diff --git a/src/main/java/world/arainu/core/metaverseplugin/listener/ServerListener.java b/src/main/java/world/arainu/core/metaverseplugin/listener/ServerListener.java index 038fd31..0f0317f 100644 --- a/src/main/java/world/arainu/core/metaverseplugin/listener/ServerListener.java +++ b/src/main/java/world/arainu/core/metaverseplugin/listener/ServerListener.java @@ -7,6 +7,8 @@ import me.leoko.advancedban.manager.TimeManager; import me.leoko.advancedban.utils.Punishment; import me.leoko.advancedban.utils.PunishmentType; +import github.scarsz.discordsrv.dependencies.jda.api.entities.Message; +import github.scarsz.discordsrv.dependencies.jda.api.entities.MessageEmbed; import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -17,6 +19,7 @@ import world.arainu.core.metaverseplugin.utils.sqlUtil; import java.awt.Color; +import java.util.HashMap; import java.util.Objects; import java.util.UUID; @@ -27,10 +30,12 @@ */ public class ServerListener implements Listener { private final JDA jda = DiscordUtil.getJda(); - private final TextChannel channel = Objects.requireNonNull(jda.getTextChannelById(MetaversePlugin.getConfiguration().getLong("discord.warn_channel"))); + private final TextChannel channel = Objects + .requireNonNull(jda.getTextChannelById(MetaversePlugin.getConfiguration().getLong("discord.warn_channel"))); /** * ホワリス以外の人がログインしてきたときにdiscordにログを流す + * * @param e イベント */ @EventHandler @@ -40,52 +45,75 @@ public void onPlayerLogin(PlayerLoginEvent e) { if (e.getResult() == PlayerLoginEvent.Result.KICK_WHITELIST) { sqlUtil.addkickcount(uuid); final int kickcount = Objects.requireNonNull(sqlUtil.getkickcount(uuid)); - channel.sendMessage( - new EmbedBuilder() - .setTitle("ホワイトリストに登録されていないプレイヤーがログインしようとしました") - .setDescription("自動BANまで残り" + (10 * (kickcount / 10 + 1) - kickcount) + "回") - .addField("プレイヤー名", "`"+name+"`", false) - .addField("UUID", String.valueOf(uuid), false) - .setThumbnail("https://crafatar.com/avatars/" + uuid + ".png") - .setFooter("接続元サーバー:" + ServerStore.getServerDisplayName()) - .setColor(Color.ORANGE) - .build() - ).queue(); + MessageEmbed embed = new EmbedBuilder().setTitle("ホワイトリストに登録されていないプレイヤーがログインしようとしました") + .setDescription("自動BANまで残り" + (10 * (kickcount / 10 + 1) - kickcount) + "回") + .addField("プレイヤー名", "`" + name + "`", false).addField("UUID", String.valueOf(uuid), false) + .setThumbnail("https://crafatar.com/avatars/" + uuid + ".png") + .setFooter("接続元サーバー:" + ServerStore.getServerDisplayName()).setColor(Color.ORANGE).build(); + if (last_log_map.containsKey(uuid)) { + if (System.currentTimeMillis() - last_log_map.get(uuid).time < 30 * 60 * 1000) { + last_log_map.get(uuid).msg.editMessage(embed) + .queue(msg -> last_log_map.put(uuid, new TimeAndMsg(System.currentTimeMillis(), msg))); + } else { + channel.sendMessage(embed) + .queue(msg -> last_log_map.put(uuid, new TimeAndMsg(System.currentTimeMillis(), msg))); + } + } else { + channel.sendMessage(embed) + .queue(msg -> last_log_map.put(uuid, new TimeAndMsg(System.currentTimeMillis(), msg))); + } + if (kickcount % 10 == 0) { - Punishment punishment = new Punishment(name, name, "@attack", "自動BAN", PunishmentType.TEMP_BAN, TimeManager.getTime(), TimeManager.getTime() + (long) kickcount * 60 * 1000, null, -1); + Punishment punishment = new Punishment(name, name, "@attack", "自動BAN", PunishmentType.TEMP_BAN, + TimeManager.getTime(), TimeManager.getTime() + (long) kickcount * 60 * 1000, null, -1); punishment.create(); - channel.sendMessage( - new EmbedBuilder() - .setTitle("アクセス試行回数がしきい値を超えたので一時的にBANしました") - .setDescription("BAN時間:" + kickcount + "分") - .setFooter("接続元サーバー:" + ServerStore.getServerDisplayName()) - .setAuthor(name, null, "https://crafatar.com/avatars/" + uuid + ".png") - .setColor(Color.RED) - .build() - ).queue(); + channel.sendMessage(new EmbedBuilder().setTitle("アクセス試行回数がしきい値を超えたので一時的にBANしました") + .setDescription("BAN時間:" + kickcount + "分") + .setFooter("接続元サーバー:" + ServerStore.getServerDisplayName()) + .setAuthor(name, null, "https://crafatar.com/avatars/" + uuid + ".png").setColor(Color.RED) + .build()).queue(); } } } /** * AdvancedBANでのBANはこのイベント以降は動かないみたいなのでここで定義 + * * @param e イベント */ @EventHandler public void onAsyncPlayerPreLogin(AsyncPlayerPreLoginEvent e) { UUID uuid = e.getPlayerProfile().getId(); String name = e.getPlayerProfile().getName(); - if(PunishmentManager.get().isBanned(name)){ - channel.sendMessage( - new EmbedBuilder() - .setTitle("すでにBANされているプレイヤーがログインしようとしました") - .addField("プレイヤー名", "`"+name+"`", false) - .addField("UUID", String.valueOf(uuid), false) - .setThumbnail("https://crafatar.com/avatars/" + uuid + ".png") - .setFooter("接続元サーバー:" + ServerStore.getServerDisplayName()) - .setColor(Color.YELLOW) - .build() - ).queue(); + if (PunishmentManager.get().isBanned(name)) { + MessageEmbed embed = new EmbedBuilder().setTitle("すでにBANされているプレイヤーがログインしようとしました") + .addField("プレイヤー名", "`" + name + "`", false).addField("UUID", String.valueOf(uuid), false) + .setThumbnail("https://crafatar.com/avatars/" + uuid + ".png") + .setFooter("接続元サーバー:" + ServerStore.getServerDisplayName()).setColor(Color.YELLOW).build(); + if (last_log_map.containsKey(uuid)) { + if (System.currentTimeMillis() - last_log_map.get(uuid).time < 30 * 60 * 1000) { + last_log_map.get(uuid).msg.editMessage(embed) + .queue(msg -> last_log_map.put(uuid, new TimeAndMsg(System.currentTimeMillis(), msg))); + } else { + channel.sendMessage(embed) + .queue(msg -> last_log_map.put(uuid, new TimeAndMsg(System.currentTimeMillis(), msg))); + } + } else { + channel.sendMessage(embed) + .queue(msg -> last_log_map.put(uuid, new TimeAndMsg(System.currentTimeMillis(), msg))); + } + } + } + + private final HashMap last_log_map = new HashMap<>(); + + class TimeAndMsg { + TimeAndMsg(long time, Message msg) { + this.time = time; + this.msg = msg; } + + private final long time; + private final Message msg; } }