Essentials/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java

180 lines
7.0 KiB
Java

package net.essentialsx.discordlink.listeners;
import com.earth2me.essentials.utils.FormatUtil;
import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent;
import net.essentialsx.api.v2.events.UserMailEvent;
import net.essentialsx.api.v2.events.discord.DiscordMessageEvent;
import net.essentialsx.api.v2.events.discordlink.DiscordLinkStatusChangeEvent;
import net.essentialsx.api.v2.services.discord.MessageType;
import net.essentialsx.discord.util.MessageUtil;
import net.essentialsx.discordlink.DiscordLinkSettings;
import net.essentialsx.discordlink.EssentialsDiscordLink;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import static com.earth2me.essentials.I18n.tl;
public class LinkBukkitListener implements Listener {
private final EssentialsDiscordLink ess;
public LinkBukkitListener(EssentialsDiscordLink ess) {
this.ess = ess;
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMail(final UserMailEvent event) {
if (!ess.getSettings().isRelayMail()) {
return;
}
final String discordId = ess.getLinkManager().getDiscordId(event.getRecipient().getBase().getUniqueId());
if (discordId == null) {
return;
}
final String sanitizedName = MessageUtil.sanitizeDiscordMarkdown(event.getMessage().getSenderUsername());
final String sanitizedMessage = MessageUtil.sanitizeDiscordMarkdown(FormatUtil.stripFormat(event.getMessage().getMessage()));
ess.getApi().getMemberById(discordId).thenAccept(member -> {
member.sendPrivateMessage(tl("discordMailLine", sanitizedName, sanitizedMessage));
});
}
@EventHandler(priority = EventPriority.HIGH)
public void onConnect(final AsyncPlayerPreLoginEvent event) {
if (ess.getSettings().getLinkPolicy() != DiscordLinkSettings.LinkPolicy.KICK) {
return;
}
if (!ess.getLinkManager().isLinked(event.getUniqueId())) {
String code;
try {
code = ess.getLinkManager().createCode(event.getUniqueId());
} catch (IllegalArgumentException e) {
code = e.getMessage();
}
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, tl("discordLinkLoginKick", "/link " + code, ess.getApi().getInviteUrl()));
}
}
@EventHandler(priority = EventPriority.LOW)
public void onInteract(final PlayerInteractEvent event) {
if (ess.getSettings().getLinkPolicy() != DiscordLinkSettings.LinkPolicy.FREEZE) {
return;
}
if (!ess.getLinkManager().isLinked(event.getPlayer().getUniqueId())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW)
public void onCommand(final PlayerCommandPreprocessEvent event) {
if (ess.getSettings().getLinkPolicy() != DiscordLinkSettings.LinkPolicy.FREEZE) {
return;
}
//todo maybe allowed commands
if (!ess.getLinkManager().isLinked(event.getPlayer().getUniqueId())) {
event.setCancelled(true);
String code;
try {
code = ess.getLinkManager().createCode(event.getPlayer().getUniqueId());
} catch (IllegalArgumentException e) {
code = e.getMessage();
}
event.getPlayer().sendMessage(tl("discordLinkLoginPrompt", "/link " + code, ess.getApi().getInviteUrl()));
}
}
@EventHandler(priority = EventPriority.LOW)
public void onChat(final AsyncPlayerChatEvent event) {
if (ess.getSettings().getLinkPolicy() != DiscordLinkSettings.LinkPolicy.FREEZE) {
return;
}
if (!ess.getLinkManager().isLinked(event.getPlayer().getUniqueId())) {
event.setCancelled(true);
String code;
try {
code = ess.getLinkManager().createCode(event.getPlayer().getUniqueId());
} catch (IllegalArgumentException e) {
code = e.getMessage();
}
event.getPlayer().sendMessage(tl("discordLinkLoginPrompt", "/link " + code, ess.getApi().getInviteUrl()));
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onUserDataLoad(final AsyncUserDataLoadEvent event) {
if (ess.getSettings().getLinkPolicy() != DiscordLinkSettings.LinkPolicy.FREEZE) {
return;
}
if (!ess.getLinkManager().isLinked(event.getUser().getBase().getUniqueId())) {
event.getUser().setFreeze(true);
String code;
try {
code = ess.getLinkManager().createCode(event.getUser().getBase().getUniqueId());
} catch (IllegalArgumentException e) {
code = e.getMessage();
}
event.getUser().sendMessage(tl("discordLinkLoginPrompt", "/link " + code, ess.getApi().getInviteUrl()));
}
}
@EventHandler(priority = EventPriority.HIGH)
public void onDiscordMessage(final DiscordMessageEvent event) {
if (ess.getSettings().isBlockUnlinkedChat() && event.getType() == MessageType.DefaultTypes.CHAT && !ess.getLinkManager().isLinked(event.getUUID())) {
event.setCancelled(true);
}
}
@EventHandler
public void onUserLinkStatusChange(final DiscordLinkStatusChangeEvent event) {
if (event.isLinked()) {
event.getUser().setFreeze(false);
return;
}
switch (ess.getSettings().getLinkPolicy()) {
case KICK: {
String code;
try {
code = ess.getLinkManager().createCode(event.getUser().getBase().getUniqueId());
} catch (IllegalArgumentException e) {
code = e.getMessage();
}
final String finalCode = code;
final Runnable kickTask = () -> event.getUser().getBase().kickPlayer(tl("discordLinkLoginKick", "/link " + finalCode, ess.getApi().getInviteUrl()));
if (Bukkit.isPrimaryThread()) {
kickTask.run();
} else {
ess.getEss().scheduleSyncDelayedTask(kickTask);
}
break;
}
case FREEZE: {
String code;
try {
code = ess.getLinkManager().createCode(event.getUser().getBase().getUniqueId());
} catch (IllegalArgumentException e) {
code = e.getMessage();
}
event.getUser().sendMessage(tl("discordLinkLoginPrompt", "/link " + code, ess.getApi().getInviteUrl()));
event.getUser().setFreeze(true);
break;
}
default: {
break;
}
}
}
}