discord bot на python
Писал бота через chatgpt, просто попробовать. В общем есть 2 кнопки, если нажать одну, то она меня никнейм пользователю и выдает рольки. Если нажимает вторую кнопку, меняет на другой никнейм и выдает другие рольки. Но проблема, не понимаю как сделать так, чтобы он определил, какую кнопку я нажал. Уже разными способами попробовал. Помогите кто понимает
import discord
from discord.ui import Button, View, Modal, TextInput
from discord.ext import commands
# Устанавливаем префикс для команд бота и включаем необходимые intents
intents = discord.Intents.default()
intents.message_content = True # Включаем intent для чтения содержимого сообщений
intents.guilds = True # Включаем intent для работы с серверами
intents.members = True # Включаем intent для работы с участниками
bot = commands.Bot(command_prefix="!", intents=intents)
# ID канала для отправки кнопки
target_channel_id = 1332348283414249512 # Замените на настоящий ID вашего канала
# ID канала для логирования данных (где бот будет отправлять текст)
log_channel_id = 1332348302183759964 # Замените на ID канала для логирования
# ID ролей, которые вы хотите назначить (замените на реальные ID ролей)
role_1_id = 1332348645672095754 # Роль 1
role_2_id = 1332736634319536161 # Роль 2
role_3_id = 1332348697350242398 # Роль 3
role_4_id = 1332348716236931202 # Роль 4
role_5_id = 1332914558968270862 # Роль 5
@bot.event
async def on_ready():
print(f'Мы вошли как {bot.user}')
# Автоматически отправляем кнопки в определенный канал
channel = bot.get_channel(target_channel_id)
if channel:
# Создаем кнопки с уникальными custom_id для каждой кнопки
button_1 = Button(label="Получить роли", style=discord.ButtonStyle.primary, custom_id="button_1")
# Создаем callback для первой кнопки
async def button_1_callback(interaction: discord.Interaction):
# Создаем модальное окно с двумя полями ввода
modal = Modal(title="Выдача ролей")
modal.add_item(TextInput(label="Ваш никнейм", placeholder="Например: Morris Moore"))
modal.add_item(TextInput(label="Ваш номер паспорта", placeholder="Например: 123456", max_length=6))
# Отправляем модальное окно
await interaction.response.send_modal(modal)
button_1.callback = button_1_callback
button_2 = Button(label="Получить другие роли", style=discord.ButtonStyle.danger, custom_id="button_2")
# Создаем callback для второй кнопки
async def button_2_callback(interaction: discord.Interaction):
# Создаем модальное окно с двумя полями ввода
modal = Modal(title="Выдача ролей")
modal.add_item(TextInput(label="Ваш никнейм", placeholder="Например: Morris Moore"))
modal.add_item(TextInput(label="Ваш номер паспорта", placeholder="Например: 123456", max_length=6))
# Отправляем модальное окно
await interaction.response.send_modal(modal)
button_2.callback = button_2_callback
# Создаем View и добавляем кнопки
view = View()
view.add_item(button_1)
view.add_item(button_2)
# Отправляем сообщение с кнопками в канал
await channel.send("Нажмите на одну из кнопок, чтобы получить роли.", view=view)
@bot.event
async def on_interaction(interaction: discord.Interaction):
if interaction.type == discord.InteractionType.modal_submit:
# Получаем введенные данные из модального окна
text_input_1 = interaction.data['components'][0]['components'][0]['value']
text_input_2 = interaction.data['components'][1]['components'][0]['value']
# Получаем пользователя
user = interaction.user
# Логируем данные
log_channel = bot.get_channel(log_channel_id)
if log_channel:
await log_channel.send(f"{user.mention}\nНомер паспорта: {text_input_2}")
# Проверяем, какая кнопка была нажата по custom_id
if interaction.data["custom_id"] == "button_1":
roles = [role_1_id, role_2_id, role_3_id]
new_nick = f"[1 | TSD] {text_input_1}"
elif interaction.data["custom_id"] == "button_2":
roles = [role_1_id, role_2_id, role_4_id, role_5_id]
new_nick = f"[2 | TSD] {text_input_1}"
else:
await interaction.response.send_message("Произошла ошибка: не удалось определить, какую кнопку вы нажали.", ephemeral=True)
return
# Обрезаем ник, если он слишком длинный
if len(new_nick) > 32:
new_nick = new_nick[:32]
# Получаем пользователя и сервер
member = interaction.user
guild = interaction.guild
# Проверяем, есть ли у бота права на управление ролями
if guild.me.guild_permissions.manage_roles:
# Получаем объекты ролей по ID
role_objects = [guild.get_role(role_id) for role_id in roles]
# Проверяем, что все роли существуют
if all(role for role in role_objects):
await member.add_roles(*role_objects)
# Проверяем, есть ли у бота права на изменение ника
if guild.me.guild_permissions.manage_nicknames:
try:
await member.edit(nick=new_nick)
await interaction.response.send_message(f"Роли выданы успешно, и ваш ник был изменен на: {user.mention}", ephemeral=True)
except discord.Forbidden:
await interaction.response.send_message("У меня нет прав на изменение вашего ника!", ephemeral=True)
else:
await interaction.response.send_message("У меня нет прав на изменение ников!", ephemeral=True)
# Запуск бота
bot.run('YOUR_BOT_TOKEN')```