Implement method to fetch message summaries from newsgroups
This commit is contained in:
parent
616e767c0c
commit
7824c8e47b
2 changed files with 52 additions and 7 deletions
|
@ -2,15 +2,19 @@ import re
|
||||||
import socket
|
import socket
|
||||||
import ssl
|
import ssl
|
||||||
import datetime
|
import datetime
|
||||||
|
import email.utils
|
||||||
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from nntp.tiny.socket import Connection
|
from nntp.tiny.socket import Connection
|
||||||
from nntp.tiny.host import Host
|
from nntp.tiny.host import Host
|
||||||
from nntp.tiny.response import Response, ResponseCode
|
from nntp.tiny.response import Response, ResponseCode
|
||||||
from nntp.tiny.remote import RemoteNewsgroup
|
|
||||||
from nntp.tiny.message import MessageRange
|
from nntp.tiny.message import MessageRange
|
||||||
|
|
||||||
|
from nntp.tiny.remote import (
|
||||||
|
RemoteException, RemoteNewsgroup, RemoteMessage
|
||||||
|
)
|
||||||
|
|
||||||
class ClientException(Exception):
|
class ClientException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -62,7 +66,12 @@ class Client(Connection):
|
||||||
def request(self, *args):
|
def request(self, *args):
|
||||||
self.print(' '.join(args))
|
self.print(' '.join(args))
|
||||||
|
|
||||||
return self._read_response()
|
response = self._read_response()
|
||||||
|
|
||||||
|
if response.code.value >= 400:
|
||||||
|
raise RemoteException(response)
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
def each_response_line(self):
|
def each_response_line(self):
|
||||||
while True:
|
while True:
|
||||||
|
@ -88,9 +97,33 @@ class Client(Connection):
|
||||||
parts = self.RE_SPLIT.split(line)
|
parts = self.RE_SPLIT.split(line)
|
||||||
|
|
||||||
if len(parts) != 4:
|
if len(parts) != 4:
|
||||||
raise ClientException('Unexpected result from NEWGROUPS')
|
raise RemoteException('Unexpected result from NEWGROUPS')
|
||||||
|
|
||||||
yield RemoteNewsgroup(parts[0],
|
yield RemoteNewsgroup(parts[0],
|
||||||
int(parts[1]),
|
int(parts[1]),
|
||||||
int(parts[2]),
|
int(parts[2]),
|
||||||
parts[3] == 'y')
|
parts[3] == 'y')
|
||||||
|
|
||||||
|
def each_newsgroup_message(self, newsgroup: RemoteNewsgroup, msgrange: Optional[MessageRange]):
|
||||||
|
self.request('GROUP', newsgroup.name)
|
||||||
|
self.request('OVER', str(msgrange))
|
||||||
|
|
||||||
|
for line in self.each_response_line():
|
||||||
|
message = RemoteMessage()
|
||||||
|
parts = line.split('\t')
|
||||||
|
|
||||||
|
message.id = int(parts[0])
|
||||||
|
message.subject = parts[1]
|
||||||
|
message.sender = parts[2]
|
||||||
|
message.created_on = email.utils.parsedate_to_datetime(parts[3])
|
||||||
|
message.message_id = parts[4]
|
||||||
|
message.references = parts[5]
|
||||||
|
message.size = int(parts[6])
|
||||||
|
message.lines = int(parts[7])
|
||||||
|
|
||||||
|
for part in parts[8:]:
|
||||||
|
key, value = part.split(': ')
|
||||||
|
|
||||||
|
message.headers[key] = value
|
||||||
|
|
||||||
|
yield message
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
|
class RemoteException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
class RemoteNewsgroup():
|
class RemoteNewsgroup():
|
||||||
__slots__ = 'name', 'low', 'high', 'post',
|
__slots__ = 'name', 'low', 'high', 'post',
|
||||||
|
|
||||||
def __init__(self, name: str, low: int, high: int, post: bool):
|
def __init__(self, name: str, low: int, high: int, post: bool):
|
||||||
self.name = name
|
self.name: str = name
|
||||||
self.low = low
|
self.low: int = low
|
||||||
self.high = high
|
self.high: int = high
|
||||||
self.post = post
|
self.post: bool = post
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s %d %d %s" % (
|
return "%s %d %d %s" % (
|
||||||
|
@ -14,3 +17,12 @@ class RemoteNewsgroup():
|
||||||
self.high,
|
self.high,
|
||||||
'y' if self.post else 'n'
|
'y' if self.post else 'n'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class RemoteMessage():
|
||||||
|
__slots__ = (
|
||||||
|
'id', 'subject', 'sender', 'created_on', 'message_id',
|
||||||
|
'references', 'size', 'lines', 'headers'
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.headers = dict()
|
||||||
|
|
Loading…
Add table
Reference in a new issue