diff --git a/lib/nntp/tiny/session.py b/lib/nntp/tiny/session.py index 4adee06..bf873c8 100644 --- a/lib/nntp/tiny/session.py +++ b/lib/nntp/tiny/session.py @@ -588,6 +588,62 @@ class Session(): return self.end() + def _message_overview(self, message: Message) -> dict: + return map(lambda s: s.replace('\t', ' '), [ + str(message.id), + message.subject, + message.sender, + message.created_on.isoformat(), + message.message_id, + message.parent_id or '', + str(len(message.body)), + str(message.body.count('\n') + 1), + ]) + + def _cmd_over(self, identifier: Optional[str]=None): + if identifier is None: + 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) + + message = self.db.get(Message, self.article_id) + + if message is None: + return self.respond(ResponseCode.NNTP_ARTICLE_INVALID_NUMBER) + elif identifier[0] == '<': + message = self.db.query(Message, { + 'message_id': identifier + }).fetchone() + + if message is None: + return self.respond(ResponseCode.NNTP_ARTICLE_NOT_FOUND_ID) + else: + if self.newsgroup is None: + return self.respond(ResponseCode.NNTP_NEWSGROUP_NOT_SELECTED) + + msgrange = MessageRange.parse(identifier) + + sql = f"select * from {Message.name} where " + sql += " newsgroup_id = ? and " + msgrange.where() + + cr = self.db.query_sql(Message, sql, (self.newsgroup.id,)) + + first = True + + for message in cr.each(): + if first: + first = False + self.respond(ResponseCode.NNTP_OVERVIEW_FOLLOWS) + + overview = self._message_overview(message) + + self.print('|'.join(overview)) + + if first: + return self.respond(ResponseCode.NNTP_ARTICLE_NOT_FOUND_RANGE) + def _cmd_stat(self, identifier: Optional[str]=None): if self.newsgroup is None: return self.respond(ResponseCode.NNTP_NEWSGROUP_NOT_SELECTED) @@ -659,6 +715,7 @@ class Session(): 'ARTICLE': _cmd_article, 'HDR': _cmd_hdr, 'XHDR': _cmd_hdr, + 'OVER': _cmd_over, 'STAT': _cmd_stat, 'DATE': _cmd_date, 'QUIT': _cmd_quit,