diff --git a/conf/willie-example.cfg b/conf/willie-example.cfg index 0d9ea12..9dc4e1e 100644 --- a/conf/willie-example.cfg +++ b/conf/willie-example.cfg @@ -20,7 +20,7 @@ channels = #whatsedo # Enable the modules needed for the game # and the game itself -enable = admin +enable = admin,whatsedo extra = /somewhere/whatsedo/game # Where are we going to log our actions? diff --git a/game/whatsedo.py b/game/whatsedo.py new file mode 100644 index 0000000..7263083 --- /dev/null +++ b/game/whatsedo.py @@ -0,0 +1,257 @@ +from willie import module +import time + +# Variables +players = [] +game = {} +game['status'] = 0 +game['awnser'] = 0 +game['round'] = 0 +game['awnserok'] = [] +game['solved'] = [] +settings = {} +settings['minplayers'] = 1 +settings['channel'] = "#whatsedo" +settings['wa_user'] = "whatsedo_wa" +settings['admin'] = "Your_own_IRC_User" +settings['walktime'] = 10 +settings['playtime'] = 5 +settings['gamequestion'] = "De hoofdvraag is: Wie is waar met het touw vermoord." +solution = { +'person':'crofts', +'place':'mariaplaats', +'weapon':'touw' +} +locations = { +1:['Vredenburg/uitgang Catharijne', 'Een camera kijkt hier uit op een bord wat meestal (niet hier) info over Utrecht staat. Wat is zijn ID nummer?', 'mu01326', 'Op het Neude werd iemand met gif vermoord, maar niet door Crofts'], +2:['Zandbrug', 'Deze brug bevat een oude Duitse bunker. Echter in de 80 jarige oorlog was er hier ook een verzetsvrouw. In welk jaar gaf ze de opdracht kasteel Vredenburg te slopen?', '1577', 'Beatrix was in de stationshal, maar niet met het touw'], +3:['Domplein', 'Jan van Nassau (broer van Willem van Oranje) was 1 van de oprichters van de Unie van Utrecht, het begin van het huidige Nederland. In welke zaal werd dit verdrag getekend?', 'kapittelzaal', 'Op het Domplein lag geen pistool'], +4:['Sonnenborgh - Museum & Sterrenwacht', 'Deze sterrenwacht werd samen met het KNMI door wie opgericht? (twee woorden)', 'buys ballot', 'Van Krimpen was op het domplein, zonder touw.'], +5:['Louis Hartlooper Complex (Tolsteegbrug)', 'Waarmee ondertekende de persoon die ook schreef: ANNO DOMINI MIXD', 'sdj95', 'Labre had dynamiet, echter niet op de mariaplaats.'], +6:['Klein park achter Tivoli Oude Gracht', 'Er staat hier een oud pandhuis (bank van leningen). Wat was voor 1713 de functie van dit gebouw? (1 woord)', 'graanpakhuis', 'Op het vredenburg lag dynamiet. Masselman was op het Neude.'] +} + + +# Make the good guys better +@module.event('JOIN') +@module.rule(r'.*') +def autoop(bot, trigger): + """ + If the user is the admin, he will be oped. + """ + global settings + + nick = trigger.nick + + if nick == settings['admin']: + channel = trigger.sender + bot.write(['MODE', channel, "+o", nick]) + +@module.rule('gameintro') +def gameintro(bot, trigger): + """ + Give an intro of the game and how to participate. + """ + global game, settings + + channel = settings['channel'] + + if game['status'] == 0 and settings['channel'] in bot.channels: + bot.msg(channel, 'Welkom bij het spel LGedo. Meld je aan door in deze groeps WhatsApp te antwoorden met "speelmee". Je speelt dan met je team mee.') + +@module.rule('<(.*)>\s\Dpeelmee') +def groupadd(bot, trigger): + """ + Add a group to the players list. If there are enough (same as amount of locations) + """ + global settings, players, locations + + channel = settings['channel'] + + if game['status'] == 1: + bot.msg(channel, 'Het spel is al begonnen. Je kunt niet meer mee doen.') + return + + if len(players) == len(locations): + bot.msg(channel, 'Er zijn genoeg groepjes. Jullie kunnen niet meer mee doen.') + return + + newplayer = trigger.group(1) + + if players.count(newplayer) == 0: + players.append(newplayer) + bot.msg(channel, 'Het groepje met als teamcaptain ' + newplayer + ' doet mee aan het spel!') + +@module.rule('startspel') +def startcheck(bot, trigger): + """ + Check the game requirements. + """ + global settings, players + + nick = trigger.nick + channel = settings['channel'] + + if game['status'] == 1: + bot.msg(channel, 'Het spel is al begonnen.') + return + + if len(players) >= settings['minplayers']: + startgame(bot) + else: + bot.msg(channel, 'Minimum aantal spelers nog niet bereikt. Dit moeten er minimaal ' + str(settings['minplayers']) + ' zijn.') + +@module.rule('<(.*)>\s\Dntwoord\s(.*)') +def awnser(bot, trigger): + """ + Let the players give an awnser to the questions given in the game. + """ + global settings, players, game, locations + + player = trigger.group(1) + awnser = trigger.group(2) + channel = settings['channel'] + + if game['status'] == 0: + bot.msg(settings['wa_user'], player + ': Het spel is nog niet begonnen. Je kunt geen antwoorden insturen.') + return + + if game['awnser'] == 0: + bot.msg(settings['wa_user'], player + ': Je kunt op dit moment geen antwoorden insturen.') + return + + if players.count(player) == 0: + bot.msg(settings['wa_user'], player + ': Je speelt niet mee.') + return + + if game['awnserok'].count(player) == 1: + return + + loccounter = players.index(player) + game['round'] + if loccounter > len(locations): + loccounter = loccounter - len(locations) + + if awnser == locations[loccounter][2]: + game['awnserok'].append(player) + bot.msg(settings['wa_user'], player + ': Goed') + bot.msg(settings['wa_user'], player + ': Aanwijzing ' + str(game['round']) + ': ' + locations[loccounter][3]) + bot.msg(channel, 'De groep van ' + player + ' heeft een goed antwoord gegeven.') + else: + bot.msg(settings['wa_user'], player + ': Fout') + +@module.rule('<(.*)>\s\Dplossing\s(.*)\s(.*)\s(.*)') +def gamesolution(bot, trigger): + """ + Let the players give the solution to the main question of the game. + """ + global settings, players, game, locations, solution + + player = trigger.group(1) + person = trigger.group(2) + place = trigger.group(3) + weapon = trigger.group(4) + channel = settings['channel'] + + if game['status'] == 0: + bot.msg(settings['wa_user'], player + ': Het spel is nog niet begonnen. Je kunt geen oplossing insturen.') + return + + if players.count(player) == 0: + bot.msg(settings['wa_user'], player + ': Je speelt niet mee.') + return + + if game['solved'].count(player) == 1: + return + + if person == solution['person'] and place == solution['place'] and weapon == solution['weapon']: + game['solved'].append(player) + bot.msg(settings['wa_user'], player + ': Dat is het goede antwoord!') + bot.msg(channel, 'De groep van ' + player + ' heeft de complete zaak opgelost. Als ze er nog niet zijn, zijn ze nu onderweg naar het eindpunt.') + else: + bot.msg(settings['wa_user'], player + ': Dat is niet goed.') + bot.msg(channel, 'De groep van ' + player + ' heeft de verkeerde oplossing gegeven. ' + person + ' , ' + place + ' , ' + weapon + ' is niet het goede antwoord.' ) + +# Not user-callable functions +def startgame(bot): + """ + Start the game itself. + """ + global settings, players, game + + channel = settings['channel'] + game['status'] = '1' + + bot.msg(channel, 'We beginnen het spel! Er spelen ' + str(len(players)) + ' groepjes mee.') + + for player in players: + bot.msg(settings['wa_user'], player + ': In deze persoonlijke chat krijg je de opdrachten voor je groep. Geef ook alleen maar antwoord in deze chat en niet in de groepswhatsapp. De groepswhatsapp kan iedereen lezen. Mocht je de oplossing van het spel weten, dan stuur je het volgende bericht: "oplossing " Daarna ga je naar de moordplek toe.') + + bot.msg(channel, settings['gamequestion']) + + for count in locations: + round(bot) + + bot.msg(channel, 'Dit waren alle aanwijzingen. Hiermee zullen jullie het moeten doen.') + +def stopgame(bot, trigger): + """ + Ends the game and reset all the variables. + """ + global settings, players, game + + nick = trigger.nick + channel = settings['channel'] + + if game['status'] == 0: + bot.msg(channel, 'Het spel was nog niet begonnen.') + return + + bot.msg(channel, 'Het spel is gestopt en gereset.') + + players = [] + game['status'] = 0 + game['round'] = 0 + game['awnserok'] = [] + game['solved'] = [] + +def round(bot): + """ + Play one round. + """ + global settings, players, game, locations + + game['round'] = game['round'] + 1 + channel = settings['channel'] + + bot.msg(channel, 'Ronde: ' + str(game['round'])) + + counter = 1 + for player in players: + loccounter = counter + game['round'] - 1 + if loccounter > len(locations): + loccounter = loccounter - len(locations) + + bot.msg(settings['wa_user'], player + ': De lokatie waar jullie naar toe moeten is: ' + locations[loccounter][0] + '. Hiervoor hebben jullie ' + str(settings['walktime']) + ' minuten de tijd. Over ' + str(settings['walktime']) + ' minuten hoor je weer van mij.') + counter = counter + 1 + + time.sleep(settings['walktime'] * 60) + + game['awnser'] = 1 + + counter = 1 + for player in players: + loccounter = counter + game['round'] - 1 + if loccounter > len(locations): + loccounter = loccounter - len(locations) + + bot.msg(settings['wa_user'], player + ': Stuur het antwoord als volgt: "antwoord ". Jullie hebben ' + str(settings['playtime']) + ' minuten de tijd voor het antwoord.') + bot.msg(settings['wa_user'], player + ': Vraag ' + str(game['round']) + ': ' + locations[loccounter][1]) + counter = counter + 1 + + time.sleep(settings['playtime'] * 60) + + for player in players: + bot.msg(settings['wa_user'], player + ': Einde van ronde: ' + str(game['round']) + '. Antwoorden kunnen niet meer ingestuurd worden.') + + game['awnser'] = 0 + game['awnserok'] = []