Pārlūkot izejas kodu

Finished session next command

Kirk Trombley 6 gadi atpakaļ
vecāks
revīzija
ffdb24a78c
2 mainītis faili ar 72 papildinājumiem un 21 dzēšanām
  1. 54 17
      src/plugins/session.py
  2. 18 4
      src/test_driver.py

+ 54 - 17
src/plugins/session.py

@@ -23,7 +23,12 @@ WEEKDAYS = {
 
 
 def parse_datetime(args):
-    day_date, args = pop_arg(args)
+    try:
+        day_date = next(args)
+    except StopIteration:
+        print(1)
+        return  # must have at least one more argument
+
     day_date = day_date.lower()
     if day_date in WEEKDAYS:
         today = datetime.date.today()
@@ -43,19 +48,35 @@ def parse_datetime(args):
             day = date_parts[1]
             year = datetime.date.today().year
         else:
-            return
+            print(2)
+            return  # invalid format
 
     hour = 19
     minute = 45
-    time, ampm = pop_arg(args)
-    if time is not None:
-        time_parts = time.split(":")
-        hour = time_parts[0]
-        if len(time_parts) > 1:
-            minute = time_parts[1]
-    if ampm is not None:
-        if ampm.lower() == "pm":
-            hour = int(hour) + 12
+
+    try:
+        time = next(args)
+    except StopIteration:
+        return datetime.datetime(
+            int(year), int(month), int(day),
+            int(hour), int(minute)
+        )
+
+    time_parts = time.split(":")
+    hour = time_parts[0]
+    if len(time_parts) > 1:
+        minute = time_parts[1]
+
+    try:
+        ampm = next(args)
+    except StopIteration:
+        return datetime.datetime(
+            int(year), int(month), int(day),
+            int(hour), int(minute)
+        )
+
+    if ampm.lower() == "pm":
+        hour = int(hour) + 12
 
     return datetime.datetime(
         int(year), int(month), int(day),
@@ -63,12 +84,13 @@ def parse_datetime(args):
     )
 
 
+
 def get_upcoming(db):
     return db.query(DnDSession).order_by(DnDSession.session_time).first()
 
 
 def get_fmt_next(db):
-    dt = get_upcoming_time(db).session_time
+    dt = get_upcoming(db).session_time
     if dt is None or dt < datetime.datetime.now():
         return "No upcoming session found."
     else:
@@ -77,23 +99,33 @@ def get_fmt_next(db):
 
 
 def session_next(db, message, args):
-    return RollbotResponse(message, "TODO")
+    dt = parse_datetime(args)
+    if dt is None:
+        return RollbotResponse(
+            message,
+            failure=RollbotFailure.INVALID_ARGUMENTS,
+            debugging={"explain": "Could not process argument as a date/time."}
+        )
+
+    db.add(DnDSession(session_time=dt))
+
+    return RollbotResponse(message, txt=get_fmt_next(db))
 
 
 def session_worst(db, message, args):
-    return RollbotResponse(message, "TODO")
+    return RollbotResponse(message, txt="TODO")
 
 
 def session_view(db, message, args):
-    return RollbotResponse(message, "TODO")
+    return RollbotResponse(message, txt="TODO")
 
 
 def session_late(db, message, args):
-    return RollbotResponse(message, "TODO")
+    return RollbotResponse(message, txt="TODO")
 
 
 def session_cancel(db, message, args):
-    return RollbotResponse(message, "TODO")
+    return RollbotResponse(message, txt="TODO")
 
 
 SUBCOMMANDS = dict(
@@ -104,6 +136,8 @@ SUBCOMMANDS = dict(
     cancel=session_cancel
 )
 
+NEEDS_ADMIN = ("next", "cancel")
+
 
 @as_plugin
 def session(db, message):
@@ -123,4 +157,7 @@ def session(db, message):
             }
         )
 
+    if subcommand in NEEDS_ADMIN and not message.from_admin:
+        return RollbotResponse(message, failure=RollbotFailure.PERMISSIONS)
+
     return SUBCOMMANDS[subcommand](db, message, args)

+ 18 - 4
src/test_driver.py

@@ -4,18 +4,32 @@ import logging
 from rollbot import Rollbot
 from command_system import RollbotMessage
 
+
 rollbot = Rollbot(logging.getLogger(__name__))
-rollbot.start_plugins()
-atexit.register(rollbot.shutdown_plugins)
 
 
-def test_drive(msg):
-    print(rollbot.run_command(RollbotMessage("mock", None, None, None, None, msg)))
+def test_drive(msg, from_admin=True):
+    rmsg = RollbotMessage("mock", None, None, None, None, msg)
+    rmsg.from_admin = from_admin
+    r =rollbot.run_command(rmsg)
+    print(msg, ":", r.txt, ",", r.failure)
 
 
 if __name__ == "__main__":
+    [logging.disable(level) for level in [
+        logging.DEBUG,
+        logging.INFO,
+        logging.WARN,
+        logging.ERROR,
+    ]]
+
+    rollbot.start_plugins()
+    atexit.register(rollbot.shutdown_plugins)
+
     [test_drive(msg) for msg in [
         "!session blah",
+        "!session next",
+        "!session next asdf",
         "!session next Sunday",
         "!session view",
         "!session cancel",