This commit is contained in:
Juhani Krekelä 2019-05-06 16:00:55 +03:00
parent 46084d4f64
commit 3d29e2c994
2 changed files with 101 additions and 67 deletions

View File

@ -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:

View File

@ -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)