diff --git a/PluginDocs/java/MyFirstPlugin.MD b/PluginDocs/java/MyFirstPlugin.MD index e69de29bb..495778997 100644 --- a/PluginDocs/java/MyFirstPlugin.MD +++ b/PluginDocs/java/MyFirstPlugin.MD @@ -0,0 +1,3 @@ +Java的插件教程 + +你可以下载source.java和MyFirstPluginJava.pdf 一起阅读 diff --git a/PluginDocs/java/source.java b/PluginDocs/java/source.java new file mode 100644 index 000000000..92ff7d906 --- /dev/null +++ b/PluginDocs/java/source.java @@ -0,0 +1,176 @@ +package net.mamoe.n; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import net.mamoe.mirai.console.command.*; +import net.mamoe.mirai.console.plugins.Config; +import net.mamoe.mirai.console.plugins.ConfigSection; +import net.mamoe.mirai.console.plugins.ConfigSectionFactory; +import net.mamoe.mirai.console.plugins.PluginBase; +import net.mamoe.mirai.console.utils.Utils; +import net.mamoe.mirai.message.GroupMessage; +import org.jetbrains.annotations.NotNull; +import org.jsoup.Jsoup; + +import java.util.ArrayList; +import java.util.List; + +class PingMyMCServerMain extends PluginBase { + + private String defaultServerName; + private ConfigSection serverMap; + private Config setting; + private String API; + private String responseTemplate; + + public void onLoad(){ + super.onLoad(); + + this.setting = this.loadConfig("setting.yml"); + + this.setting.setIfAbsent("API","https://api-mping.loliboy.com/ping/{address}/{port}"); + this.setting.setIfAbsent("ServerList", ConfigSectionFactory.create()); + this.setting.setIfAbsent("DefaultServerName",""); + this.setting.setIfAbsent("ResponseTemplate","Ping {serverName}: \nGame: {game}, {version}\nName: {fullName}\nPlayer: {currentPlayers}/{maxPlayers}\nConnected: {connected}\nIP: {address}:{port}"); + + + this.API = this.setting.getString("API"); + this.defaultServerName = this.setting.getString("DefaultServerName"); + this.serverMap = this.setting.getConfigSection("ServerList"); + this.responseTemplate = this.setting.getString("ResponseTemplate"); + } + + @Override + public void onDisable() { + super.onDisable(); + this.setting.set("ServerList",serverMap); + this.setting.set("DefaultServerName",defaultServerName); + this.setting.save(); + } + + public void onEnable(){ + this.getEventListener().subscribeAlways(GroupMessage.class, (GroupMessage event) -> { + + String messageInString = event.getMessage().toString(); + + if(!messageInString.contains("ping ")) { + return; + } + + String serverName = messageInString.replace("ping ", "").toLowerCase().trim(); + + if(!this.serverMap.containsKey(serverName)) { + serverName = this.defaultServerName; + } + + if(!this.serverMap.containsKey(serverName)){ + event.getSubject().sendMessage("Bot管理员没有设置任何可ping的服务器, 请使用/mcserver 来增加"); + return; + } + + ConfigSection serverInfo = this.serverMap.getConfigSection(serverName); + + final String serverName_ = serverName; + + getScheduler().async(() -> { + event.getSubject().sendMessage("正在获取中.."); + try { + String response = Utils.tryNTimes(2, () -> + Jsoup.connect(API + .replace("{address}", serverInfo.getString("address")) + .replace("{port}", serverInfo.getString("port")) + ).ignoreContentType(true).timeout(8000).execute().body() + ); + JsonObject resObj = JsonParser.parseString(response).getAsJsonObject(); + JsonObject addressObj = resObj.get("rinfo").getAsJsonObject(); + event.getSubject().sendMessage(this.responseTemplate + .replace("{connected}",resObj.get("connected").getAsString()) + .replace("{currentPlayers}",resObj.get("currentPlayers").getAsString()) + .replace("{maxPlayers}",resObj.get("maxPlayers").getAsString()) + .replace("{serverName}",serverName_) + .replace("{fullName}",resObj.get("cleanName").getAsString()) + .replace("{game}",resObj.get("game").getAsString()) + .replace("{version}",resObj.get("version").getAsString()) + .replace("{address}",addressObj.get("address").getAsString()) + .replace("{port}",addressObj.get("port").getAsString()) + ); + } catch (Exception e) { + event.getSubject().sendMessage("获取失败.." + e.getMessage()); + e.printStackTrace(); + } + }); + + }); + + JCommandManager.getInstance().register(this, new BlockingCommand( + "mcserver", new ArrayList<>(),"管理可以ping的MC服务器","/mcserver add/remove" + ) { + @Override + public boolean onCommandBlocking(@NotNull CommandSender commandSender, @NotNull List list) { + if(list.size() < 1){ + return false; + } + switch (list.get(0)){ + case "add": + if(list.size() < 4){ + commandSender.sendMessageBlocking("/mcserver add 服务器名字 IP 端口"); + return true; + } + String serverName = list.get(1); + + String IP = list.get(2); + + int port = -1; + try { + port = Integer.parseInt(list.get(3)); + }catch (Exception e){ + commandSender.sendMessageBlocking("无法识别端口号"); + return true; + } + + if(port < 0 || port > 65535){ + commandSender.sendMessageBlocking("无法识别端口号[0-65535]"); + return true; + } + if(IP.contains(":")){ + commandSender.sendMessageBlocking("IP中不应包含端口"); + return true; + } + + ConfigSection data = ConfigSectionFactory.create(); + + data.set("address",IP); + data.set("port",port); + + if(serverMap.size() == 0){ + defaultServerName = serverName; + } + + serverMap.put(serverName.toLowerCase(),data); + commandSender.sendMessageBlocking("设置成功, 发送ping " + serverName + " 即可"); + + break; + case "remove": + if(list.size() < 2){ + commandSender.sendMessageBlocking("/mcserver remove 服务器名字"); + return true; + } + String serverNameToRemove = list.get(1).toLowerCase(); + if(serverMap.containsKey(serverNameToRemove)){ + serverMap.remove(serverNameToRemove); + commandSender.sendMessageBlocking("移除成功"); + }else{ + commandSender.sendMessageBlocking("没有找到" + list.get(1) + "的数据"); + } + break; + default: + return false; + } + return true; + } + }); + + this.getLogger().info("PingMyMCServer Enabled"); + } + +} \ No newline at end of file