Implement LIST NEWSGROUPS

This commit is contained in:
XANTRONIX Development 2024-11-25 15:53:32 -05:00
parent a43fdc9009
commit a476821ca8

View file

@ -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()