Я не понимаю этих ошибок, которые я получаю с помощью своих функций on_member_join / on_member_remove - PullRequest
0 голосов
/ 13 января 2019

Я работал над ботом разногласий, написанным на python. И я пытался заставить своего бота сказать сообщение, когда пользователь присоединяется к серверу и покидает сервер. Но когда я проверил это, я получил 2 ошибки, которые я не понимаю ошибки. И я не уверен, что я сделал не так. Если бы кто-нибудь мог помочь объяснить эти ошибки и указать правильное направление для моего кода, я был бы очень признателен.

Я посмотрел на api для перезаписи и проверил его на своем сервере с другом, когда я получил ошибки

@client.event
async def on_member_join(member):
    channel = member.server.get_channel("499457708978864151")
    msg = 'Welcome to the {1.name} Server, {0.mention}'
    await client.say(channel, msg.format(member, member.server))

@client.event
async def on_member_remove(member):
    channel = member.server.get_channel("499457708978864151")
    msg = '{0.mention} has left the server'
    await client.say((channel, msg.format(member, member.server)))

Я ожидал, что мой бот скажет: «Добро пожаловать на (имя сервера) сервера», @username при входе на сервер, и @username покинул сервер, когда пользователь вышел, но я получил эти ошибки:

TypeError: send_message() takes from 2 to 3 positional arguments but 4 were given
discord.errors.InvalidArgument: Destination must be Channel, PrivateChannel, User, or Object. Received NoneType

Вот мой полный след

Ignoring exception in on_member_join
Traceback (most recent call last):
  File "C:\Users\Chris\PycharmProjects\untitled1\venv\lib\site-packages\discord\client.py", line 307, in _run_event
    yield from getattr(self, event)(*args, **kwargs)
  File "C:/Users/Chris/PycharmProjects/untitled1/RomaniBot.py", line 37, in on_member_join
    await client.say(channel, msg.format(member, member.server))
  File "C:\Users\Chris\PycharmProjects\untitled1\venv\lib\site-packages\discord\ext\commands\bot.py", line 350, in say
    coro = self.send_message(destination, *args, **kwargs)
TypeError: send_message() takes from 2 to 3 positional arguments but 4 were given
Ignoring exception in on_member_remove
Traceback (most recent call last):
  File "C:\Users\Chris\PycharmProjects\untitled1\venv\lib\site-packages\discord\client.py", line 307, in _run_event
    yield from getattr(self, event)(*args, **kwargs)
  File "C:/Users/Chris/PycharmProjects/untitled1/RomaniBot.py", line 43, in on_member_remove
    await client.say((channel, msg.format(member, member.server)))
  File "C:\Users\Chris\PycharmProjects\untitled1\venv\lib\site-packages\discord\ext\commands\bot.py", line 309, in _augmented_msg
    msg = yield from coro
  File "C:\Users\Chris\PycharmProjects\untitled1\venv\lib\site-packages\discord\client.py", line 1145, in send_message
    channel_id, guild_id = yield from self._resolve_destination(destination)
  File "C:\Users\Chris\PycharmProjects\untitled1\venv\lib\site-packages\discord\client.py", line 289, in _resolve_destination
    raise InvalidArgument(fmt.format(destination))
discord.errors.InvalidArgument: Destination must be Channel, PrivateChannel, User, or Object. Received NoneType

Ответы [ 2 ]

0 голосов
/ 13 января 2019

member.server возвращает вам сервер, к которому присоединился участник. И вы пытались получить доступ к каналу с идентификатором 499457708978864151, это определенно не работало бы на других серверах, кроме сервера, где канал с идентификатором 499457708978864151, поэтому вы должны получить сервер тоже client.get_server("ID") сделает это.

0 голосов
/ 13 января 2019

Одним простым исправлением для вашего кода было бы вместо использования client.say использовать channel.send. Так

@client.event
async def on_member_join(member):
    channel = member.server.get_channel(499457708978864151)
    msg = 'Welcome to the {1.name} Server, {0.mention}'
    await channel.send(msg.format(member, member.server))

Кроме того, согласно документации,

get_channel (id)

Возвращает abc.GuildChannel или abc.PrivateChannel с следующий идентификатор.

Если не найден, возвращает None.

Таким образом, вы не выбрали канал успешно. Причина в том, что идентификатор в перезаписываемом является int, а не строка.

...