Do +v/-v
This commit is contained in:
parent
46084d4f64
commit
3d29e2c994
28
botcmd.py
28
botcmd.py
|
@ -10,6 +10,22 @@ irc_chan = None
|
||||||
|
|
||||||
game_channel = 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):
|
class GameLoop(threading.Thread):
|
||||||
def __init__(self, irc, chan, irc_chan):
|
def __init__(self, irc, chan, irc_chan):
|
||||||
self.irc = irc
|
self.irc = irc
|
||||||
|
@ -58,9 +74,19 @@ class GameLoop(threading.Thread):
|
||||||
event = self.chan.recv()
|
event = self.chan.recv()
|
||||||
return event
|
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):
|
def run(self):
|
||||||
try:
|
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:
|
except Exception as err:
|
||||||
self.send('Crash! (%s, %s)' % (type(err), repr(err)))
|
self.send('Crash! (%s, %s)' % (type(err), repr(err)))
|
||||||
finally:
|
finally:
|
||||||
|
|
140
gameloop.py
140
gameloop.py
|
@ -33,73 +33,9 @@ class Player:
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return id(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
|
class Error: pass
|
||||||
|
|
||||||
def game(send, notice, get_event):
|
def game(send, notice, voice, devoice, get_event):
|
||||||
def error(message):
|
def error(message):
|
||||||
send('Error: %s' % message)
|
send('Error: %s' % message)
|
||||||
|
|
||||||
|
@ -262,6 +198,7 @@ def game(send, notice, get_event):
|
||||||
nick, = args
|
nick, = args
|
||||||
if nick not in players:
|
if nick not in players:
|
||||||
add_player(nick)
|
add_player(nick)
|
||||||
|
voice(nick)
|
||||||
send('%s has joined' % nick)
|
send('%s has joined' % nick)
|
||||||
else:
|
else:
|
||||||
send('%s has already joined' % nick)
|
send('%s has already joined' % nick)
|
||||||
|
@ -272,6 +209,7 @@ def game(send, notice, get_event):
|
||||||
send('No such player %s' % nick)
|
send('No such player %s' % nick)
|
||||||
|
|
||||||
elif errwrapper('Could not remove player %s (%%s)' % nick, remove_player, nick) is not Error:
|
elif errwrapper('Could not remove player %s (%%s)' % nick, remove_player, nick) is not Error:
|
||||||
|
devoice(nick)
|
||||||
send('%s has left the game' % nick)
|
send('%s has left the game' % nick)
|
||||||
|
|
||||||
elif event == events.players:
|
elif event == events.players:
|
||||||
|
@ -318,6 +256,9 @@ def game(send, notice, get_event):
|
||||||
|
|
||||||
def no_game():
|
def no_game():
|
||||||
nonlocal players, decks, limit, round_number, round_call_card, czar, card_choices
|
nonlocal players, decks, limit, round_number, round_call_card, czar, card_choices
|
||||||
|
if players is not None:
|
||||||
|
devoice(players)
|
||||||
|
|
||||||
players = {}
|
players = {}
|
||||||
decks = {}
|
decks = {}
|
||||||
limit = Limit(limit_types.points, 5)
|
limit = Limit(limit_types.points, 5)
|
||||||
|
@ -336,6 +277,7 @@ def game(send, notice, get_event):
|
||||||
nick, *rest = args
|
nick, *rest = args
|
||||||
|
|
||||||
add_player(nick)
|
add_player(nick)
|
||||||
|
voice(nick)
|
||||||
|
|
||||||
send('%s started a game, !join to join!' % nick)
|
send('%s started a game, !join to join!' % nick)
|
||||||
|
|
||||||
|
@ -801,4 +743,70 @@ def game(send, notice, get_event):
|
||||||
state = state()
|
state = state()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
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)
|
||||||
|
|
Loading…
Reference in New Issue