@@ -18,15 +18,16 @@ namespace CaiBot;
18
18
[ ApiVersion ( 2 , 1 ) ]
19
19
public class Plugin : TerrariaPlugin
20
20
{
21
- public static readonly Version VersionNum = new ( 2025 , 1 , 29 , 1 ) ; //日期+版本号(0,1,2...)
21
+ public static readonly Version VersionNum = new ( 2025 , 3 , 2 , 1 ) ; //日期+版本号(0,1,2...)
22
22
internal static int InitCode = - 1 ;
23
23
public static bool LocalMode => Config . Settings . BotApi != "api.terraria.ink:22334" ;
24
24
public static bool DebugMode ;
25
25
private static bool _stopWebsocket ;
26
- internal static ClientWebSocket WebSocket = new ( ) ;
27
- private static readonly Task WebSocketTask = Task . CompletedTask ;
28
- private static readonly CancellationTokenSource TokenSource = new ( ) ;
29
-
26
+ internal static ClientWebSocket WebSocket
27
+ {
28
+ get => PacketWriter . WebSocket ;
29
+ set => PacketWriter . WebSocket = value ;
30
+ }
30
31
public Plugin ( Main game ) : base ( game )
31
32
{
32
33
}
@@ -40,25 +41,26 @@ public Plugin(Main game) : base(game)
40
41
public override void Initialize ( )
41
42
{
42
43
AppDomain . CurrentDomain . AssemblyResolve += this . CurrentDomain_AssemblyResolve ;
43
- MapGenerator . Init ( ) ;
44
- EconomicSupport . Init ( ) ;
45
44
Commands . ChatCommands . Add ( new Command ( "caibot.admin" , this . CaiBotCommand , "caibot" ) ) ;
46
45
Config . Settings . Read ( ) ;
47
46
Config . Settings . Write ( ) ;
48
47
DebugMode = Program . LaunchParameters . ContainsKey ( "-caidebug" ) ;
48
+ ServerApi . Hooks . NetGetData . Register ( this , Login . OnGetData , int . MaxValue ) ;
49
+ ServerApi . Hooks . ServerChat . Register ( this , OnChat , int . MaxValue ) ;
50
+ ServerApi . Hooks . GamePostInitialize . Register ( this , GenBindCode ) ;
49
51
BanManager . OnBanPostAdd += this . OnBanInsert ;
50
52
Hooks . MessageBuffer . InvokeGetData += Login . MessageBuffer_InvokeGetData ;
51
- ServerApi . Hooks . NetGetData . Register ( this , Login . OnGetData , int . MaxValue ) ;
52
- ServerApi . Hooks . ServerChat . Register ( this , this . OnChat , int . MaxValue ) ;
53
- PlayerHooks . PlayerPostLogin += this . PlayerHooksOnPlayerPostLogin ;
53
+ PlayerHooks . PlayerPostLogin += PlayerHooksOnPlayerPostLogin ;
54
54
PlayerHooks . PlayerLogout += this . PlayerHooksOnPlayerLogout ;
55
55
GeneralHooks . ReloadEvent += this . GeneralHooksOnReloadEvent ;
56
- ServerApi . Hooks . GamePostInitialize . Register ( this , GenBindCode ) ;
57
- Task . Run ( StartCaiApi , TokenSource . Token ) ;
58
- Task . Run ( StartHeartBeat , TokenSource . Token ) ;
56
+ MapGenerator . Init ( ) ;
57
+ EconomicSupport . Init ( ) ;
58
+ PacketWriter . Init ( false , DebugMode ) ;
59
+ Task . Factory . StartNew ( StartCaiApi , TaskCreationOptions . LongRunning ) ;
60
+ Task . Factory . StartNew ( StartHeartBeat , TaskCreationOptions . LongRunning ) ;
59
61
if ( LocalMode )
60
62
{
61
- TShock . Log . ConsoleWarn ( $ "[CaiAPI ]CaiBot插件正在以本地模式运行, 当前API地址: { Config . Settings . BotApi } ") ;
63
+ TShock . Log . ConsoleWarn ( $ "[CaiBot ]CaiBot插件正在以本地模式运行, 当前API地址: { Config . Settings . BotApi } ") ;
62
64
}
63
65
}
64
66
@@ -68,22 +70,17 @@ protected override void Dispose(bool disposing)
68
70
{
69
71
var asm = Assembly . GetExecutingAssembly ( ) ;
70
72
Commands . ChatCommands . RemoveAll ( c => c . CommandDelegate . Method . DeclaringType ? . Assembly == asm ) ;
71
- MapGenerator . Dispose ( ) ;
72
73
AppDomain . CurrentDomain . AssemblyResolve -= this . CurrentDomain_AssemblyResolve ;
73
- Hooks . MessageBuffer . InvokeGetData -= Login . MessageBuffer_InvokeGetData ;
74
- BanManager . OnBanPostAdd -= this . OnBanInsert ;
75
74
ServerApi . Hooks . NetGetData . Deregister ( this , Login . OnGetData ) ;
76
75
ServerApi . Hooks . GamePostInitialize . Deregister ( this , GenBindCode ) ;
77
- ServerApi . Hooks . ServerChat . Deregister ( this , this . OnChat ) ;
78
- PlayerHooks . PlayerPostLogin -= this . PlayerHooksOnPlayerPostLogin ;
76
+ ServerApi . Hooks . ServerChat . Deregister ( this , OnChat ) ;
77
+ Hooks . MessageBuffer . InvokeGetData -= Login . MessageBuffer_InvokeGetData ;
78
+ BanManager . OnBanPostAdd -= this . OnBanInsert ;
79
+ PlayerHooks . PlayerPostLogin -= PlayerHooksOnPlayerPostLogin ;
79
80
PlayerHooks . PlayerLogout -= this . PlayerHooksOnPlayerLogout ;
80
81
_stopWebsocket = true ;
81
82
WebSocket . Dispose ( ) ;
82
- if ( ! WebSocketTask . IsCompleted )
83
- {
84
- TokenSource . Cancel ( ) ;
85
- TokenSource . Dispose ( ) ;
86
- }
83
+ MapGenerator . Dispose ( ) ;
87
84
}
88
85
89
86
base . Dispose ( disposing ) ;
@@ -93,7 +90,6 @@ private void GeneralHooksOnReloadEvent(ReloadEventArgs e)
93
90
{
94
91
Config . Settings . Read ( ) ;
95
92
e . Player . SendSuccessMessage ( "[CaiBot]配置文件已重载 :)" ) ;
96
- WebSocket . Dispose ( ) ;
97
93
}
98
94
99
95
private static async Task ? StartHeartBeat ( )
@@ -105,8 +101,8 @@ private void GeneralHooksOnReloadEvent(ReloadEventArgs e)
105
101
{
106
102
if ( WebSocket . State == WebSocketState . Open )
107
103
{
108
- Dictionary < string , string > heartBeat = new ( ) { { "type" , "HeartBeat" } } ;
109
- await CaiBotApi . SendDateAsync ( JsonConvert . SerializeObject ( heartBeat ) ) ;
104
+ var packetWriter = new PacketWriter ( ) ;
105
+ packetWriter . SetType ( "HeartBeat" ) . Send ( ) ;
110
106
}
111
107
}
112
108
catch
@@ -140,7 +136,7 @@ private void GeneralHooksOnReloadEvent(ReloadEventArgs e)
140
136
var token = json [ "token" ] ! . ToString ( ) ;
141
137
Config . Settings . Token = token ;
142
138
Config . Settings . Write ( ) ;
143
- TShock . Log . ConsoleInfo ( "[CaiAPI ]被动绑定成功!" ) ;
139
+ TShock . Log . ConsoleInfo ( "[CaiBot ]被动绑定成功!" ) ;
144
140
}
145
141
146
142
@@ -154,15 +150,15 @@ private void GeneralHooksOnReloadEvent(ReloadEventArgs e)
154
150
var receivedData = Encoding . UTF8 . GetString ( buffer , 0 , result . Count ) ;
155
151
if ( DebugMode )
156
152
{
157
- TShock . Log . ConsoleInfo ( $ "[CaiAPI ]收到BOT数据包: { receivedData } ") ;
153
+ TShock . Log . ConsoleInfo ( $ "[CaiBot ]收到BOT数据包: { receivedData } ") ;
158
154
}
159
155
160
156
_ = CaiBotApi . HandleMessageAsync ( receivedData ) ;
161
157
}
162
158
}
163
159
catch ( Exception ex )
164
160
{
165
- TShock . Log . ConsoleInfo ( "[CaiAPI ]CaiBot断开连接..." ) ;
161
+ TShock . Log . ConsoleInfo ( "[CaiBot ]CaiBot断开连接..." ) ;
166
162
if ( DebugMode )
167
163
{
168
164
TShock . Log . ConsoleError ( ex . ToString ( ) ) ;
@@ -177,7 +173,7 @@ private void GeneralHooksOnReloadEvent(ReloadEventArgs e)
177
173
}
178
174
}
179
175
180
- private void OnChat ( ServerChatEventArgs args )
176
+ private static void OnChat ( ServerChatEventArgs args )
181
177
{
182
178
var plr = TShock . Players [ args . Who ] ;
183
179
@@ -190,31 +186,28 @@ private void OnChat(ServerChatEventArgs args)
190
186
{
191
187
return ;
192
188
}
193
-
194
- var result = new RestObject
195
- {
196
- { "type" , "chat" } ,
197
- { "chat" , string . Format ( Config . Settings . ServerChatFormat , plr . Name , args . Text , plr . Group . Name , plr . Group . Prefix , EconomicSupport . IsSupported ( "GetLevelName" ) ? EconomicSupport . GetLevelName ( plr . Account . Name ) . Replace ( "职业:" , "" ) : "不支持" ) } , //[Server]玩家名:内容" 额外 {2}:玩家组名 {3}:玩家聊天前缀 {4}:Ec职业名
198
- { "group" , Config . Settings . GroupNumber }
199
- } ;
200
- _ = CaiBotApi . SendDateAsync ( JsonConvert . SerializeObject ( result ) ) ;
189
+
190
+ PacketWriter packetWriter = new ( ) ;
191
+
192
+ packetWriter . SetType ( "chat" ) //[Server]玩家名:内容" 额外 {2}:玩家组名 {3}:玩家聊天前缀 {4}:Ec职业名
193
+ . Write ( "chat" , string . Format ( Config . Settings . ServerChatFormat , plr . Name , args . Text , plr . Group . Name , plr . Group . Prefix ,
194
+ EconomicSupport . IsSupported ( "GetLevelName" ) ? EconomicSupport . GetLevelName ( plr . Account . Name ) . Replace ( "职业:" , "" ) : "不支持" ) )
195
+ . Send ( ) ;
201
196
}
202
197
203
- private void PlayerHooksOnPlayerPostLogin ( PlayerPostLoginEventArgs e )
198
+ private static void PlayerHooksOnPlayerPostLogin ( PlayerPostLoginEventArgs e )
204
199
{
205
200
var plr = e . Player ;
206
201
if ( ! Config . Settings . SyncChatFromServer || string . IsNullOrEmpty ( Config . Settings . JoinServerFormat ) || plr == null )
207
202
{
208
203
return ;
209
204
}
210
-
211
- var result = new RestObject
212
- {
213
- { "type" , "chat" } ,
214
- { "chat" , string . Format ( Config . Settings . JoinServerFormat , plr . Name , plr . Group . Name , plr . Group . Prefix , EconomicSupport . IsSupported ( "GetLevelName" ) ? EconomicSupport . GetLevelName ( plr . Account . Name ) . Replace ( "职业:" , "" ) : "不支持" ) } , //[Server]玩家名:内容" 额外 {2}:玩家组名 {3}:玩家聊天前缀 {4}:Ec职业名
215
- { "group" , Config . Settings . GroupNumber }
216
- } ;
217
- _ = CaiBotApi . SendDateAsync ( JsonConvert . SerializeObject ( result ) ) ;
205
+
206
+ PacketWriter packetWriter = new ( ) ;
207
+
208
+ packetWriter . SetType ( "chat" ) //[Server]玩家名:内容" 额外 {2}:玩家组名 {3}:玩家聊天前缀 {4}:Ec职业名
209
+ . Write ( "chat" , string . Format ( Config . Settings . JoinServerFormat , plr . Name , plr . Group . Name , plr . Group . Prefix , EconomicSupport . IsSupported ( "GetLevelName" ) ? EconomicSupport . GetLevelName ( plr . Account . Name ) . Replace ( "职业:" , "" ) : "不支持" ) )
210
+ . Send ( ) ;
218
211
}
219
212
220
213
private void PlayerHooksOnPlayerLogout ( PlayerLogoutEventArgs e )
@@ -224,14 +217,10 @@ private void PlayerHooksOnPlayerLogout(PlayerLogoutEventArgs e)
224
217
{
225
218
return ;
226
219
}
227
-
228
- var result = new RestObject
229
- {
230
- { "type" , "chat" } ,
231
- { "chat" , string . Format ( Config . Settings . ExitServerFormat , plr . Name , plr . Group . Name , plr . Group . Prefix , EconomicSupport . IsSupported ( "GetLevelName" ) ? EconomicSupport . GetLevelName ( plr . Account . Name ) . Replace ( "职业:" , "" ) : "不支持" ) } , //[Server]玩家名:内容" 额外 {2}:玩家组名 {3}:玩家聊天前缀 {4}:Ec职业名
232
- { "group" , Config . Settings . GroupNumber }
233
- } ;
234
- _ = CaiBotApi . SendDateAsync ( JsonConvert . SerializeObject ( result ) ) ;
220
+ PacketWriter packetWriter = new ( ) ;
221
+ packetWriter . SetType ( "chat" ) //[Server]玩家名:内容" 额外 {2}:玩家组名 {3}:玩家聊天前缀 {4}:Ec职业名
222
+ . Write ( "chat" , string . Format ( Config . Settings . ExitServerFormat , plr . Name , plr . Group . Name , plr . Group . Prefix , EconomicSupport . IsSupported ( "GetLevelName" ) ? EconomicSupport . GetLevelName ( plr . Account . Name ) . Replace ( "职业:" , "" ) : "不支持" ) )
223
+ . Send ( ) ;
235
224
}
236
225
237
226
private void CaiBotCommand ( CommandArgs args )
@@ -299,6 +288,7 @@ void ShowHelpText()
299
288
case "调试" :
300
289
case "debug" :
301
290
DebugMode = ! DebugMode ;
291
+ PacketWriter . Debug = DebugMode ;
302
292
plr . SendInfoMessage ( $ "[CaiBot]调试模式已{ ( DebugMode ? "开启" : "关闭" ) } !") ;
303
293
break ;
304
294
case "验证码" :
@@ -343,15 +333,13 @@ private void OnBanInsert(object? sender, BanEventArgs e)
343
333
344
334
var name = e . Ban . Identifier . Replace ( Identifier . Name . Prefix , "" ) . Replace ( Identifier . Account . Prefix , "" ) ;
345
335
var expireTime = e . Ban . GetPrettyExpirationString ( ) ;
346
- var result = new RestObject
347
- {
348
- { "type" , "post_ban_add" } ,
349
- { "name" , name } ,
350
- { "reason" , e . Ban . Reason } ,
351
- { "admin" , e . Ban . BanningUser } ,
352
- { "expire_time" , expireTime == "Never" ? "永久封禁" : expireTime }
353
- } ;
354
- _ = CaiBotApi . SendDateAsync ( JsonConvert . SerializeObject ( result ) ) ;
336
+ PacketWriter packetWriter = new ( ) ;
337
+ packetWriter . SetType ( "post_ban_add" )
338
+ . Write ( "name" , name )
339
+ . Write ( "reason" , e . Ban . Reason )
340
+ . Write ( "admin" , e . Ban . BanningUser )
341
+ . Write ( "expire_time" , expireTime == "Never" ? "永久封禁" : expireTime )
342
+ . Send ( ) ;
355
343
}
356
344
357
345
0 commit comments