Skip to content

Commit 9b65560

Browse files
authored
Merge pull request #841 from UnrealMultiple/cai-dev
fix(CaiBot):修复白名单登录时空引用报错
2 parents f24f67d + 9aafa63 commit 9b65560

File tree

5 files changed

+72
-69
lines changed

5 files changed

+72
-69
lines changed

src/CaiBot/CaiBotApi.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ internal static async Task HandleMessageAsync(string receivedData)
123123

124124
if (Login.CheckWhite(name, code))
125125
{
126-
var plr = TShock.Players.FirstOrDefault(x => x.Name == name);
126+
var plr = TShock.Players.FirstOrDefault(x => x?.Name == name);
127127
if (plr != null)
128128
{
129129
Login.HandleLogin(plr);
@@ -132,19 +132,19 @@ internal static async Task HandleMessageAsync(string receivedData)
132132
break;
133133
case "selfkick":
134134
name = (string) jsonObject["name"]!;
135-
var playerList2 = TSPlayer.FindByNameOrID("tsn:" + name);
136-
if (playerList2.Count == 0)
135+
var kickPlr= TShock.Players.FirstOrDefault(x=> x?.Name == name);
136+
if (kickPlr == null)
137137
{
138138
return;
139139
}
140-
playerList2[0].Kick("在群中使用自踢命令.", true, saveSSI: true);
140+
kickPlr.Kick("在群中使用自踢命令.", true, saveSSI: true);
141141
break;
142142
case "lookbag":
143143
name = (string) jsonObject["name"]!;
144-
var playerList3 = TSPlayer.FindByNameOrID("tsn:" + name);
145-
if (playerList3.Count != 0)
144+
var lookPlr = TShock.Players.FirstOrDefault(x=> x?.Name == name);
145+
if (lookPlr != null)
146146
{
147-
var plr = playerList3[0].TPlayer;
147+
var plr = lookPlr.TPlayer;
148148
var lookOnlineResult = LookBag.LookOnline(plr);
149149
packetWriter.SetType("lookbag")
150150
.Write("name", lookOnlineResult.Name)
@@ -157,7 +157,6 @@ internal static async Task HandleMessageAsync(string receivedData)
157157
.Write("enhances", lookOnlineResult.Enhances)
158158
.Write("economic", EconomicData.GetEconomicData(lookOnlineResult.Name))
159159
.Send();
160-
return;
161160
}
162161
else
163162
{

src/CaiBotLite/CaiBotApi.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ internal static async Task HandleMessageAsync(string receivedData)
5252
TShock.Log.ConsoleInfo("[CaiBotLite]CaiBOT连接成功...");
5353
//发送服务器信息
5454
packetWriter.SetType("hello")
55+
.Write("server_type", "TShock")
5556
.Write("tshock_version", TShock.VersionNum.ToString())
5657
.Write("plugin_version", Plugin.VersionNum)
5758
.Write("terraria_version", Main.versionNumber)
@@ -109,7 +110,7 @@ internal static async Task HandleMessageAsync(string receivedData)
109110

110111
if (Login.CheckWhite(name, code))
111112
{
112-
var plr = TShock.Players.FirstOrDefault(x => x.Name == name);
113+
var plr = TShock.Players.FirstOrDefault(x => x?.Name == name);
113114
if (plr != null)
114115
{
115116
Login.HandleLogin(plr);
@@ -119,20 +120,20 @@ internal static async Task HandleMessageAsync(string receivedData)
119120
break;
120121
case "selfkick":
121122
name = (string) jsonObject["name"]!;
122-
var playerList2 = TSPlayer.FindByNameOrID("tsn:" + name);
123-
if (playerList2.Count == 0)
123+
var kickPlr = TShock.Players.FirstOrDefault(x=> x?.Name == name);
124+
if (kickPlr == null)
124125
{
125126
return;
126127
}
127128

128-
playerList2[0].Kick("在群中使用自踢命令.", true, saveSSI: true);
129+
kickPlr.Kick("在群中使用自踢命令.", true, saveSSI: true);
129130
break;
130131
case "lookbag":
131132
name = (string) jsonObject["name"]!;
132-
var playerList3 = TSPlayer.FindByNameOrID("tsn:" + name);
133-
if (playerList3.Count != 0)
133+
var lookPlr = TShock.Players.FirstOrDefault(x=> x?.Name == name);
134+
if (lookPlr != null)
134135
{
135-
var plr = playerList3[0].TPlayer;
136+
var plr = lookPlr.TPlayer;
136137
var lookOnlineResult = LookBag.LookOnline(plr);
137138
packetWriter.SetType("lookbag")
138139
.Write("name", lookOnlineResult.Name)
@@ -217,7 +218,9 @@ internal static async Task HandleMessageAsync(string receivedData)
217218
}
218219
catch (Exception ex)
219220
{
220-
TShock.Log.ConsoleError("[CaiBotLite] 处理BOT数据包时出错:\n"+ex+$"\n源数据包: {receivedData}");
221+
TShock.Log.ConsoleError($"[CaiBotLite] 处理BOT数据包时出错:\n" +
222+
$"{ex}\n" +
223+
$"源数据包: {receivedData}");
221224
}
222225
}
223226

src/CaiBotLite/Login.cs

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using NuGet.Protocol;
2-
using On.OTAPI;
3-
using Rests;
1+
using On.OTAPI;
42
using Terraria;
53
using TerrariaApi.Server;
64
using TShockAPI;
@@ -105,15 +103,18 @@ internal static void OnGetData(GetDataEventArgs args)
105103
var type = args.MsgID;
106104

107105
var player = TShock.Players[args.Msg.whoAmI];
108-
if (player == null || !player.ConnectionAlive)
106+
if (player is not { ConnectionAlive: true })
109107
{
110108
args.Handled = true;
111109
return;
112110
}
113111

114-
if ((player.State < 10 || player.Dead) && (int) type > 12 && (int) type != 16 && (int) type != 42 &&
115-
(int) type != 50 &&
116-
(int) type != 38 && (int) type != 21 && (int) type != 22)
112+
if ((player.State < (int)ConnectionState.Complete || player.Dead)
113+
&& type > PacketTypes.PlayerSpawn
114+
&& type != PacketTypes.PlayerMana
115+
&& type != PacketTypes.PlayerBuff
116+
//&& type != PacketTypes.ItemDrop
117+
&& type != PacketTypes.ItemOwner)
117118
{
118119
args.Handled = true;
119120
return;
@@ -123,7 +124,7 @@ internal static void OnGetData(GetDataEventArgs args)
123124
{
124125
if (type == PacketTypes.ContinueConnecting2)
125126
{
126-
player.DataWhenJoined = new PlayerData(true);
127+
player.DataWhenJoined = new PlayerData();
127128
player.DataWhenJoined.CopyCharacter(player);
128129
args.Handled = true;
129130
}
@@ -136,24 +137,23 @@ internal static void OnGetData(GetDataEventArgs args)
136137

137138
internal static bool CheckWhite(string name, int code)
138139
{
139-
var playerList = TSPlayer.FindByNameOrID("tsn:" + name);
140+
var player = TShock.Players.FirstOrDefault(x=> x?.Name == name);
140141

141142
var groupId = Config.Settings.GroupNumber.ToString();
142143
if (Config.Settings.GroupNumber == 0)
143144
{
144145
groupId = "<未配置>";
145146
}
146-
if (playerList.Count == 0)
147+
if (player==null)
147148
{
148149
return false;
149150
}
150151

151-
var plr = playerList[0];
152152
if (string.IsNullOrEmpty(name))
153153
{
154-
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {plr.IP})版本可能过低...");
155-
plr.Disconnect("你的游戏版本可能过低,\n" +
156-
"请使用Terraria1.4.4+游玩");
154+
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {player.IP})版本可能过低...");
155+
player.Disconnect("你的游戏版本可能过低,\n" +
156+
"请使用Terraria1.4.4+游玩");
157157
return false;
158158
}
159159

@@ -163,23 +163,23 @@ internal static bool CheckWhite(string name, int code)
163163
{
164164
case 200:
165165
{
166-
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {plr.IP})已通过白名单验证...");
166+
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {player.IP})已通过白名单验证...");
167167
break;
168168
}
169169
case 404:
170170
{
171-
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {plr.IP})没有添加白名单...");
172-
plr.SilentKickInProgress = true;
173-
plr.Disconnect($"[Cai白名单]没有添加白名单!\n" +
174-
$"请在群{groupId}内发送'/添加白名单 角色名字'");
171+
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {player.IP})没有添加白名单...");
172+
player.SilentKickInProgress = true;
173+
player.Disconnect($"[Cai白名单]没有添加白名单!\n" +
174+
$"请在群{groupId}内发送'/添加白名单 角色名字'");
175175
return false;
176176
}
177177
case 403:
178178
{
179-
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {plr.IP})被屏蔽,处于CaiBot云黑名单中...");
180-
plr.SilentKickInProgress = true;
181-
plr.Disconnect("[Cai白名单]你已被服务器屏蔽,\n" +
182-
"你处于本群黑名单中!");
179+
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {player.IP})被屏蔽,处于CaiBot云黑名单中...");
180+
player.SilentKickInProgress = true;
181+
player.Disconnect("[Cai白名单]你已被服务器屏蔽,\n" +
182+
"你处于本群黑名单中!");
183183
return false;
184184
}
185185
// case 401:
@@ -192,30 +192,30 @@ internal static bool CheckWhite(string name, int code)
192192
// }
193193
case 405:
194194
{
195-
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {plr.IP})使用未授权的设备...");
196-
plr.SilentKickInProgress = true;
197-
plr.Disconnect($"[Cai白名单]未授权设备!\n" +
198-
$"在群{groupId}内发送'/登录'\n" +
199-
$"以批准此设备登录");
195+
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {player.IP})使用未授权的设备...");
196+
player.SilentKickInProgress = true;
197+
player.Disconnect($"[Cai白名单]未授权设备!\n" +
198+
$"在群{groupId}内发送'/登录'\n" +
199+
$"以批准此设备登录");
200200

201201
return false;
202202
}
203203
}
204204
}
205205
catch (Exception ex)
206206
{
207-
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {plr.IP})验证白名单时出现错误...\n" +
207+
TShock.Log.ConsoleInfo($"[Cai白名单]玩家[{name}](IP: {player.IP})验证白名单时出现错误...\n" +
208208
$"{ex}");
209-
plr.SilentKickInProgress = true;
210-
plr.Disconnect($"[Cai白名单]服务器发生错误无法处理该请求!\n" +
211-
$"请尝试重新加入游戏或者联系服务器群{groupId}管理员");
209+
player.SilentKickInProgress = true;
210+
player.Disconnect($"[Cai白名单]服务器发生错误无法处理该请求!\n" +
211+
$"请尝试重新加入游戏或者联系服务器群{groupId}管理员");
212212
return false;
213213
}
214214

215215
return true;
216216
}
217217

218-
internal static bool HandleLogin(TSPlayer player)
218+
internal static void HandleLogin(TSPlayer player)
219219
{
220220
var password = Guid.NewGuid().ToString();
221221
var account = TShock.UserAccounts.GetUserAccountByName(player.Name);
@@ -266,7 +266,7 @@ internal static bool HandleLogin(TSPlayer player)
266266
TShock.Log.ConsoleInfo(player.Name + "成功验证登录。");
267267
TShock.UserAccounts.SetUserAccountUUID(account, player.UUID);
268268
PlayerHooks.OnPlayerPostLogin(player);
269-
return true;
269+
return;
270270
}
271271

272272
if (player.Name != TSServerPlayer.AccountName)
@@ -278,7 +278,7 @@ internal static bool HandleLogin(TSPlayer player)
278278
}
279279
catch (ArgumentOutOfRangeException)
280280
{
281-
return true;
281+
return;
282282
}
283283

284284
player.SendSuccessMessage("[CaiBotLite]账户{0}注册成功。", account.Name);
@@ -328,11 +328,10 @@ internal static bool HandleLogin(TSPlayer player)
328328
TShock.Log.ConsoleInfo(player.Name + "成功验证登录.");
329329
TShock.UserAccounts.SetUserAccountUUID(account, player.UUID);
330330
PlayerHooks.OnPlayerPostLogin(player);
331-
return true;
331+
return;
332332
}
333333

334334
player.SilentKickInProgress = true;
335335
player.Disconnect("[CaiBotLite]此名字不可用!");
336-
return true;
337336
}
338337
}

src/CaiBotLite/Plugin.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace CaiBotLite;
1717
[ApiVersion(2, 1)]
1818
public class Plugin : TerrariaPlugin
1919
{
20-
public static readonly Version VersionNum = new (2025, 3, 15, 1); //日期+版本号(0,1,2...)
20+
public static readonly Version VersionNum = new (2025, 3, 29, 1); //日期+版本号(0,1,2...)
2121
internal static int InitCode = -1;
2222
public static bool DebugMode;
2323
private static bool _stopWebsocket;
@@ -34,14 +34,15 @@ public Plugin(Main game) : base(game)
3434
public override string Author => "Cai,羽学,西江";
3535
public override string Description => "CaiBot官方机器人的适配插件";
3636
public override string Name => "CaiBotLitePlugin";
37+
3738
public override Version Version => VersionNum;
3839

3940

4041
public override void Initialize()
4142
{
4243
DebugMode = Program.LaunchParameters.ContainsKey("-caidebug");
4344
AppDomain.CurrentDomain.AssemblyResolve += this.CurrentDomain_AssemblyResolve;
44-
Commands.ChatCommands.Add(new Command("caibotlite.admin", this.CaiBotCommand, "caibotlite"));
45+
Commands.ChatCommands.Add(new Command("caibotlite.admin", this.CaiBotCommand, "caibotlite", "cbl"));
4546
Config.Settings.Read();
4647
Config.Settings.Write();
4748
ServerApi.Hooks.NetGetData.Register(this, Login.OnGetData, int.MaxValue);
@@ -176,16 +177,16 @@ void ShowHelpText()
176177

177178
List<string> lines = new ()
178179
{
179-
"/caibot debug CaiBot调试开关",
180-
"/caibot code 生成并且展示验证码",
181-
"/caibot info 显示CaiBot的一些信息",
182-
"/caibot unbind 主动解除绑定",
183-
"/caibot test Cai保留用于测试的命令,乱用可能会爆掉"
180+
"/caibotlite debug CaiBot调试开关",
181+
"/caibotlite code 生成并且展示验证码",
182+
"/caibotlite info 显示CaiBot的一些信息",
183+
"/caibotlite unbind 主动解除绑定",
184+
"/caibotlite test Cai保留用于测试的命令, 乱用可能会爆掉"
184185
};
185186

186187
PaginationTools.SendPage(
187188
plr, pageNumber, lines,
188-
new PaginationTools.Settings { HeaderFormat = GetString("帮助 ({0}/{1}):"), FooterFormat = GetString("输入 {0}caibot help {{0}} 查看更多").SFormat(Commands.Specifier) }
189+
new PaginationTools.Settings { HeaderFormat = GetString("帮助 ({0}/{1}):"), FooterFormat = GetString("输入 {0}caibotlite help {{0}} 查看更多").SFormat(Commands.Specifier) }
189190
);
190191
}
191192

@@ -215,7 +216,7 @@ void ShowHelpText()
215216
plr.SendInfoMessage($"[CaiBot信息]\n" +
216217
$"插件版本: v{VersionNum}\n" +
217218
$"WebSocket状态: {WebSocket.State}\n" +
218-
$"绑定QQ群: {(Config.Settings.GroupNumber == 0L ? "未绑定|未连接" : Config.Settings.GroupNumber)}\n" +
219+
$"设置QQ群: {(Config.Settings.GroupNumber == 0L ? "未设置" : Config.Settings.GroupNumber)}\n" +
219220
$"绑定状态: {Config.Settings.Token != ""}\n" +
220221
$"Debug模式: {DebugMode}\n" +
221222
$"Economic API支持: {EconomicSupport.GetCoinsSupport}\n" +

src/CaiBotLite/README.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# CaiBotPlugin 官方机器人适配插件
1+
# CaiBotLitePlugin 官方机器人适配插件
22

33
- 作者: Cai
44
- 仓库: 此仓库
@@ -10,12 +10,12 @@ https://docs.terraria.ink/zh/caibot/CaiBotLite.html
1010

1111
## 指令
1212

13-
| 语法 | 权限 | 说明 |
14-
|---------------------|:------------:|:------------:|
15-
| /caibotlite debug | caibot.admin | 调试模式开关 |
16-
| /caibotlite code | caibot.admin | 生成验证码 |
17-
| /caibotlite info | caibot.admin | 显示CaiBot状态信息 |
18-
| /caibotlite unbind | caibot.admin | 主动解除群绑定 |
13+
| 语法 | 权限 | 说明 |
14+
|------------------------|:------------:|:------------:|
15+
| /caibotlite(cbl) debug | caibot.admin | 调试模式开关 |
16+
| /caibotlite(cbl) code | caibot.admin | 生成验证码 |
17+
| /caibotlite(cbl) info | caibot.admin | 显示CaiBot状态信息 |
18+
| /caibotlite(cbl) unbind | caibot.admin | 主动解除群绑定 |
1919

2020
## 配置
2121

@@ -32,6 +32,7 @@ https://docs.terraria.ink/zh/caibot/CaiBotLite.html
3232
## 更新日志
3333

3434
```
35+
v2025.03.29.1 修复白名单登录时空引用报错
3536
v2025.03.15.1 修改一些提示
3637
v2025.03.10.1 适配TS 5.2.3
3738
v2025.01.28.1 建立项目

0 commit comments

Comments
 (0)