From 3d29e2c994fe942f8010c7cbcfeca255b8cfc6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Mon, 6 May 2019 16:00:55 +0300 Subject: [PATCH] Do +v/-v --- botcmd.py | 28 ++++++++++- gameloop.py | 140 +++++++++++++++++++++++++++------------------------- 2 files changed, 101 insertions(+), 67 deletions(-) diff --git a/botcmd.py b/botcmd.py index ff1b3de..0931837 100644 --- a/botcmd.py +++ b/botcmd.py @@ -10,6 +10,22 @@ irc_chan = None game_channel = None +def chunk(l, n): + assert 0 < n + chunked = [] + + item = [] + for i in l: + if len(item) >= n: + chunked.append(item) + item = [] + item.append(i) + + if len(item) > 0: + chunked.append(item) + + return chunked + class GameLoop(threading.Thread): def __init__(self, irc, chan, irc_chan): self.irc = irc @@ -58,9 +74,19 @@ class GameLoop(threading.Thread): event = self.chan.recv() return event + def voice(self, nicks): + if type(nicks) == str: nicks = [nicks] + for nicks in chunk(nicks, 4): + self.irc.send_raw(b'MODE %s +%s %s' % (self.irc_chan, b'v'*len(nicks), b' '.join(i.encode() for i in nicks))) + + def devoice(self, nicks): + if type(nicks) == str: nicks = [nicks] + for nicks in chunk(nicks, 4): + self.irc.send_raw(b'MODE %s -%s %s' % (self.irc_chan, b'v'*len(nicks), b' '.join(i.encode() for i in nicks))) + def run(self): try: - gameloop.game(self.send, self.notice, self.get_event) + gameloop.game(self.send, self.notice, self.voice, self.devoice, self.get_event) except Exception as err: self.send('Crash! (%s, %s)' % (type(err), repr(err))) finally: diff --git a/gameloop.py b/gameloop.py index 83e619e..db33793 100644 --- a/gameloop.py +++ b/gameloop.py @@ -33,73 +33,9 @@ class Player: def __hash__(self): return id(self) -def get_event(): - while True: - try: - t = input('> ') - except EOFError: - return (events.quit,) - - if t == 'nick': - old = input('old> ') - new = input('new> ') - return (events.nick_change, old, new) - elif t == 'start': - nick = input('nick> ') - return (events.start, nick) - elif t == 'ready': - nick = input('nick> ') - return (events.ready, nick) - elif t == 'unready': - nick = input('nick> ') - return (events.unready, nick) - elif t == 'status': - return (events.status,) - elif t == 'kill': - return (events.kill,) - elif t == 'join': - nick = input('nick> ') - return (events.join, nick) - elif t == 'leave': - nick = input('nick> ') - return (events.leave, nick) - elif t == 'players': - return (events.players,) - elif t == 'deck add': - code = input('code> ') - return (events.deck_add, code) - elif t == 'deck add random': - return (events.deck_add_random,) - elif t == 'deck remove': - code = input('code> ') - return (events.deck_remove, code) - elif t == 'deck list': - return (events.deck_list,) - elif t == 'limit': - return (events.limit,) - elif t == 'limit_set': - limit_type = {'r': limit_types.rounds, 'p': limit_types.points}[input('type (p/r)> ')] - number = int(input('limit> ')) - return (events.limit, limit_type, number) - elif t == 'card': - nick = input('nick> ') - choice = [int(i) for i in input('choice> ').split()] - return (events.card, nick, choice) - elif t == 'cards': - nick = input('nick> ') - return (events.cards, nick) - else: - print('?') - -def send(text): - print(text) - -def notice(nick, text): - print('\t', nick, text) - class Error: pass -def game(send, notice, get_event): +def game(send, notice, voice, devoice, get_event): def error(message): send('Error: %s' % message) @@ -262,6 +198,7 @@ def game(send, notice, get_event): nick, = args if nick not in players: add_player(nick) + voice(nick) send('%s has joined' % nick) else: send('%s has already joined' % nick) @@ -272,6 +209,7 @@ def game(send, notice, get_event): send('No such player %s' % nick) elif errwrapper('Could not remove player %s (%%s)' % nick, remove_player, nick) is not Error: + devoice(nick) send('%s has left the game' % nick) elif event == events.players: @@ -318,6 +256,9 @@ def game(send, notice, get_event): def no_game(): nonlocal players, decks, limit, round_number, round_call_card, czar, card_choices + if players is not None: + devoice(players) + players = {} decks = {} limit = Limit(limit_types.points, 5) @@ -336,6 +277,7 @@ def game(send, notice, get_event): nick, *rest = args add_player(nick) + voice(nick) send('%s started a game, !join to join!' % nick) @@ -801,4 +743,70 @@ def game(send, notice, get_event): state = state() if __name__ == '__main__': - game(send, notice, get_event) + def get_event(): + while True: + try: + t = input('> ') + except EOFError: + return (events.quit,) + + if t == 'nick': + old = input('old> ') + new = input('new> ') + return (events.nick_change, old, new) + elif t == 'start': + nick = input('nick> ') + return (events.start, nick) + elif t == 'ready': + nick = input('nick> ') + return (events.ready, nick) + elif t == 'unready': + nick = input('nick> ') + return (events.unready, nick) + elif t == 'status': + return (events.status,) + elif t == 'kill': + return (events.kill,) + elif t == 'join': + nick = input('nick> ') + return (events.join, nick) + elif t == 'leave': + nick = input('nick> ') + return (events.leave, nick) + elif t == 'players': + return (events.players,) + elif t == 'deck add': + code = input('code> ') + return (events.deck_add, code) + elif t == 'deck add random': + return (events.deck_add_random,) + elif t == 'deck remove': + code = input('code> ') + return (events.deck_remove, code) + elif t == 'deck list': + return (events.deck_list,) + elif t == 'limit': + return (events.limit,) + elif t == 'limit_set': + limit_type = {'r': limit_types.rounds, 'p': limit_types.points}[input('type (p/r)> ')] + number = int(input('limit> ')) + return (events.limit, limit_type, number) + elif t == 'card': + nick = input('nick> ') + choice = [int(i) for i in input('choice> ').split()] + return (events.card, nick, choice) + elif t == 'cards': + nick = input('nick> ') + return (events.cards, nick) + else: + print('?') + + def send(text): + print(text) + + def notice(nick, text): + print('\t', nick, text) + + def nop(*args, **kwargs): pass + + game(send, notice, nop, nop, get_event)