diff --git a/README.md b/README.md index 842cd99..91b1975 100644 --- a/README.md +++ b/README.md @@ -241,11 +241,19 @@ whitelist: # 简易的 ip 黑名单. 在这里添加正则表达式, 匹配的ip不允许加入服务器 (也不允许使用参观账户 # 使用 /wl reload 重载配置即可应用 + # IP 地址格式: ipv4: "/127.0.0.1", ipv6: "/0:0:0:0:0:0:0:1" 没有方括号 ipBlacklist: [ ] - # - '^192\.168\.100\..+$' - # - '^fe80::1234:.+$' # IPv6 没有方括号 + # - '^/192\.168\.100\..+$' + # - '^/fe80::1234:.+$' ipBlacklistMsg: '§6IpacEL §f> §b您已被列入黑名单: §a%playerName%' # var: %ip% + # 限定玩家只能通过以下地址连接服务器 + addressConfig: + enable: false + list: [ ] + # - '^0:0:0:0:0:0:0:0:25565$' + kickMsg: '§6IpacEL §f> §b此地址不可用' + # 玩家名称字符检查 # 名称长度为 3 到 16 字符, 允许包含 Geyser 的 "." 前缀 playerNameRule: '^(?:\.?[a-zA-Z0-9_]{3,16})$' @@ -298,6 +306,13 @@ whitelist: # 参观账户 VISIT: + + # 限定参观模式可使用的地址 + addressConfig: + enable: false + list: [ ] + kickMsg: '§6IpacEL §f> §b您不在白名单中' + # 参观账户的名称字符检查 playerNameRule: '^(?:\.?[a-zA-Z0-9_]{3,16})$' playerNameRuleMsg: '§6IpacEL §f> §a名称中包含不支持的字符: §b%playerName%' @@ -333,7 +348,7 @@ whitelist: - 'gamemode spectator %playerName%' # 将玩家设置为观察模式 msg: - '§6IpacEL §f> §a您正在使用参观账户=w=' - # - '§6IpacEL §f> §b如需加入, 请访问我们的网站: §ahttps://ipacel.cc/' + # - '§6IpacEL §f> §b如需加入, 请访问我们的网站: §ahttps://ipacel.cc/' msgExclude: - '§6IpacEL §f> §a%playerName% §b使用参观账户加入游戏' diff --git a/pom.xml b/pom.xml index 5f49718..d985f78 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ ApliNi IpacWhitelist - 4.1.1-rc1 + 4.1.1-rc2 jar IpacWhitelist diff --git a/src/main/java/aplini/ipacwhitelist/listener/onPlayerLogin.java b/src/main/java/aplini/ipacwhitelist/listener/onPlayerLogin.java index 8d2259c..9f664f4 100644 --- a/src/main/java/aplini/ipacwhitelist/listener/onPlayerLogin.java +++ b/src/main/java/aplini/ipacwhitelist/listener/onPlayerLogin.java @@ -17,7 +17,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; @@ -47,6 +46,12 @@ public class onPlayerLogin implements Listener { @EventHandler(priority = EventPriority.LOWEST) // 玩家登录服务器 public void onPlayerLoginEvent(PlayerLoginEvent event) { + // 如果结果已被设置, 我们可以忽略这个玩家 + // 同时防止这个事件循环回来 (触发两次) + if(event.getResult() != PlayerLoginEvent.Result.ALLOWED){ + return; + } + // 设置不允许登录的结果, 在允许登录的分支取消它. 防止出错造成意外的玩家登录 event.disallow(KICK_OTHER, config.getString("message.playerLoginErr", "")); @@ -54,26 +59,24 @@ public void onPlayerLoginEvent(PlayerLoginEvent event) { String playerName = player.getName(); String playerUUID = player.getUniqueId().toString(); String playerIP = event.getRealAddress().toString(); - playerIP = playerIP.substring(playerIP.lastIndexOf("/") +1); + String playerAddressHost = event.getHostname(); + plugin.getLogger().info("%s[%s] -> Server[%s]".formatted(playerName, playerIP, playerAddressHost)); // 玩家 ip 地址检查 // 原始ip格式: ipv4: "/127.0.0.1", ipv6: "/0:0:0:0:0:0:0:1" 没有方括号 - for(String li : config.getStringList("whitelist.ipBlacklist")){ - if(Pattern.matches(li, playerIP)){ - plugin.getLogger().info("%s 在IP黑名单中: %s".formatted(playerName, playerIP)); - event.disallow(KICK_OTHER, msg(config.getString("whitelist.ipBlacklistMsg", ""), playerUUID, playerName) - .replace(ph.ip.ph, playerIP)); - return; - } + if(config.getStringList("whitelist.ipBlacklist").stream().anyMatch(li -> Pattern.matches(li, playerIP))){ + plugin.getLogger().info("%s 在IP黑名单中: %s".formatted(playerName, playerIP)); + event.disallow(KICK_OTHER, msg(config.getString("whitelist.ipBlacklistMsg", ""), playerUUID, playerName) + .replace(ph.ip.ph, playerIP)); + return; } // 限定玩家只能通过以下地址加入服务器 - String playerAddressHost = Objects.requireNonNull(player.getAddress()).getHostString(); - plugin.getLogger().info("玩家 %s 通过地址 %s 连接服务器".formatted(playerName, playerAddressHost)); if(config.getBoolean("whitelist.addressConfig.enable", false)){ - if(!config.getStringList("whitelist.addressConfig.list").contains(playerAddressHost)){ + if(config.getStringList("whitelist.addressConfig.list").stream().noneMatch(li -> Pattern.matches(li, playerAddressHost))){ event.disallow(KICK_OTHER, msg(config.getString("whitelist.addressConfig.kickMsg", ""), playerUUID, playerName)); + return; } } @@ -234,8 +237,9 @@ else if(onOtherPlayer != Type.NOT){ // 限定参观模式可使用的地址 if(config.getBoolean("whitelist.VISIT.addressConfig.enable", false)){ - if(!config.getStringList("whitelist.VISIT.addressConfig.list").contains(playerAddressHost)){ + if(config.getStringList("whitelist.VISIT.addressConfig.list").stream().noneMatch(li -> Pattern.matches(li, playerAddressHost))){ event.disallow(KICK_OTHER, msg(config.getString("whitelist.VISIT.addressConfig.kickMsg", ""), playerUUID, playerName)); + return; } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1509426..39ce464 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -17,15 +17,17 @@ whitelist: # 简易的 ip 黑名单. 在这里添加正则表达式, 匹配的ip不允许加入服务器 (也不允许使用参观账户 # 使用 /wl reload 重载配置即可应用 + # IP 地址格式: ipv4: "/127.0.0.1", ipv6: "/0:0:0:0:0:0:0:1" 没有方括号 ipBlacklist: [ ] - # - '^192\.168\.100\..+$' - # - '^fe80::1234:.+$' # IPv6 没有方括号 + # - '^/192\.168\.100\..+$' + # - '^/fe80::1234:.+$' ipBlacklistMsg: '§6IpacEL §f> §b您已被列入黑名单: §a%playerName%' # var: %ip% - # 限定玩家只能通过以下地址加入服务器 + # 限定玩家只能通过以下地址连接服务器 addressConfig: enable: false list: [ ] + # - '^0:0:0:0:0:0:0:0:25565$' kickMsg: '§6IpacEL §f> §b此地址不可用' # 玩家名称字符检查 @@ -85,7 +87,7 @@ whitelist: addressConfig: enable: false list: [ ] - kickMsg: '§6IpacEL §f> §b您不在白名单中, 请使用参观地址加入服务器' + kickMsg: '§6IpacEL §f> §b您不在白名单中' # 参观账户的名称字符检查 playerNameRule: '^(?:\.?[a-zA-Z0-9_]{3,16})$' @@ -122,7 +124,7 @@ whitelist: - 'gamemode spectator %playerName%' # 将玩家设置为观察模式 msg: - '§6IpacEL §f> §a您正在使用参观账户=w=' -# - '§6IpacEL §f> §b如需加入, 请访问我们的网站: §ahttps://ipacel.cc/' + # - '§6IpacEL §f> §b如需加入, 请访问我们的网站: §ahttps://ipacel.cc/' msgExclude: - '§6IpacEL §f> §a%playerName% §b使用参观账户加入游戏'