aboutsummaryrefslogtreecommitdiffstats
path: root/pysite/views/ws/bot.py
diff options
context:
space:
mode:
Diffstat (limited to 'pysite/views/ws/bot.py')
-rw-r--r--pysite/views/ws/bot.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/pysite/views/ws/bot.py b/pysite/views/ws/bot.py
new file mode 100644
index 00000000..24af74df
--- /dev/null
+++ b/pysite/views/ws/bot.py
@@ -0,0 +1,59 @@
+import json
+import logging
+
+from geventwebsocket.websocket import WebSocket
+
+from pysite.constants import BOT_API_KEY
+from pysite.mixins import DBMixin
+from pysite.websockets import WS
+
+
+class BotWebsocket(WS, DBMixin):
+ path = "/bot"
+ name = "ws.bot"
+ table_name = "bot_events"
+
+ do_changefeed = True
+
+ def __init__(self, socket: WebSocket):
+ super().__init__(socket)
+ self.log = logging.getLogger()
+
+ def on_open(self):
+ self.log.debug("Bot | WS opened.")
+
+ def on_message(self, message):
+ self.log.debug(f"Bot | Message: {message}")
+
+ try:
+ message = json.loads(message)
+ except json.JSONDecodeError:
+ self.send_json({"error": "Message was not valid JSON"})
+ return self.socket.close()
+
+ action = message["action"]
+
+ if action == "login":
+ if message["key"] != BOT_API_KEY:
+ return self.socket.close()
+
+ self.do_changefeed = True
+
+ for document in self.db.changes(self.table_name, include_initial=True, include_types=True):
+ if not self.do_changefeed:
+ break
+
+ if document["type"] not in ["add", "initial"]:
+ continue
+
+ self.send_json({"action": "event", "event": document["new_val"]})
+ self.db.delete(self.table_name, document["id"])
+
+ self.send_json({"error": f"Unknown action: {action}"})
+
+ def on_close(self):
+ self.log.debug("Bot | WS closed.")
+ self.do_changefeed = False
+
+ def send_json(self, data):
+ return self.send(json.dumps(data))