From 33b591293750db1de93c2c372706cf2e3b134dee Mon Sep 17 00:00:00 2001 From: Blake DeMarcy Date: Wed, 26 Apr 2017 14:51:03 -0500 Subject: [PATCH] add message feeds --- clients/urwid/main.py | 1 - server.py | 37 +++++++++++++++++++++++++++------ src/db.py | 48 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 7 deletions(-) diff --git a/clients/urwid/main.py b/clients/urwid/main.py index 57bb119..0d7b977 100644 --- a/clients/urwid/main.py +++ b/clients/urwid/main.py @@ -1532,7 +1532,6 @@ class JumpPrompt(Prompt, urwid.IntEdit): self.set_edit_pos(len(value)) - def keypress(self, size, key): keyl = key.lower() if key == "enter": diff --git a/server.py b/server.py index d20432f..cb9a4f8 100644 --- a/server.py +++ b/server.py @@ -211,6 +211,37 @@ class API(object): return threads + @api_method + def message_feed(self, args, database, user, **kwargs): + """ + Returns a special object representing all activity on the board since + the argument `time`, a unix/epoch timestamp. + + { + "threads": { + "thread_id": { + ...thread object + }, + ...more thread_id/object pairs + }, + "messages": [...standard message object array sorted by date] + } + + The message objects in "messages" are the same objects returned + in threads normally. They each have a thread_id parameter, and + you can access metadata for these threads by the "threads" object + which is also provided. + + The "messages" array is already sorted by submission time, newest + first. The order in the threads object is undefined and you should + instead use their `last_mod` attribute if you intend to list them + out visually. + """ + validate(args, ["time"]) + return db.message_feed(database, args["time"]) + + + @api_method def thread_create(self, args, database, user, **kwargs): """ @@ -435,12 +466,6 @@ class API(object): return response - def test(self, **kwargs): - print(cherrypy.request.body.read()) - return "{\"wow\": \"jolly good show!\"}" - test.exposed = True - - def api_http_error(status, message, traceback, version): return json.dumps(schema.error(2, "HTTP error {}: {}".format(status, message))) diff --git a/src/db.py b/src/db.py index 1050e6a..ebb205d 100644 --- a/src/db.py +++ b/src/db.py @@ -30,6 +30,54 @@ import os anon = None + +def message_feed(connection, time): + """ + Returns a special object representing all activity on the board since + the argument `time`, a unix/epoch timestamp. + + { + "threads": { + "thread_id": { + ...thread object + }, + ...more thread_id/object pairs + }, + "messages": [...standard message object array sorted by date] + } + + The message objects in "messages" are the same objects returned + in threads normally. They each have a thread_id parameter, and + you can access metadata for these threads by the "threads" object + which is also provided. + + The "messages" array is already sorted by submission time, newest + first. The order in the threads object is undefined and you should + instead use their `last_mod` attribute if you intend to list them + out visually. + """ + threads = { + obj[0]: schema.thread(*obj) for obj in + connection.execute( + "SELECT * FROM threads WHERE last_mod > ?", (time,)) + } + + messages = list() + for thread in threads.values(): + messages += [ + schema.message(*obj) for obj in + connection.execute(""" + SELECT * FROM messages WHERE thread_id = ? + AND created > ? """, (thread["thread_id"], time)) + ] + + return { + "threads": threads, + "messages": sorted(messages, key=lambda m: m["created"]) + } + + + ### THREADS ### def thread_get(connection, thread_id, messages=True):