Extend the usage function and add descriptions for commands
User-facing help text is now kept in a dictionary where command tuples map to help entries. This greatly simplifies maintenance should more commands be added in the future. Additionally, every command now has a short description that serves to give players a quick overview of its functionality.
This commit is contained in:
parent
221b740bce
commit
2f8fb69dbf
86
botcmd.py
86
botcmd.py
|
@ -1,5 +1,6 @@
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
import channel
|
import channel
|
||||||
|
|
||||||
|
@ -13,6 +14,8 @@ irc_chan = None
|
||||||
|
|
||||||
game_channel = None
|
game_channel = None
|
||||||
|
|
||||||
|
HelpEntry = namedtuple('HelpEntry', ['synopsis', 'desc', 'is_sub'])
|
||||||
|
|
||||||
def chunk(l, n):
|
def chunk(l, n):
|
||||||
assert 0 < n
|
assert 0 < n
|
||||||
chunked = []
|
chunked = []
|
||||||
|
@ -122,6 +125,33 @@ def send_event(event):
|
||||||
game_channel.send(event)
|
game_channel.send(event)
|
||||||
|
|
||||||
def usage(command):
|
def usage(command):
|
||||||
|
entries = {
|
||||||
|
('status',) : HelpEntry('!status', 'Show the game status.', False),
|
||||||
|
('ready',) : HelpEntry('!ready', 'Mark yourself as ready.', False),
|
||||||
|
('unready',) : HelpEntry('!unready', 'Mark yourself as not ready.', False),
|
||||||
|
('kill',) : HelpEntry('!kill', 'Stop the game.', False),
|
||||||
|
('leave',) : HelpEntry('!leave', 'Leave the game.', False),
|
||||||
|
('players',) : HelpEntry('!players', 'Show a list of players.', False),
|
||||||
|
('cards',) : HelpEntry('!cards', 'Show the cards in your hand.', False),
|
||||||
|
('origins',) : HelpEntry('!origins', 'Show the cardcast codes of the decks containing the cards that can be picked currently.', False),
|
||||||
|
('redeal',) : HelpEntry('!redeal', 'Remove all cards from your hand and redeal.', False),
|
||||||
|
('start',) : HelpEntry('!start [<preset>]', 'Start a game with the specified preset. If no preset is given, use "default". Available presets are: default, empty, offtopia, offtopia-random', False),
|
||||||
|
('join',) : HelpEntry('!join [<message>]', 'Join the game with the specified message.', False),
|
||||||
|
('kick',) : HelpEntry('!kick <nick>', 'Kick the specified player from the game.', False),
|
||||||
|
('card',) : HelpEntry('[!card] <number[,number,...]> ...', 'Pick the specified cards. If multiple numbers are specified for a single pick, play one of them at random.', False),
|
||||||
|
('jape',) : HelpEntry('[!jape] <number[,number,...]> ...', 'See !card.', False),
|
||||||
|
('deck',) : HelpEntry('!deck add | remove | list', 'Manage decks.', True),
|
||||||
|
('bot',) : HelpEntry('!bot add | remove', 'Manage bots.', True),
|
||||||
|
('limit',) : HelpEntry('!limit [<number> [<type>]]', 'Show or adjust the win limit. Type can be "r" for rounds and "p" for points.', False),
|
||||||
|
('help',) : HelpEntry('!help [command [subcommand]]', 'Show a synopsis and description for the specified command.', False),
|
||||||
|
|
||||||
|
('deck', 'add') : HelpEntry('!deck add <code> | random', 'Add the deck with the specified cardcast code (or pick one randomly).', False),
|
||||||
|
('deck', 'remove') : HelpEntry('!deck remove <code>', 'Remove the deck with the specified cardcast code.', False),
|
||||||
|
('deck', 'list') : HelpEntry('!deck list', 'List selected decks.', False),
|
||||||
|
('bot', 'add') : HelpEntry('!bot add <type> [<name>]', 'Add a bot of the specified type and name. If the name is omitted, name the bot after its type.', False),
|
||||||
|
('bot', 'remove') : HelpEntry('!bot remove <name>', 'Remove the specified bot.', False),
|
||||||
|
}
|
||||||
|
|
||||||
if type(command) == str:
|
if type(command) == str:
|
||||||
command = [command]
|
command = [command]
|
||||||
|
|
||||||
|
@ -130,55 +160,17 @@ def usage(command):
|
||||||
command[0] = command[0][1:]
|
command[0] = command[0][1:]
|
||||||
|
|
||||||
if len(command) == 0:
|
if len(command) == 0:
|
||||||
return '!status !start !ready !unready !kill !join !leave !players !kick !deck !limit !card !cards !origins !redeal !help'
|
return ' '.join(sorted(set('!' + cmd[0] for cmd in entries.keys())))
|
||||||
|
elif len(command) > 2:
|
||||||
elif len(command) == 1:
|
|
||||||
if command[0] in ('status', 'ready', 'unready', 'kill', 'join', 'leave', 'players', 'cards', 'origins', 'redeal'):
|
|
||||||
return 'Usage: !%s' % (command[0])
|
|
||||||
elif command[0] == 'start':
|
|
||||||
return 'Usage: !start [<preset>]'
|
|
||||||
elif command[0] == 'join':
|
|
||||||
return 'Usage: !join [<message>]'
|
|
||||||
elif command[0] == 'kick':
|
|
||||||
return 'Usage: !kick <nick>'
|
|
||||||
elif command[0] == 'card':
|
|
||||||
return 'Usage: [!card] <number[,number,...]> ...'
|
|
||||||
elif command[0] == 'jape':
|
|
||||||
return 'Usage: [!jape] <number[,number,...]> ...'
|
|
||||||
elif command[0] == 'deck':
|
|
||||||
return 'Subcommands: !deck add | remove | list'
|
|
||||||
elif command[0] == 'bot':
|
|
||||||
return 'Subcommands: !bot add | remove'
|
|
||||||
elif command[0] == 'limit':
|
|
||||||
return 'Usage: !limit [<number> [<type>]]'
|
|
||||||
elif command[0] == 'help':
|
|
||||||
return 'Usage: !help [command [subcommmand]]'
|
|
||||||
else:
|
|
||||||
return 'No such command !%s' % (command[0])
|
|
||||||
|
|
||||||
elif len(command) == 2:
|
|
||||||
if command[0] == 'deck':
|
|
||||||
if command[1] == 'add':
|
|
||||||
return 'Usage: !deck add <code> | random'
|
|
||||||
elif command[1] == 'remove':
|
|
||||||
return 'Usage: !deck remove <code>'
|
|
||||||
elif command[1] == 'list':
|
|
||||||
return 'Usage: !deck list'
|
|
||||||
else:
|
|
||||||
return 'No such subcommand !%s %s' % (command[0], command[1])
|
|
||||||
elif command[0] == 'bot':
|
|
||||||
if command[1] == 'add':
|
|
||||||
return 'Usage: !bot add <type> [<name>]'
|
|
||||||
elif command[1] == 'remove':
|
|
||||||
return 'Usage: !bot remove <name>'
|
|
||||||
else:
|
|
||||||
return 'No such subcommand !%s %s' % (command[0], command[1])
|
|
||||||
else:
|
|
||||||
return 'No such subcommand !%s %s' % (command[0], command[1])
|
|
||||||
|
|
||||||
else:
|
|
||||||
return 'Uh, how did we get %i args?' % len(command)
|
return 'Uh, how did we get %i args?' % len(command)
|
||||||
|
|
||||||
|
key = tuple(command)
|
||||||
|
if key in entries:
|
||||||
|
e = entries[key]
|
||||||
|
return '%s: %s %s' % ('Subcommands' if e.is_sub else 'Usage', e.synopsis, e.desc)
|
||||||
|
else:
|
||||||
|
return 'No such command !%s' % ' '.join(command)
|
||||||
|
|
||||||
def parse_command(message, nick, irc):
|
def parse_command(message, nick, irc):
|
||||||
def send(m):
|
def send(m):
|
||||||
global irc_chan
|
global irc_chan
|
||||||
|
|
Loading…
Reference in New Issue