Rework how the !rolestats command parses its arguments (#350)
Now it tries completing the everything as a role first before attempting to complete it as a gamemode.
This commit is contained in:
parent
1e91f1a907
commit
d2ed485995
44
src/db.py
44
src/db.py
@ -512,23 +512,47 @@ def get_role_stats(role, mode=None):
|
|||||||
else:
|
else:
|
||||||
return "No stats for \u0002{0}\u0002 in \u0002{1}\u0002.".format(role, mode)
|
return "No stats for \u0002{0}\u0002 in \u0002{1}\u0002.".format(role, mode)
|
||||||
|
|
||||||
def get_role_totals():
|
def get_role_totals(mode=None):
|
||||||
conn = _conn()
|
conn = _conn()
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
c.execute("SELECT COUNT(1) FROM game")
|
if mode is None:
|
||||||
|
c.execute("SELECT COUNT(1) FROM game")
|
||||||
|
else:
|
||||||
|
c.execute("SELECT COUNT(1) FROM game WHERE gamemode = ?", (mode,))
|
||||||
total_games = c.fetchone()[0]
|
total_games = c.fetchone()[0]
|
||||||
if not total_games:
|
if not total_games:
|
||||||
return "No games played."
|
if mode is None:
|
||||||
c.execute("""SELECT
|
return "No games played."
|
||||||
gpr.role AS role,
|
else:
|
||||||
COUNT(1) AS count
|
return "No games played in the \u0002{0}\u0002 gamemode".format(mode)
|
||||||
FROM game_player_role gpr
|
|
||||||
GROUP BY role
|
if mode is None:
|
||||||
ORDER BY count DESC""")
|
c.execute("""SELECT
|
||||||
|
gpr.role AS role,
|
||||||
|
COUNT(1) AS count
|
||||||
|
FROM game_player_role gpr
|
||||||
|
GROUP BY role
|
||||||
|
ORDER BY count DESC""")
|
||||||
|
else:
|
||||||
|
c.execute("""SELECT
|
||||||
|
gpr.role AS role,
|
||||||
|
COUNT(1) AS count
|
||||||
|
FROM game_player_role gpr
|
||||||
|
JOIN game_player gp
|
||||||
|
ON gp.id = gpr.game_player
|
||||||
|
JOIN game g
|
||||||
|
ON g.id = gp.game
|
||||||
|
WHERE g.gamemode = ?
|
||||||
|
GROUP BY role
|
||||||
|
ORDER BY count DESC""", (mode,))
|
||||||
|
|
||||||
totals = []
|
totals = []
|
||||||
for row in c:
|
for row in c:
|
||||||
totals.append("\u0002{0}\u0002: {1}".format(*row))
|
totals.append("\u0002{0}\u0002: {1}".format(*row))
|
||||||
return "Total games: {0} | {1}".format(total_games, ", ".join(totals))
|
if mode is None:
|
||||||
|
return "Total games: {0} | {1}".format(total_games, ", ".join(totals))
|
||||||
|
else:
|
||||||
|
return "\u0002{0}\u0002 games: {1} | {2}".format(mode, total_games, ", ".join(totals))
|
||||||
|
|
||||||
|
|
||||||
def get_warning_points(acc, hostmask):
|
def get_warning_points(acc, hostmask):
|
||||||
|
@ -376,7 +376,7 @@ def get_victim(cli, nick, victim, in_chan, self_in_list=False, bot_in_list=False
|
|||||||
|
|
||||||
class InvalidModeException(Exception): pass
|
class InvalidModeException(Exception): pass
|
||||||
|
|
||||||
def complete_role(var, wrapper, role):
|
def complete_role(var, role):
|
||||||
if role not in var.ROLE_GUIDE.keys():
|
if role not in var.ROLE_GUIDE.keys():
|
||||||
special_keys = {"lover"}
|
special_keys = {"lover"}
|
||||||
evt = Event("get_role_metadata", {})
|
evt = Event("get_role_metadata", {})
|
||||||
@ -387,12 +387,8 @@ def complete_role(var, wrapper, role):
|
|||||||
else:
|
else:
|
||||||
matches = complete_match(role, var.ROLE_GUIDE.keys() | special_keys)
|
matches = complete_match(role, var.ROLE_GUIDE.keys() | special_keys)
|
||||||
if not matches:
|
if not matches:
|
||||||
wrapper.reply(messages["no_such_role"].format(role))
|
return []
|
||||||
return False
|
return matches
|
||||||
if len(matches) > 1:
|
return [role]
|
||||||
wrapper.reply(messages["ambiguous_role"].format(", ".join(matches)))
|
|
||||||
return False
|
|
||||||
return matches[0]
|
|
||||||
return role
|
|
||||||
|
|
||||||
# vim: set sw=4 expandtab:
|
# vim: set sw=4 expandtab:
|
||||||
|
@ -5591,30 +5591,47 @@ def role_stats(var, wrapper, rest):
|
|||||||
wrapper.pm(messages["stats_wait_for_game_end"])
|
wrapper.pm(messages["stats_wait_for_game_end"])
|
||||||
return
|
return
|
||||||
|
|
||||||
rest = rest.split()
|
params = rest.split()
|
||||||
if len(rest) == 0:
|
|
||||||
|
if len(params) == 0:
|
||||||
# this is a long message
|
# this is a long message
|
||||||
wrapper.pm(db.get_role_totals())
|
wrapper.pm(db.get_role_totals())
|
||||||
elif len(rest) == 1 or (rest[-1] == "all" and rest.pop()):
|
return
|
||||||
role = complete_role(var, wrapper, " ".join(rest))
|
|
||||||
if role:
|
roles = complete_role(var, rest)
|
||||||
wrapper.reply(db.get_role_stats(role))
|
if params[-1] == "all" and len(roles) != 1:
|
||||||
else:
|
roles = complete_role(var, " ".join(params[:-1]))
|
||||||
role = complete_role(var, wrapper, " ".join(rest[:-1]))
|
if len(roles) == 1:
|
||||||
if not role:
|
wrapper.reply(db.get_role_stats(roles[0]))
|
||||||
|
return
|
||||||
|
|
||||||
|
gamemode = params[-1]
|
||||||
|
if gamemode not in var.GAME_MODES.keys():
|
||||||
|
matches = complete_match(gamemode, var.GAME_MODES.keys())
|
||||||
|
if len(matches) == 1:
|
||||||
|
gamemode = matches[0]
|
||||||
|
else:
|
||||||
|
if len(roles) > 0:
|
||||||
|
wrapper.pm(messages["ambiguous_role"].format(", ".join(roles)))
|
||||||
|
elif len(matches) > 0:
|
||||||
|
wrapper.pm(messages["ambiguous_mode"].format(gamemode, ", ".join(matches)))
|
||||||
|
else:
|
||||||
|
wrapper.pm(messages["no_such_role"].format(rest))
|
||||||
return
|
return
|
||||||
gamemode = rest[-1]
|
|
||||||
if gamemode not in var.GAME_MODES.keys():
|
if len(params) == 1:
|
||||||
matches = complete_match(gamemode, var.GAME_MODES.keys())
|
wrapper.pm(db.get_role_totals(gamemode))
|
||||||
if len(matches) == 1:
|
return
|
||||||
gamemode = matches[0]
|
|
||||||
if not matches:
|
role = " ".join(params[:-1])
|
||||||
wrapper.pm(messages["invalid_mode"].format(rest[1]))
|
roles = complete_role(var, role)
|
||||||
return
|
if len(roles) != 1:
|
||||||
if len(matches) > 1:
|
if len(roles) == 0:
|
||||||
wrapper.pm(messages["ambiguous_mode"].format(rest[1], ", ".join(matches)))
|
wrapper.pm(messages["no_such_role"].format(role))
|
||||||
return
|
else:
|
||||||
wrapper.reply(db.get_role_stats(role, gamemode))
|
wrapper.pm(messages["ambiguous_role"].format(", ".join(roles)))
|
||||||
|
return
|
||||||
|
wrapper.reply(db.get_role_stats(roles[0], gamemode))
|
||||||
|
|
||||||
# Called from !game and !join, used to vote for a game mode
|
# Called from !game and !join, used to vote for a game mode
|
||||||
def vote_gamemode(var, wrapper, gamemode, doreply):
|
def vote_gamemode(var, wrapper, gamemode, doreply):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user