0

I want to start a hangman game after .hm is called and the user then be able to enter in characters without command prefixes to play the game. I've looked at the documentation https://discordpy.readthedocs.io/en/latest/api.html#discord.Client.wait_for_message and tried to mimic user input checking but am unsuccessful. The last line before the code yields no output is: print('Running')

@client.event
async def on_message(message):
   global Hangman, guessed, tries, guessed_letters, channel, word, word_completion, guessed_words

   if message.content.startswith('.hm'):
       Hangman = True
       print("hangman started")
       channel = message.channel
       word = get_word()
       word_completion = "_" * len(word)
       guessed = False
       guessed_letters = []
       guessed_words = []
       tries = 6

       await channel.send("Let's play hangman")
       await channel.send(display_hangman(tries))
       await channel.send(word_completion)

   elif message.content.startswith('.hm quit'):
       Hangman = False

   if Hangman:
       print(str(guessed) + str(tries))
       if not guessed and tries > 0:

           def check(m):
               if any(c.isalpha() for c in m.content) and len(str(m)) == 1:
                   return m.content == message

           print('Running')
           guess = await client.wait_for('message', check=check)
           print(str(guess))

           if len(str(guess)) == 1:
               if guess in guessed_letters:
                   await channel.send("You already guessed the letter", guess)
               elif guess not in word:
                   await channel.send(guess, "is not in the word.")
                   tries -= 1
                   guessed_letters.append(guess)
               else:
                   await channel.send("Good job,", guess, "is in the word!")
                   guessed_letters.append(guess)
                   word_as_list = list(word_completion)
                   indices = [i for i, letter in enumerate(word) if letter == guess]
                   for index in indices:
                       word_as_list[index] = guess
                   word_completion = "".join(word_as_list)
                   if "_" not in word_completion:
                    guessed = True
           elif len(guess) == len(word) and guess.isalpha():
               if guess in guessed_words:
                   await channel.send("You already guessed the word", guess)
               elif guess != word:
                   await channel.send(guess, "is not the word.")
                   tries -= 1
                   guessed_words.append(guess)
               else:
                   guessed = True
                   word_completion = word
           else:
               await channel.send("Not a valid guess.")
           await channel.send(display_hangman(tries))
           await channel.send(word_completion)

       if guessed:
           await channel.send("Congrats, you guessed the word! You win!")
       else:
           await channel.send("Sorry, you ran out of tries. The word was " + word + ". Maybe next time!")

get_word() just gets a random word from another .py file.

sbot
  • 1
  • 2
  • 1
    You should consider using [discord.ext.commands](https://discordpy.readthedocs.io/en/latest/ext/commands/#discord-ext-commands-bot-commands-framework) and making each one into a command instead of putting everything inside `on_message` – Abdulaziz Sep 08 '20 at 08:37
  • Ok yea. thanks. I ended up doing something similar to that – sbot Sep 08 '20 at 19:44

1 Answers1

1
guess = await client.wait_for('message', check=check)

it is for using in a command if you are using on_message then you can add in check. if

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

now, it will work. you can add more checks if you want.

Amit Agarwal
  • 309
  • 1
  • 8