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'


Ответы (0 шт):