Discord.py отправка сообщений участникам при присоединении и присвоение им ролей

#python #discord #discord.py

#python #Discord #discord.py

Вопрос:

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

Мой код:

 @bot.event
async def on_member_join(member):
    await member.send('Hi! Welcome to our server, in 30 seconds you will get "Verified" role, please read rules in that time.')
    time.sleep(30)
    await member.add_roles('Verified')
 

Я импортировал discord , time и у моего бота есть разрешения, у участника нет заблокированных DMS.

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

1. Добавляет ли ваш бот роль через 30 секунд, как предполагалось? Можете ли вы добавить print инструкцию при ее тестировании, чтобы убедиться, что функция вызывается?

2. Нет, это не дает, я могу сделать print заявление, но я думаю, что оно вылетает при отправке сообщения. Я пытаюсь это проверить

3. Хорошо, он не обнаруживает нового участника.

Ответ №1:

Если вы используете последнюю версию discord.py , это должно сработать:

 @bot.event   #Event to detect when a user joins the server
async def on_member_join(member):
    await member.send('Hi! Welcome to our server, in 30 seconds you will get "Verified" role, please read rules in that time.')
    time.sleep(30)   #The parameter is in seconds, so it'll wait for 30 seconds
    verifiedRole = discord.utils.get(member.guild.roles, id = THE_ROLE_ID)
    await member.add_roles(verifiedRole)
 

Примечание: Имейте в виду, что бот перестанет работать на эти 30 секунд. Итак, используя time.sleep() ужасную идею. Используйте asyncio.sleep() вместо этого.

 @bot.event   #Event to detect when a user joins the server
async def on_member_join(member):
    await member.send('Hi! Welcome to our server, in 30 seconds you will get "Verified" role, please read rules in that time.')
    await asyncio.sleep(30)   #The parameter is in seconds, so it'll wait for 30 seconds
    verifiedRole = discord.utils.get(member.guild.roles, id = THE_ROLE_ID)
    await member.add_roles(verifiedRole)
 

Используя это, бот все еще будет функционировать в течение этих 30 секунд. Не забудьте импортировать asyncio вместо time .


Замените THE_ROLE_ID на идентификатор роли с сервера, который вы можете получить, щелкнув правой кнопкой мыши роль, как показано ниже.

введите описание изображения здесь

Ответ №2:

Чтобы получить событие присоединения к участнику, вашему боту требуется намерение участника, которое по умолчанию отключено. Чтобы получить его, вам нужно сделать две вещи:

Перейдите на портал разработчика и в разделе «бот» ==> «Намерения привилегированного шлюза» включите «НАМЕРЕНИЯ УЧАСТНИКОВ СЕРВЕРА».

Включите это в своем боте, например:

 intents = discord.Intents.default()
intents.members = True

bot = commands.Bot(intents=intents, ...) # command_prefix and other things like that in the ...
 

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

1. Я получил эту ошибку: Traceback (most recent call last): File "bot.py", line 5, in <module> intents = discord.Intents.default() AttributeError: module 'discord' has no attribute 'Intents'