Skip to content

Commit

Permalink
问题修复和指令统计
Browse files Browse the repository at this point in the history
修复可能的机器人连接问题
添加统计OP使用指令功能
  • Loading branch information
xia-mc committed Mar 2, 2024
1 parent f5147bd commit f2ea631
Show file tree
Hide file tree
Showing 11 changed files with 110 additions and 33 deletions.
3 changes: 2 additions & 1 deletion src/main/java/top/infsky/mcstats/McStats.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ public void onServerStarting(MinecraftServer server) {

public void onServerStarted(MinecraftServer server) {
statsData = new StatsData();

ServerTickEvents.END_SERVER_TICK.register(statsData::update);

McBot.init();
}

public void onServerStopping(MinecraftServer server) {
Expand Down
21 changes: 6 additions & 15 deletions src/main/java/top/infsky/mcstats/command/ConnectCommand.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,20 @@
package top.infsky.mcstats.command;

import cn.evole.onebot.client.connection.ConnectFactory;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.network.chat.Component;
import top.infsky.mcstats.config.ModConfig;
import top.infsky.mcstats.log.LogUtils;
import top.infsky.mcstats.mcbot.McBot;

public class ConnectCommand {
public static int execute(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
LogUtils.LOGGER.info("连接QQ机器人");
context.getSource().sendSuccess(() -> Component.literal("正在尝试连接QQ机器人"), true);
try {
McBot.app = new Thread(() -> {
McBot.service = new ConnectFactory(ModConfig.INSTANCE.getBotConfig().toBot(), McBot.blockingQueue);//创建websocket连接
McBot.bot = McBot.service.ws.createBot();//创建机器人实例
}, "BotServer");
McBot.app.start();
LogUtils.LOGGER.info("QQ机器人已连接");
context.getSource().sendSuccess(() -> Component.literal("连接成功。"), true);
} catch (Exception e) {
LogUtils.LOGGER.error("§c机器人服务端配置不正确");
if (McBot.init()) {
context.getSource().sendSuccess(() -> Component.literal("连接成功"), true);
return 1;
} else {
context.getSource().sendSuccess(() -> Component.literal("连接失败,请检查日志"), true);
}
return 1;
return -1;
}
}
7 changes: 6 additions & 1 deletion src/main/java/top/infsky/mcstats/config/CommonConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,16 @@ public class CommonConfig extends AutoLoadTomlConfig {

@TableField(rightComment = "统计数据输出时间(24小时制)")
private String time = "00:00:00";
@TableField(rightComment = "统计指令列表")
private List<String> commandStatsList = new ArrayList<>() {{
add("gamemode");
add("tp");
}};

@TableField(rightComment = "开启Q群功能")
private boolean groupOn = true;
@TableField(rightComment = "Q群列表")
private List<Long> groupIdList = new ArrayList<Long>(){};//支持多个q群
private List<Long> groupIdList = new ArrayList<>();//支持多个q群
@TableField(rightComment = "机器人qq")
private long botId = 0;//机器人qq

Expand Down
39 changes: 32 additions & 7 deletions src/main/java/top/infsky/mcstats/data/FamilyReport.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
import com.google.gson.JsonObject;
import lombok.val;
import net.minecraft.world.entity.player.Player;
import top.infsky.mcstats.config.ModConfig;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.*;

public class FamilyReport {
public static String getString(Map<UUID, PlayerData> playerData, Map<UUID, PlayerData> botData) {
Expand All @@ -29,16 +28,18 @@ public static String getString(Map<UUID, PlayerData> playerData, Map<UUID, Playe
);
}

public static String getString(PlayerData data, boolean online, boolean isFakePlayer) {
public static String getString(PlayerData data, boolean online, boolean isFakePlayer, boolean isOp) {
return String.format(
"""
§r§n§l%s:§7%s §r%s§r
§r上线时长:§7%s§r
§r上线时长:§7%s§r%s%s
""",
isFakePlayer ? "机器人" : "玩家",
isFakePlayer ? "机器人" : isOp ? "管理员" : "玩家",
data.getPlayer().getName().getString(),
online ? "§a在线" : "§4离线",
data.getPlayTime() < 1200 ? data.getPlayTime() / 20 + "秒" : data.getPlayTime() / 1200 + "分钟"
data.getPlayTime() < 1200 ? data.getPlayTime() / 20 + "秒" : data.getPlayTime() / 1200 + "分钟",
isOp ? "\n§r使用指令:\n" : "",
isOp ? getCommandUsed(data) : ""
);
}

Expand All @@ -62,4 +63,28 @@ public static List<Object> getLongestOnlinePlayer(Map<UUID, PlayerData> dataMap)
if (player != null) return List.of(player.getName().getString(), maxTime);
return List.of("无", 0L);
}

public static String getCommandUsed(PlayerData data) {
final List<String> baseCmdUsed = data.getOPCommandUsed();
if (baseCmdUsed.isEmpty()) return "无";

// 从ModConfig生成map
Map<String, Integer> commands = new HashMap<>();
ModConfig.INSTANCE.getCommon().getCommandStatsList().forEach(string -> {
if (baseCmdUsed.contains(string)) {
for (String cmd : baseCmdUsed) {
val count = commands.get(cmd);
commands.put(cmd, (count == null) ? 1 : count + 1);
}
}
});

// 格式化字符串
StringBuilder back = new StringBuilder();
for (String cmd : commands.keySet()) {
back.append(String.format(" §f%s : §r%s次", cmd, commands.get(cmd)));
}

return back.toString();
}
}
5 changes: 0 additions & 5 deletions src/main/java/top/infsky/mcstats/data/IEvents.java

This file was deleted.

9 changes: 8 additions & 1 deletion src/main/java/top/infsky/mcstats/data/PlayerData.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,25 @@
import net.minecraft.world.entity.player.Player;
import top.infsky.mcstats.log.LogUtils;

import java.util.LinkedList;
import java.util.List;

@Getter
public class PlayerData {
public Player player; // 玩家

public boolean fakePlayer;
public boolean fakePlayer; // 是否为假玩家

public long playTime; // 当天游玩tick数

public List<String> OPCommandUsed; // 当天使用OP指令的列表

public PlayerData(Player gamePlayer, boolean isFakePlayer) {
LogUtils.LOGGER.debug(String.format("初始化玩家数据: %s", gamePlayer.getName().getString()));
player = gamePlayer;
fakePlayer = isFakePlayer;
playTime = 0;
OPCommandUsed = new LinkedList<>();
}

/**
Expand All @@ -31,5 +37,6 @@ public void timeAdd() {
*/
public void reset() {
playTime = 0;
OPCommandUsed = new LinkedList<>();
}
}
6 changes: 4 additions & 2 deletions src/main/java/top/infsky/mcstats/data/StatsData.java
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,12 @@ public String getReport() {
public String getFullReport() {
StringBuilder result = new StringBuilder();
for (PlayerData botData : botDataMap.values()) {
result.append(FamilyReport.getString(botData, onlineMap.get(botData.getPlayer().getUUID()), true)).append('\n');
// bot
result.append(FamilyReport.getString(botData, onlineMap.get(botData.getPlayer().getUUID()), true, botData.getPlayer().hasPermissions(2))).append('\n');
}
for (PlayerData playerData : playerDataMap.values()) {
result.append(FamilyReport.getString(playerData, onlineMap.get(playerData.getPlayer().getUUID()), false)).append('\n');
// player or op
result.append(FamilyReport.getString(playerData, onlineMap.get(playerData.getPlayer().getUUID()), false, playerData.getPlayer().hasPermissions(2))).append('\n');
}
return result.toString();
}
Expand Down
12 changes: 11 additions & 1 deletion src/main/java/top/infsky/mcstats/mcbot/McBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,27 @@ public class McBot {

static {
blockingQueue = new LinkedBlockingQueue<>();//使用队列传输数据
messageThread = new MessageThread(); // 创建消息处理线程池
}

/**
* 连接QQ机器人
* @return true -> 成功 | false -> 失败
*/
public static boolean init() {
LogUtils.LOGGER.info("连接QQ机器人");
try {
app = new Thread(() -> {
service = new ConnectFactory(ModConfig.INSTANCE.getBotConfig().toBot(), blockingQueue);//创建websocket连接
bot = service.ws.createBot();//创建机器人实例
}, "BotServer");
app.start();
LogUtils.LOGGER.info("QQ机器人已连接");
return true;
} catch (Exception e) {
LogUtils.LOGGER.error("▌ §c机器人服务端未配置或未打开");
}
messageThread = new MessageThread(); // 创建消息处理线程池
return false;
}

public static void sendGroupMsg(String message){
Expand Down
27 changes: 27 additions & 0 deletions src/main/java/top/infsky/mcstats/mixins/MixinCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package top.infsky.mcstats.mixins;

import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import top.infsky.mcstats.McStats;
import top.infsky.mcstats.config.ModConfig;

import java.util.Objects;

@Mixin(Commands.class)
public class MixinCommand {
@Inject(method = "performPrefixedCommand", at = @At("HEAD"))
public void performPrefixedCommand(CommandSourceStack commandSourceStack, String string, CallbackInfoReturnable<Integer> cir) {
if (!commandSourceStack.hasPermission(2)) return;
if (!ModConfig.INSTANCE.getCommon().getCommandStatsList().contains(string.substring(1))) return;

try {
if (McStats.getStatsData() != null) {
McStats.getStatsData().getPlayerDataMap().get(Objects.requireNonNull(commandSourceStack.getPlayer()).getUUID()).OPCommandUsed.add(string.substring(1));
}
} catch (NullPointerException ignored) {}
}
}
3 changes: 3 additions & 0 deletions src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
"top.infsky.mcstats.McStats"
]
},
"mixins": [
"mc-stats.mixins.json"
],
"depends": {
"fabricloader": ">=${loader_version}",
"fabric": "*",
Expand Down
11 changes: 11 additions & 0 deletions src/main/resources/mc-stats.mixins.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"required": true,
"package": "top.infsky.mcstats.mixins",
"compatibilityLevel": "JAVA_17",
"mixins": [
"MixinCommand"
],
"injectors": {
"defaultRequire": 1
}
}

0 comments on commit f2ea631

Please sign in to comment.