source.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package net.mamoe.n;
  2. import com.google.gson.JsonObject;
  3. import com.google.gson.JsonParser;
  4. import net.mamoe.mirai.console.command.*;
  5. import net.mamoe.mirai.console.plugin.Config;
  6. import net.mamoe.mirai.console.plugin.ConfigSection;
  7. import net.mamoe.mirai.console.plugin.ConfigSectionFactory;
  8. import net.mamoe.mirai.console.plugin.PluginBase;
  9. import net.mamoe.mirai.console.util.Utils;
  10. import net.mamoe.mirai.message.GroupMessage;
  11. import org.jetbrains.annotations.NotNull;
  12. import org.jsoup.Jsoup;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. class PingMyMCServerMain extends PluginBase {
  16. private String defaultServerName;
  17. private ConfigSection serverMap;
  18. private Config setting;
  19. private String API;
  20. private String responseTemplate;
  21. public void onLoad(){
  22. super.onLoad();
  23. this.setting = this.loadConfig("setting.yml");
  24. this.setting.setIfAbsent("API","https://api-mping.loliboy.com/ping/{address}/{port}");
  25. this.setting.setIfAbsent("ServerList", ConfigSectionFactory.create());
  26. this.setting.setIfAbsent("DefaultServerName","");
  27. this.setting.setIfAbsent("ResponseTemplate","Ping {serverName}: \nGame: {game}, {version}\nName: {fullName}\nPlayer: {currentPlayers}/{maxPlayers}\nConnected: {connected}\nIP: {address}:{port}");
  28. this.API = this.setting.getString("API");
  29. this.defaultServerName = this.setting.getString("DefaultServerName");
  30. this.serverMap = this.setting.getConfigSection("ServerList");
  31. this.responseTemplate = this.setting.getString("ResponseTemplate");
  32. }
  33. @Override
  34. public void onDisable() {
  35. super.onDisable();
  36. this.setting.set("ServerList",serverMap);
  37. this.setting.set("DefaultServerName",defaultServerName);
  38. this.setting.save();
  39. }
  40. public void onEnable(){
  41. this.getEventListener().subscribeAlways(GroupMessage.class, (GroupMessage event) -> {
  42. String messageInString = event.getMessage().toString();
  43. if(!messageInString.contains("ping ")) {
  44. return;
  45. }
  46. String serverName = messageInString.replace("ping ", "").toLowerCase().trim();
  47. if(!this.serverMap.containsKey(serverName)) {
  48. serverName = this.defaultServerName;
  49. }
  50. if(!this.serverMap.containsKey(serverName)){
  51. event.getSubject().sendMessage("Bot管理员没有设置任何可ping的服务器, 请使用/mcserver 来增加");
  52. return;
  53. }
  54. ConfigSection serverInfo = this.serverMap.getConfigSection(serverName);
  55. final String serverName_ = serverName;
  56. getScheduler().async(() -> {
  57. event.getSubject().sendMessage("正在获取中..");
  58. try {
  59. String response = Utils.tryNTimes(2, () ->
  60. Jsoup.connect(API
  61. .replace("{address}", serverInfo.getString("address"))
  62. .replace("{port}", serverInfo.getString("port"))
  63. ).ignoreContentType(true).timeout(8000).execute().body()
  64. );
  65. JsonObject resObj = JsonParser.parseString(response).getAsJsonObject();
  66. JsonObject addressObj = resObj.get("rinfo").getAsJsonObject();
  67. event.getSubject().sendMessage(this.responseTemplate
  68. .replace("{connected}",resObj.get("connected").getAsString())
  69. .replace("{currentPlayers}",resObj.get("currentPlayers").getAsString())
  70. .replace("{maxPlayers}",resObj.get("maxPlayers").getAsString())
  71. .replace("{serverName}",serverName_)
  72. .replace("{fullName}",resObj.get("cleanName").getAsString())
  73. .replace("{game}",resObj.get("game").getAsString())
  74. .replace("{version}",resObj.get("version").getAsString())
  75. .replace("{address}",addressObj.get("address").getAsString())
  76. .replace("{port}",addressObj.get("port").getAsString())
  77. );
  78. } catch (Exception e) {
  79. event.getSubject().sendMessage("获取失败.." + e.getMessage());
  80. e.printStackTrace();
  81. }
  82. });
  83. });
  84. JCommandManager.getInstance().register(this, new BlockingCommand(
  85. "mcserver", new ArrayList<>(),"管理可以ping的MC服务器","/mcserver add/remove"
  86. ) {
  87. @Override
  88. public boolean onCommandBlocking(@NotNull CommandSender commandSender, @NotNull List<String> list) {
  89. if(list.size() < 1){
  90. return false;
  91. }
  92. switch (list.get(0)){
  93. case "add":
  94. if(list.size() < 4){
  95. commandSender.sendMessageBlocking("/mcserver add 服务器名字 IP 端口");
  96. return true;
  97. }
  98. String serverName = list.get(1);
  99. String IP = list.get(2);
  100. int port = -1;
  101. try {
  102. port = Integer.parseInt(list.get(3));
  103. }catch (Exception e){
  104. commandSender.sendMessageBlocking("无法识别端口号");
  105. return true;
  106. }
  107. if(port < 0 || port > 65535){
  108. commandSender.sendMessageBlocking("无法识别端口号[0-65535]");
  109. return true;
  110. }
  111. if(IP.contains(":")){
  112. commandSender.sendMessageBlocking("IP中不应包含端口");
  113. return true;
  114. }
  115. ConfigSection data = ConfigSectionFactory.create();
  116. data.set("address",IP);
  117. data.set("port",port);
  118. if(serverMap.size() == 0){
  119. defaultServerName = serverName;
  120. }
  121. serverMap.put(serverName.toLowerCase(),data);
  122. commandSender.sendMessageBlocking("设置成功, 发送ping " + serverName + " 即可");
  123. break;
  124. case "remove":
  125. if(list.size() < 2){
  126. commandSender.sendMessageBlocking("/mcserver remove 服务器名字");
  127. return true;
  128. }
  129. String serverNameToRemove = list.get(1).toLowerCase();
  130. if(serverMap.containsKey(serverNameToRemove)){
  131. serverMap.remove(serverNameToRemove);
  132. commandSender.sendMessageBlocking("移除成功");
  133. }else{
  134. commandSender.sendMessageBlocking("没有找到" + list.get(1) + "的数据");
  135. }
  136. break;
  137. default:
  138. return false;
  139. }
  140. return true;
  141. }
  142. });
  143. this.getLogger().info("PingMyMCServer Enabled");
  144. }
  145. }