mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
refactor for clearer algorithm
This commit is contained in:
@@ -33,15 +33,30 @@ class Relay:
|
|||||||
|
|
||||||
|
|
||||||
class Message:
|
class Message:
|
||||||
def __init__(self, sender, recipients, msgtype, payload):
|
def __init__(self, sender, **payload):
|
||||||
self.sender = sender
|
self.sender = sender
|
||||||
self.recipients = recipients
|
self.recipients = list(sender.members)
|
||||||
self.msgtype = msgtype
|
|
||||||
self.payload = payload
|
self.payload = payload
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
nums = repr_peers(self.recipients)
|
nums = repr_peers(self.recipients)
|
||||||
return f"<Message {self.sender.id}->{nums} {self.msgtype} {self.payload}"
|
return f"<{self.__class__.__name__} {self.sender.id}->{nums} {self.payload}"
|
||||||
|
|
||||||
|
|
||||||
|
class AddMemberMessage(Message):
|
||||||
|
def receive_imf(self, peer):
|
||||||
|
peer.members.add(self.payload["newmember"])
|
||||||
|
peer.members.update(self.recipients)
|
||||||
|
|
||||||
|
class DelMemberMessage(Message):
|
||||||
|
def receive_imf(self, peer):
|
||||||
|
member = self.payload["member"]
|
||||||
|
if member in peer.members:
|
||||||
|
peer.members.remove(member)
|
||||||
|
|
||||||
|
class ChatMessage(Message):
|
||||||
|
def receive_imf(self, peer):
|
||||||
|
peer.members.update(self.recipients)
|
||||||
|
|
||||||
|
|
||||||
class Peer:
|
class Peer:
|
||||||
@@ -71,35 +86,29 @@ class Peer:
|
|||||||
|
|
||||||
def add_member(self, newmember):
|
def add_member(self, newmember):
|
||||||
self.members.add(newmember)
|
self.members.add(newmember)
|
||||||
self.queue_message(msgtype="addmember", newmember=newmember)
|
message = AddMemberMessage(self, newmember=newmember)
|
||||||
|
self.queue_message(message)
|
||||||
|
|
||||||
def del_member(self, member):
|
def del_member(self, member):
|
||||||
self.queue_message(msgtype="delmember", member=member)
|
message = DelMemberMessage(self, member=member)
|
||||||
|
self.queue_message(message)
|
||||||
self.members.remove(member)
|
self.members.remove(member)
|
||||||
|
|
||||||
def send_chatmessage(self):
|
def send_chatmessage(self):
|
||||||
self.queue_message(msgtype="chatmessage")
|
message = ChatMessage(self)
|
||||||
|
self.queue_message(message)
|
||||||
|
|
||||||
def queue_message(self, msgtype, **payload):
|
def queue_message(self, message):
|
||||||
msg = Message(self, list(self.members), msgtype, payload)
|
|
||||||
for peer in self.members:
|
for peer in self.members:
|
||||||
peer.from2mailbox.setdefault(self, []).append(msg)
|
peer.from2mailbox.setdefault(self, []).append(message)
|
||||||
|
|
||||||
|
|
||||||
### processing group membership message
|
### processing group membership message
|
||||||
|
|
||||||
|
|
||||||
def drain_mailbox(peer, from_peer):
|
def drain_mailbox(peer, from_peer):
|
||||||
for msg in peer.from2mailbox.get(from_peer, []):
|
for msg in peer.from2mailbox.get(from_peer, []):
|
||||||
if msg.msgtype == "addmember":
|
msg.receive_imf(peer)
|
||||||
peer.members.add(msg.payload["newmember"])
|
|
||||||
peer.members.update(msg.recipients)
|
|
||||||
elif msg.msgtype == "delmember":
|
|
||||||
member = msg.payload["member"]
|
|
||||||
if member in peer.members:
|
|
||||||
peer.members.remove(member)
|
|
||||||
elif msg.msgtype == "chatmessage":
|
|
||||||
peer.members.update(msg.recipients)
|
|
||||||
|
|
||||||
|
|
||||||
### Tests
|
### Tests
|
||||||
|
|||||||
Reference in New Issue
Block a user