资源图标

原创 娱乐 MC-BngeuitBridge —— Bngeuit QQ 机器人 ↔ Minecraft 服务器的双向通信桥 1.0.0

完成注册/登录后下载
版权类型
原创
插件中文名称
我的世界与腾讯企鹅机器人通信桥
插件英文名称
MC-BngeuitBridge
原帖地址
#
支持的核心(服务端)
  1. Spigot
  2. Paper
  3. Purpur
语言支持
中文(简体)
前置组件
CraneCore (可选)
适配版本(Java)
  1. 26.x
  2. 1.21
  3. 1.20
  4. 1.19
  5. 1.18
  6. 1.17
  7. 1.16
  8. 1.15
  9. 1.14
  10. 1.13
  11. 1.12

提示​

仅支持QQ官方机器人,需要通过 QQ开放平台 创建机器人

这是什么​

Bngeuit QQ 机器人 ↔ Minecraft 服务器的双向通信桥

两个插件配合使用,通过 WebSocket 在 Bngeuit QQ 机器人和 Minecraft 服务器之间建立双向消息通道。

插件​
运行环境​
角色​
BngeuitBridge​
Bngeuit(Java)​
WebSocket 服务端,接受多个客户端连接​
MC-BngeuitBridge​
Bukkit(Kotlin + TabooLib)​
WebSocket 客户端,连接到 BngeuitBridge​

不绑定任何具体业务,只提供通道。你可以用它做任何事:QQ 群接收玩家上下线通知、QQ 指令操控服务器、查状态、远程执行命令……

点击查看什么是 Bngeuit


架构​

代码:
MC服务器-1 (client-id:1) ──┐
MC服务器-2 (client-id:2) ──┤──→ BngeuitBridge (ws://ip:8765) ──→ QQ群
MC服务器-3 (client-id:3) ──┘

BngeuitBridge 是服务端,支持多个 MC 客户端同时连接
每个 MC 服务器用 client-id 区分
消息可以广播给所有客户端,也可以定向发给某个客户端


示例​

emm...安装 CraneCore + MC-BngeuitBridge 时,可使用 CraneCore 提供的脚本系统,并在插件文件夹中生成示例文件。
也可以在群文件中下载到 Bngeuit 侧的示例脚本。

Bngeuit 侧示例
JavaScript:
const plugin = {
    name: 'BridgeEventListener',
    version: '1.0.0',
    description: '监听 MC-BngeuitBridge 消息:玩家加入/退出通知、状态查询',
    author: 'bngeuit',
    depend: ['BngeuitBridge'],
    softdepend: [],
};

const BridgeMessageReceiveEvent = Packages.cn.org.bukkit.bngeuit.bridge.event.BridgeMessageReceiveEvent;
const BngeuitBridge = Packages.cn.org.bukkit.bngeuit.bridge.BngeuitBridge;

const GroupAtMessageEvent = Packages.cn.org.bukkit.bngeuit.event.receive.GroupAtMessageEvent;

// 在此填写要接收信息的group_openid
// 若不知道,可以在群内 @机器人 后在控制台查看 log 中 (群: xxxx) 字眼
const GROUP_ID = '';

function onLoad() {
    // lifecycle start
}

function onEnable() {
    bngeuit.info('[BngeuitBridge] 事件监听已启用');

    bngeuit.on(BridgeMessageReceiveEvent, (event) => {
        var type = String(event.getType());
        var action = event.getAction() ? String(event.getAction()) : '';

        if (type === 'bridge') {
            handleBridgeStatus(event, action);
        } else if (type === 'mc_event') {
            handleMcEvent(event, action);
        }
    });

    // 群聊 @ 事件,若不需要,可删除 37~42 行
    bngeuit.on(GroupAtMessageEvent, (e) => {
        const text = String(e.getContent()).trim();
        bngeuit.info('GroupAtMessageEvent: ' + text + ' (群: ' + e.getGroupOpenid() + ')');

    });
}

function handleBridgeStatus(event, action) {
    if (action !== 'status') return;

    var msg = event.getMessage();
    var requestId = msg.getRequestId();
    if (!requestId) {
        bngeuit.warn('[BngeuitBridge] 收到 bridge/status 请求但 requestId 为 null,跳过回复');
        return;
    }

    var instance = BngeuitBridge.getInstance();
    var uptimeMs = java.lang.System.currentTimeMillis() - instance.getStartTime();
    var uptimeSec = Math.floor(uptimeMs / 1000);

    var status = new java.util.LinkedHashMap();
    status.put('version', instance.getDescription().getVersion());
    status.put('uptimeSeconds', uptimeSec);
    status.put('connectedClients', instance.getChannel().getConnectedClients().size());
    status.put('clientIds', instance.getChannel().getConnectedClients());

    instance.getChannel().send(event.getClientId(), msg.reply(status));
    bngeuit.info('[BngeuitBridge] 已回复状态查询: clientId=' + event.getClientId() + ', requestId=' + requestId + ', uptime=' + uptimeSec + 's');
}

function handleMcEvent(event, action) {
    var data = event.getData();
    if (!(data instanceof java.util.Map)) {
        bngeuit.warn('[BngeuitBridge] mc_event 的 data 不是 Map: ' + data);
        return;
    }

    var playerName = data.get('player') ? String(data.get('player')) : '未知玩家';
    var uuid = data.get('uuid') ? String(data.get('uuid')) : '';

    if (action === 'player_join') {
        var msg = playerName + ' 加入了游戏';
        bngeuit.info('[BngeuitBridge] 发送加入游戏信息: ' + msg + ' (uuid=' + uuid + ')');
        Bngeuit.sendGroupText(GROUP_ID, msg);
    } else if (action === 'player_quit') {
        var msg = playerName + ' 离开了游戏';
        bngeuit.info('[BngeuitBridge] 发送离开游戏信息: ' + msg + ' (uuid=' + uuid + ')');
        Bngeuit.sendGroupText(GROUP_ID, msg);
    } else {
        bngeuit.info('[BngeuitBridge] 未知 mc_event action: ' + action);
    }
}

function onDisable() {
    bngeuit.info('BridgeEventListener unloaded');
}

MC侧
JavaScript:
const MCBngeuitBridge = Packages.cn.org.bukkit.bngeuit.bridge.MCBngeuitBridge.INSTANCE

function enable() {
    ListenerUtils.registerListener("MCBngeuitBridge:加入信息", "org.bukkit.event.player.PlayerJoinEvent", "HIGHEST", false, function (event) {
        let channel = MCBngeuitBridge.getChannel();
        if (channel == null || !channel.isConnected()) return
        let player = event.getPlayer();
        let data = new java.util.HashMap()
        data.put("player", player.getName())
        channel.send("mc_event", "player_join", data)
    })
    ListenerUtils.registerListener("MCBngeuitBridge:离开信息", "org.bukkit.event.player.PlayerQuitEvent", "HIGHEST", false, function (event) {
        let channel = MCBngeuitBridge.getChannel();
        if (channel == null || !channel.isConnected()) return
        let player = event.getPlayer();
        let data = new java.util.HashMap()
        data.put("player", player.getName())
        channel.send("mc_event", "player_quit", data)
    })
}

function disable() {
    ListenerUtils.unregisterListener("MCBngeuitBridge:加入信息")
    ListenerUtils.unregisterListener("MCBngeuitBridge:离开信息")
}

适用场景​

QQ 群实时显示玩家上下线
QQ 指令远程操控 MC 服务器(白名单、踢人、广播)
查询服务器在线人数、TPS、运行状态
跨多个 MC 服务器的消息中转
任何需要 QQ ↔ MC 双向通信的场景

下载​

点击下载
作者
MonsterXZ
下载
7
查看
136
首次发布
最后更新

评分

0.00 星 0 次评分

MonsterXZ 的其他资源

后退
顶部 底部