فهرست منبع

Merge branch 'feature/curse-v2' of kirkleon/rollbot3 into master

kirkleon 6 سال پیش
والد
کامیت
04a5e66963
1فایلهای تغییر یافته به همراه70 افزوده شده و 38 حذف شده
  1. 70 38
      src/plugins/curse.py

+ 70 - 38
src/plugins/curse.py

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