diff --git a/modules/hangman.py b/modules/hangman.py index 1deacb8..afa6dbc 100755 --- a/modules/hangman.py +++ b/modules/hangman.py @@ -1,91 +1,84 @@ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- +#!/usr/bin/env python3 """ -Hangman. +A class and functions needed for playing handman. """ +import os import random -import module + +from module import commands, example class Hangman(): - def __init__(self): - self.running = False - - def newgame(self): - self.running = True + def __init__(self, bot): self.tries = 8 - self.word = self._PickWord() + self.word = self._PickWord(bot) self.working = [x for x in self.word] self.blanks = list('_' * len(self.word)) - for n,char in enumerate(self.word): - if char == ' ': - self.blanks[n] = ' ' - def _PickWord(self): - with open("/home/iou1name/fulvia/static/wordlist.txt",'r') as file: - lines = file.readlines() - wrd = list(lines[ random.randint(0, len(lines))-1 ].strip()) - return wrd + def _PickWord(self, bot): + with open(os.path.join(bot.static, "wordlist.txt"), "r") as file: + word = random.choice(file.read().splitlines()) + return word - def solve(self, guess): - if list(guess) == self.word: - self.running = False - self.blanks = self.word - return 'win' + def update(self, guess): + if not guess in self.word: + return - elif guess in self.word and len(guess) == 1: - while guess in self.working: - index = self.working.index(guess) - self.blanks[index] = guess - self.working[index] = '_' - return 'correct' - else: - self.tries = self.tries - 1 - if self.tries == 0: - self.running = False - self.blanks = self.word - return 'lose' - else: - return 'incorrect' + for n, char in enumerate(self.word): + if char == guess: + self.blanks[n] = guess + - def return_blanks(self): - return ''.join(self.blanks) +def setup(bot): + bot.memory["hangman"] = {} -hangman = Hangman() -@module.commands('hangman') -@module.example('.hangman') +@commands("hangman", "hm") def hangman_start(bot, trigger): """Starts a game of hangman.""" - if hangman.running: - bot.reply("There is already a game running.") + if not trigger.group(2): + return bot.reply("Hang what?") + + if trigger.group(3) == "--start" or trigger.group(3) == "-s": + if bot.memory["hangman"].get(trigger.channel): + return bot.reply("There is already a game running in this channel.") + + bot.memory["hangman"][trigger.channel] = Hangman(bot) + msg = f"{trigger.nick} has started a game of hangman! " \ + + "Use '.hangman [guess]' to guess a letter or the entire word." + bot.msg(msg) + bot.say("".join(bot.memory["hangman"][trigger.channel].blanks)) return - hangman.newgame() - bot.say(trigger.nick + " has started a game of hangman! Type .guess to guess a letter or the entire phrase.") - bot.say(hangman.return_blanks()) + if not bot.memory["hangman"].get(trigger.channel): + msg = "There is no game currently running in this channel. " \ + + "Use '.hangman --start' to start one" + return bot.reply(msg) + if len(trigger.group(2)) > 1: + if trigger.group(2) == bot.memory["hangman"][trigger.channel].word: + bot.say(f"{trigger.nick} has won!") + bot.say(bot.memory["hangman"][trigger.channel].word) + bot.memory["hangman"].pop(trigger.channel) + return + else: + msg = "Incorrect. " \ + + f"{bot.memory['hangman'][trigger.channel].tries} tries left." + bot.reply(msg) -@module.commands('guess') -@module.example('.guess a') -@module.example('.guess anus') -def guess(bot, trigger): - """Makes a guess in hangman. May either guess a single letter or the entire word/phrase.""" - if not hangman.running: - bot.reply('There is no game currently running. Use .hangman to start one') - return + elif len(trigger.group(2)) == 1: + if trigger.group(2) in bot.memory["hangman"][trigger.channel].word: + bot.reply("Correct!") + bot.memory["hangman"][trigger.channel].update(trigger.group(2)) - response = hangman.solve(trigger.group(2)) - - if response == 'win': - bot.say(trigger.nick + " has won!") - elif response == 'correct': - pass - elif response == 'lose': - bot.say("Game over.") - elif response == 'incorrect': - bot.reply("incorrect.") - bot.say( str(hangman.tries) + " tries left." ) + else: + bot.memory["hangman"][trigger.channel].tries -= 1 + msg = "Incorrect. " \ + + f"{bot.memory['hangman'][trigger.channel].tries} tries left." + bot.reply(msg) + + if bot.memory["hangman"][trigger.channel].tries <= 0: + bot.say("Game over!") + bot.say(bot.memory['hangman'][trigger.channel].word) + bot.memory["hangman"].pop(trigger.channel) else: - bot.say('Fuck.') - - bot.say(hangman.return_blanks()) + bot.say("".join(bot.memory["hangman"][trigger.channel].blanks))