Discord.py Therapy Bot Указывает пользователя и пока-L oop не введен - PullRequest
0 голосов
/ 23 февраля 2020

Я довольно новый пользователь для python, извините за это. Я пытался ввести какое-то время l oop для разрозненных пользователей, где бот продолжает задавать вопросы о заземлении, пока они не скажут «спасибо».

dissociation_event = False
dissociated_user = ""

@client.event
async def on_message(message):
    if ('dissocia' in message.content):
        dissociation_event = True 
        dissociated_user = message.author

        if dissociation_event==True and dissociated_user == message.author:
            response = 'It sounds like you may be dissociating, would you like help with grounding
 techniques?\n(yes.joi/no.joi)'
            await message.channel.send(response)

        if message.content.lower() == 'no.joi' and dissociation_event==True and dissociated_user == message.author:
            dissociation_event=False
            dissociated_user=""
            response = 'Sorry for misunderstanding'
            await message.channel.send(response)
        if message.content.lower() == 'yes.joi' and dissociation_event==True and dissociated_user == message.author:
            while not ('thanks' in message.content):
                questions = ['What is something you can see?(... etc),
                ]
                response = random.choice(questions)
                await message.channel.send(response)
            if 'thanks' in message.content:
                response = 'Hope that you feel better soon :)'
                await message.channel.send(response)

Когда упоминается «disocia», бот будет задайте начальный вопрос: 'It sounds like you may be dissociating, would you like help with grounding techniques?'

Я хочу, чтобы пользователь мог сказать да / нет, а бот вводил время l oop, задавая вопросы, пока они не скажут «спасибо». В данный момент бот не задает никаких вопросов, и я не знаю почему. У меня проблемы с указанием того, что бот должен отвечать только пользователю, который изначально вызвал первоначальный вопрос, и началом вопросов l oop. Буду признателен за любую помощь, я застрял на этом некоторое время.

1 Ответ

0 голосов
/ 24 февраля 2020

Я не даю законченного решения в этом ответе, но я укажу на логическую ошибку, которую вы делаете.

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

https://discordpy.readthedocs.io/en/latest/api.html?highlight=wait_for#discord .Client.wait_for

@client.event
async def on_message(message):
  if message.content.startswith('$greet'):
    channel = message.channel
    await channel.send('Say hello!')

    def check(m):
      return m.content == 'hello' and m.channel == channel

    msg = await client.wait_for('message', check=check)
    await channel.send('Hello {.author}!'.format(msg))

Здесь вы можете вызвать бота с помощью $greet. Он ответит Say hello!. Другие пользователи, отправляющие несвязанные сообщения, будут игнорироваться, поскольку они не передают check. Он реагирует на комментарии, которые говорят hello и были отправлены из того же текстового канала.

Вы можете расширить проверку, включив в нее оригинального автора:

author = message.author
def check(m):
  return m.content == 'hello' and m.channel == channel and m.author == author

В то время как l oop Вам необходимо повторно настроить await client.wait_for новое сообщение, пока условие не будет выполнено.

...