Ignore duplicate messages
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
This commit is contained in:
parent
17ca4d105f
commit
ebd6c18032
|
@ -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()
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue