From 97078ffedec729b814e85cd0b81d4d8e82ce1dc2 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Tue, 26 Nov 2024 12:08:56 -0500 Subject: [PATCH] Implement LAST, NEXT commands --- lib/nntp/tiny/session.py | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/lib/nntp/tiny/session.py b/lib/nntp/tiny/session.py index a685b0b..40c9ebe 100644 --- a/lib/nntp/tiny/session.py +++ b/lib/nntp/tiny/session.py @@ -191,6 +191,60 @@ class Session(): return self.respond(ResponseCode.NNTP_GROUP_LISTING, text) + def _cmd_last(self): + if self.newsgroup is None: + return self.respond(ResponseCode.NNTP_NEWSGROUP_NOT_SELECTED) + + if self.article_id is None: + return self.respond(ResponseCode.NNTP_ARTICLE_INVALID_NUMBER) + + sql = """ + select + max(id) + from + newsgroup_message + where + newsgroup_id = ? + and id < ? + """ + + cr = self.db.execute(sql, (self.newsgroup.id, self.article_id)) + row = cr.fetchone() + + if row is None or row[0] is None: + return self.respond(ResponseCode.NNTP_ARTICLE_NO_PREVIOUS) + + self.article_id = row[0] + + return self.respond(ResponseCode.NNTP_ARTICLE_STAT_RESPONSE) + + def _cmd_next(self): + if self.newsgroup is None: + return self.respond(ResponseCode.NNTP_NEWSGROUP_NOT_SELECTED) + + if self.article_id is None: + return self.respond(ResponseCode.NNTP_ARTICLE_INVALID_NUMBER) + + sql = """ + select + min(id) + from + newsgroup_message + where + newsgroup_id = ? + and id > ? + """ + + cr = self.db.execute(sql, (self.newsgroup.id, self.article_id)) + row = cr.fetchone() + + if row is None or row[0] is None: + return self.respond(ResponseCode.NNTP_ARTICLE_NO_NEXT) + + self.article_id = row[0] + + return self.respond(ResponseCode.NNTP_ARTICLE_STAT_RESPONSE) + def _newsgroup_summary(self, newsgroup: Newsgroup) -> str: sql = """ select @@ -587,6 +641,8 @@ class Session(): 'CAPABILITIES': _cmd_capabilities, 'MODE': _cmd_mode, 'GROUP': _cmd_group, + 'LAST': _cmd_last, + 'NEXT': _cmd_next, 'LISTGROUP': _cmd_listgroup, 'LIST': _cmd_list, 'NEWNEWS': _cmd_newnews,