介绍

  1. 通过本插件可以实现Minecraft服务器聊天窗口与QQ群的互联
  2. 远程执行Minecraft服务器的指令
「代码发布」QQ群与Minecraft服务器互联 (IOTQQ插件)插图
QQ群与Minecraft服务器互联 (IOTQQ插件)

编写教程

环境要求

  1. Eclipse ( java IDE )
  2. 可以连接互联网( 废话 )
  3. IOTQQ环境

第一步 依赖引用

    
        io.socket
        socket.io-client
        0.8.3
    
    
    
        com.alibaba
        fastjson
        1.2.62
    
    
    
        org.spigotmc
        spigot-api
        1.12-R0.1-SNAPSHOT
        provided
    

这里IOTQQ环境搭建就不介绍了,详细请看Github!

第二步 开始编写插件

@Override
public void onEnable() {
    // new JavaSocketDemo();
    API.registerModule("mcoo", (Module)new WebServerModule());
    API.registerModule("player", (Module)new WebServerModule1());
    API.registerModule("Inv", (Module)new WebServerModule2());
    LanguageRegistry.INSTANCE.registerEntry(EnumLang.ZH_CN, "item.swordGold.name", "Excalibur");
    if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
        /*
         * We register the EventListeneres here, when PlaceholderAPI is installed. Since
         * all events are in the main class (this class), we simply use "this"
         */
        Bukkit.getPluginManager().registerEvents(new listen(), this);
        getLogger().info("MCOO插件成功启用!正在连接IOTQQ服务器...");
 
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO 自动生成的方法存根
                String url = "http://i.mcenjoy.cn:8888";
                String qq = "2629326992";
                try {
                    IO.Options options = new IO.Options();
                    options.transports = new String[] { "websocket" };
                    // 失败重试次数
                    options.reconnectionAttempts = 10;
                    // 失败重连的时间间隔
                    options.reconnectionDelay = 1000;
                    // 连接超时时间(ms)
                    options.timeout = 500;
                    final Socket socket = IO.socket(url, options);
                    socket.emit("GetWebConn", qq, new Ack() {
                        @Override
                        public void call(Object... objects) {
                            System.out.println(qq + ":" + Arrays.toString(objects));
                        }
                    });
                    // 统一事件管理如好友进群事件 好友请求事件 退群等事件集合
                    socket.on("OnEvents", objects -> System.out.println(Arrays.toString(objects)));
                    // 收到好友消息的回调事件
                    socket.on("OnFriendMsgs", objects -> System.out.println(Arrays.toString(objects)));
                    // 收到群消息的回调事件
                    socket.on("OnGroupMsgs", objects -> {
                        String tmpString = String.valueOf(objects[0]);
                        // System.out.println(tmpString);
                        // tmpString = getSubString(tmpString, "[", "]");
                        // tmpString = tmpString.replace("\\", "");
                        // System.out.println(tmpString);
                        Map stringToMap = JSONObject.parseObject(tmpString);
                        Map stringToMap1 = JSONObject.parseObject(stringToMap.get("CurrentPacket").toString());
                        Map stringToMap2 = JSONObject.parseObject(stringToMap1.get("Data").toString());
 
                        // Map stMap = stringToMap["CurrentPacket"];
                        // getLogger().info();
                        String qqG = stringToMap2.get("FromGroupId").toString();
                        String FromQQ = stringToMap2.get("FromUserId").toString();
                        String Msg = stringToMap2.get("Content").toString();
                        // System.out.println(Msg);
                        // System.out.println(qqG);
                        // System.out.println(qqG == "237962582");
                        // System.out.println(qqG.equals(237962582));
                        // SmallFaceMsg
                        String[] cm = Msg.split("\\s+",2);
                        // 表情信息处理
 
                        if (qqG.equals("237962582")
                                && !stringToMap2.get("FromUserId").toString().equals("2629326992")
                                && stringToMap2.get("MsgType").equals("SmallFaceMsg")) {
                            Map emojiMap = JSONObject.parseObject(Msg);
                            Bukkit.broadcastMessage("§f[§aQQ群§f] <" + stringToMap2.get("FromNickName").toString()
                                    + "> " + emojiMap.get("Content").toString());
                            return;
                        }
 
                        // 文本信息处理
                        if (qqG.equals("237962582")
                                && !stringToMap2.get("FromUserId").toString().equals("2629326992")
                                && stringToMap2.get("MsgType").equals("TextMsg")) {
 
                            if (Msg.equals("刷新机器人连接")) {
                                Map parameters = new HashMap();
                                parameters.put("qq", "2629326992");
                                String string1 = listen.sendGet("http://****.cn:88088/v1/RefreshKeys", parameters);
                                try {
                                    listen.send(Long.parseLong(qqG), 2, "TextMsg", "执行刷新成功!返回"+string1,
                                            Long.parseLong(stringToMap2.get("FromUserId").toString()));
                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                            if (cm[0].equals("聊天状态"))
                            {
                                try {
                                    if (chat) {
                                        listen.send(Long.parseLong(qqG), 2, "TextMsg", "已连接服务器聊天窗口",
                                                Long.parseLong(stringToMap2.get("FromUserId").toString()));
                                    }else{
                                        listen.send(Long.parseLong(qqG), 2, "TextMsg", "未连接服务器聊天窗口",
                                                Long.parseLong(stringToMap2.get("FromUserId").toString()));
                                    }
                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                    }
                                }
                            if (FromQQ.equals("2435932516") && cm[0].equals("关闭聊天"))
                            {
                                chat = false;
                                try {
                                    listen.send(Long.parseLong(qqG), 2, "TextMsg", "关闭聊天成功!",
                                            Long.parseLong(stringToMap2.get("FromUserId").toString()));
                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
 
                            }
                            if (FromQQ.equals("2435932516") && cm[0].equals("开启聊天"))
                            {
                                chat = true;
                                try {
                                    listen.send(Long.parseLong(qqG), 2, "TextMsg", "开启聊天成功!",
                                            Long.parseLong(stringToMap2.get("FromUserId").toString()));
                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
 
                            }
                            if (cm.length>1)
                            {
 
                                if (FromQQ.equals("2435932516") && cm[0].equals("执行"))
                                {
                                    try {
                                        listen.send(Long.parseLong(qqG), 2, "TextMsg", "执行命令成功!",
                                                Long.parseLong(stringToMap2.get("FromUserId").toString()));
                                    } catch (NumberFormatException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    } catch (Exception e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    CommandSender se= Bukkit.getConsoleSender();
                                    Bukkit.dispatchCommand(se,cm[1]);
                                    return;
                                }
 
                            }
                            if (FromQQ.equals("2435932516") && Msg.equals("重启服务器")) {
                                Bukkit.broadcastMessage("[MCOO服务器官方] 服务器即将重启...");
                                try {
                                    listen.send(Long.parseLong(qqG), 2, "TextMsg", "执行重启命令成功!",
                                            Long.parseLong(stringToMap2.get("FromUserId").toString()));
                                } catch (NumberFormatException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                Bukkit.dispatchCommand(Bukkit.getConsoleSender(),"stop");
                                return;
                            }
                            if (FromQQ.equals("2435932516") && Msg.equals("服务器人数")) {
                                String msg = "服务器当前人数:";
                                try {
                                    Collection tmp = Bukkit.getOnlinePlayers();
                                    msg += String.valueOf(tmp.size()) + "\n";
                                    for (Player i : tmp) {
                                        msg += i.getName() + "\n";
                                    }
 
                                    System.out.println(listen.send(Long.parseLong(qqG), 2, "TextMsg", msg,
                                            Long.parseLong(stringToMap2.get("FromUserId").toString())));
                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                return;
                            }
                            Bukkit.broadcastMessage("§f[§aQQ群§f] <" + stringToMap2.get("FromNickName").toString()
                                    + "> " + stringToMap2.get("Content").toString());
                        }
                        //图片消息处理
                        if (qqG.equals("237962582")
                                && !stringToMap2.get("FromUserId").toString().equals("2629326992")
                                && stringToMap2.get("MsgType").equals("PicMsg")) {
                            Bukkit.broadcastMessage("§f[§aQQ群§f] <" + stringToMap2.get("FromNickName").toString()
                                    + "> " + "[图片消息](请前往官方群查看!)");
                        }
                        //AT消息处理
                        if (qqG.equals("237962582")
                                && !stringToMap2.get("FromUserId").toString().equals("2629326992")
                                && stringToMap2.get("MsgType").equals("AtMsg")) {
                            Map stringToMap3 = JSONObject.parseObject(stringToMap2.get("Content").toString());
                            Bukkit.broadcastMessage("§f[§aQQ群§f] <" + stringToMap2.get("FromNickName").toString()
                                    + "> " + stringToMap3.get("Content").toString());
                        }
                        // System.out.println(stringToMap2.get("MsgType"));
                        // System.out.println(stringToMap2.get("FromNickName").toString()+" :
                        // "+stringToMap2.get("Content").toString());
                        // Bukkit.broadcastMessage("[QQ群] [" +
                        // stringToMap2.get("FromNickName").toString() + "] "+
                        // stringToMap2.get("Content").toString());
 
                    });
                    socket.on(Socket.EVENT_CONNECT, objects -> {
                        System.out.println("client: " + "连接成功");
 
                    });
                    socket.connect();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
 
            }
        }
 
        );
 
        t.start();
 
    } else {
        throw new RuntimeException("缺少PlaceholderAPI前置!");
    }
 
    // getServer().getPluginManager().registerEvents(this, this);
}