UnionCraft - 111

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("ВСТАВЬТЕ_СЮДА_ТОКЕН_БОТА")