From ebb40028921290abc96dad5e106f575876aae6ac Mon Sep 17 00:00:00 2001 From: bvn13 Date: Mon, 4 Nov 2019 10:12:52 +0300 Subject: [PATCH] fixed bug: double answering with deferred message if user prints into chat very quickly --- pom.xml | 4 +--- .../listeners/DeferredMessagesListener.java | 22 +++++++++++++------ src/main/resources/application.properties | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 9d5b9d9..478086b 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ ru.bvn13 jircbot - 2.2.1 + 2.2.2 jar @@ -18,8 +18,6 @@ - 2.2.1 - 1.8 2.3-SNAPSHOT diff --git a/src/main/java/ru/bvn13/jircbot/listeners/DeferredMessagesListener.java b/src/main/java/ru/bvn13/jircbot/listeners/DeferredMessagesListener.java index 77b7c04..756a587 100644 --- a/src/main/java/ru/bvn13/jircbot/listeners/DeferredMessagesListener.java +++ b/src/main/java/ru/bvn13/jircbot/listeners/DeferredMessagesListener.java @@ -16,7 +16,10 @@ import ru.bvn13.jircbot.documentation.DocumentationProvider; import ru.bvn13.jircbot.documentation.ListenerDescription; import java.text.SimpleDateFormat; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import static ru.bvn13.jircbot.documentation.ListenerDescription.CommandDescription; @@ -36,6 +39,8 @@ public class DeferredMessagesListener extends ImprovedListenerAdapter implements private DeferredMessageService deferredMessageService; + private Map mutexes = new ConcurrentHashMap<>(); + @Autowired public DeferredMessagesListener(DocumentationProvider documentationProvider) { registerDescription(documentationProvider); @@ -127,18 +132,21 @@ public class DeferredMessagesListener extends ImprovedListenerAdapter implements } - private void sendDeferredMessage(final MessageEvent event) { if (event.getUser() != null) { String userIdent = event.getUser().getNick() + "!" + event.getUser().getLogin() + "@" + event.getUser().getHostname(); + Object mutex = mutexes.containsKey(userIdent) ? mutexes.get(userIdent) : new Object(); + mutexes.put(userIdent, mutex); - List deferredMessages = deferredMessageService.getDeferredMessagesForUser(this.getChannelName(event), event.getUser().getNick().toLowerCase(), userIdent); - if (deferredMessages != null && deferredMessages.size() > 0) { - DeferredMessage msg = deferredMessages.get(0); - String more = "" + (deferredMessages.size() > 1 ? " (" + (deferredMessages.size() - 1) + " message/-s more)" : ""); - event.respond("User " + msg.getSender() + " at " + dt.format(msg.getDtCreated()) + " told you" + more + ": " + msg.getMessage()); - deferredMessageService.markMessageWasSent(msg); + synchronized (mutex) { + List deferredMessages = deferredMessageService.getDeferredMessagesForUser(this.getChannelName(event), event.getUser().getNick().toLowerCase(), userIdent); + if (deferredMessages != null && deferredMessages.size() > 0) { + DeferredMessage msg = deferredMessages.get(0); + String more = "" + (deferredMessages.size() > 1 ? " (" + (deferredMessages.size() - 1) + " message/-s more)" : ""); + event.respond("User " + msg.getSender() + " at " + dt.format(msg.getDtCreated()) + " told you" + more + ": " + msg.getMessage()); + deferredMessageService.markMessageWasSent(msg); + } } } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index cf5671d..58fffab 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1,5 @@ -jircbot.version=2.2.1 +jircbot.version=2.2.2 jircbot.config=config.json