From 2ec972e1fe116ad3d89d4cab1d13aba6c3189d34 Mon Sep 17 00:00:00 2001 From: CuteStar <78346594+MX233@users.noreply.github.com> Date: Fri, 30 Jul 2021 10:05:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9F=BA=E5=B2=A9=E7=89=88?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20=E4=B8=80=E4=BA=9B=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tax/cute/mcpingplugin/BETypeset.java | 64 +++++ src/tax/cute/mcpingplugin/Config.java | 271 ++++++++++++++++++ src/tax/cute/mcpingplugin/JETypeset.java | 92 ++++++ src/tax/cute/mcpingplugin/MCBEPingThread.java | 45 +++ src/tax/cute/mcpingplugin/MCJEPingThread.java | 154 ++++++++++ src/tax/cute/mcpingplugin/OtherMcPing.java | 68 +++++ src/tax/cute/mcpingplugin/Plugin.java | 106 +++++++ src/tax/cute/mcpingplugin/SendBindServer.java | 47 +++ src/tax/cute/mcpingplugin/Util/Srv.java | 43 +++ src/tax/cute/mcpingplugin/Util/Util.java | 74 +++++ .../mcpingplugin/commands/BindServer.java | 216 ++++++++++++++ .../cute/mcpingplugin/commands/Enable.java | 58 ++++ src/tax/cute/mcpingplugin/commands/Help.java | 34 +++ .../cute/mcpingplugin/commands/MCPing.java | 114 ++++++++ .../mcpingplugin/commands/OtherMcPingSet.java | 48 ++++ src/tax/cute/mcpingplugin/commands/Owner.java | 126 ++++++++ .../cute/mcpingplugin/commands/Reload.java | 55 ++++ .../cute/mcpingplugin/friend/GetOwner.java | 39 +++ .../mrxiaom/miraiutils/CommandListener.java | 184 ++++++++++++ src/top/mrxiaom/miraiutils/CommandModel.java | 18 ++ src/top/mrxiaom/miraiutils/CommandSender.java | 33 +++ .../miraiutils/CommandSenderFriend.java | 24 ++ .../miraiutils/CommandSenderGroup.java | 31 ++ .../miraiutils/CommandSenderStranger.java | 24 ++ 24 files changed, 1968 insertions(+) create mode 100644 src/tax/cute/mcpingplugin/BETypeset.java create mode 100644 src/tax/cute/mcpingplugin/Config.java create mode 100644 src/tax/cute/mcpingplugin/JETypeset.java create mode 100644 src/tax/cute/mcpingplugin/MCBEPingThread.java create mode 100644 src/tax/cute/mcpingplugin/MCJEPingThread.java create mode 100644 src/tax/cute/mcpingplugin/OtherMcPing.java create mode 100644 src/tax/cute/mcpingplugin/Plugin.java create mode 100644 src/tax/cute/mcpingplugin/SendBindServer.java create mode 100644 src/tax/cute/mcpingplugin/Util/Srv.java create mode 100644 src/tax/cute/mcpingplugin/Util/Util.java create mode 100644 src/tax/cute/mcpingplugin/commands/BindServer.java create mode 100644 src/tax/cute/mcpingplugin/commands/Enable.java create mode 100644 src/tax/cute/mcpingplugin/commands/Help.java create mode 100644 src/tax/cute/mcpingplugin/commands/MCPing.java create mode 100644 src/tax/cute/mcpingplugin/commands/OtherMcPingSet.java create mode 100644 src/tax/cute/mcpingplugin/commands/Owner.java create mode 100644 src/tax/cute/mcpingplugin/commands/Reload.java create mode 100644 src/tax/cute/mcpingplugin/friend/GetOwner.java create mode 100644 src/top/mrxiaom/miraiutils/CommandListener.java create mode 100644 src/top/mrxiaom/miraiutils/CommandModel.java create mode 100644 src/top/mrxiaom/miraiutils/CommandSender.java create mode 100644 src/top/mrxiaom/miraiutils/CommandSenderFriend.java create mode 100644 src/top/mrxiaom/miraiutils/CommandSenderGroup.java create mode 100644 src/top/mrxiaom/miraiutils/CommandSenderStranger.java diff --git a/src/tax/cute/mcpingplugin/BETypeset.java b/src/tax/cute/mcpingplugin/BETypeset.java new file mode 100644 index 0000000..270ca37 --- /dev/null +++ b/src/tax/cute/mcpingplugin/BETypeset.java @@ -0,0 +1,64 @@ +package tax.cute.mcpingplugin; + +import tax.cute.minecraftserverpingbe.MCBePing; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +public class BETypeset { + private String motdText; + + public BETypeset(String motdText) { + this.motdText = motdText; + } + + public static BETypeset getTypeset(String host,int port,String typesetText) throws IOException{ + final String description = "%description"; + final String default_mode = "%default_mode"; + final String version = "%version"; + final String protocol_num = "%protocol_num"; + final String type = "%type"; + final String online_players = "%online_players"; + final String max_players = "%max_players"; + final String delay = "%delay"; + final String world_name = "%world_name"; + + MCBePing motd = MCBePing.getMotd(host, port,2000); + + String motdText = typesetText + .replace(description,String.valueOf(motd.getDescription())) + .replace(default_mode,String.valueOf(motd.getDefault_mode())) + .replace(version,String.valueOf(motd.getVersion())) + .replace(world_name,String.valueOf(motd.getWorld_name())) + .replace(protocol_num,String.valueOf(motd.getProtocol_num())) + .replace(type,motd.getType()) + .replace(online_players,String.valueOf(motd.getOnline_players())) + .replace(max_players,String.valueOf(motd.getMax_players())) + .replace(delay,String.valueOf(motd.getDelay())); + return new BETypeset(motdText); + } + + public String getMotdText() { + return this.motdText; + } + + public static void createTypesetFile(String path) throws IOException{ + File file = new File(path); + if(file.exists()) return; + String text = + "[ 描述 ] %description" + + "\n[ 版本 ] %version(%protocol_num)" + + "\n[ 人数 ] %online_players/%max_players" + + "\n[ 延迟 ] %delayms" + + "\n[ 类型 ] %type" + + "\n[ 默认模式 ] %default_mode" + + "\n[ 世界名称 ] %world_name" + ; + OutputStream out = new FileOutputStream(path); + out.write(text.getBytes()); + out.flush(); + out.close(); + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/Config.java b/src/tax/cute/mcpingplugin/Config.java new file mode 100644 index 0000000..49652bc --- /dev/null +++ b/src/tax/cute/mcpingplugin/Config.java @@ -0,0 +1,271 @@ +package tax.cute.mcpingplugin; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import tax.cute.mcpingplugin.Util.Util; + +import java.io.*; + +public class Config { + private static final String name = "[MCPing]"; + + private String path; + private JSONArray owner; + private JSONArray bindServerList; + private String enable; + private String mcPingCmd; + + public Config( + String path, + JSONArray owner, + JSONArray bindServerList, + String enable, + String mcPingCmd + ) { + this.path = path; + this.owner = owner; + this.bindServerList = bindServerList; + this.enable = enable; + this.mcPingCmd = mcPingCmd; + } + + public static Config getConfig(String path) throws IOException { + File file = new File(path); + //Create a configuration file when it is judged that the configuration file does not exist + if (!file.exists()) if (!createConfig(path)) System.err.println(name + "Create config failure"); + + //initialization + JSONArray owner = new JSONArray(); + String enable = "false"; + String mcPingCmd = null; + JSONArray bindServer = new JSONArray(); + + //Read config file text + String jsonStr = Util.readText(path); + JSONObject json = JSONObject.parseObject(jsonStr); + + //Determine whether the configuration file is json + if (json == null) { + createConfig(path); + jsonStr = Util.readText(path); + json = JSONObject.parseObject(jsonStr); + } + + JSONObject config = new JSONObject(); + + //Determine whether it is json, if not, it will be reset + if (json.containsKey("Config")) { + if (json.get("Config") instanceof JSONObject) { + config = json.getJSONObject("Config"); + } + } + + if (config.containsKey("Enable")) { + if (config.get("Enable") instanceof String) { + if (Util.isBoolean(config.getString("Enable"))) { + enable = config.getString("Enable"); + } else { + System.err.println(name + "\"Config\\Enable\"Unexpected type"); + } + } else { + System.err.println(name + "\"Config\\Enable\"Unexpected type"); + } + } else { + System.err.println(name + "\"Config\\Enable\"Missing"); + } + + if (config.containsKey("CMD")) { + if (config.get("CMD") instanceof String) { + mcPingCmd = config.getString("CMD"); + } else { + System.err.println(name + "\"Config\\CMD\"Unexpected type"); + } + } else { + System.err.println(name + "\"Config\\CMD\"Missing"); + } + + if (json.containsKey("Owner")) { + if (json.get("Owner") instanceof JSONArray) { + owner = json.getJSONArray("Owner"); + } else { + System.err.println(name + "\"Owner\"Unexpected type"); + } + } else { + System.err.println(name + "\"Owner\"Missing"); + } + + if (json.containsKey("BindServer")) { + if (json.get("BindServer") instanceof JSONArray) { + bindServer = json.getJSONArray("BindServer"); + } else { + System.err.println(name + "\"BindServer\"Unexpected type"); + } + } else { + System.err.println(name + "\"BindServer\"Missing"); + } + + return new Config(path, owner, bindServer, enable, mcPingCmd); + } + + public static boolean createConfig(String path) { + try { + JSONObject json = new JSONObject(); + + JSONArray bindServer = new JSONArray(); + + JSONArray owner = new JSONArray(); + + JSONObject config = new JSONObject(); + config.put("Enable", "true"); + config.put("CMD", "/mcmotd"); + + json.put("Owner", owner); + json.put("BindServer", bindServer); + json.put("Config", config); + + String jsonStr = JSON.toJSONString(json); + + OutputStream out = new FileOutputStream(path); + out.write(jsonStr.getBytes()); + out.flush(); + out.close(); + } catch (IOException e) { + File file = new File(path); + file.delete(); + return false; + } + return true; + } + + public void writeConfig() throws IOException { + JSONObject json = new JSONObject(); + JSONObject config = new JSONObject(); + config.put("Enable", this.enable); + config.put("CMD", this.mcPingCmd); + + json.put("Owner", this.owner); + json.put("Config", config); + json.put("BindServer", this.bindServerList); + + String jsonStr = JSON.toJSONString(json); + + OutputStream out = new FileOutputStream(path); + out.write(jsonStr.getBytes()); + out.flush(); + out.close(); + } + + public boolean isEnable() { + return Boolean.parseBoolean(this.enable); + } + + public String getPath() { + return this.path; + } + + public String getMcPingCmd() { + return this.mcPingCmd; + } + + public JSONArray getOwner() { + return this.owner; + } + + public boolean isOwner(long qqNum) { + return this.owner.contains(String.valueOf(qqNum)); + } + + public JSONArray getBindServerList() { + return this.bindServerList; + } + + public void setEnable(boolean args) throws IOException { + this.enable = String.valueOf(args); + writeConfig(); + } + + public void setMcPingCmd(String args) throws IOException { + this.mcPingCmd = args; + writeConfig(); + } + + public boolean addOwner(long qqNum) throws IOException { + if (isOwner(qqNum)) return false; + this.owner.add(String.valueOf(qqNum)); + writeConfig(); + return true; + } + + public boolean removeOwner(long qqNum) throws IOException { + if (!isOwner(qqNum)) return false; + this.owner.remove(String.valueOf(qqNum)); + writeConfig(); + return true; + } + + public JSONObject getServer(long groupNum) { + for (int i = 0; i < this.bindServerList.size(); i++) { + if (this.bindServerList.get(i) instanceof JSONObject) { + JSONObject server = this.bindServerList.getJSONObject(i); + if (server.containsKey("GroupNum")) { + if (server.get("GroupNum") instanceof String) { + if (Util.isNum(server.getString("GroupNum"))) { + if (server.getString("GroupNum").equals(String.valueOf(groupNum))) { + return this.bindServerList.getJSONObject(i); + } + } + } + } + } + } + return null; + } + + public int getServerIndex(long groupNum) { + for (int i = 0; i < this.bindServerList.size(); i++) { + if (this.bindServerList.get(i) instanceof JSONObject) { + JSONObject server = this.bindServerList.getJSONObject(i); + if (server.containsKey("GroupNum")) { + if (server.get("GroupNum") instanceof String) { + if (Util.isNum(server.getString("GroupNum"))) { + if (server.getString("GroupNum").equals(String.valueOf(groupNum))) { + return i; + } + } + } + } + } + } + return -1; + } + + public boolean addBindServer(long groupNum, String cmd, String host) throws IOException { + if (getServer(groupNum) != null) { + return false; + } + + JSONObject server = new JSONObject(); + server.put("GroupNum", String.valueOf(groupNum)); + server.put("CMD", cmd); + server.put("Host", host); + this.bindServerList.add(server); + writeConfig(); + return true; + } + + public boolean removeBindServer(long groupNum) throws IOException { + int index = getServerIndex(groupNum); + if (index == -1) return false; + this.bindServerList.remove(index); + writeConfig(); + return true; + } + + public int removeAllBindServer() throws IOException{ + int count = this.bindServerList.size(); + this.bindServerList.clear(); + writeConfig(); + return count; + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/JETypeset.java b/src/tax/cute/mcpingplugin/JETypeset.java new file mode 100644 index 0000000..597945f --- /dev/null +++ b/src/tax/cute/mcpingplugin/JETypeset.java @@ -0,0 +1,92 @@ +package tax.cute.mcpingplugin; + +import tax.cute.mcpingplugin.Util.Util; +import tax.cute.minecraftserverping.MCPing; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Base64; +import java.util.List; + +public class JETypeset { + private String motdText; + private byte[] favicon_bytes; + private List modList; + + public JETypeset(String motdText,byte[] favicon_bytes, List modList) { + this.motdText = motdText; + this.favicon_bytes = favicon_bytes; + this.modList = modList; + } + + public static JETypeset getTypeset(String host, int port, String typesetText) throws IOException{ + final String favicon = "%favicon"; + final String description = "%description"; + final String version_name = "%version_name"; + final String version_protocol = "%version_protocol"; + final String online_players = "%online_players"; + final String max_players = "%max_players"; + final String delay = "%delay"; + final String mod_count = "%mod_count"; + final String type = "%type"; + final String mod_list = "%mod_list"; + + MCPing motd = MCPing.getMotd(host, port,2000); + + boolean sendFavicon = typesetText.contains(favicon); + List modList = null; + if (typesetText.contains(mod_list) || motd.getModList().size() > 0) { + modList = motd.getModList(); + } + byte[] favicon_bytes = null; + if (sendFavicon) { + if (motd.getFavicon().equals("null")) + favicon_bytes = Base64.getDecoder().decode(Util.MC_SERVER_DEFAULT_FAVICON_BASE64); + else favicon_bytes = Base64.getDecoder().decode(motd.getFavicon()); + } + + String motdText = typesetText + .replace(description, motd.getDescription()) + .replace(version_name, motd.getVersion_name()) + .replace(version_protocol, motd.getVersion_protocol()) + .replace(online_players, String.valueOf(motd.getOnline_players())) + .replace(max_players, String.valueOf(motd.getMax_players())) + .replace(delay, String.valueOf(motd.getDelay())) + .replace(mod_count, String.valueOf(motd.getMod_count())) + .replace(type, motd.getType()) + .replace(mod_list, "") + .replace(favicon, ""); + return new JETypeset(motdText,favicon_bytes,modList); + } + + public String getMotdText() { + return this.motdText; + } + + public byte[] getFavicon_bytes() { + return this.favicon_bytes; + } + + public List getModList() { + return this.modList; + } + + public static void createTypesetFile(String path) throws IOException { + File file = new File(path); + if (file.exists()) return; + String text = + "\n%favicon" + + "\n[ 描述 ] %description" + + "\n[ 版本 ] %version_name(%version_protocol)" + + "\n[ 人数 ] %online_players/%max_players" + + "\n[ 延迟 ] %delayms" + + "\n[ 类型 ] %type" + + "\n[ Mod数量 ] %mod_count"; + OutputStream out = new FileOutputStream(path); + out.write(text.getBytes()); + out.flush(); + out.close(); + } +} diff --git a/src/tax/cute/mcpingplugin/MCBEPingThread.java b/src/tax/cute/mcpingplugin/MCBEPingThread.java new file mode 100644 index 0000000..e871cc4 --- /dev/null +++ b/src/tax/cute/mcpingplugin/MCBEPingThread.java @@ -0,0 +1,45 @@ +package tax.cute.mcpingplugin; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; + +import java.io.IOException; + +public class MCBEPingThread extends Thread { + Plugin plugin; + String host; + int port; + Object object; + public int status = -1; + + public MCBEPingThread(Plugin plugin, String host, int port, Object object) { + this.host = host; + this.port = port; + this.object = object; + this.plugin = plugin; + } + + @Override + public void run() { + ping(); + } + + public void ping() { + if(port == -1) port = 19132; + BETypeset typeset; + try { + typeset = BETypeset.getTypeset(host,port,plugin.BETypesetText); + } catch (IOException e) { + status = 0; + return; + } + if (object instanceof Group) { + Group group = (Group) object; + group.sendMessage(typeset.getMotdText()); + } else if (object instanceof Friend) { + Friend friend = (Friend)object; + friend.sendMessage(typeset.getMotdText()); + } + status = 1; + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/MCJEPingThread.java b/src/tax/cute/mcpingplugin/MCJEPingThread.java new file mode 100644 index 0000000..81e67ef --- /dev/null +++ b/src/tax/cute/mcpingplugin/MCJEPingThread.java @@ -0,0 +1,154 @@ +package tax.cute.mcpingplugin; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.message.data.ForwardMessageBuilder; +import net.mamoe.mirai.message.data.Image; +import net.mamoe.mirai.message.data.PlainText; +import net.mamoe.mirai.utils.ExternalResource; +import tax.cute.mcpingplugin.Util.Srv; +import tax.cute.mcpingplugin.Util.Util; +import top.mrxiaom.miraiutils.CommandListener; + +import java.io.IOException; +import java.util.List; + +public class MCJEPingThread extends Thread { + Plugin plugin; + String host; + int port; + Object sendObject; + public int status = -1; + + public MCJEPingThread(Plugin plugin, String host, int port,Object sendObject) { + this.host = host; + this.port = port; + this.sendObject = sendObject; + this.plugin = plugin; + } + + @Override + public void run() { + ping(); + } + + public void ping() { + if (port == -1) port = 25565; + + if(sendObject instanceof Group) { + Group group = (Group) sendObject; + Srv srv = Srv.getSrv(host, Util.MC_SRV); + if (srv != null) { + host = srv.getSrvHost(); + port = srv.getSrvPort(); + group.sendMessage("检测到存在Srv记录 已自动跳转到\n>>\n" + host + ":" + port); + } + + JETypeset typeset; + try { + //获取信息并排版 + typeset = JETypeset.getTypeset(host, port, plugin.JETypesetText); + } catch (IOException e) { + this.status = 0; + return; + } + + //是否发送图标(如果要求发送的话) + if (typeset.getFavicon_bytes() != null) { + Image image = group.uploadImage(ExternalResource.create(typeset.getFavicon_bytes())); + group.sendMessage(image.plus(typeset.getMotdText())); + } else { + group.sendMessage(typeset.getMotdText()); + } + + //发送ModList(如果要求发送的话) + //不存在直接结束 + if (typeset.getModList() == null) return; + if (typeset.getModList().size() < 1) return; + //构建合并转发聊天记录 + ForwardMessageBuilder builder = new ForwardMessageBuilder(group); + List modList = typeset.getModList(); + int count = 0; + for (int i = 0; i < modList.size(); i++) { + count++; + builder.add(group.getBot().getId(), "Mod" + (i + 1), new PlainText(modList.get(i))); + //等于100才发送,超过100发不了 + if (count == 100) { + count = 0; + group.sendMessage(builder.build()); + builder = new ForwardMessageBuilder(group); + } + if (count > 100) { + group.sendMessage("程序遇到量子异常,程序无法定位此异常,请联系外星人"); + return; + } + //大于500停止发送,防止刷屏 + if (i > 500) { + group.sendMessage("Mod数量大于500,出于安全策略,无法查看更多(什么量子服会装500个Mod?)"); + return; + } + } + //即使小于100,最后也会发送 + if (count > 0) group.sendMessage(builder.build()); + status = 1; + } + + if (sendObject instanceof Friend) { + Friend friend = (Friend) sendObject; + Srv srv = Srv.getSrv(host, Util.MC_SRV); + if (srv != null) { + host = srv.getSrvHost(); + port = srv.getSrvPort(); + friend.sendMessage("检测到存在Srv记录 已自动跳转到\n>>\n" + host + ":" + port); + } + + JETypeset typeset; + try { + //获取信息并排版 + typeset = JETypeset.getTypeset(host, port, plugin.JETypesetText); + } catch (IOException e) { + this.status = 0; + return; + } + + //是否发送图标(如果要求发送的话) + if (typeset.getFavicon_bytes() != null) { + Image image = friend.uploadImage(ExternalResource.create(typeset.getFavicon_bytes())); + friend.sendMessage(image.plus(typeset.getMotdText())); + } else { + friend.sendMessage(typeset.getMotdText()); + } + + //发送ModList(如果要求发送的话) + //不存在直接结束 + if (typeset.getModList() == null) return; + if (typeset.getModList().size() < 1) return; + //构建合并转发聊天记录 + ForwardMessageBuilder builder = new ForwardMessageBuilder(friend); + List modList = typeset.getModList(); + int count = 0; + for (int i = 0; i < modList.size(); i++) { + count++; + builder.add(friend.getBot().getId(), "Mod" + (i + 1), new PlainText(modList.get(i))); + //等于100才发送,超过100发不了 + if (count == 100) { + count = 0; + friend.sendMessage(builder.build()); + builder = new ForwardMessageBuilder(friend); + } + if (count > 100) { + friend.sendMessage("程序遇到量子异常,程序无法定位此异常,请联系外星人"); + return; + } + //大于500停止发送,防止刷屏 + if (i > 500) { + friend.sendMessage("Mod数量大于500,出于安全策略,无法查看更多(什么量子服会装500个Mod?)"); + return; + } + } + //即使小于100,最后也会发送 + if (count > 0) friend.sendMessage(builder.build()); + status = 1; + } + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/OtherMcPing.java b/src/tax/cute/mcpingplugin/OtherMcPing.java new file mode 100644 index 0000000..ba4ec41 --- /dev/null +++ b/src/tax/cute/mcpingplugin/OtherMcPing.java @@ -0,0 +1,68 @@ +package tax.cute.mcpingplugin; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.event.EventHandler; +import net.mamoe.mirai.event.ListeningStatus; +import net.mamoe.mirai.event.SimpleListenerHost; +import net.mamoe.mirai.event.events.FriendMessageEvent; +import net.mamoe.mirai.event.events.GroupMessageEvent; +import tax.cute.mcpingplugin.commands.MCPing; +import tax.cute.minecraftserverping.Punycode; + +public class OtherMcPing extends SimpleListenerHost { + Plugin plugin; + public OtherMcPing(Plugin plugin) { + this.plugin = plugin; + } + + @EventHandler + public ListeningStatus onGroup(GroupMessageEvent event) { + if(!plugin.config.isEnable()) return ListeningStatus.LISTENING; + Group group = event.getGroup(); + String msg = event.getMessage().contentToString(); + String cmd = plugin.config.getMcPingCmd(); + if(!msg.toLowerCase().startsWith(cmd)) return ListeningStatus.LISTENING; + String host = msg.split(" ")[1]; + + String ip; + int port; + if (host.contains(":")) { + ip = host.split(":")[0]; + port = Integer.parseInt(host.split(":")[1]); + } else { + ip = host; + port = -1; + } + + //涓枃鍩熷悕杞爜 + ip = Punycode.encodeURL(ip); + MCPing.sendMCPing(plugin,group,ip,port); + return ListeningStatus.LISTENING; + } + + @EventHandler + public ListeningStatus onFriend(FriendMessageEvent event) { + if(!plugin.config.isEnable()) return ListeningStatus.LISTENING; + Friend friend = event.getFriend(); + String msg = event.getMessage().contentToString(); + String cmd = plugin.config.getMcPingCmd(); + if(!msg.toLowerCase().startsWith(cmd)) return ListeningStatus.LISTENING; + String host = msg.split(" ")[1]; + + String ip; + int port; + if (host.contains(":")) { + ip = host.split(":")[0]; + port = Integer.parseInt(host.split(":")[1]); + } else { + ip = host; + port = -1; + } + + //涓枃鍩熷悕杞爜 + ip = Punycode.encodeURL(ip); + MCPing.sendMCPing(plugin,friend,ip,port); + return ListeningStatus.LISTENING; + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/Plugin.java b/src/tax/cute/mcpingplugin/Plugin.java new file mode 100644 index 0000000..46a4778 --- /dev/null +++ b/src/tax/cute/mcpingplugin/Plugin.java @@ -0,0 +1,106 @@ +package tax.cute.mcpingplugin; + +import net.mamoe.mirai.console.extension.PluginComponentStorage; +import net.mamoe.mirai.console.plugin.jvm.JavaPlugin; +import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescriptionBuilder; +import net.mamoe.mirai.event.GlobalEventChannel; +import tax.cute.mcpingplugin.Util.Util; +import tax.cute.mcpingplugin.commands.*; +import tax.cute.mcpingplugin.friend.GetOwner; +import top.mrxiaom.miraiutils.CommandListener; + +import java.io.IOException; + +public class Plugin extends JavaPlugin{ + public Config config; + public Plugin plugin; + public String name = "[MCPing]"; + public String JETypesetText; + public String BETypesetText; + public String McPingCmd; + + public final String configFilePath = "data\\MCPing\\Config.json"; + public final String JETypesetFilePath = "data\\MCPing\\typeset.txt"; + public final String BETypesetFilePath = "data\\MCPing\\Betypeset.txt"; + + CommandListener cmd; + BindServer bindServer; + Enable enable; + MCPing mcPing; + Help help; + OtherMcPingSet otherMcPingSet; + Owner owner; + Reload reload; + GetOwner getOwner; + + SendBindServer sendBindServer; + OtherMcPing otherMcPing; + + public Plugin() { + super(new JvmPluginDescriptionBuilder( + "tax.cute.mcpingplugins", // id + "2.0.0" // version + ) + .name("MCPing") + .author("CuteStar") + // .info("...") + .build() + ); + } + @Override + public void onLoad(PluginComponentStorage pcs) { + this.getLogger().info("ConfigPath: " + this.getDataFolder().getAbsoluteFile().getPath()); + plugin = this; + try { + JETypeset.createTypesetFile(this.JETypesetFilePath); + BETypeset.createTypesetFile(this.BETypesetFilePath); + Util.createPin(); + this.config = Config.getConfig(this.configFilePath); + this.JETypesetText = Util.readText(this.JETypesetFilePath,"GBK"); + this.BETypesetText = Util.readText(this.BETypesetFilePath,"GBK"); + this.McPingCmd = config.getMcPingCmd(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void register() { + this.bindServer = new BindServer(this); + this.enable = new Enable(this); + this.mcPing = new MCPing(this); + this.help = new Help(this); + this.otherMcPingSet = new OtherMcPingSet(this); + this.owner = new Owner(this); + this.reload = new Reload(this); + + this.getOwner = new GetOwner(this); + + cmd = new CommandListener("/"); + cmd.registerCommand(bindServer); + cmd.registerCommand(enable); + cmd.registerCommand(mcPing); + cmd.registerCommand(help); + cmd.registerCommand(otherMcPingSet); + cmd.registerCommand(owner); + cmd.registerCommand(reload); + + cmd.registerCommand(getOwner); + } + + @Override + public void onEnable() { + register(); + sendBindServer = new SendBindServer(this); + otherMcPing = new OtherMcPing(this); + + GlobalEventChannel.INSTANCE.registerListenerHost(cmd); + GlobalEventChannel.INSTANCE.registerListenerHost(sendBindServer); + GlobalEventChannel.INSTANCE.registerListenerHost(otherMcPing); + this.getLogger().info(name + "github URL: https://github.com/MX233/Mirai-MCPingPlugin"); + } + + @Override + public void onDisable() { + this.getLogger().info(name + "Disable"); + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/SendBindServer.java b/src/tax/cute/mcpingplugin/SendBindServer.java new file mode 100644 index 0000000..7c22420 --- /dev/null +++ b/src/tax/cute/mcpingplugin/SendBindServer.java @@ -0,0 +1,47 @@ +package tax.cute.mcpingplugin; + +import com.alibaba.fastjson.JSONObject; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.event.EventHandler; +import net.mamoe.mirai.event.ListeningStatus; +import net.mamoe.mirai.event.SimpleListenerHost; +import net.mamoe.mirai.event.events.GroupMessageEvent; +import tax.cute.mcpingplugin.commands.MCPing; +import tax.cute.minecraftserverping.Punycode; + +public class SendBindServer extends SimpleListenerHost { + Plugin plugin; + public SendBindServer(Plugin plugin) { + this.plugin = plugin; + } + + @EventHandler + private ListeningStatus awa(GroupMessageEvent event) { + if(!plugin.config.isEnable()) return ListeningStatus.LISTENING; + long groupNum = event.getGroup().getId(); + JSONObject json = this.plugin.config.getServer(groupNum); + if (json != null) { + String msg = event.getMessage().contentToString(); + Group group = event.getGroup(); + String cmd = json.getString("CMD"); + if (msg.equalsIgnoreCase(cmd)) { + String host = json.getString("Host"); + + String ip; + int port; + if (host.contains(":")) { + ip = host.split(":")[0]; + port = Integer.parseInt(host.split(":")[1]); + } else { + ip = host; + port = -1; + } + + //涓枃鍩熷悕杞爜 + ip = Punycode.encodeURL(ip); + MCPing.sendMCPing(plugin,group,ip,port); + } + } + return ListeningStatus.LISTENING; + } +} diff --git a/src/tax/cute/mcpingplugin/Util/Srv.java b/src/tax/cute/mcpingplugin/Util/Srv.java new file mode 100644 index 0000000..2c3c3aa --- /dev/null +++ b/src/tax/cute/mcpingplugin/Util/Srv.java @@ -0,0 +1,43 @@ +package tax.cute.mcpingplugin.Util; + +import javax.naming.directory.Attribute; +import javax.naming.directory.InitialDirContext; +import java.util.Hashtable; + +public class Srv { + private String srvHost; + private int srvPort; + + public Srv(String srvHost,int srvPort) { + this.srvHost = srvHost; + this.srvPort = srvPort; + } + + public static Srv getSrv(String host,String Srv) { + String SrvHost; + int SrvPort; + Hashtable hashtable = new Hashtable(); + hashtable.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); + hashtable.put("java.naming.provider.url", "dns:"); + try { + Attribute qwq = (new InitialDirContext(hashtable)).getAttributes((new StringBuilder()).append(Srv).append(host).toString(), new String[]{"SRV"}).get("srv"); + if (qwq != null) { + String[] re = qwq.get().toString().split(" ", 4); + SrvHost = re[3].substring(0, re[3].length() - 1); + SrvPort = Integer.parseInt(re[2]); + return new Srv(SrvHost, SrvPort); + } + } catch (Exception ignored) { + return null; + } + return null; + } + + public String getSrvHost() { + return this.srvHost; + } + + public int getSrvPort() { + return this.srvPort; + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/Util/Util.java b/src/tax/cute/mcpingplugin/Util/Util.java new file mode 100644 index 0000000..53d7846 --- /dev/null +++ b/src/tax/cute/mcpingplugin/Util/Util.java @@ -0,0 +1,74 @@ +package tax.cute.mcpingplugin.Util; + +import java.io.*; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.concurrent.ThreadLocalRandom; + +public class Util { + public final static String MC_SRV = "_Minecraft._tcp."; + public final static String MC_SERVER_DEFAULT_FAVICON_BASE64 = "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"; + public final static String MENU = " [ MCPing ] " + + "\n可获取MC(JE|BE)服务器的Motd" + + "\n使用方法:/mcping <域名/IP>" + + "\n支持Srv和中文域名" + + "\n完整功能请见项目的README" + ; + + public static String combineArgs(String s, int start) { + String[] args = s.split(" "); + String str = ""; + for (; start < args.length; start++) { + str += args[start]; + } + return str; + } + + public static boolean isNum(String data) { + try { + Long.parseLong(data); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + public static boolean isBoolean(String data) { + return data.toLowerCase().equals("true") || data.toLowerCase().equals("false"); + } + + public static String readText(String path) throws IOException { + return readText(path, "UTF-8"); + } + + public static String readText(String path, String charsets) throws IOException { + InputStream in = new FileInputStream(path); + String text = new String(in.readAllBytes()); + in.close(); + return text; + } + + public static int random(int Max, int Min) { + return ThreadLocalRandom.current().nextInt(Min, Max); + } + + public static void createPin() { + String path = "data\\MCPing\\Pin.txt"; + File file = new File(path); + if(file.exists()) return; + try { + StringBuilder sb = new StringBuilder(); + int count = random(10,5); + for (int i = 0;i < count;i++) { + sb.append(random(9,0)); + } + String pin = sb.toString(); + OutputStream out = new FileOutputStream(path); + out.write(pin.getBytes()); + out.flush(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/tax/cute/mcpingplugin/commands/BindServer.java b/src/tax/cute/mcpingplugin/commands/BindServer.java new file mode 100644 index 0000000..7b08e35 --- /dev/null +++ b/src/tax/cute/mcpingplugin/commands/BindServer.java @@ -0,0 +1,216 @@ +package tax.cute.mcpingplugin.commands; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.message.data.ForwardMessageBuilder; +import net.mamoe.mirai.message.data.PlainText; +import net.mamoe.mirai.message.data.SingleMessage; +import tax.cute.mcpingplugin.Plugin; +import tax.cute.mcpingplugin.Util.Util; +import top.mrxiaom.miraiutils.CommandModel; +import top.mrxiaom.miraiutils.CommandSender; +import top.mrxiaom.miraiutils.CommandSenderFriend; +import top.mrxiaom.miraiutils.CommandSenderGroup; + +import java.io.IOException; + +public class BindServer extends CommandModel { + Plugin plugin; + + public BindServer(Plugin plugin) { + super("bindServer"); + this.plugin = plugin; + } + + @Override + public void onCommand(CommandSender sender, SingleMessage[] args) { + if (!plugin.config.isEnable()) return; + if (args[0].contentToString().equalsIgnoreCase("/bindServer")) return; + if (!plugin.config.isOwner(sender.getSenderID())) return; + + if (sender instanceof CommandSenderGroup) { + CommandSenderGroup senderGroup = (CommandSenderGroup) sender; + Group group = senderGroup.getGroup(); + try { + if (args[0].contentToString().equalsIgnoreCase("/bingServer")) return; + if (args[0].contentToString().equalsIgnoreCase("add")) addBind(args, group); + if (args[0].contentToString().equalsIgnoreCase("remove")) removeBind(args, group); + if (args[0].contentToString().equalsIgnoreCase("list")) getBind(group); + } catch (IOException e) { + group.sendMessage("读写配置文件时出现了异常\n" + e); + } + } + + if (sender instanceof CommandSenderFriend) { + CommandSenderFriend senderFriend = (CommandSenderFriend) sender; + Friend friend = senderFriend.getFriend(); + try { + if (args[0].contentToString().equalsIgnoreCase("/bingServer")) return; + if (args[0].contentToString().equalsIgnoreCase("add")) addBind(args, friend); + if (args[0].contentToString().equalsIgnoreCase("remove")) removeBind(args, friend); + if (args[0].contentToString().equalsIgnoreCase("list")) getBind(friend); + } catch (IOException e) { + friend.sendMessage("读写配置文件时出现了异常\n" + e); + } + } + } + + private void addBind(SingleMessage[] args, Object sendObject) throws IOException { + if (sendObject instanceof Group) { + Group group = (Group) sendObject; + if (args.length != 4) { + group.sendMessage("参数输入有误"); + return; + } + long num = 0; + if (args[1].contentToString().equalsIgnoreCase("this")) + num = group.getId(); + else if (Util.isNum(args[1].contentToString())) + num = Long.parseLong(args[1].contentToString()); + else + group.sendMessage("意外的数据类型(需要整数)"); + + String cmd = args[2].contentToString(); + String host = args[3].contentToString(); + if (this.plugin.config.addBindServer(num, cmd, host)) + group.sendMessage("绑定成功 可在该群发送 " + cmd + " 获取" + host + "的信息"); + else group.sendMessage("绑定失败 此群已绑定"); + } else if (sendObject instanceof Friend) { + Friend friend = (Friend) sendObject; + if (args.length != 4) { + friend.sendMessage("参数输入有误"); + return; + } + long num; + if (Util.isNum(args[1].contentToString())) + num = Long.parseLong(args[1].contentToString()); + else { + friend.sendMessage("意外的数据类型(需要整数)"); + return; + } + + String cmd = args[2].contentToString(); + String host = args[3].contentToString(); + if (this.plugin.config.addBindServer(num, cmd, host)) + friend.sendMessage("绑定成功 可在该群发送 " + cmd + " 获取" + host + "的信息"); + else friend.sendMessage("绑定失败 此群已绑定"); + } + } + + private void removeBind(SingleMessage[] args, Object sendObject) throws IOException { + if (sendObject instanceof Group) { + Group group = (Group) sendObject; + if (args.length != 2) { + group.sendMessage("参数输入错误"); + return; + } + long num = -1; + if (args[1].contentToString().equalsIgnoreCase("all")) { + int removeCount = plugin.config.removeAllBindServer(); + group.sendMessage("已清空绑定数据(" + removeCount + "个)"); + } else { + if (args[1].contentToString().equalsIgnoreCase("this")) + num = group.getId(); + else if (Util.isNum(args[1].contentToString())) + num = Long.parseLong(args[1].contentToString()); + else + group.sendMessage("意外的数据类型(需要整数)"); + + if (num != -1) { + if (plugin.config.removeBindServer(num)) + group.sendMessage(num + "不再绑定服务器"); + else + group.sendMessage(num + "没有绑定服务器,无法解绑"); + } + } + } else if (sendObject instanceof Friend) { + Friend friend = (Friend)sendObject; + if (args.length != 2) { + friend.sendMessage("参数输入错误"); + return; + } + long num = -1; + if (args[1].contentToString().equalsIgnoreCase("all")) { + int removeCount = plugin.config.removeAllBindServer(); + friend.sendMessage("已清空绑定数据(" + removeCount + "个)"); + } else { + if (Util.isNum(args[1].contentToString())) + num = Long.parseLong(args[1].contentToString()); + else + friend.sendMessage("意外的数据类型(需要整数)"); + + if (num != -1) { + if (plugin.config.removeBindServer(num)) + friend.sendMessage(num + "不再绑定服务器"); + else + friend.sendMessage(num + "没有绑定服务器,无法解绑"); + } + } + } + } + + private void getBind(Object sendObject) { + JSONArray array = plugin.config.getBindServerList(); + if(sendObject instanceof Group) { + Group group = (Group)sendObject; + if (array.size() == 0) { + group.sendMessage("没有数据"); + return; + } + ForwardMessageBuilder builder = new ForwardMessageBuilder(group); + int count = 0; + for (int i = 0; i < array.size(); i++) { + count++; + JSONObject json = array.getJSONObject(i); + builder.add(group.getBot().getId(), "Server" + i, new PlainText( + "Group:" + json.get("GroupNum") + + "\nCmd:" + json.get("CMD") + + "\nHost:" + json.get("Host") + )); + //清零count 发送合并转发 清空ForwardMessageBuilder + if (count == 100) { + count = 0; + group.sendMessage(builder.build()); + builder = new ForwardMessageBuilder(group); + } + if (count > 100) { + group.sendMessage("程序遇到量子异常,程序无法定位此异常,请联系外星人"); + return; + } + } + //即使没上百,最后也会发送 + if (count > 0) group.sendMessage(builder.build()); + }else if(sendObject instanceof Friend) { + Friend friend = (Friend)sendObject; + if (array.size() == 0) { + friend.sendMessage("没有数据"); + return; + } + ForwardMessageBuilder builder = new ForwardMessageBuilder(friend); + int count = 0; + for (int i = 0; i < array.size(); i++) { + count++; + JSONObject json = array.getJSONObject(i); + builder.add(friend.getBot().getId(), "Server" + i, new PlainText( + "Group:" + json.get("GroupNum") + + "\nCmd:" + json.get("CMD") + + "\nHost:" + json.get("Host") + )); + //清零count 发送合并转发 清空ForwardMessageBuilder + if (count == 100) { + count = 0; + friend.sendMessage(builder.build()); + builder = new ForwardMessageBuilder(friend); + } + if (count > 100) { + friend.sendMessage("程序遇到量子异常,程序无法定位此异常,请联系外星人"); + return; + } + } + //即使没上百,最后也会发送 + if (count > 0) friend.sendMessage(builder.build()); + } + } +} diff --git a/src/tax/cute/mcpingplugin/commands/Enable.java b/src/tax/cute/mcpingplugin/commands/Enable.java new file mode 100644 index 0000000..3e7df9a --- /dev/null +++ b/src/tax/cute/mcpingplugin/commands/Enable.java @@ -0,0 +1,58 @@ +package tax.cute.mcpingplugin.commands; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.message.data.SingleMessage; +import tax.cute.mcpingplugin.Plugin; +import tax.cute.mcpingplugin.Util.Util; +import top.mrxiaom.miraiutils.CommandModel; +import top.mrxiaom.miraiutils.CommandSender; +import top.mrxiaom.miraiutils.CommandSenderFriend; +import top.mrxiaom.miraiutils.CommandSenderGroup; + +import java.io.IOException; + +public class Enable extends CommandModel { + Plugin plugin; + public Enable(Plugin plugin) { + super("enable"); + this.plugin = plugin; + } + + @Override + public void onCommand(CommandSender sender, SingleMessage[] args) { + if(args.length != 1) return; + if(!plugin.config.isOwner(sender.getSenderID())) return; + if (sender instanceof CommandSenderGroup) { + CommandSenderGroup senderGroup = (CommandSenderGroup)sender; + Group group = senderGroup.getGroup(); + + try { + if (Util.isBoolean(args[0].contentToString())) { + this.plugin.config.setEnable(Boolean.parseBoolean(args[0].contentToString())); + group.sendMessage("已将enable设置为" + args[0]); + } else { + group.sendMessage("意外的数据类型(需要boolean)"); + } + } catch (IOException e) { + group.sendMessage("读写配置时遇到了异常" + e); + } + } + + if (sender instanceof CommandSenderFriend) { + CommandSenderFriend senderFriend = (CommandSenderFriend)sender; + Friend friend = senderFriend.getFriend(); + + try { + if (Util.isBoolean(args[0].contentToString())) { + this.plugin.config.setEnable(Boolean.parseBoolean(args[0].contentToString())); + friend.sendMessage("已将enable设置为" + args[0]); + } else { + friend.sendMessage("意外的数据类型(需要boolean)"); + } + } catch (IOException e) { + friend.sendMessage("读写配置时遇到了异常" + e); + } + } + } +} diff --git a/src/tax/cute/mcpingplugin/commands/Help.java b/src/tax/cute/mcpingplugin/commands/Help.java new file mode 100644 index 0000000..82c9cbd --- /dev/null +++ b/src/tax/cute/mcpingplugin/commands/Help.java @@ -0,0 +1,34 @@ +package tax.cute.mcpingplugin.commands; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.message.data.SingleMessage; +import tax.cute.mcpingplugin.Plugin; +import tax.cute.mcpingplugin.Util.Util; +import top.mrxiaom.miraiutils.CommandModel; +import top.mrxiaom.miraiutils.CommandSender; +import top.mrxiaom.miraiutils.CommandSenderFriend; +import top.mrxiaom.miraiutils.CommandSenderGroup; + +public class Help extends CommandModel { + Plugin plugin; + public Help(Plugin plugin) { + super("help"); + this.plugin = plugin; + } + + @Override + public void onCommand(CommandSender sender, SingleMessage[] args) { + if(!plugin.config.isEnable()) return; + if (sender instanceof CommandSenderGroup) { + CommandSenderGroup senderGroup = (CommandSenderGroup) sender; + Group group = senderGroup.getGroup(); + group.sendMessage(Util.MENU); + } + if (sender instanceof CommandSenderFriend) { + CommandSenderFriend senderFriend = (CommandSenderFriend)sender; + Friend friend = senderFriend.getFriend(); + friend.sendMessage(Util.MENU); + } + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/commands/MCPing.java b/src/tax/cute/mcpingplugin/commands/MCPing.java new file mode 100644 index 0000000..e4288b2 --- /dev/null +++ b/src/tax/cute/mcpingplugin/commands/MCPing.java @@ -0,0 +1,114 @@ +package tax.cute.mcpingplugin.commands; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.message.data.SingleMessage; +import tax.cute.mcpingplugin.*; +import tax.cute.mcpingplugin.Util.Util; +import tax.cute.minecraftserverping.Punycode; +import top.mrxiaom.miraiutils.CommandModel; +import top.mrxiaom.miraiutils.CommandSender; +import top.mrxiaom.miraiutils.CommandSenderFriend; +import top.mrxiaom.miraiutils.CommandSenderGroup; + +import java.util.Timer; +import java.util.TimerTask; + +public class MCPing extends CommandModel { + Plugin plugin; + + public MCPing(Plugin plugin) { + super("mcping"); + this.plugin = plugin; + } + + @Override + public void onCommand(CommandSender sender, SingleMessage[] args) { + if (!plugin.config.isEnable()) return; + if (args.length != 1) return; + String host = args[0].contentToString(); + + String ip; + int port; + if (host.contains(":")) { + ip = host.split(":")[0]; + port = Integer.parseInt(host.split(":")[1]); + } else { + ip = host; + port = -1; + } + + //中文域名转码 + ip = Punycode.encodeURL(ip); + + if (sender instanceof CommandSenderGroup) { + CommandSenderGroup senderGroup = (CommandSenderGroup) sender; + Group group = senderGroup.getGroup(); + if (args[0].contentToString().equalsIgnoreCase("/mcping")) { + group.sendMessage(Util.MENU); + return; + } + + sendMCPing(plugin, group, ip, port); + } + + if (sender instanceof CommandSenderFriend) { + CommandSenderFriend senderFriend = (CommandSenderFriend) sender; + Friend friend = senderFriend.getFriend(); + if (args[0].contentToString().equalsIgnoreCase("/mcping")) { + friend.sendMessage(Util.MENU); + return; + } + + sendMCPing(plugin, friend, ip, port); + } + } + + public static void sendMCPing(Plugin plugin, Object sendObject, String ip, int port) { + if (sendObject instanceof Group) { + Group group = (Group) sendObject; + MCJEPingThread je = new MCJEPingThread(plugin, ip, port, group); + MCBEPingThread be = new MCBEPingThread(plugin, ip, port, group); + + je.start(); + be.start(); + + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + if (be.status == 0 && je.status == 0) + group.sendMessage("查询失败 请检测服务器是否开启"); + if (je.isAlive() && be.status == 0) + group.sendMessage("查询失败 请检查服务器是否开启"); + if (je.isAlive() && be.isAlive()) + group.sendMessage("查询失败 请检查服务器是否开启"); + je.stop(); + be.stop(); + } + }, 3000); + } else if (sendObject instanceof Friend) { + Friend friend = (Friend) sendObject; + MCJEPingThread je = new MCJEPingThread(plugin, ip, port, friend); + MCBEPingThread be = new MCBEPingThread(plugin, ip, port, friend); + + je.start(); + be.start(); + + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + if (be.status == 0 && je.status == 0) + friend.sendMessage("查询失败 请检测服务器是否开启"); + if (je.isAlive() && be.status == 0) + friend.sendMessage("查询失败 请检查服务器是否开启"); + if (je.isAlive() && be.isAlive()) + friend.sendMessage("查询失败 请检查服务器是否开启"); + je.stop(); + be.stop(); + } + }, 3000); + } + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/commands/OtherMcPingSet.java b/src/tax/cute/mcpingplugin/commands/OtherMcPingSet.java new file mode 100644 index 0000000..f01e4f7 --- /dev/null +++ b/src/tax/cute/mcpingplugin/commands/OtherMcPingSet.java @@ -0,0 +1,48 @@ +package tax.cute.mcpingplugin.commands; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.message.data.SingleMessage; +import tax.cute.mcpingplugin.Plugin; +import top.mrxiaom.miraiutils.CommandModel; +import top.mrxiaom.miraiutils.CommandSender; +import top.mrxiaom.miraiutils.CommandSenderFriend; +import top.mrxiaom.miraiutils.CommandSenderGroup; + +import java.io.IOException; + +public class OtherMcPingSet extends CommandModel { + Plugin plugin; + public OtherMcPingSet(Plugin plugin) { + super("mcPingCmd"); + this.plugin = plugin; + } + + @Override + public void onCommand(CommandSender sender, SingleMessage[] args) { + if(!plugin.config.isOwner(sender.getSenderID())) return; + if(args.length != 2) return; + if(!args[0].contentToString().equalsIgnoreCase("set")) return; + if (sender instanceof CommandSenderGroup) { + CommandSenderGroup senderGroup = (CommandSenderGroup)sender; + Group group = senderGroup.getGroup(); + String cmd = args[1].contentToString(); + try { + plugin.config.setMcPingCmd(cmd); + group.sendMessage("已更改命令为" + cmd); + } catch (IOException e) { + group.sendMessage("读写配置时出现异常" + e); + } + }else if (sender instanceof CommandSenderFriend) { + CommandSenderFriend senderFriend = (CommandSenderFriend)sender; + Friend friend = senderFriend.getFriend(); + String cmd = args[1].contentToString(); + try { + plugin.config.setMcPingCmd(cmd); + friend.sendMessage("已更改命令为" + cmd); + } catch (IOException e) { + friend.sendMessage("读写配置时出现异常" + e); + } + } + } +} diff --git a/src/tax/cute/mcpingplugin/commands/Owner.java b/src/tax/cute/mcpingplugin/commands/Owner.java new file mode 100644 index 0000000..86ff71f --- /dev/null +++ b/src/tax/cute/mcpingplugin/commands/Owner.java @@ -0,0 +1,126 @@ +package tax.cute.mcpingplugin.commands; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.message.data.SingleMessage; +import tax.cute.mcpingplugin.Plugin; +import tax.cute.mcpingplugin.Util.Util; +import top.mrxiaom.miraiutils.CommandModel; +import top.mrxiaom.miraiutils.CommandSender; +import top.mrxiaom.miraiutils.CommandSenderFriend; +import top.mrxiaom.miraiutils.CommandSenderGroup; + +import java.io.IOException; + +public class Owner extends CommandModel { + Plugin plugin; + + public Owner(Plugin plugin) { + super("lp"); + this.plugin = plugin; + } + + @Override + public void onCommand(CommandSender sender, SingleMessage[] args) { + if(!plugin.config.isEnable()) return; + if (args[0].contentToString().equalsIgnoreCase("/lp")) return; + if (!plugin.config.isOwner(sender.getSenderID())) return; + if (sender instanceof CommandSenderGroup) { + CommandSenderGroup senderGroup = (CommandSenderGroup) sender; + Group group = senderGroup.getGroup(); + if (args.length == 1) { + if (args[0].contentToString().equalsIgnoreCase("list")) + sendList(group); + } + if (args.length == 2) { + if (Util.isNum(args[1].contentToString())) { + long num = Long.parseLong(args[1].contentToString()); + try { + if (args[0].contentToString().equalsIgnoreCase("add")) + add(group, num); + + if (args[0].contentToString().equalsIgnoreCase("remove")) + remove(group, num); + + } catch (IOException e) { + group.sendMessage("读写配置时出现了异常\n" + e); + } + } + } + }else + if (sender instanceof CommandSenderFriend) { + CommandSenderFriend senderFriend = (CommandSenderFriend)sender; + Friend friend = senderFriend.getFriend(); + if (args.length == 1) { + if (args[0].contentToString().equalsIgnoreCase("list")) + sendList(friend); + } + if (args.length == 2) { + if (Util.isNum(args[1].contentToString())) { + long num = Long.parseLong(args[1].contentToString()); + try { + if (args[0].contentToString().equalsIgnoreCase("add")) + add(friend,num); + + if (args[0].contentToString().equalsIgnoreCase("remove")) + remove(friend, num); + + } catch (IOException e) { + friend.sendMessage("读写配置时出现了异常\n" + e); + } + } + } + } + + } + + private void add(Object sendObject, long qqNum) throws IOException { + if (sendObject instanceof Group) { + Group group = (Group) sendObject; + if (plugin.config.addOwner(qqNum)) + group.sendMessage("已添加" + qqNum + "为主人"); + else + group.sendMessage(qqNum + "已是主人,无需重复添加"); + } else if (sendObject instanceof Friend) { + Friend friend = (Friend)sendObject; + if (plugin.config.addOwner(qqNum)) + friend.sendMessage("已添加" + qqNum + "为主人"); + else + friend.sendMessage(qqNum + "已是主人,无需重复添加"); + } + } + + private void remove(Object sendObject, long qqNum) throws IOException { + if (sendObject instanceof Group) { + Group group = (Group) sendObject; + if (plugin.config.removeOwner(qqNum)) + group.sendMessage(qqNum + "不再是主人了"); + else + group.sendMessage(qqNum + "不是主人 无法移除"); + } else if (sendObject instanceof Friend) { + Friend friend = (Friend)sendObject; + if (plugin.config.removeOwner(qqNum)) + friend.sendMessage(qqNum + "不再是主人了"); + else + friend.sendMessage(qqNum + "不是主人 无法移除"); + } + } + + private void sendList(Object sendObject) { + if (sendObject instanceof Group) { + Group group = (Group) sendObject; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < plugin.config.getOwner().size(); i++) { + sb.append(plugin.config.getOwner().getString(i)).append("\n"); + } + group.sendMessage("主人:\n" + sb); + } else if (sendObject instanceof Friend) { + Friend friend = (Friend)sendObject; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < plugin.config.getOwner().size(); i++) { + sb.append(plugin.config.getOwner().getString(i)).append("\n"); + } + friend.sendMessage("主人:\n" + sb); + } + } +} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/commands/Reload.java b/src/tax/cute/mcpingplugin/commands/Reload.java new file mode 100644 index 0000000..86f12f2 --- /dev/null +++ b/src/tax/cute/mcpingplugin/commands/Reload.java @@ -0,0 +1,55 @@ +package tax.cute.mcpingplugin.commands; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.message.data.SingleMessage; +import tax.cute.mcpingplugin.BETypeset; +import tax.cute.mcpingplugin.Config; +import tax.cute.mcpingplugin.JETypeset; +import tax.cute.mcpingplugin.Plugin; +import tax.cute.mcpingplugin.Util.Util; +import top.mrxiaom.miraiutils.CommandModel; +import top.mrxiaom.miraiutils.CommandSender; +import top.mrxiaom.miraiutils.CommandSenderFriend; +import top.mrxiaom.miraiutils.CommandSenderGroup; + +import java.io.IOException; + +public class Reload extends CommandModel { + Plugin plugin; + public Reload(Plugin plugin) { + super("reload"); + this.plugin = plugin; + } + @Override + public void onCommand(CommandSender sender, SingleMessage[] args) { + if(!plugin.config.isEnable()) return; + if(!plugin.config.isOwner(sender.getSenderID())) return; + if (sender instanceof CommandSenderGroup) { + CommandSenderGroup senderGroup = (CommandSenderGroup)sender; + Group group = senderGroup.getGroup(); + try { + plugin.config = Config.getConfig(plugin.config.getPath()); + BETypeset.createTypesetFile(plugin.BETypesetFilePath); + JETypeset.createTypesetFile(plugin.JETypesetFilePath); + plugin.JETypesetText = Util.readText(plugin.JETypesetFilePath,"GBK"); + plugin.BETypesetText = Util.readText(plugin.BETypesetFilePath,"GBK"); + group.sendMessage("已完成重载"); + } catch (IOException e) { + group.sendMessage("重新加载配置文件时出现了异常\n" + e); + } + }else if (sender instanceof CommandSenderFriend) { + CommandSenderFriend senderFriend = (CommandSenderFriend)sender; + Friend friend = senderFriend.getFriend(); + + try { + plugin.config = Config.getConfig(plugin.config.getPath()); + plugin.JETypesetText = Util.readText(plugin.JETypesetFilePath,"GBK"); + plugin.BETypesetText = Util.readText(plugin.BETypesetFilePath,"GBK"); + friend.sendMessage("已完成重载"); + } catch (IOException e) { + friend.sendMessage("重新加载配置文件时出现了异常\n" + e); + } + } + } +} diff --git a/src/tax/cute/mcpingplugin/friend/GetOwner.java b/src/tax/cute/mcpingplugin/friend/GetOwner.java new file mode 100644 index 0000000..f92de6a --- /dev/null +++ b/src/tax/cute/mcpingplugin/friend/GetOwner.java @@ -0,0 +1,39 @@ +package tax.cute.mcpingplugin.friend; + +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.message.data.SingleMessage; +import tax.cute.mcpingplugin.Plugin; +import top.mrxiaom.miraiutils.CommandModel; +import top.mrxiaom.miraiutils.CommandSender; +import top.mrxiaom.miraiutils.CommandSenderFriend; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class GetOwner extends CommandModel { + Plugin plugin; + public GetOwner(Plugin plugin) { + super("getOwner"); + this.plugin = plugin; + } + + @Override + public void onCommand(CommandSender sender, SingleMessage[] args) { + if (sender instanceof CommandSenderFriend) { + CommandSenderFriend senderFriend = (CommandSenderFriend)sender; + Friend friend = senderFriend.getFriend(); + if(plugin.config.getOwner().size() > 0) return; + try { + InputStream in = new FileInputStream("data\\MCPing\\Pin.txt"); + String pin = new String(in.readAllBytes()); + in.close(); + if (!args[0].contentToString().equals(pin)) return; + plugin.config.addOwner(friend.getId()); + } catch (IOException e) { + e.printStackTrace(); + } + friend.sendMessage("你已成为主人"); + } + } +} diff --git a/src/top/mrxiaom/miraiutils/CommandListener.java b/src/top/mrxiaom/miraiutils/CommandListener.java new file mode 100644 index 0000000..c5c2fb6 --- /dev/null +++ b/src/top/mrxiaom/miraiutils/CommandListener.java @@ -0,0 +1,184 @@ +package top.mrxiaom.miraiutils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.mamoe.mirai.event.Event; +import net.mamoe.mirai.event.EventChannel; +import net.mamoe.mirai.event.EventHandler; +import net.mamoe.mirai.event.ListeningStatus; +import net.mamoe.mirai.event.SimpleListenerHost; +import net.mamoe.mirai.event.events.FriendMessageEvent; +import net.mamoe.mirai.event.events.GroupMessageEvent; +import net.mamoe.mirai.event.events.MessageEvent; +import net.mamoe.mirai.event.events.StrangerMessageEvent; +import net.mamoe.mirai.message.data.MessageChain; +import net.mamoe.mirai.message.data.MessageSource; +import net.mamoe.mirai.message.data.PlainText; +import net.mamoe.mirai.message.data.SingleMessage; + +public class CommandListener extends SimpleListenerHost { + private String prefix; + private final Set commands = new HashSet(); + + /** + *

+ * The command listener. + *

+ *

+ * You can register it by {@link net.mamoe.mirai.event.EventChannel} + *

+ *

+ * For example: + *

+ *

+ * {@code GlobalEventChannel.INSTANCE.registerListenerHost(new CommandListener("/"));} + *

+ * + * @param prefix the prefix of commands + * @author MrXiaoM + */ + public CommandListener(String prefix) { + this.prefix = prefix; + } + + /** + * Use the default prefix "/" + * + * @author MrXiaoM + */ + public CommandListener() { + this("/"); + } + + public void setCommandPrefix(String prefix) { + this.prefix = prefix; + } + + public String getCommandPrefix() { + return this.prefix; + } + + public void registerToChannel(EventChannel channel) { + channel.registerListenerHost(this); + } + + public void registerCommand(CommandModel command) { + this.commands.add(command); + } + + private void processMessages(MessageEvent event) { + if (event instanceof StrangerMessageEvent) { + StrangerMessageEvent sEvent = (StrangerMessageEvent) event; + this.dispitchCommand( + new CommandSenderStranger(event.getBot(), sEvent.getSender(), sEvent.getSource(), sEvent.getTime()), + event.getMessage()); + } + if (event instanceof FriendMessageEvent) { + FriendMessageEvent fEvent = (FriendMessageEvent) event; + this.dispitchCommand( + new CommandSenderFriend(event.getBot(), fEvent.getSender(), fEvent.getSource(), fEvent.getTime()), + event.getMessage()); + } + if (event instanceof GroupMessageEvent) { + GroupMessageEvent gEvent = (GroupMessageEvent) event; + this.dispitchCommand(new CommandSenderGroup(event.getBot(), gEvent.getGroup(), gEvent.getSender(), + gEvent.getSource(), gEvent.getTime()), event.getMessage()); + } + } + + public void dispitchCommand(CommandSender sender, MessageChain message) { + String cmdRoot = null; + List args = new ArrayList(); + // 遍历消息里所有分段 + int h = 0; + for (int i = 0; i < message.size(); i++) { + if (i >= message.size()) + return; + SingleMessage s = message.get(i); + // i=0 时必为 MessageSource,这个不能算进参数里面,直接跳过 + if (s instanceof MessageSource) { + continue; + } + // 如果分段是普通文本 + if (s instanceof PlainText) { + PlainText text = (PlainText) s; + String str = text.getContent(); + + if (h == 0) { + cmdRoot = str.contains(" ") ? (str.split(" ").length > 0 ? str.split(" ")[0] : null) : str; + if (cmdRoot == null) + break; + // 如果不是命令前缀开头的命令根直接结束 + if (!cmdRoot.startsWith(this.prefix)) { + cmdRoot = null; + break; + } + // 去除命令前缀 + cmdRoot = cmdRoot.substring(this.prefix.length()); + } + // 如果找不到命令根直接结束 + if (cmdRoot == null) + break; + // 将所有带空格的消息分段作为参数 + if (str.contains(" ")) { + String[] splitText = str.split(" "); + // 如果是在最前面的分段,则要选择从1开始还是从0开始 + // 从1开始可舍弃命令根为参数,即让参数里没有命令根 + for (int j = (h == 0 ? 1 : 0); j < splitText.length; j++) { + args.add(new PlainText(splitText[j])); + } + } else { + // 没有带空格时非第一个分段才加入到参数里面 + // 在消息为出现“文字+@AT+文字”等情况的时候会被用到 + if (h != 1) { + args.add(text); + } + } + h++; + // 懒得写 else + continue; + } + + // 如果是其他的消息分段类型 + + // 不是头个的分段的时候判断命令根,如果找不到直接下一个命令 + if (h > 0 && cmdRoot == null) + break; + + h++; + + // 不是普通文本的分段统一加入参数列表 + args.add(s); + } + + if (cmdRoot != null) { + for (CommandModel model : this.commands) { + if (cmdRoot.equalsIgnoreCase(model.getCommand())) { + model.onCommand(sender, args.toArray(new SingleMessage[0])); + } + } + } + } + + @EventHandler + private ListeningStatus onGroupMessage(GroupMessageEvent event) { + this.processMessages(event); + return ListeningStatus.LISTENING; + } + + @EventHandler + private ListeningStatus onFriendMessage(FriendMessageEvent event) { + this.processMessages(event); + return ListeningStatus.LISTENING; + } + + @EventHandler + private ListeningStatus onStrangerMessage(StrangerMessageEvent event) { + + this.processMessages(event); + return ListeningStatus.LISTENING; + } +} diff --git a/src/top/mrxiaom/miraiutils/CommandModel.java b/src/top/mrxiaom/miraiutils/CommandModel.java new file mode 100644 index 0000000..8849308 --- /dev/null +++ b/src/top/mrxiaom/miraiutils/CommandModel.java @@ -0,0 +1,18 @@ +package top.mrxiaom.miraiutils; + +import net.mamoe.mirai.message.data.SingleMessage; + +public abstract class CommandModel { + + private final String command; + + public CommandModel(String command) { + this.command = command; + } + + public String getCommand() { + return this.command; + } + + public abstract void onCommand(CommandSender sender, SingleMessage[] args); +} diff --git a/src/top/mrxiaom/miraiutils/CommandSender.java b/src/top/mrxiaom/miraiutils/CommandSender.java new file mode 100644 index 0000000..923d564 --- /dev/null +++ b/src/top/mrxiaom/miraiutils/CommandSender.java @@ -0,0 +1,33 @@ +package top.mrxiaom.miraiutils; + +import net.mamoe.mirai.Bot; + +public abstract class CommandSender { + private final long senderId; + private final String senderNick; + private final int sendTime; + private final Bot bot; + + protected CommandSender(Bot bot, long senderId, String senderNick, int sendTime) { + this.bot = bot; + this.senderId = senderId; + this.senderNick = senderNick; + this.sendTime = sendTime; + } + + public Bot getBot() { + return this.bot; + } + + public long getSenderID() { + return this.senderId; + } + + public String getSenderNick() { + return this.senderNick; + } + + public int getSendTime() { + return this.sendTime; + } +} diff --git a/src/top/mrxiaom/miraiutils/CommandSenderFriend.java b/src/top/mrxiaom/miraiutils/CommandSenderFriend.java new file mode 100644 index 0000000..929eb87 --- /dev/null +++ b/src/top/mrxiaom/miraiutils/CommandSenderFriend.java @@ -0,0 +1,24 @@ +package top.mrxiaom.miraiutils; + +import net.mamoe.mirai.Bot; +import net.mamoe.mirai.contact.Friend; +import net.mamoe.mirai.message.data.MessageSource; + +public class CommandSenderFriend extends CommandSender { + private final Friend friend; + private final MessageSource source; + + public CommandSenderFriend(Bot bot, Friend friend, MessageSource source, int time) { + super(bot, friend.getId(), friend.getNick(), time); + this.friend = friend; + this.source = source; + } + + public Friend getFriend() { + return this.friend; + } + + public MessageSource getMessageSource() { + return this.source; + } +} diff --git a/src/top/mrxiaom/miraiutils/CommandSenderGroup.java b/src/top/mrxiaom/miraiutils/CommandSenderGroup.java new file mode 100644 index 0000000..353e5de --- /dev/null +++ b/src/top/mrxiaom/miraiutils/CommandSenderGroup.java @@ -0,0 +1,31 @@ +package top.mrxiaom.miraiutils; + +import net.mamoe.mirai.Bot; +import net.mamoe.mirai.contact.Group; +import net.mamoe.mirai.contact.Member; +import net.mamoe.mirai.message.data.MessageSource; + +public class CommandSenderGroup extends CommandSender { + private final Group group; + private final Member member; + private final MessageSource source; + + public CommandSenderGroup(Bot bot, Group group, Member member, MessageSource source, int time) { + super(bot, member.getId(), member.getNick(), time); + this.group = group; + this.member = member; + this.source = source; + } + + public Group getGroup() { + return this.group; + } + + public Member getMember() { + return this.member; + } + + public MessageSource getMessageSource() { + return this.source; + } +} diff --git a/src/top/mrxiaom/miraiutils/CommandSenderStranger.java b/src/top/mrxiaom/miraiutils/CommandSenderStranger.java new file mode 100644 index 0000000..3b6ed25 --- /dev/null +++ b/src/top/mrxiaom/miraiutils/CommandSenderStranger.java @@ -0,0 +1,24 @@ +package top.mrxiaom.miraiutils; + +import net.mamoe.mirai.Bot; +import net.mamoe.mirai.contact.Stranger; +import net.mamoe.mirai.message.data.MessageSource; + +public class CommandSenderStranger extends CommandSender { + private final Stranger stranger; + private final MessageSource source; + + public CommandSenderStranger(Bot bot, Stranger stranger, MessageSource source, int time) { + super(bot, stranger.getId(), stranger.getNick(), time); + this.stranger = stranger; + this.source = source; + } + + public Stranger getStranger() { + return this.stranger; + } + + public MessageSource getMessageSource() { + return this.source; + } +}