Ignore duplicate messages

Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
This commit is contained in:
Yohann D'ANELLO 2020-12-21 16:04:16 +01:00
parent 17ca4d105f
commit ebd6c18032
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
2 changed files with 37 additions and 2 deletions

View File

@ -1,6 +1,6 @@
# Copyright (C) 2020 by eichhornchen, ÿnérant
# SPDX-License-Identifier: GPL-3.0-or-later
from datetime import datetime
from typing import Any, Tuple
from ipaddress import IPv6Address
from threading import Thread
@ -49,6 +49,7 @@ class Squirrel(Hazelnut):
self.last_line = -1
self.history = []
self.received_messages = dict()
self.history_pad = curses.newpad(curses.LINES - 2, curses.COLS)
self.input_pad = curses.newpad(1, curses.COLS)
self.emoji_pad = curses.newpad(18, 12)
@ -252,6 +253,19 @@ class Squirrel(Hazelnut):
if self.last_line == len(self.history) - 2:
self.last_line += 1
def receive_message_from(self, msg: str, sender_id: int, nonce: int) -> bool:
"""
This method is called by a DataTLV, sent by a real person.
This add the message in the history if not already done.
Returns True iff the message was not already received previously.
"""
if (sender_id, nonce) in self.received_messages:
return False
self.add_message(msg)
self.received_messages[(sender_id, nonce)] = Message(msg, sender_id, nonce)
return True
def add_system_message(self, msg: str) -> None:
"""
Add a new system log message.
@ -457,3 +471,21 @@ class Worm(Thread):
tlv.handle(self.squirrel, hazelnut)
self.squirrel.refresh_history()
self.squirrel.refresh_input()
class Message:
"""
This class symbolises the data sent by a real client, excluding system messages.
This is useful to check unicity or to save and load messages.
"""
content: str
# TODO: Replace the id by the good (potential) hazel
sender_id: int
nonce: int
created_at: datetime
def __init__(self, content: str, sender_id: int, nonce: int, created_at: datetime = None):
self.content = content
self.sender_id = sender_id
self.nonce = nonce
self.created_at = created_at or datetime.now()

View File

@ -208,7 +208,10 @@ class DataTLV(TLV):
TODO: Check that the tuple (sender_id, nonce) is unique to avoid duplicates.
"""
msg = self.data.decode('UTF-8')
squirrel.add_message(msg)
if not squirrel.receive_message_from(msg, self.sender_id, self.nonce):
# The message was already received
return
nickname_match = re.match("(.*): (.*)", msg)
if nickname_match is None:
squirrel.send_packet(sender, Packet.construct(WarningTLV.construct(