From a476821ca8eba5709d3d11f64ecb841d5c2eb465 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Mon, 25 Nov 2024 15:53:32 -0500 Subject: [PATCH] Implement LIST NEWSGROUPS --- lib/nntp/tiny/session.py | 85 +++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/lib/nntp/tiny/session.py b/lib/nntp/tiny/session.py index df6ad50..812b0a2 100644 --- a/lib/nntp/tiny/session.py +++ b/lib/nntp/tiny/session.py @@ -223,8 +223,63 @@ class Session(): return self.end() + def _newsgroup_summary(self, newsgroup: Newsgroup): + sql = """ + select + min(id), + max(id) + from + newsgroup_message + where + newsgroup_id = ? + """ + + cr = self.db.execute(sql, (newsgroup.id,)) + row = cr.fetchone() + + return { + 'low': row[0], + 'high': row[1], + 'perms': 'n' + } + + + def print_newsgroup(self, newsgroup: Newsgroup): + summary = self._newsgroup_summary(newsgroup) + + return self.print("%s %d %d %s" % ( + newsgroup.name, + summary['low'], + summary['high'], + summary['perms'] + )) + + def _cmd_list_newsgroups(self): + self.respond(ResponseCode.NNTP_INFORMATION_FOLLOWS) + + for name in self.server.newsgroups: + newsgroup = self.server.newsgroups[name] + + self.print_newsgroup(newsgroup) + + return self.end() + + LIST_SUBCOMMANDS = { + 'NEWSGROUPS': _cmd_list_newsgroups, + } + def _cmd_list(self, *args): - pass + if len(args) == 0: + return self.respond(ResponseCode.NNTP_SYNTAX_ERROR, "No subcommand provided") + + subcmd, *subargs = args + + fn = self.LIST_SUBCOMMANDS.get(subcmd.upper()) + + if fn is None: + return self.respond(ResponseCode.NNTP_COMMAND_UNKNOWN) + + return fn(self, *subargs) RE_DATE_SHORT = re.compile(r'^(\d{2})(\d{2})(\d{2})$') RE_DATE_LONG = re.compile(r'^(\d{4})(\d{2})(\d{2})$') @@ -291,26 +346,6 @@ class Session(): return self.end() - def _newsgroup_summary(self, newsgroup: Newsgroup): - sql = """ - select - min(id), - max(id) - from - newsgroup_message - where - newsgroup_id = ? - """ - - cr = self.db.execute(sql, (newsgroup.id,)) - row = cr.fetchone() - - return { - 'min': row[0], - 'max': row[1], - 'perms': 'n' - } - def _cmd_newgroups(self, wildmat, datestr, timestr, *args): gmt = False @@ -327,14 +362,8 @@ class Session(): for name in self.server.newsgroups: if fnmatch.fnmatch(name, wildmat): newsgroup = self.server.newsgroups[name] - summary = self._newsgroup_summary(newsgroup) - self.print("%s %d %d %s" % ( - newsgroup.name, - summary['min'], - summary['max'], - summary['perms'] - )) + self.print_newsgroup(newsgroup) return self.end()