discord py — message.упоминание «else» ничего не дает

#python #python-3.x #discord #discord.py

#python #python-3.x #Discord #discord.py

Вопрос:

Я хочу получить пользователя, который был упомянут в сообщении, и отправить ему личное сообщение. Это работает без проблем, но теперь я хочу добавить сообщение для случая, когда указанный участник не находится на том же сервере.

Я много искал и пытаюсь найти решение более 3 часов.

Демонстрация проблемы: https: //youtu.be/PYZMVXYtxpE

Вот мой код:

 @bot.event
async def on_message(message):
 if len(message.mentions) == 1:
   membe1 = message.mentions[0].id
   membe2 = bot.get_user(membe1)
   guild = bot.get_guild(message.author.guild.id)
   if guild.get_member(membe1) is not None:
      await membe2.send(content=f"you was mentioned in the server chat")
   else:
      embed2 = discord.Embed(title=f"» :warning: | PING not possible", description=f"not possible")
      await message.channel.send(content=f"{message.author.mention}", embed=embed)
      await message.delete()
      return
 

Первая часть работает без проблем, но в else части «» бот ничего не делает. Он по-прежнему публикует сообщение с «недопустимым» ping в чате и просто игнорирует его. Что я могу сделать, чтобы это исправить?

Комментарии:

1. Не могли бы вы отправить скриншот вывода бота?

2. Никаких ошибок, ничего.

Ответ №1:

В том, что вы пытаетесь сделать, есть ошибка дизайна. В Discord вы не можете упомянуть пользователя, если он не находится на том же сервере, поэтому то, что вы проверяете, никогда не будет работать вообще, в настоящее время ваш код в значительной степени проверяет, существует ли указанный пользователь, что всегда будет происходить, если он не покинет гильдию одновременно с командой казнен.

Скажем, например, чтобы заставить вашу команду работать, вы хотите упомянуть пользователя user123, который находится на вашем сервере, вы делаете следующее:

@пользователь123 блаблабла

И это работает, потому что внутренний кэш Discord может найти пользователя 123 на вашем сервере, и это упоминается, что означает, что нажатие на «@user123» покажет нам цель с его аватаром, его ролями или чем-то еще.

Но если вы попытаетесь сделать то же самое для недопустимого пользователя, скажем, notuser321:

@notuser321 блаблабла

Это не упоминание, возьмем, к примеру, что вы знаете, кто такой notuser321, но он находится на том же сервере, что и бот. Discord не может извлечь этого пользователя из кэша, и это не считается упоминанием, просто одна строка, поэтому ни одна часть вашего кода не будет запущена, потому len(message.mentions) что будет 0 .

Что-то, что вы могли бы попробовать, это использовать регулярные выражения для поиска попытки пометить внутри message.content . Примером может быть что-то вроде этого:

 import re

message = "I love @user1 and @user2"
mention_attempt = re.findall(r'[@]S*', message)   # ['@user1', '@user2']
 

Комментарии:

1. Я получил сообщение об ошибке: TypeError: 'in <string>' requires string as left operand, not list для if mention_attempt in message.content:

2. re.findall() возвращает список со всеми результатами, которые, если они найдены, либо проверяют только mention_attempt[0] , либо перебирают его элементы, чтобы отправить сообщение каждому упомянутому пользователю.

3. Вы должны попытаться отладить свой код, чтобы понять, почему вы это получаете. По сути, это означает, что он не идентифицирует какой-либо синтаксис, такой как @username , в вашем сообщении. Вы должны передать message.content re.findall() функцию, а не message объект…