Implement OVER command
This commit is contained in:
parent
2084b4c19a
commit
072cf46c1e
1 changed files with 57 additions and 0 deletions
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue