Add PrivateMessageSentEvent and fix PrivateMessagePreSendEvent (#3432)

This PR introduces a new private messaging related event `PrivateMessageSentEvent` and fixes a mistake made on my part during the implementation of `PrivateMessagePreSendEvent`.

Recently when attempting to use the pre-send event in order to play a sound to the recipient of a message, I found that the event was not completely adequate for my use case. Between the firing of the pre-send event and the end of the delivery attempt, the message delivery could fail for a number of reasons (e.g. messages toggled off, sender ignored, unreachable recipient) with no straightforward way of determining this using the existing event.

I believe that a second event fired after the message sending attempt has been fully processed will provide a simple method of determining whether or not a message was successfully delivered by including the [`MessageResponse`](60f54ee37d/Essentials/src/com/earth2me/essentials/messaging/IMessageRecipient.java (L84)) in the event.

Additionally, I found that when implementing the pre-send event, I mistakenly passed an incorrect reference for the `sender` meaning that currently there's no clean or reliable way to determine if `sender` is the `Console` or a `User` (`instanceof` doesn't work, which leaves checking by name or using reflection).
This commit is contained in:
triagonal 2020-07-07 04:34:13 +10:00 committed by GitHub
parent c668879070
commit 0a73be2082
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 4 deletions

View file

@ -4,6 +4,7 @@ import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.IUser;
import com.earth2me.essentials.User;
import net.ess3.api.events.PrivateMessagePreSendEvent;
import net.ess3.api.events.PrivateMessageSentEvent;
import java.lang.ref.WeakReference;
@ -63,13 +64,13 @@ public class SimpleMessageRecipient implements IMessageRecipient {
}
@Override public MessageResponse sendMessage(IMessageRecipient recipient, String message) {
final PrivateMessagePreSendEvent event = new PrivateMessagePreSendEvent(this, recipient, message);
ess.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
final PrivateMessagePreSendEvent preSendEvent = new PrivateMessagePreSendEvent(parent, recipient, message);
ess.getServer().getPluginManager().callEvent(preSendEvent);
if (preSendEvent.isCancelled()) {
return MessageResponse.EVENT_CANCELLED;
}
message = event.getMessage();
message = preSendEvent.getMessage();
MessageResponse messageResponse = recipient.onReceiveMessage(this.parent, message);
switch (messageResponse) {
case UNREACHABLE:
@ -116,6 +117,10 @@ public class SimpleMessageRecipient implements IMessageRecipient {
if (messageResponse.isSuccess()) {
setReplyRecipient(recipient);
}
final PrivateMessageSentEvent sentEvent = new PrivateMessageSentEvent(parent, recipient, message, messageResponse);
ess.getServer().getPluginManager().callEvent(sentEvent);
return messageResponse;
}