UnionCraft
1111
111
import discord
from discord.ext import commands
# Для работы с реакциями и сообщениями боту нужны соответствующие интенты.
intents = discord.Intents.default()
intents.message_content = True # чтобы уметь читать содержание сообщений
intents.members = True # чтобы иметь доступ к участникам (выдача ролей и т.д.)
intents.reactions = True # чтобы отслеживать реакции
# Создаём экземпляр бота с нужными интентами.
bot = commands.Bot(command_prefix='!', intents=intents)
# ID канала, куда будет отправлено сообщение "ТЕСТ"
CHANNEL_ID = 1340030095104020581
# ID роли, которую нужно выдавать при реакции с флагом России
ROLE_ID = 1340030539545186314
@bot.event
async def on_ready():
"""Событие, срабатывающее один раз при запуске бота."""
print(f'Бот запущен и авторизовался как {bot.user}.')
# Получаем объект канала, куда нужно отправить сообщение
channel = bot.get_channel(CHANNEL_ID)
if channel is None:
print(f'Не удалось найти канал с ID {CHANNEL_ID}. Проверьте настройки.')
return
# Отправляем сообщение "ТЕСТ" в указанный канал
message = await channel.send("ТЕСТ")
# Добавляем реакции: флаг России и Великобритании
await message.add_reaction("🇷🇺")
await message.add_reaction("🇬🇧")
@bot.event
async def on_raw_reaction_add(payload: discord.RawReactionActionEvent):
"""
Событие срабатывает, когда пользователь нажал на реакцию (даже если бот не «видит» само сообщение напрямую).
Используем raw-событие, т.к. оно лучше работает с частичными объектами (partial).
"""
# Игнорируем, если автор реакции — сам бот
if payload.user_id == bot.user.id:
return
# Проверяем, что у нас есть ID гильдии (сервер), чтобы можно было работать с ролями.
if not payload.guild_id:
return
# Получаем объект гильдии
guild = bot.get_guild(payload.guild_id)
if guild is None:
return
# Получаем канал, где была поставлена реакция
channel = bot.get_channel(payload.channel_id)
if channel is None:
# Если канал не находится, пробуем «достать» его через fetch
channel = await bot.fetch_channel(payload.channel_id)
# Пытаемся получить само сообщение, чтобы проверить контент и автора
try:
message = await channel.fetch_message(payload.message_id)
except discord.NotFound:
# Сообщение удалено или не найдено
return
except discord.Forbidden:
# Нет прав на получение сообщения
return
except discord.HTTPException:
# Общая ошибка сети
return
# Убедимся, что реагируют именно на наше "ТЕСТ"-сообщение бота
if message.author.id != bot.user.id or message.content != "ТЕСТ":
return
# Теперь смотрим, какая именно реакция была добавлена
emoji_name = payload.emoji.name
# Если пользователь нажал на флаг России
if emoji_name == "🇷🇺":
role = guild.get_role(ROLE_ID)
if role is None:
print(f"Роль с ID {ROLE_ID} не найдена!")
return
member = guild.get_member(payload.user_id)
if member is None:
return
try:
await member.add_roles(role)
print(f"[INFO] Роль {role.name} выдана пользователю {member.display_name}")
except discord.Forbidden:
print("[ERROR] У бота нет прав на выдачу этой роли.")
except discord.HTTPException as e:
print(f"[ERROR] Не удалось выдать роль: {e}")
# Если пользователь нажал на флаг Великобритании
elif emoji_name == "🇬🇧":
# Отправляем личное сообщение в ЛС
user = bot.get_user(payload.user_id)
if user is None:
user = await bot.fetch_user(payload.user_id)
try:
await user.send("ТЕСТ")
print(f"[INFO] Отправлено ЛС пользователю {user}")
except discord.Forbidden:
print("[ERROR] Пользователь запретил отправку личных сообщений.")
except discord.HTTPException as e:
print(f"[ERROR] Не удалось отправить ЛС: {e}")
# Запуск бота.
# Вставьте сюда токен, который вы получили в Discord Developer Portal.
bot.run("ВСТАВЬТЕ_СЮДА_ТОКЕН_БОТА")