diff --git a/lib/nntp/tiny/client.py b/lib/nntp/tiny/client.py index 6ab015b..21814bf 100644 --- a/lib/nntp/tiny/client.py +++ b/lib/nntp/tiny/client.py @@ -3,10 +3,13 @@ import socket import ssl import datetime +from typing import Optional + from nntp.tiny.socket import Connection from nntp.tiny.host import Host from nntp.tiny.response import Response, ResponseCode from nntp.tiny.remote import RemoteNewsgroup +from nntp.tiny.message import MessageRange class ClientException(Exception): pass diff --git a/lib/nntp/tiny/session.py b/lib/nntp/tiny/session.py index e59d0cb..d6a304e 100644 --- a/lib/nntp/tiny/session.py +++ b/lib/nntp/tiny/session.py @@ -199,19 +199,27 @@ class Session(Connection): return self.respond(ResponseCode.NNTP_ARTICLE_STAT_RESPONSE) - def _newsgroup_summary(self, newsgroup: Newsgroup) -> str: + def _newsgroup_summary(self, newsgroup: Newsgroup, since: Optional[datetime.datetime]=None) -> str: sql = """ select - count(message_id), - min(message_id), - max(message_id) + count(newsgroup_message.message_id), + min(newsgroup_message.message_id), + max(newsgroup_message.message_id) from - newsgroup_message + newsgroup_message, + message where - newsgroup_id = ? + message.id = newsgroup_message.message_id + and newsgroup_message.newsgroup_id = ? """ - cr = self.db.execute(sql, (newsgroup.id,)) + values = [newsgroup.id] + + if since is not None: + sql += " and message.created_on >= ?" + values.append(since.isoformat()) + + cr = self.db.execute(sql, values) row = cr.fetchone() return { @@ -269,8 +277,8 @@ class Session(Connection): return self.end() - def print_newsgroup(self, newsgroup: Newsgroup): - summary = self._newsgroup_summary(newsgroup) + def print_newsgroup(self, newsgroup: Newsgroup, since: Optional[datetime.datetime]=None): + summary = self._newsgroup_summary(newsgroup, since) return self.print("%s %d %d %s" % ( summary['name'], @@ -485,13 +493,15 @@ class Session(Connection): elif len(args) > 1: return self.respond(ResponseCode.NNTP_SYNTAX_ERROR, "Too many arguments") + timestamp = self._parse_date_time(datestr, timestr) + self.respond(ResponseCode.NNTP_GROUPS_NEW_FOLLOW) for name in self.server.newsgroups: if fnmatch.fnmatch(name, wildmat): newsgroup = self.server.newsgroups[name] - self.print_newsgroup(newsgroup) + self.print_newsgroup(newsgroup, timestamp) return self.end()