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 <pratyush.desai@liberta.casa>
This commit is contained in:
Pratyush Desai 2024-12-15 21:00:42 +05:30
parent 77030f9092
commit ea1814e166
Signed by: pratyush
GPG Key ID: DBA5BB7505946FAD

199
plugin.py
View File

@ -75,75 +75,101 @@ class TripsitServerCallback(httpserver.SupyHTTPServerCallback):
self.plugin = plugin # to access db self.plugin = plugin # to access db
def doGet(self, handler, path): def doGet(self, handler, path):
# '/doses'
if path == '/doses': if path == '/doses':
nick = 'mogad0n' # Collect all dose logs from self.db
dose_logs = self.plugin.db.get(nick, {}).get('doses', []) 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 # Create HTML response
response = """ html_response = """
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Dose Logs</title> <title>Dose Logs</title>
<style>
table {
width: 100%;
border-collapse: collapse;
}
table, th, td {
border: 1px solid black;
}
th, td {
padding: 8px;
text-align: left;
}
#filter {
margin-bottom: 10px;
padding: 5px;
width: 300px;
}
</style>
</head> </head>
<body> <body>
<h1>Dose Logs for {}</h1> <h1>Dose Logs</h1>
<table border="1"> <input type="text" id="filter" placeholder="Search for nicknames, drugs, etc.">
<table id="doseTable">
<thead>
<tr> <tr>
<th>Nick</th>
<th>Time</th> <th>Time</th>
<th>Dose</th> <th>Dose</th>
<th>Drug</th> <th>Drug</th>
<th>Method</th> <th>Method</th>
</tr> </tr>
""".format(nick) </thead>
<tbody>
"""
# Add rows for each dose log
for log in dose_logs: for log in dose_logs:
response += """ html_response += f"""
<tr> <tr>
<td>{}</td> <td>{log['nick']}</td>
<td>{}</td> <td>{log['time']}</td>
<td>{}</td> <td>{log['dose']}</td>
<td>{}</td> <td>{log['drug']}</td>
<td>{log['method']}</td>
</tr> </tr>
""".format( """
log['time'],
log['dose'],
log['drug'],
log['method']
)
response += """ html_response += """
</tbody>
</table> </table>
<script>
// Filter table rows based on input
document.getElementById('filter').addEventListener('input', function() {
const filter = this.value.toLowerCase();
const rows = document.querySelectorAll('#doseTable tbody tr');
rows.forEach(row => {
const text = row.innerText.toLowerCase();
row.style.display = text.includes(filter) ? '' : 'none';
});
});
</script>
</body> </body>
</html> </html>
""" """
# Response # Send the HTML response
handler.send_response(200) handler.send_response(200)
handler.send_header('Content-type', 'text/html') handler.send_header('Content-type', 'text/html')
handler.end_headers() handler.end_headers()
handler.wfile.write(response.encode('utf-8')) handler.wfile.write(html_response.encode('utf-8'))
return else:
# 404 response for unknown paths
# handle unknown paths
handler.send_response(404) handler.send_response(404)
handler.send_header('Content-type', 'text/html') handler.send_header('Content-type', 'text/html')
handler.end_headers() handler.end_headers()
handler.wfile.write(b""" handler.wfile.write(b"<h1>404 Not Found</h1>")
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
<p>The requested resource was not found on this server.</p>
</body>
</html>
""")
class Tripsit(callbacks.Plugin): class Tripsit(callbacks.Plugin):
"""Harm-Reduction tools from tripsit's tripbot and the tripsitwiki""" """Harm-Reduction tools from tripsit's tripbot and the tripsitwiki"""
@ -294,7 +320,102 @@ class Tripsit(callbacks.Plugin):
This command takes no arguments. This command takes no arguments.
Retrieves the number of doses logged for a given nick 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 = """
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Dose Logs</title>
<style>
table {
width: 100%;
border-collapse: collapse;
}
table, th, td {
border: 1px solid black;
}
th, td {
padding: 8px;
text-align: left;
}
#filter {
margin-bottom: 10px;
padding: 5px;
width: 300px;
}
</style>
</head>
<body>
<h1>Dose Logs</h1>
<input type="text" id="filter" placeholder="Search for nicknames, drugs, etc.">
<table id="doseTable">
<thead>
<tr>
<th>Nick</th>
<th>Time</th>
<th>Dose</th>
<th>Drug</th>
<th>Method</th>
</tr>
</thead>
<tbody>
""" """
# Add rows for each dose log
for log in dose_logs:
html_response += f"""
<tr>
<td>{log['nick']}</td>
<td>{log['time']}</td>
<td>{log['dose']}</td>
<td>{log['drug']}</td>
<td>{log['method']}</td>
</tr>
"""
html_response += """
</tbody>
</table>
<script>
// Filter table rows based on input
document.getElementById('filter').addEventListener('input', function() {
const filter = this.value.toLowerCase();
const rows = document.querySelectorAll('#doseTable tbody tr');
rows.forEach(row => {
const text = row.innerText.toLowerCase();
row.style.display = text.includes(filter) ? '' : 'none';
});
});
</script>
</body>
</html>
"""
# 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"<h1>404 Not Found</h1>")
nick = msg.nick nick = msg.nick
if nick in self.db: if nick in self.db:
try: try: