Implement LIST NEWSGROUPS
This commit is contained in:
parent
a43fdc9009
commit
a476821ca8
1 changed files with 57 additions and 28 deletions
|
@ -223,8 +223,63 @@ class Session():
|
||||||
|
|
||||||
return self.end()
|
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):
|
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_SHORT = re.compile(r'^(\d{2})(\d{2})(\d{2})$')
|
||||||
RE_DATE_LONG = re.compile(r'^(\d{4})(\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()
|
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):
|
def _cmd_newgroups(self, wildmat, datestr, timestr, *args):
|
||||||
gmt = False
|
gmt = False
|
||||||
|
|
||||||
|
@ -327,14 +362,8 @@ class Session():
|
||||||
for name in self.server.newsgroups:
|
for name in self.server.newsgroups:
|
||||||
if fnmatch.fnmatch(name, wildmat):
|
if fnmatch.fnmatch(name, wildmat):
|
||||||
newsgroup = self.server.newsgroups[name]
|
newsgroup = self.server.newsgroups[name]
|
||||||
summary = self._newsgroup_summary(newsgroup)
|
|
||||||
|
|
||||||
self.print("%s %d %d %s" % (
|
self.print_newsgroup(newsgroup)
|
||||||
newsgroup.name,
|
|
||||||
summary['min'],
|
|
||||||
summary['max'],
|
|
||||||
summary['perms']
|
|
||||||
))
|
|
||||||
|
|
||||||
return self.end()
|
return self.end()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue