From 77030f9092379397dddc03b319501ff8030b5376 Mon Sep 17 00:00:00 2001 From: Pratyush Desai Date: Thu, 12 Dec 2024 00:24:23 +0530 Subject: [PATCH 1/2] Doselog HTML Table Base Added basic HTTP support to serve doselogs using a simple HTML table. Currently hardcoded to one nick. Signed-off-by: Pratyush Desai --- plugin.py | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/plugin.py b/plugin.py index 34ce165..b643da7 100644 --- a/plugin.py +++ b/plugin.py @@ -31,7 +31,10 @@ from supybot import utils, plugins, ircutils, callbacks, world, conf, log from supybot.commands import * +# HTTP Imports +from supybot import httpserver +# Misc from num2words import num2words import pickle import datetime @@ -63,6 +66,84 @@ METHODS = { "smoked": ["Smoked"] } +class TripsitServerCallback(httpserver.SupyHTTPServerCallback): + name = 'Tripsit' + defaultResponse = """ + This plugin handles only GET request, please don't use other requests.""" + + def __init__(self, plugin): + self.plugin = plugin # to access db + + def doGet(self, handler, path): + # '/doses' + if path == '/doses': + nick = 'mogad0n' + dose_logs = self.plugin.db.get(nick, {}).get('doses', []) + + # HTML + response = """ + + + + + Dose Logs + + +

Dose Logs for {}

+ + + + + + + + """.format(nick) + + for log in dose_logs: + response += """ + + + + + + + """.format( + log['time'], + log['dose'], + log['drug'], + log['method'] + ) + + response += """ +
TimeDoseDrugMethod
{}{}{}{}
+ + + """ + + # Response + handler.send_response(200) + handler.send_header('Content-type', 'text/html') + handler.end_headers() + handler.wfile.write(response.encode('utf-8')) + return + + # handle unknown paths + handler.send_response(404) + handler.send_header('Content-type', 'text/html') + handler.end_headers() + handler.wfile.write(b""" + + + + + 404 Not Found + + +

404 Not Found

+

The requested resource was not found on this server.

+ + + """) class Tripsit(callbacks.Plugin): """Harm-Reduction tools from tripsit's tripbot and the tripsitwiki""" @@ -74,6 +155,7 @@ class Tripsit(callbacks.Plugin): self.db = {} self._loadDb() world.flushers.append(self._flushDb) + httpserver.hook('tripsit', TripsitServerCallback(self)) # register the callback at `/tripsit` def _loadDb(self): """Loads the (flatfile) database mapping nicks to doses.""" @@ -95,6 +177,7 @@ class Tripsit(callbacks.Plugin): def die(self): self._flushDb() + httpserver.unhook('tripsit') world.flushers.remove(self._flushDb) self.__parent.die() -- 2.35.3 From ea1814e166cc236c04a2c3b036baea0315322be5 Mon Sep 17 00:00:00 2001 From: Pratyush Desai Date: Sun, 15 Dec 2024 21:00:42 +0530 Subject: [PATCH 2/2] Finish the base web doselog display The issues are .. One can't load all the doses and then filter dynamically via search. One has to limit records. And it doesn't randomize. Signed-off-by: Pratyush Desai --- plugin.py | 223 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 172 insertions(+), 51 deletions(-) diff --git a/plugin.py b/plugin.py index b643da7..42b3def 100644 --- a/plugin.py +++ b/plugin.py @@ -75,75 +75,101 @@ class TripsitServerCallback(httpserver.SupyHTTPServerCallback): self.plugin = plugin # to access db def doGet(self, handler, path): - # '/doses' if path == '/doses': - nick = 'mogad0n' - dose_logs = self.plugin.db.get(nick, {}).get('doses', []) + # Collect all dose logs from self.db + dose_logs = [] + for nick, data in self.plugin.db.items(): + for dose in data.get('doses', []): + dose_logs.append({ + 'nick': nick, + 'time': dose['time'], + 'dose': dose['dose'], + 'drug': dose['drug'], + 'method': dose['method'], + }) - # HTML - response = """ + # Create HTML response + html_response = """ Dose Logs + -

Dose Logs for {}

- - - - - - - - """.format(nick) - +

Dose Logs

+ +
TimeDoseDrugMethod
+ + + + + + + + + + + """ + # Add rows for each dose log for log in dose_logs: - response += """ - - - - - - - """.format( - log['time'], - log['dose'], - log['drug'], - log['method'] - ) + html_response += f""" + + + + + + + + """ - response += """ + html_response += """ +
NickTimeDoseDrugMethod
{}{}{}{}
{log['nick']}{log['time']}{log['dose']}{log['drug']}{log['method']}
+ """ - # Response + # Send the HTML response handler.send_response(200) handler.send_header('Content-type', 'text/html') handler.end_headers() - handler.wfile.write(response.encode('utf-8')) - return - - # handle unknown paths - handler.send_response(404) - handler.send_header('Content-type', 'text/html') - handler.end_headers() - handler.wfile.write(b""" - - - - - 404 Not Found - - -

404 Not Found

-

The requested resource was not found on this server.

- - - """) + handler.wfile.write(html_response.encode('utf-8')) + else: + # 404 response for unknown paths + handler.send_response(404) + handler.send_header('Content-type', 'text/html') + handler.end_headers() + handler.wfile.write(b"

404 Not Found

") class Tripsit(callbacks.Plugin): """Harm-Reduction tools from tripsit's tripbot and the tripsitwiki""" @@ -294,7 +320,102 @@ class Tripsit(callbacks.Plugin): This command takes no arguments. Retrieves the number of doses logged for a given nick - """ + """ def doGet(self, handler, path): + if path == '/doses': + # Collect all dose logs from self.db + dose_logs = [] + for nick, data in self.plugin.db.items(): + for dose in data.get('doses', []): + dose_logs.append({ + 'nick': nick, + 'time': dose['time'], + 'dose': dose['dose'], + 'drug': dose['drug'], + 'method': dose['method'], + }) + + # Create HTML response + html_response = """ + + + + + Dose Logs + + + +

Dose Logs

+ + + + + + + + + + + + + """ + # Add rows for each dose log + for log in dose_logs: + html_response += f""" + + + + + + + + """ + + html_response += """ + +
NickTimeDoseDrugMethod
{log['nick']}{log['time']}{log['dose']}{log['drug']}{log['method']}
+ + + + """ + + # Send the HTML response + handler.send_response(200) + handler.send_header('Content-type', 'text/html') + handler.end_headers() + handler.wfile.write(html_response.encode('utf-8')) + else: + # 404 response for unknown paths + handler.send_response(404) + handler.send_header('Content-type', 'text/html') + handler.end_headers() + handler.wfile.write(b"

404 Not Found

") nick = msg.nick if nick in self.db: try: -- 2.35.3