diff --git a/src/tax/cute/mcpingplugin/BETypeset.java b/src/tax/cute/mcpingplugin/BETypeset.java deleted file mode 100644 index 270ca37..0000000 --- a/src/tax/cute/mcpingplugin/BETypeset.java +++ /dev/null @@ -1,64 +0,0 @@ -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 deleted file mode 100644 index 49652bc..0000000 --- a/src/tax/cute/mcpingplugin/Config.java +++ /dev/null @@ -1,271 +0,0 @@ -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/Friend.java b/src/tax/cute/mcpingplugin/Friend.java deleted file mode 100644 index 616ad33..0000000 --- a/src/tax/cute/mcpingplugin/Friend.java +++ /dev/null @@ -1,93 +0,0 @@ -package tax.cute.mcpingplugin; - -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.message.data.Image; -import net.mamoe.mirai.utils.ExternalResource; -import tax.cute.minecraftserverping.MCPing; -import tax.cute.minecraftserverping.Punycode; - -import java.io.EOFException; -import java.io.IOException; -import java.net.ConnectException; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import java.net.UnknownHostException; -import java.util.Base64; - -public class Friend extends SimpleListenerHost { - Plugin plugin; - - public Friend(Plugin plugin) { - this.plugin = plugin; - } - - @EventHandler - private ListeningStatus onMonitor(FriendMessageEvent event) { - long qqNum = event.getSender().getId(); - String msg = event.getMessage().contentToString(); - - if (plugin.config.isEnable()) { - try { - if (msg.toLowerCase().startsWith(plugin.config.getMcpingCMD() + " ")) { - //MCPing main function - String host = Util.combineArgs(msg, 1); - String ip; - int port; - if (host.contains(":")) { - ip = host.split(":")[0]; - port = Integer.parseInt(host.split(":")[1]); - } else { - ip = host; - port = 25565; - } - - //Chinese domain encode - ip = Punycode.encodeURL(ip); - - //Check if there is a Srv record - Srv srv = Srv.getSrv(ip, Util.MC_SRV); - if (srv.isExist()) { - event.getSubject().sendMessage("检测到存在Srv记录,已自动跳转到\n>>\n" + srv.getSrvHost() + ":" + srv.getSrvPort()); - ip = srv.getSrvHost(); - port = srv.getSrvPort(); - } - - Typeset typeset = Typeset.getTypeset(ip, port, plugin.typesetText); - - if (typeset.isSendFavicon()) { - Image image = event.getSubject().uploadImage(ExternalResource.create(typeset.getFavicon_bytes())); - event.getSubject().sendMessage(image.plus(typeset.getMotdText())); - } else { - event.getSubject().sendMessage(typeset.getMotdText()); - } - } - - if (msg.equalsIgnoreCase("/getowner")) { - if (plugin.config.getOwner().size() < 1) { - plugin.config.addOwner(qqNum); - event.getSubject().sendMessage(plugin.name + "你已成为主人"); - } - } - } catch (SocketTimeoutException e) { - event.getSubject().sendMessage(plugin.name + "连接失败:连接超时"); - } catch (ConnectException e) { - event.getSubject().sendMessage(plugin.name + "连接失败:无法连接/未开放TCP端口"); - } catch (EOFException e) { - event.getSubject().sendMessage(plugin.name + "连接失败:连接丢失"); - } catch (SocketException e) { - event.getSubject().sendMessage(plugin.name + "连接失败:远程服务器断开了连接\n" + e); - } catch (UnknownHostException e) { - event.getSubject().sendMessage(plugin.name + "连接失败:" + "无效的地址"); - } catch (IOException e) { - event.getSubject().sendMessage(plugin.name + "出现异常:\n" + e); - } - - if (msg.equalsIgnoreCase("/mcping")) event.getSubject().sendMessage(Menu.mcPingMenu()); - } - - return ListeningStatus.LISTENING; - } -} diff --git a/src/tax/cute/mcpingplugin/Group.java b/src/tax/cute/mcpingplugin/Group.java deleted file mode 100644 index 0c4a60f..0000000 --- a/src/tax/cute/mcpingplugin/Group.java +++ /dev/null @@ -1,126 +0,0 @@ -package tax.cute.mcpingplugin; - -import com.alibaba.fastjson.JSONObject; -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 net.mamoe.mirai.message.data.Image; -import net.mamoe.mirai.utils.ExternalResource; -import tax.cute.minecraftserverping.*; - -import java.io.EOFException; -import java.io.IOException; -import java.net.ConnectException; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import java.net.UnknownHostException; -import java.util.Base64; - -public class Group extends SimpleListenerHost { - String name = "[MCPing]"; - Plugin plugin; - - public Group(Plugin plugin) { - this.plugin = plugin; - } - - @EventHandler - private ListeningStatus onMonitor(GroupMessageEvent event) { - long groupNum = event.getGroup().getId(); - if (plugin.config.isEnable()) { - String msg = event.getMessage().contentToString(); - try { - if (msg.toLowerCase().startsWith(plugin.config.getMcpingCMD() + " ")) { - //MCPing main function - String host = Util.combineArgs(msg, 1); - String ip; - int port; - if (host.contains(":")) { - ip = host.split(":")[0]; - port = Integer.parseInt(host.split(":")[1]); - } else { - ip = host; - port = 25565; - } - - //Chinese domain encode - ip = Punycode.encodeURL(ip); - - //Check if there is a Srv record - Srv srv = Srv.getSrv(ip, Util.MC_SRV); - if (srv.isExist()) { - event.getSubject().sendMessage("检测到存在Srv记录,已自动跳转到\n>>\n" + srv.getSrvHost() + ":" + srv.getSrvPort()); - ip = srv.getSrvHost(); - port = srv.getSrvPort(); - } - - Typeset typeset = Typeset.getTypeset(ip,port,plugin.typesetText); - - if (typeset.isSendFavicon()) { - Image image = event.getSubject().uploadImage(ExternalResource.create(typeset.getFavicon_bytes())); - event.getSubject().sendMessage(image.plus(typeset.getMotdText())); - } else { - event.getSubject().sendMessage(typeset.getMotdText()); - } - } - - //bindServer function - if (plugin.config.isGroup(groupNum)) { - JSONObject server = plugin.config.getServer(groupNum); - String cmd = server.getString("CMD"); - if (cmd.equalsIgnoreCase(msg)) { - String host = server.getString("Host"); - - String ip; - int port; - if (host.contains(":")) { - ip = host.split(":")[0]; - port = Integer.parseInt(host.split(":")[1]); - } else { - ip = host; - port = 25565; - } - - //Chinese domain encode - ip = Punycode.encodeURL(ip); - - //Check if there is a Srv record - Srv srv = Srv.getSrv(ip, Util.MC_SRV); - if (srv.isExist()) { - event.getSubject().sendMessage("检测到存在Srv记录,已自动跳转到\n>>\n" + srv.getSrvHost() + ":" + srv.getSrvPort()); - ip = srv.getSrvHost(); - port = srv.getSrvPort(); - } - - Typeset typeset = Typeset.getTypeset(ip,port,plugin.typesetText); - if (typeset.isSendFavicon()) { - Image image = event.getSubject().uploadImage(ExternalResource.create(typeset.getFavicon_bytes())); - event.getSubject().sendMessage(image.plus(typeset.getMotdText())); - } else { - event.getSubject().sendMessage(typeset.getMotdText()); - } - - } - } - - if (msg.equalsIgnoreCase("/mcping")) event.getSubject().sendMessage(Menu.mcPingMenu()); - } catch (SocketTimeoutException e) { - event.getSubject().sendMessage(name + "连接失败:连接超时"); - } catch (ConnectException e) { - event.getSubject().sendMessage(name + "连接失败:无法连接/未开放TCP端口"); - } catch (EOFException e) { - event.getSubject().sendMessage(name + "连接失败:连接丢失"); - } catch (SocketException e) { - event.getSubject().sendMessage(name + "连接失败:远程服务器断开了连接\n" + e); - } catch (UnknownHostException e) { - event.getSubject().sendMessage(name + "连接失败:" + "无效的地址"); - } catch (IOException e) { - event.getSubject().sendMessage(name + "连接失败:\n" + e); - } - } - - return ListeningStatus.LISTENING; - } - -} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/JETypeset.java b/src/tax/cute/mcpingplugin/JETypeset.java deleted file mode 100644 index 597945f..0000000 --- a/src/tax/cute/mcpingplugin/JETypeset.java +++ /dev/null @@ -1,92 +0,0 @@ -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 deleted file mode 100644 index e871cc4..0000000 --- a/src/tax/cute/mcpingplugin/MCBEPingThread.java +++ /dev/null @@ -1,45 +0,0 @@ -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 deleted file mode 100644 index 81e67ef..0000000 --- a/src/tax/cute/mcpingplugin/MCJEPingThread.java +++ /dev/null @@ -1,154 +0,0 @@ -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/Menu.java b/src/tax/cute/mcpingplugin/Menu.java deleted file mode 100644 index d0f12ae..0000000 --- a/src/tax/cute/mcpingplugin/Menu.java +++ /dev/null @@ -1,43 +0,0 @@ -package tax.cute.mcpingplugin; - -public class Menu { - public static String mcPingMenu() { - return " [ MCPing ] " + - "\n可获取MC(JE)服务器的MOTD" + - "\n使用方法:/mcping <域名/IP>" + - "\n支持Srv和中文域名" - ; - } - - public static String ownerMenu() { - return "/by" + - "\n绑定服务器等命令需主人权限" + - "\n参数:" + - "\nowner list -- 查看主人列表" + - "\nowner add -- 添加主人" + - "\nowner remove -- 移除主人"; - } - - public static String bindServerMenu() { - return - "本功能可以让你的机器人" + - "\n一个群MCPing绑定一个地址" + - "\n在绑定的群输入主人设置的命令机器人自动发送Motd" + - "\n/bindServer" + - "\n参数:" + - "\nadd <群号> <命令> -- 绑定一个服务器" + - "\nremove <群号> -- 解绑服务器" + - "\nremove all -- 清空所有绑定" + - "\nPS:\"this\"可代指本群"; - } - - public static String menu() { - return "[ MCPing ] " + - "\n/MCPing -- 查看帮助" + - "\n/by -- 查看帮助" + - "\n/bindServer -- 查看帮助" + - "\n/enable set <布尔值>--开启或禁用机器人" + - "\n/cmd set <命令> -- 修改mcping功能指令" + - "\n/reload -- 重载配置"; - } -} diff --git a/src/tax/cute/mcpingplugin/OtherMcPing.java b/src/tax/cute/mcpingplugin/OtherMcPing.java deleted file mode 100644 index ba4ec41..0000000 --- a/src/tax/cute/mcpingplugin/OtherMcPing.java +++ /dev/null @@ -1,68 +0,0 @@ -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/OwnerFriendCmd.java b/src/tax/cute/mcpingplugin/OwnerFriendCmd.java deleted file mode 100644 index 11a04b3..0000000 --- a/src/tax/cute/mcpingplugin/OwnerFriendCmd.java +++ /dev/null @@ -1,141 +0,0 @@ -package tax.cute.mcpingplugin; - -import com.alibaba.fastjson.JSONObject; -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.message.data.ForwardMessageBuilder; -import net.mamoe.mirai.message.data.PlainText; - -import java.io.IOException; - -public class OwnerFriendCmd extends SimpleListenerHost { - Plugin plugin; - - public OwnerFriendCmd(Plugin plugin) { - this.plugin = plugin; - } - - @EventHandler - private ListeningStatus onMonitor(FriendMessageEvent event) { - long qqNum = event.getSender().getId(); - String msg; - if (plugin.config.isOwner(qqNum)) { - msg = event.getMessage().contentToString(); - } else { - msg = ""; - } - - try { - if (msg.toLowerCase().startsWith("/enable set ")) { - String[] args = msg.split(" "); - String bArgs = args[2]; - if (Util.isBoolean(bArgs)) { - plugin.config.setEnable(Boolean.parseBoolean(bArgs)); - event.getSubject().sendMessage(plugin.name + "enable已修改为" + bArgs); - } else { - event.getSubject().sendMessage(plugin.name + "类型有误(需要boolean)"); - } - } - - if (plugin.config.isEnable()) { - if (msg.startsWith("/")) { - //Get bindServer list function - if (msg.equalsIgnoreCase("/bindServer list")) { - if (plugin.config.getBindServerList().size() > 0) { - ForwardMessageBuilder builder = new ForwardMessageBuilder(event.getFriend()); - for (int i = 0; i < plugin.config.getBindServerList().size(); i++) { - JSONObject server = plugin.config.getBindServerList().getJSONObject(i); - StringBuilder sb = new StringBuilder(); - sb - .append(server.getString("GroupNum")) - .append(":") - .append(server.getString("CMD")) - .append(":") - .append(server.getString("Host")); - builder.add(event.getBot().getId(), String.valueOf(i), new PlainText(sb)); - } - event.getSubject().sendMessage(builder.build()); - } else { - event.getSubject().sendMessage(plugin.name + "绑定服务器列表为空"); - } - } - - if (msg.toLowerCase().startsWith("/bindserver add ")) { - String[] args = msg.split(" "); - long num = Long.parseLong(args[2]); - - //1.group 2.cmd 3.host - if (plugin.config.addBindServer(num, args[3], args[4])) { - event.getSubject().sendMessage(plugin.name + "已将 " + args[4] + " 绑定到 " + num); - } else { - event.getSubject().sendMessage(plugin.name + num + "已绑定,无需重复绑定"); - } - } - - if (msg.equalsIgnoreCase("/bindserver remove all")) { - int count = plugin.config.removeAllBindServer(); - event.getSubject().sendMessage(plugin.name + "已清空所有绑定服务器(" + count + "个)"); - }else if (msg.toLowerCase().startsWith("/bindserver remove ")) { - String[] args = msg.split(" "); - long num = Long.parseLong(args[2]); - - if (plugin.config.removeBindServer(num)) { - event.getSubject().sendMessage(plugin.name + "已将绑定 " + num + " 的服务器移除"); - } else { - event.getSubject().sendMessage(plugin.name + num + "未绑定服务器"); - } - } - - if (msg.toLowerCase().startsWith("/by owner add ")) { - String[] args = msg.split(" "); - long num = Long.parseLong(args[3]); - if (plugin.config.addOwner(num)) event.getSubject().sendMessage(plugin.name + "已将" + num + "添加为主人"); - else event.getSubject().sendMessage(plugin.name + "添加失败:" + num + "已是主人,无需重复添加"); - } - - if (msg.toLowerCase().startsWith("/by owner remove ")) { - String[] args = msg.split(" "); - long num = Long.parseLong(args[3]); - if (plugin.config.removeOwner(num)) event.getSubject().sendMessage(plugin.name + "已将" + num + "移除主人"); - else event.getSubject().sendMessage(plugin.name + "移除失败:" + num + "不是主人"); - } - - if (msg.equalsIgnoreCase("/by owner list")) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < plugin.config.getOwner().size(); i++) { - sb.append(plugin.config.getOwner().getString(i)).append("\n"); - } - event.getSubject().sendMessage(plugin.name + "主人:\n" + sb); - } - - if (msg.toLowerCase().startsWith("/cmd set ")) { - String[] args = msg.split(" "); - plugin.config.setMcpingCMD(args[2]); - event.getSubject().sendMessage(plugin.name + "mcping命令指令已更改为:" + args[2]); - } - - if (msg.toLowerCase().startsWith("/reload")) { - plugin.config = Config.getConfig(plugin.configFilePath); - plugin.typesetText = Util.readText(plugin.typesetFilePath,"GBK"); - event.getSubject().sendMessage("已完成重载"); - } - - if (msg.equalsIgnoreCase("/menu")) event.getSubject().sendMessage(Menu.menu()); - - if(msg.equalsIgnoreCase("/by")) event.getSubject().sendMessage(Menu.ownerMenu()); - - if(msg.equalsIgnoreCase("/bindServer")) event.getSubject().sendMessage(Menu.bindServerMenu()); - - } - } - } catch (IOException e) { - event.getSubject().sendMessage(plugin.name + "读写配置文件时遇到了错误" + e); - } catch (ArrayIndexOutOfBoundsException | NumberFormatException e) { - event.getSubject().sendMessage(plugin.name + "参数输入错误"); - } - - return ListeningStatus.LISTENING; - } -} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/OwnerGroupCmd.java b/src/tax/cute/mcpingplugin/OwnerGroupCmd.java deleted file mode 100644 index f368f2f..0000000 --- a/src/tax/cute/mcpingplugin/OwnerGroupCmd.java +++ /dev/null @@ -1,153 +0,0 @@ -package tax.cute.mcpingplugin; - -import com.alibaba.fastjson.JSONObject; -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 net.mamoe.mirai.message.data.ForwardMessageBuilder; -import net.mamoe.mirai.message.data.PlainText; - -import java.io.IOException; - -public class OwnerGroupCmd extends SimpleListenerHost { - Plugin plugin; - - public OwnerGroupCmd(Plugin plugin) { - this.plugin = plugin; - } - - @EventHandler - private ListeningStatus onMonitor(GroupMessageEvent event) { - long qqNum = event.getSender().getId(); - long groupNum = event.getGroup().getId(); - String msg; - if (plugin.config.isOwner(qqNum)) { - msg = event.getMessage().contentToString(); - } else { - msg = ""; - } - - try { - if (msg.toLowerCase().startsWith("/enable set ")) { - String[] args = msg.split(" "); - String bArgs = args[2]; - if (Util.isBoolean(bArgs)) { - plugin.config.setEnable(Boolean.parseBoolean(bArgs)); - event.getSubject().sendMessage(plugin.name + "enable已修改为" + bArgs); - } else { - event.getSubject().sendMessage(plugin.name + "类型有误(需要boolean)"); - } - } - //Get bindServer list function - if(plugin.config.isEnable()) { - if (msg.startsWith("/")) { - if (msg.equalsIgnoreCase("/bindServer list")) { - if (plugin.config.getBindServerList().size() > 0) { - ForwardMessageBuilder builder = new ForwardMessageBuilder(event.getGroup()); - for (int i = 0; i < plugin.config.getBindServerList().size(); i++) { - JSONObject server = plugin.config.getBindServerList().getJSONObject(i); - StringBuilder sb = new StringBuilder(); - sb - .append(server.getString("GroupNum")) - .append(":") - .append(server.getString("CMD")) - .append(":") - .append(server.getString("Host")); - builder.add(event.getBot().getId(), String.valueOf(i), new PlainText(sb)); - } - event.getSubject().sendMessage(builder.build()); - } else { - event.getSubject().sendMessage(plugin.name + "绑定服务器列表为空"); - } - } - - if (msg.toLowerCase().startsWith("/bindserver add ")) { - String[] args = msg.split(" "); - long num; - //"this" to the current group - if (args[2].equalsIgnoreCase("this")) { - num = groupNum; - } else { - num = Long.parseLong(args[2]); - } - - //1.group 2.cmd 3.host - if (plugin.config.addBindServer(num, args[3], args[4])) { - event.getSubject().sendMessage(plugin.name + "已将 " + args[4] + " 绑定到 " + num); - } else { - event.getSubject().sendMessage(plugin.name + num + "已绑定,无需重复绑定"); - } - } - - if (msg.equalsIgnoreCase("/bindserver remove all")) { - int count = plugin.config.removeAllBindServer(); - event.getSubject().sendMessage(plugin.name + "已清空所有绑定服务器(" + count + "个)"); - }else if (msg.toLowerCase().startsWith("/bindserver remove ")) { - long num; - String[] args = msg.split(" "); - if (args[2].equalsIgnoreCase("this")) { - num = groupNum; - } else { - num = Long.parseLong(args[2]); - } - - if (plugin.config.removeBindServer(num)) { - event.getSubject().sendMessage(plugin.name + "已将绑定 " + num + " 的服务器移除"); - } else { - event.getSubject().sendMessage(plugin.name + num + "未绑定服务器"); - } - } - - if (msg.toLowerCase().startsWith("/by owner add ")) { - String[] args = msg.split(" "); - long num = Long.parseLong(args[3]); - if (plugin.config.addOwner(num)) event.getSubject().sendMessage(plugin.name + "已将" + num + "添加为主人"); - else event.getSubject().sendMessage(plugin.name + "添加失败:" + num + "已是主人,无需重复添加"); - } - - if (msg.toLowerCase().startsWith("/by owner remove ")) { - String[] args = msg.split(" "); - long num = Long.parseLong(args[3]); - if (plugin.config.removeOwner(num)) event.getSubject().sendMessage(plugin.name + "已将" + num + "移除主人"); - else event.getSubject().sendMessage(plugin.name + "移除失败:" + num + "不是主人"); - } - - if (msg.equalsIgnoreCase("/by owner list")) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < plugin.config.getOwner().size(); i++) { - sb.append(plugin.config.getOwner().getString(i)).append("\n"); - } - event.getSubject().sendMessage(plugin.name + "主人:\n" + sb); - } - - if (msg.toLowerCase().startsWith("/cmd set ")) { - String[] args = msg.split(" "); - plugin.config.setMcpingCMD(args[2]); - event.getSubject().sendMessage(plugin.name + "mcping命令指令已更改为:" + args[2]); - } - - if (msg.toLowerCase().startsWith("/reload")) { - plugin.config = Config.getConfig(plugin.configFilePath); - plugin.typesetText = Util.readText(plugin.typesetFilePath,"GBK"); - event.getSubject().sendMessage("已完成重载"); - } - - if (msg.equalsIgnoreCase("/menu")) event.getSubject().sendMessage(Menu.menu()); - - if(msg.equalsIgnoreCase("/by")) event.getSubject().sendMessage(Menu.ownerMenu()); - - if(msg.equalsIgnoreCase("/bindServer")) event.getSubject().sendMessage(Menu.bindServerMenu()); - } - } - - } catch (IOException e) { - event.getSubject().sendMessage(plugin.name + "读写配置文件时遇到了错误" + e); - } catch (ArrayIndexOutOfBoundsException | NumberFormatException e) { - event.getSubject().sendMessage(plugin.name + "参数输入错误"); - } - - return ListeningStatus.LISTENING; - } - -} diff --git a/src/tax/cute/mcpingplugin/Plugin.java b/src/tax/cute/mcpingplugin/Plugin.java deleted file mode 100644 index 46a4778..0000000 --- a/src/tax/cute/mcpingplugin/Plugin.java +++ /dev/null @@ -1,106 +0,0 @@ -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 deleted file mode 100644 index 7c22420..0000000 --- a/src/tax/cute/mcpingplugin/SendBindServer.java +++ /dev/null @@ -1,47 +0,0 @@ -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/Srv.java b/src/tax/cute/mcpingplugin/Srv.java deleted file mode 100644 index eb1109e..0000000 --- a/src/tax/cute/mcpingplugin/Srv.java +++ /dev/null @@ -1,48 +0,0 @@ -package tax.cute.mcpingplugin; - -import javax.naming.directory.Attribute; -import javax.naming.directory.InitialDirContext; -import java.util.Hashtable; - -public class Srv { - private String SrvHost; - private int SrvPort; - private boolean exist = false; - - public Srv(boolean exist,String SrvHost,int SrvPort) { - this.SrvHost = SrvHost; - this.SrvPort = SrvPort; - this.exist = exist; - } - - 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(true,SrvHost, SrvPort); - } - } catch (Exception ignored) { - } - return new Srv(false,"null",0); - } - - public String getSrvHost() { - return SrvHost; - } - - public int getSrvPort() { - return SrvPort; - } - - public boolean isExist() { - return exist; - } -} \ No newline at end of file diff --git a/src/tax/cute/mcpingplugin/Typeset.java b/src/tax/cute/mcpingplugin/Typeset.java deleted file mode 100644 index 7107d52..0000000 --- a/src/tax/cute/mcpingplugin/Typeset.java +++ /dev/null @@ -1,64 +0,0 @@ -package tax.cute.mcpingplugin; - -import tax.cute.minecraftserverping.MCPing; -import java.io.IOException; -import java.util.Base64; - -public class Typeset { - private String motdText; - private boolean sendFavicon; - private byte[] favicon_bytes; - - public Typeset(String motdText, boolean sendFavicon,byte[] favicon_bytes) { - this.motdText = motdText; - this.sendFavicon = sendFavicon; - this.favicon_bytes = favicon_bytes; - } - - public static Typeset 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); - - boolean sendFavicon = typesetText.contains(favicon); - byte[] favicon_bytes = null; - if (sendFavicon) { - if(motd.getFavicon().equals("null")) favicon_bytes = Base64.getDecoder().decode(Util.MCSERVERDEFAULTFAVICONBASE64); - 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, String.valueOf(motd.getModList())) - .replace(favicon, ""); - return new Typeset(motdText,sendFavicon,favicon_bytes); - } - - public String getMotdText() { - return this.motdText; - } - - public boolean isSendFavicon() { - return this.sendFavicon; - } - - public byte[] getFavicon_bytes() { - return this.favicon_bytes; - } -} diff --git a/src/tax/cute/mcpingplugin/Util.java b/src/tax/cute/mcpingplugin/Util.java deleted file mode 100644 index 0f9f07a..0000000 --- a/src/tax/cute/mcpingplugin/Util.java +++ /dev/null @@ -1,54 +0,0 @@ -package tax.cute.mcpingplugin; - -import java.io.*; - -public class Util { - public final static String MC_SRV = "_Minecraft._tcp."; - public final static String MCSERVERDEFAULTFAVICONBASE64 = "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ICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiCL7QMIuQdydE3l3laojjxwpHfqGWdramIF5jaQ5gGuOOR2+CjmcjuKxt2l7HGtFscRHo8lRnbZv+p6d32agfFpUnUd21Gdnc9lRH96nH90JzR9EoBkKudV5ymV2PNesplW5JY4m5keGjvPFeYZ2zsL2A4BI1RLrHRCQYbuMjO9Ecftqe3SzW+8wdTX0zZQPZdwc3wI1C550P/nbx+rB/jXUllbyxt5cov3R5W0G/PbXOrKca9Xj6VvkPa8te5c3q7LcrptA6joKKeoqCxu8xjT6vI7x4N4c8L6fXkMY1znNa0Odq4ganxSLSdUuUbL9EUkMQkvtWBvet6PTHUdxf+A81023WqgtFOIKClip4+YYNT4nifNZiKJnaJmZERFCBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBaW7WYTb1RStAm4vYNA/v8AH5rdIomNr48lqT1VQHPHlg4IPIqP7aDe2Zk0Ok8R/eXSLrZmVhM8GGVHPsk8e/vXNNv2SR7I1rC1zHsli3gdCPXCpWJi0PS+dXLimY8ueOmjY4Mc8bxOABqva1dBSVFZXwwUkEk8znjDI2Fzj5BdXsPRXW1W7PeZ/RIic9RHh0hHeeDfiuqZiHB1RDlPotRW3N1PSwy1E73ENjjaXOPgBqunbK9E1xljbLfJG0cRO91Mbg6U9xPst+K6paNn7VYoTHbqKKAuHryAZe/9Zx1K2SpNvZnNpa6z2K22GmMFupWwh2N93FzyOZJ1K2KIqKiIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAtNtDsxb9paF9LW9axr90OfC4NcQDkDUFblETEzHhrLNs/atn6UU9sooqduMOcBl7+9zuJ81s0RECIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiIP/Z"; - 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); - return new String(in.readAllBytes(),charsets); - } - - public static boolean createTypesetFile(String path) throws IOException{ - File file = new File(path); - if(file.exists()) return false; - OutputStream out = new FileOutputStream(path); - String text = - "%favicon\n" + - "[ 描述 ] %description\n" + - "[ 版本 ] %version_name(%version_protocol)\n" + - "[ 人数 ] %online_players/%max_players\n" + - "[ 延迟 ] %delayms\n" + - "[ 类型 ] %type\n" + - "[ Mod数量 ] %mod_count"; - out.write(text.getBytes()); - return true; - } -} diff --git a/src/tax/cute/mcpingplugin/Util/Srv.java b/src/tax/cute/mcpingplugin/Util/Srv.java deleted file mode 100644 index 2c3c3aa..0000000 --- a/src/tax/cute/mcpingplugin/Util/Srv.java +++ /dev/null @@ -1,43 +0,0 @@ -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 deleted file mode 100644 index 53d7846..0000000 --- a/src/tax/cute/mcpingplugin/Util/Util.java +++ /dev/null @@ -1,74 +0,0 @@ -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 deleted file mode 100644 index 7b08e35..0000000 --- a/src/tax/cute/mcpingplugin/commands/BindServer.java +++ /dev/null @@ -1,216 +0,0 @@ -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 deleted file mode 100644 index 3e7df9a..0000000 --- a/src/tax/cute/mcpingplugin/commands/Enable.java +++ /dev/null @@ -1,58 +0,0 @@ -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 deleted file mode 100644 index 82c9cbd..0000000 --- a/src/tax/cute/mcpingplugin/commands/Help.java +++ /dev/null @@ -1,34 +0,0 @@ -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 deleted file mode 100644 index e4288b2..0000000 --- a/src/tax/cute/mcpingplugin/commands/MCPing.java +++ /dev/null @@ -1,114 +0,0 @@ -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 deleted file mode 100644 index f01e4f7..0000000 --- a/src/tax/cute/mcpingplugin/commands/OtherMcPingSet.java +++ /dev/null @@ -1,48 +0,0 @@ -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 deleted file mode 100644 index 86ff71f..0000000 --- a/src/tax/cute/mcpingplugin/commands/Owner.java +++ /dev/null @@ -1,126 +0,0 @@ -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 deleted file mode 100644 index 86f12f2..0000000 --- a/src/tax/cute/mcpingplugin/commands/Reload.java +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index f92de6a..0000000 --- a/src/tax/cute/mcpingplugin/friend/GetOwner.java +++ /dev/null @@ -1,39 +0,0 @@ -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 deleted file mode 100644 index c5c2fb6..0000000 --- a/src/top/mrxiaom/miraiutils/CommandListener.java +++ /dev/null @@ -1,184 +0,0 @@ -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 deleted file mode 100644 index 8849308..0000000 --- a/src/top/mrxiaom/miraiutils/CommandModel.java +++ /dev/null @@ -1,18 +0,0 @@ -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 deleted file mode 100644 index 923d564..0000000 --- a/src/top/mrxiaom/miraiutils/CommandSender.java +++ /dev/null @@ -1,33 +0,0 @@ -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 deleted file mode 100644 index 929eb87..0000000 --- a/src/top/mrxiaom/miraiutils/CommandSenderFriend.java +++ /dev/null @@ -1,24 +0,0 @@ -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 deleted file mode 100644 index 353e5de..0000000 --- a/src/top/mrxiaom/miraiutils/CommandSenderGroup.java +++ /dev/null @@ -1,31 +0,0 @@ -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 deleted file mode 100644 index 3b6ed25..0000000 --- a/src/top/mrxiaom/miraiutils/CommandSenderStranger.java +++ /dev/null @@ -1,24 +0,0 @@ -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; - } -}