|
@@ -29,6 +29,75 @@ def get_response(msg, name, score):
|
|
|
return RollbotResponse(msg, txt=f"It is done! {name} has been cursed {fmt_times(score.curses)} and blessed {fmt_times(score.blessings)} in this chat.")
|
|
|
|
|
|
|
|
|
+def curse_agg(db, msg, args):
|
|
|
+ name, _ = pop_arg(args)
|
|
|
+ person_id = name.strip().lower()
|
|
|
+ curses = 0
|
|
|
+ blessings = 0
|
|
|
+ for cbs in db.query(CurseBlessScore).filter(CurseBlessScore.person_id == person_id):
|
|
|
+ curses += cbs.curses
|
|
|
+ blessings += cbs.blessings
|
|
|
+ return RollbotResponse(msg, txt=f"From my records, {name} has been cursed {fmt_times(curses)} and blessed {fmt_times(blessings)} across all chats.")
|
|
|
+
|
|
|
+
|
|
|
+def curse_clear(db, msg, args):
|
|
|
+ name, _ = pop_arg(args)
|
|
|
+ if name is None:
|
|
|
+ return RollbotResponse(msg, txt=f"Sorry! I need to know who's records you're trying to clear!")
|
|
|
+ person_id = name.strip().lower()
|
|
|
+ if not msg.from_admin:
|
|
|
+ return RollbotResponse(msg, failure=RollbotFailure.PERMISSIONS)
|
|
|
+ cbs = db.query(CurseBlessScore).get((msg.group_id, person_id))
|
|
|
+ if cbs is None:
|
|
|
+ return RollbotResponse(msg, txt=f"Sorry! I don't know who {name} is!")
|
|
|
+ oc = cbs.curses
|
|
|
+ ob = cbs.blessings
|
|
|
+ cbs.curses = 0
|
|
|
+ cbs.blessings = 0
|
|
|
+ return RollbotResponse(msg, txt=f"Done! I have cleared all records of {name} in this chat, who was previously cursed {fmt_times(oc)} and blessed {fmt_times(ob)}!")
|
|
|
+
|
|
|
+
|
|
|
+def curse_clearall(db, msg, args):
|
|
|
+ name, _ = pop_arg(args)
|
|
|
+ if name is None:
|
|
|
+ return RollbotResponse(msg, txt=f"Sorry! I need to know who's records you're trying to clear!")
|
|
|
+ person_id = name.strip().lower()
|
|
|
+ if not msg.from_admin:
|
|
|
+ return RollbotResponse(msg, failure=RollbotFailure.PERMISSIONS)
|
|
|
+ cnt = 0
|
|
|
+ oc = 0
|
|
|
+ ob = 0
|
|
|
+ for cbs in db.query(CurseBlessScore).filter(CurseBlessScore.person_id == person_id):
|
|
|
+ oc += cbs.curses
|
|
|
+ ob += cbs.blessings
|
|
|
+ cbs.curses = 0
|
|
|
+ cbs.blessings = 0
|
|
|
+ cnt += 1
|
|
|
+ if cnt == 0:
|
|
|
+ return RollbotResponse(msg, txt=f"Sorry! I don't know who {name} is!")
|
|
|
+ return RollbotResponse(msg, txt=f"Done! I have cleared all records of {name} in all chats, who was previously cursed {fmt_times(oc)} and blessed {fmt_times(ob)} in total!")
|
|
|
+
|
|
|
+
|
|
|
+def curse_top(db, msg, args):
|
|
|
+ rankings = "\n".join(f"{i + 1}. {cbs.person_id.capitalize()} was cursed {fmt_times(cbs.curses)}"
|
|
|
+ for i, cbs in enumerate(db.query(CurseBlessScore
|
|
|
+ ).filter(CurseBlessScore.group_id == msg.group_id
|
|
|
+ ).filter(CurseBlessScore.curses != 0
|
|
|
+ ).order_by(CurseBlessScore.curses.desc()
|
|
|
+ ).limit(10)))
|
|
|
+ if len(rankings) == 0:
|
|
|
+ return RollbotResponse(msg, txt="Sorry! I don't have enough curse history in this chat to give statistics.")
|
|
|
+ return RollbotResponse(msg, txt=f"The worst offenders of this chat:\n{rankings}")
|
|
|
+
|
|
|
+
|
|
|
+SUBC_MAP = {
|
|
|
+ "aggregate": curse_agg,
|
|
|
+ "clear": curse_clear,
|
|
|
+ "clearall": curse_clearall,
|
|
|
+ "top": curse_top,
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
@as_plugin
|
|
|
def curse(db, msg):
|
|
|
# TODO might be nice to add subcommands to this later
|
|
@@ -45,45 +114,8 @@ def curse(db, msg):
|
|
|
# handle the case of spaces between ! and subcommand
|
|
|
subc, args = pop_arg(args)
|
|
|
subc = subc.lower()
|
|
|
- name, _ = pop_arg(args)
|
|
|
- person_id = name.strip().lower()
|
|
|
-
|
|
|
- if subc == "aggregate":
|
|
|
- curses = 0
|
|
|
- blessings = 0
|
|
|
- for cbs in db.query(CurseBlessScore).filter(CurseBlessScore.person_id == person_id):
|
|
|
- curses += cbs.curses
|
|
|
- blessings += cbs.blessings
|
|
|
- return RollbotResponse(msg, txt=f"From my records, {name} has been cursed {fmt_times(curses)} and blessed {fmt_times(blessings)} across all chats.")
|
|
|
- elif subc == "clear":
|
|
|
- if not msg.from_admin:
|
|
|
- return RollbotResponse(msg, failure=RollbotFailure.PERMISSIONS)
|
|
|
- cbs = db.query(CurseBlessScore).get((msg.group_id, person_id))
|
|
|
- if cbs:
|
|
|
- oc = cbs.curses
|
|
|
- ob = cbs.blessings
|
|
|
- cbs.curses = 0
|
|
|
- cbs.blessings = 0
|
|
|
- return RollbotResponse(msg, txt=f"Done! I have cleared all records of {name} in this chat, who was previously cursed {fmt_times(oc)} and blessed {fmt_times(ob)}!")
|
|
|
- return RollbotResponse(msg, txt=f"Sorry! I don't know who {name} is!")
|
|
|
- elif subc == "clearall":
|
|
|
- if not msg.from_admin:
|
|
|
- return RollbotResponse(msg, failure=RollbotFailure.PERMISSIONS)
|
|
|
- cnt = 0
|
|
|
- oc = 0
|
|
|
- ob = 0
|
|
|
- for cbs in db.query(CurseBlessScore).filter(CurseBlessScore.person_id == person_id):
|
|
|
- oc += cbs.curses
|
|
|
- ob += cbs.blessings
|
|
|
- cbs.curses = 0
|
|
|
- cbs.blessings = 0
|
|
|
- cnt += 1
|
|
|
- if cnt == 0:
|
|
|
- return RollbotResponse(msg, txt=f"Sorry! I don't know who {name} is!")
|
|
|
- return RollbotResponse(msg, txt=f"Done! I have cleared all records of {name} in all chats, who was previously cursed {fmt_times(oc)} and blessed {fmt_times(ob)} in total!")
|
|
|
- else:
|
|
|
- return RollbotResponse(msg, failure=RollbotFailure.INVALID_SUBCOMMAND)
|
|
|
|
|
|
+ return SUBC_MAP.get(subc, lambda *a: RollbotResponse(msg, failure=RollbotFailure.INVALID_SUBCOMMAND))(db, msg, args)
|
|
|
|
|
|
|
|
|
@as_plugin
|