Skip to content

Commit

Permalink
API Update (part#1 补充) (#147)
Browse files Browse the repository at this point in the history
* 临时的崩溃修复

* 问题修复和代码格式化

现在发送消息不会导致服务器暂停
调整一些对象的作用域

* 现在游戏内聊天中的"[""]"不会被错误转义。

孩子们我回来了

* 异步游戏->QQ的CQ转义

反卡服

* 移除多余的代码

忘删了

* 添加一个替选的旧方法

把上一个提交删的加回来了

* APIUpdate

优化MessageThread效率
添加一个回调api。

* APIUpdate

清理MessageThread代码
添加一个自定义请求API。

* bug fix

修复游戏崩溃

* 自动重连更新

你说得对,但是我最开始是检测心跳包的。

* fix
  • Loading branch information
xia-mc authored Mar 19, 2024
1 parent 8f1efb0 commit 59abaff
Show file tree
Hide file tree
Showing 9 changed files with 181 additions and 47 deletions.
34 changes: 33 additions & 1 deletion fabric/src/main/java/cn/evole/mods/mcbot/Const.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package cn.evole.mods.mcbot;

import cn.evole.mods.mcbot.config.ModConfig;
import cn.evole.mods.mcbot.core.event.ITickEvent;
import cn.evole.mods.mcbot.util.onebot.MessageThread;
import cn.evole.onebot.sdk.action.ActionPath;
import com.google.gson.JsonObject;
import lombok.val;
import net.fabricmc.loader.api.FabricLoader;
import java.nio.file.Path;
import java.util.concurrent.Callable;
Expand All @@ -14,6 +18,12 @@
import org.apache.logging.log4j.LogManager;
//#endif

//#if MC < 11900
import net.minecraft.network.chat.TextComponent;
//#else
//$$ import net.minecraft.network.chat.Component;
//#endif

/**
* Description:
* Author: cnlimiter
Expand All @@ -30,7 +40,7 @@ public class Const {
public static boolean isShutdown = false;
public static Path configDir = FabricLoader.getInstance().getConfigDir();
public static Path gameDir = FabricLoader.getInstance().getGameDir();
private static final MessageThread messageThread = new MessageThread();
public static final MessageThread messageThread = new MessageThread();

public static boolean isLoad(String modId){
return FabricLoader.getInstance().isModLoaded(modId);
Expand Down Expand Up @@ -67,6 +77,28 @@ public static void sendGroupMsg(long id, Callable<String> message){
messageThread.submit(id, message, false);
}

/**
* 自定义请求 (不应清理)
* @param action 请求类型
* @param params 参数
*/
public static void customRequest(ActionPath action, JsonObject params){
messageThread.submit(action, params);
}

/**
* 向游戏中的所有人发送消息
*/
public static void sendAllPlayerMsg(String message){
//#if MC >= 11900
//$$ val toSend = Component.literal(message);
//#else
val toSend = new TextComponent(message);
//#endif

ITickEvent.getSendQueue().add(toSend);
}

public static void shutdown() {
messageThread.stop();
}
Expand Down
7 changes: 7 additions & 0 deletions fabric/src/main/java/cn/evole/mods/mcbot/McBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import cn.evole.mods.mcbot.util.lib.LibUtils;
import cn.evole.mods.mcbot.util.locale.I18n;
import cn.evole.mods.mcbot.util.onebot.CQUtils;
import cn.evole.mods.mcbot.util.onebot.KeepAlive;
import cn.evole.onebot.client.OneBotClient;
import lombok.Getter;
import net.fabricmc.api.ModInitializer;
Expand Down Expand Up @@ -40,6 +41,9 @@ public class McBot implements ModInitializer {

public static OneBotClient onebot;

public static boolean connected = false;
public static KeepAlive keepAlive;

@Override
public void onInitialize() {
init();
Expand Down Expand Up @@ -85,8 +89,11 @@ public void onServerStarting(MinecraftServer server) {
public void onServerStarted(MinecraftServer server) {
if (ModConfig.INSTANCE.getCommon().isAutoOpen()) {
onebot = OneBotClient.create(ModConfig.INSTANCE.getBotConfig().build()).open().registerEvents(new IBotEvent());
connected = true;
}
CustomCmdHandler.INSTANCE.load();//自定义命令加载
keepAlive = new KeepAlive();
Const.messageThread.register(keepAlive::register);
}

public void onServerStopping(MinecraftServer server) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@
import net.minecraft.ChatFormatting;
import net.minecraft.commands.CommandSourceStack;
import java.util.regex.Pattern;
import net.minecraft.network.chat.Component;

//#if MC <11900
import net.minecraft.network.chat.TextComponent;
//#else
//$$ import net.minecraft.network.chat.Component;
//#endif

public class ConnectCommand {
Expand All @@ -33,10 +35,7 @@ public static int cqhttpExecute(CommandContext<CommandSourceStack> context) thro
//#else
//$$ context.getSource().sendSuccess(Component.literal("▌ " +ChatFormatting.LIGHT_PURPLE + "尝试链接框架"), true);
//#endif
McBot.onebot = OneBotClient.create(ModConfig.INSTANCE.getBotConfig().build()).open().registerEvents(new IBotEvent());
ModConfig.INSTANCE.getStatus().setREnable(true);
ModConfig.INSTANCE.getCommon().setEnable(true);
ModConfig.INSTANCE.save();
cqhttpDoConnect();
return 1;

} else {
Expand All @@ -61,13 +60,16 @@ public static int cqhttpCommonExecute(CommandContext<CommandSourceStack> context
//#else
//$$ context.getSource().sendSuccess(Component.literal("▌ " +ChatFormatting.LIGHT_PURPLE + "尝试链接框架"), true);
//#endif
cqhttpDoConnect();
return 1;

}

public static void cqhttpDoConnect() {
McBot.onebot = OneBotClient.create(ModConfig.INSTANCE.getBotConfig().build()).open().registerEvents(new IBotEvent());
ModConfig.INSTANCE.getStatus().setREnable(true);
ModConfig.INSTANCE.getCommon().setEnable(true);
ModConfig.INSTANCE.save();
return 1;

McBot.connected = true;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.network.chat.Component;
//#if MC <11900
import net.minecraft.network.chat.TextComponent;
//#else
//$$ import net.minecraft.network.chat.Component;
//#endif

public class DisconnectCommand {

public static int execute(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
if (McBot.onebot != null) {
McBot.onebot.close();
McBot.connected = false;
if (!McBot.onebot.getWs().isOpen()) {
//#if MC >= 12000
//$$ context.getSource().sendSuccess(()->Component.literal("WebSocket已断开连接"), true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,12 @@ public class BotConfig extends AutoLoadTomlConfig {
private boolean mirai = false;
@TableField(rightComment = "机器人qq")
private long botId = 0L;//机器人qq
@TableField(rightComment = "重连(未实现)")
@TableField(rightComment = "自动重连")
private boolean reconnect = true;
@TableField(rightComment = "重连次数(未实现)")
private int maxReconnectAttempts = 20;
@TableField(rightComment = "自动重连次数")
private int maxReconnectAttempts = 5;
@TableField(rightComment = "超时宽容度(毫秒)")
private long timeoutCompensation = 5000;

public BotConfig() {
super(null);
Expand Down
19 changes: 8 additions & 11 deletions fabric/src/main/java/cn/evole/mods/mcbot/core/event/IBotEvent.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
package cn.evole.mods.mcbot.core.event;

import cn.evole.mods.mcbot.Const;
import cn.evole.mods.mcbot.McBot;
import cn.evole.mods.mcbot.cmds.CmdApi;
import cn.evole.mods.mcbot.core.data.ChatRecordApi;
import cn.evole.mods.mcbot.config.ModConfig;
import cn.evole.mods.mcbot.util.onebot.CQUtils;
import cn.evole.onebot.client.annotations.SubscribeEvent;
import cn.evole.onebot.client.interfaces.Listener;
import cn.evole.onebot.sdk.event.message.GroupMessageEvent;
import cn.evole.onebot.sdk.event.meta.HeartbeatMetaEvent;
import cn.evole.onebot.sdk.event.meta.LifecycleMetaEvent;
import cn.evole.onebot.sdk.event.notice.group.GroupDecreaseNoticeEvent;
import cn.evole.onebot.sdk.event.notice.group.GroupIncreaseNoticeEvent;
import cn.evole.onebot.sdk.util.MsgUtils;
import lombok.val;
import net.minecraft.network.chat.Component;
//#if MC <11900
import net.minecraft.network.chat.TextComponent;
//#endif


/**
* Description:
Expand Down Expand Up @@ -76,13 +75,7 @@ private void onGroupMessage(GroupMessageEvent event, String send) {
// val toSend = new TextComponent(finalMsg).append(recall);
// //#endif

//#if MC >= 11900
//$$ val toSend = Component.literal(finalMsg);
//#else
val toSend = new TextComponent(finalMsg);
//#endif

ITickEvent.getSendQueue().add(toSend);
Const.sendAllPlayerMsg(finalMsg);
}


Expand Down Expand Up @@ -120,4 +113,8 @@ public void onLifeCycle(LifecycleMetaEvent event) {
}
}

@SubscribeEvent
public void onHeartbeat(HeartbeatMetaEvent event) {
McBot.keepAlive.onHeartbeat(event);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package cn.evole.mods.mcbot.util.onebot;

import cn.evole.mods.mcbot.McBot;
import cn.evole.mods.mcbot.cmds.CustomCmd;
import cn.evole.mods.mcbot.config.ModConfig;
import cn.evole.mods.mcbot.init.handler.CustomCmdHandler;
import cn.evole.onebot.sdk.event.message.GroupMessageEvent;
import cn.evole.onebot.sdk.util.NetUtils;
import lombok.val;
import org.jetbrains.annotations.NotNull;

import java.util.concurrent.atomic.AtomicBoolean;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package cn.evole.mods.mcbot.util.onebot;

import cn.evole.mods.mcbot.Const;
import cn.evole.mods.mcbot.McBot;
import cn.evole.mods.mcbot.command.ConnectCommand;
import cn.evole.mods.mcbot.config.ModConfig;
import cn.evole.onebot.sdk.event.meta.HeartbeatMetaEvent;
import lombok.Getter;
import lombok.val;
import net.minecraft.ChatFormatting;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeoutException;

@Getter
public class KeepAlive {
private final Queue<HeartbeatMetaEvent> heartBeatQueue = new LinkedBlockingQueue<>(5);
// private long timeoutMillis = 100000;

public KeepAlive() {
}

public void onHeartbeat(@NotNull HeartbeatMetaEvent event) {
heartBeatQueue.add(event);
}

public void register() {
while (true) {
val limit = ModConfig.INSTANCE.getBotConfig().getMaxReconnectAttempts();
if (McBot.connected && ModConfig.INSTANCE.getBotConfig().isReconnect() && limit >= 1) {
// try {
// timeoutMillis = getHeartbeat(timeoutMillis + ModConfig.INSTANCE.getBotConfig().getTimeoutCompensation()).getInterval();
// } catch (TimeoutException e) {
// reconnect(limit);
// }
if (McBot.onebot.getWs().isClosed()) { // 当你写完复杂的机制后突然发现有现成的api时 be like
reconnect(limit);
}
}
try {
Thread.sleep(ModConfig.INSTANCE.getBotConfig().getTimeoutCompensation());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}

private void reconnect(final int limit) {
int hasReconnect = 0;
while (hasReconnect <= limit) {
Const.LOGGER.info("正在尝试重连...第{}次", hasReconnect + 1);
ConnectCommand.cqhttpDoConnect();

// try {
// getHeartbeat(100000);
// return;
// } catch (TimeoutException ignored) {}
try {
Thread.sleep(ModConfig.INSTANCE.getBotConfig().getTimeoutCompensation());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
if (McBot.onebot.getWs().isClosed()) hasReconnect++;
else return;
}
Const.sendAllPlayerMsg("▌ " + ChatFormatting.RED + "群服互联意外断开,请联系服务器管理者。");
McBot.onebot.getWs().close();
McBot.connected = false;
}

/**
* 尝试获取心跳包
* @param timeout 超时时间(毫秒)
* @return 心跳包
*/
private HeartbeatMetaEvent getHeartbeat(final long timeout) throws TimeoutException {
val startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < timeout) {
@Nullable HeartbeatMetaEvent event = heartBeatQueue.poll();
if (event == null && timeout > 100) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
} else {
return event;
}
}
throw new TimeoutException("未在指定时间内收到心跳包");
}
}
Loading

0 comments on commit 59abaff

Please sign in to comment.