Python Discord Bot
Всем привет! Пишу своего бота для дискорда на питоне и столкнулся с проблемой.
Посмотрев Хауди, скопировал код для выдачи ролей по реакциям (и сделал все, как в видео), но при добавлении реакции выводится ошибка, что пропущен аргумент payload в on_raw_reaction_add(), но в коде он есть.
import discord
from discord.ext import commands
from discord import utils
import config
PREFIX = '.'
client = commands.Bot(command_prefix = PREFIX)
client.remove_command ('help')
@client.event
async def on_ready():
print ('nikolas_bot connected')
await client.change_presence (status = discord.Status.online, activity = discord.Game('Реальная жизнь'))
@client.event
async def on_command_error(ctx, error):
pass
@client.event
async def on_member_join(member):
channel = client.get_channel (666619701975056397)
role = discord.utils.get(member.guld.roles, id = 675795121018503170)
await member.add_roles (role)
await channel.send(embed = discord.Embed(description = f'Пользователь ``{member.name}``, присоединился в нашу бригаду :clap: :nerd: ', color = 0x0c0c0c))
# clear mess
@client.command(pass_context = True)
@commands.has_permissions(administrator = True)
async def clear (ctx, amount : int):
await ctx.channel.purge(limit = amount)
# Kick
@client.command(pass_context = True)
@commands.has_permissions(administrator = True)
async def kick (ctx, member: discord.Member, *, reason = None):
emb = discord.Embed (title = 'Kick :wave:', colour = discord.Color.red())
await ctx.channel.purge(limit = 1)
await member.kick(reason = reason)
emb.set_author (name = member.name, icon_url = member.avatar_url)
emb.add_field (name = 'Kick user', value = 'Kicked user : {}'.format(member.mention))
emb.set_footer (text = 'Был выгнан с сервера администратором {}'.format (ctx.author.name), icon_url = ctx.author.avatar_url)
await ctx.send (embed = emb)
# Ban
@client.command(pass_context = True)
@commands.has_permissions(administrator = True)
async def ban (ctx, member: discord.Member, *, reason = None):
emb = discord.Embed (title = 'Ban :lock:', colour = discord.Color.dark_red())
await ctx.channel.purge(limit = 1)
await member.ban(reason = reason)
emb.set_author (name = member.name, icon_url = member.avatar_url)
emb.add_field (name = 'Ban user', value = 'Baned user : {}'.format(member.mention))
emb.set_footer (text = 'Был заблокирован администратором {}'.format (ctx.author.name), icon_url = ctx.author.avatar_url)
await ctx.send (embed = emb)
# Unban
@client.command(pass_context = True)
@commands.has_permissions(administrator = True)
async def unban(ctx, *, member):
await ctx.channel.purge(limit = 1)
emb = discord.Embed (title = 'Unban :unlock:', colour = discord.Color.purple())
banned_users = await ctx.guild.bans()
for ban_entry in banned_users:
user = ban_entry.user
await ctx.guild.unban (user)
emb.set_author (name = member.name, icon_url = member.avatar_url)
emb.add_field (name = 'Unban user', value = 'Unbaned user : {}'.format(member.mention))
emb.set_footer (text = 'Был разблокирован администратором {}'.format (ctx.author.name), icon_url = ctx.author.avatar_url)
await ctx.send (embed = emb)
return
# help
@client.command(pass_context = True)
@commands.has_permissions(administrator = True)
async def help(ctx):
emb = discord.Embed (title = 'Навигация по командам :clipboard: ')
emb.add_field(name ='Описание сервера', value = 'Это сервер International gaming. Его владелец - Vinete. А я - просто БОТ от Tr1ton. Здесь есть ряд правил, которые нужно соблюдать: \n 1) Не флудить/спамить/оскорблять. \n 2) Не дерзить и слушаться админов. \n 3) Иметь хорошее настроение :innocent:. \n Приятного времяпровождения на сервере! <3')
emb.add_field(name ='{}clear :broom: '.format(PREFIX), value = 'Очистка чата (Только для Админов!)')
emb.add_field(name ='{}ban :lock:'.format(PREFIX), value = 'Блокирование участника (Только для Админов!)')
emb.add_field(name ='{}kick :wave: '.format(PREFIX), value = 'Удаление участника с сервера (Только для Админов!)')
emb.add_field(name ='{}unban :unlock: '.format(PREFIX), value = 'Разблокирование участника (Только для Админов!)')
emb.add_field(name ='{}mute_user :mute: '.format(PREFIX), value = 'Мут участника (Только для Админов!)')
await ctx.send ( embed = emb )
# mute
@client.command()
@commands.has_permissions(administrator = True)
async def mute_user (ctx, member: discord.Member):
await ctx.channel.purge(limit = 1)
emb = discord.Embed (title = 'Mute :mute:', colour = discord.Color.gold())
mute_role = discord.utils.get(ctx.message.guild.roles, name = 'MUTED')
await member.add_roles (mute_role)
emb.set_author (name = member.name, icon_url = member.avatar_url)
emb.add_field (name = 'MUTE', value = 'Muted user : {}'.format(member.mention))
emb.set_footer (text = 'Был помещён в мут администратором {}'.format (ctx.author.name), icon_url = ctx.author.avatar_url)
await ctx.send (embed = emb)
@clear.error
async def clear_error(ctx,error):
if isinstance (error, commands.MissingRequiredArgument):
await ctx.send(f'{ctx.author.name}, обязательно укажите аргумент!')
if isinstance(error, commands.MissingPermissions):
await ctx.send(f'{ctx.author.name}, вы не обладаете такими правами!')
@kick.error
async def kick_error(ctx,error):
if isinstance (error, commands.MissingRequiredArgument):
await ctx.send(f'{ctx.author.name}, обязательно укажите аргумент!')
if isinstance(error, commands.MissingPermissions):
await ctx.send(f'{ctx.author.name}, вы не обладаете такими правами!')
@mute_user.error
async def mute_error(ctx,error):
if isinstance (error, commands.MissingRequiredArgument):
await ctx.send(f'{ctx.author.name}, обязательно укажите аргумент!')
if isinstance(error, commands.MissingPermissions):
await ctx.send(f'{ctx.author.name}, вы не обладаете такими правами!')
@unban.error
async def unban_error(ctx,error):
if isinstance (error, commands.MissingRequiredArgument):
await ctx.send(f'{ctx.author.name}, обязательно укажите аргумент без @!')
if isinstance(error, commands.MissingPermissions):
await ctx.send(f'{ctx.author.name}, вы не обладаете такими правами!')
@client.event
async def on_raw_reaction_add(self, payload):
if payload.message_id == config.POST_ID:
channel = self.get_channel(payload.channel_id) # получаем объект канала
message = await channel.fetch_message(payload.message_id) # получаем объект сообщения
member = utils.get(message.guild.members, id=payload.user_id) # получаем объект пользователя который поставил реакцию
try:
emoji = str(payload.emoji) # эмоджик который выбрал юзер
role = utils.get(message.guild.roles, id=config.ROLES[emoji]) # объект выбранной роли (если есть)
if(len([i for i in member.roles if i.id not in config.EXCROLES]) <= config.MAX_ROLES_PER_USER):
await member.add_roles(role)
print('[SUCCESS] User {0.display_name} has been granted with role {1.name}'.format(member, role))
else:
await message.remove_reaction(payload.emoji, member)
print('[ERROR] Too many roles for user {0.display_name}'.format(member))
except KeyError as e:
print('[ERROR] KeyError, no role found for ' + emoji)
except Exception as e:
print(repr(e))
@client.event
async def on_raw_reaction_remove(self, payload):
channel = self.get_channel(payload.channel_id) # получаем объект канала
message = await channel.fetch_message(payload.message_id) # получаем объект сообщения
member = utils.get(message.guild.members, id=payload.user_id) # получаем объект пользователя который поставил реакцию
try:
emoji = str(payload.emoji) # эмоджик который выбрал юзер
role = utils.get(message.guild.roles, id=config.ROLES[emoji]) # объект выбранной роли (если есть)
await member.remove_roles(role)
print('[SUCCESS] Role {1.name} has been remove for user {0.display_name}'.format(member, role))
except KeyError as e:
print('[ERROR] KeyError, no role found for ' + emoji)
except Exception as e:
print(repr(e))
# Connect
token = open('token.txt', 'r').readline()
client.run( token )
Ошибка:
Ignoring exception in on_raw_reaction_remove Traceback (most recent call last): File "C:\Users\bogat\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\client.py", line 270, in _run_event await coro(*args, **kwargs) TypeError: on_raw_reaction_remove() missing 1 required positional argument: 'payload' Ignoring exception in on_raw_reaction_add Traceback (most recent call last): File "C:\Users\bogat\AppData\Local\Programs\Python\Python38\lib\site-packages\discord\client.py", line 270, in _run_event await coro(*args, **kwargs) TypeError: on_raw_reaction_add() missing 1 required positional argument: 'payload'