22
33import java .util .Arrays ;
44import java .util .List ;
5+ import java .util .concurrent .CompletableFuture ;
56
67import org .bukkit .ChatColor ;
78import org .bukkit .command .Command ;
@@ -48,6 +49,10 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
4849 case "backup" :
4950 handleBackup (sender , args );
5051 break ;
52+ case "whitelist" :
53+ case "wl" :
54+ handleWhitelist (sender , args );
55+ break ;
5156 case "help" :
5257 showHelp (sender );
5358 break ;
@@ -67,11 +72,13 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
6772 }
6873
6974 if (args .length == 1 ) {
70- return Arrays .asList ("reload" , "status" , "cache" , "backup" , "help" );
75+ return Arrays .asList ("reload" , "status" , "cache" , "backup" , "whitelist" , "wl" , " help" );
7176 } else if (args .length == 2 && "cache" .equals (args [0 ])) {
7277 return Arrays .asList ("clear" , "stats" );
7378 } else if (args .length == 2 && "backup" .equals (args [0 ])) {
7479 return Arrays .asList ("now" , "list" , "restore" );
80+ } else if (args .length == 2 && ("whitelist" .equals (args [0 ]) || "wl" .equals (args [0 ]))) {
81+ return Arrays .asList ("add" , "remove" , "list" , "check" , "sync" );
7582 }
7683
7784 return null ;
@@ -230,6 +237,154 @@ private void restoreBackup(CommandSender sender, String backupFileName) {
230237 });
231238 }
232239
240+ private void handleWhitelist (CommandSender sender , String [] args ) {
241+ if (plugin .getWhitelistSystem () == null || plugin .getWhitelistSystem ().getWhitelistManager () == null ) {
242+ sender .sendMessage (ChatColor .RED + "白名单系统未初始化!" );
243+ return ;
244+ }
245+
246+ if (args .length < 2 ) {
247+ sender .sendMessage (ChatColor .RED + "用法: /ca whitelist <add|remove|list|check|sync>" );
248+ return ;
249+ }
250+
251+ switch (args [1 ].toLowerCase ()) {
252+ case "add" :
253+ if (args .length < 3 ) {
254+ sender .sendMessage (ChatColor .RED + "用法: /ca whitelist add <玩家名> [备注]" );
255+ return ;
256+ }
257+ handleWhitelistAdd (sender , args );
258+ break ;
259+ case "remove" :
260+ if (args .length < 3 ) {
261+ sender .sendMessage (ChatColor .RED + "用法: /ca whitelist remove <玩家名>" );
262+ return ;
263+ }
264+ handleWhitelistRemove (sender , args [2 ]);
265+ break ;
266+ case "list" :
267+ handleWhitelistList (sender );
268+ break ;
269+ case "check" :
270+ if (args .length < 3 ) {
271+ sender .sendMessage (ChatColor .RED + "用法: /ca whitelist check <玩家名>" );
272+ return ;
273+ }
274+ handleWhitelistCheck (sender , args [2 ]);
275+ break ;
276+ case "sync" :
277+ handleWhitelistSync (sender );
278+ break ;
279+ default :
280+ sender .sendMessage (ChatColor .RED + "未知白名单命令: " + args [1 ]);
281+ break ;
282+ }
283+ }
284+
285+ private void handleWhitelistAdd (CommandSender sender , String [] args ) {
286+ String playerName = args [2 ];
287+
288+ sender .sendMessage (ChatColor .YELLOW + "正在添加玩家 " + playerName + " 到白名单..." );
289+
290+ // 使用 addPlayerOffline 方法,它会自动获取UUID
291+ plugin .getWhitelistSystem ().getWhitelistManager ()
292+ .addPlayerOffline (playerName , sender .getName (), "CONSOLE" ,
293+ com .xaoxiao .convenientaccess .whitelist .WhitelistEntry .Source .ADMIN )
294+ .thenAccept (success -> {
295+ if (success ) {
296+ sender .sendMessage (ChatColor .GREEN + "✓ 成功添加玩家 " + playerName + " 到白名单!" );
297+ } else {
298+ sender .sendMessage (ChatColor .RED + "✗ 添加失败,玩家可能已在白名单中" );
299+ }
300+ })
301+ .exceptionally (throwable -> {
302+ sender .sendMessage (ChatColor .RED + "✗ 添加失败: " + throwable .getMessage ());
303+ return null ;
304+ });
305+ }
306+
307+ private void handleWhitelistRemove (CommandSender sender , String playerName ) {
308+ sender .sendMessage (ChatColor .YELLOW + "正在从白名单移除玩家 " + playerName + "..." );
309+
310+ // 首先通过名称查找玩家的UUID
311+ plugin .getWhitelistSystem ().getWhitelistManager ()
312+ .searchPlayersByName (playerName , 1 )
313+ .thenCompose (entries -> {
314+ if (entries .isEmpty ()) {
315+ sender .sendMessage (ChatColor .RED + "✗ 玩家不在白名单中" );
316+ return CompletableFuture .completedFuture (false );
317+ }
318+
319+ String uuid = entries .get (0 ).getUuid ();
320+ return plugin .getWhitelistSystem ().getWhitelistManager ().removePlayer (uuid );
321+ })
322+ .thenAccept (success -> {
323+ if (success ) {
324+ sender .sendMessage (ChatColor .GREEN + "✓ 成功从白名单移除玩家 " + playerName + "!" );
325+ }
326+ })
327+ .exceptionally (throwable -> {
328+ sender .sendMessage (ChatColor .RED + "✗ 移除失败: " + throwable .getMessage ());
329+ return null ;
330+ });
331+ }
332+
333+ private void handleWhitelistList (CommandSender sender ) {
334+ sender .sendMessage (ChatColor .YELLOW + "正在获取白名单列表..." );
335+
336+ // 使用分页API获取前20个
337+ plugin .getWhitelistSystem ().getWhitelistManager ()
338+ .getWhitelistPaginated (1 , 20 , null , null , null , "added_at" , "DESC" , null , null )
339+ .thenAccept (result -> {
340+ if (result .getItems ().isEmpty ()) {
341+ sender .sendMessage (ChatColor .YELLOW + "白名单为空" );
342+ return ;
343+ }
344+
345+ sender .sendMessage (ChatColor .GOLD + "=== 白名单列表 (共 " + result .getTotal () + " 人) ===" );
346+ int count = 0 ;
347+ for (com .xaoxiao .convenientaccess .whitelist .WhitelistEntry entry : result .getItems ()) {
348+ count ++;
349+ sender .sendMessage (ChatColor .YELLOW + String .format ("%d. %s" , count , entry .getName ()));
350+ sender .sendMessage (ChatColor .GRAY + " UUID: " + entry .getUuid ());
351+ if (count >= 10 ) {
352+ sender .sendMessage (ChatColor .GRAY + "... 还有 " + (result .getTotal () - 10 ) + " 个玩家" );
353+ break ;
354+ }
355+ }
356+ sender .sendMessage (ChatColor .GRAY + "提示: 使用API查看完整列表" );
357+ })
358+ .exceptionally (throwable -> {
359+ sender .sendMessage (ChatColor .RED + "✗ 获取白名单失败: " + throwable .getMessage ());
360+ return null ;
361+ });
362+ }
363+
364+ private void handleWhitelistCheck (CommandSender sender , String playerName ) {
365+ plugin .getWhitelistSystem ().getWhitelistManager ()
366+ .isPlayerWhitelistedByName (playerName )
367+ .thenAccept (isWhitelisted -> {
368+ if (isWhitelisted ) {
369+ sender .sendMessage (ChatColor .GREEN + "✓ 玩家 " + playerName + " 在白名单中" );
370+ } else {
371+ sender .sendMessage (ChatColor .RED + "✗ 玩家 " + playerName + " 不在白名单中" );
372+ }
373+ })
374+ .exceptionally (throwable -> {
375+ sender .sendMessage (ChatColor .RED + "✗ 查询失败: " + throwable .getMessage ());
376+ return null ;
377+ });
378+ }
379+
380+ private void handleWhitelistSync (CommandSender sender ) {
381+ sender .sendMessage (ChatColor .YELLOW + "正在触发白名单同步..." );
382+
383+ // 触发全量同步
384+ plugin .getWhitelistSystem ().getSyncTaskManager ().scheduleFullSync ();
385+ sender .sendMessage (ChatColor .GREEN + "✓ 同步任务已提交,请稍后查看同步结果" );
386+ }
387+
233388 private void showHelp (CommandSender sender ) {
234389 sender .sendMessage (ChatColor .GOLD + "=== ConvenientAccess 命令帮助 ===" );
235390 sender .sendMessage (ChatColor .YELLOW + "/ca reload" + ChatColor .WHITE + " - 重载插件配置" );
@@ -239,6 +394,11 @@ private void showHelp(CommandSender sender) {
239394 sender .sendMessage (ChatColor .YELLOW + "/ca backup now" + ChatColor .WHITE + " - 立即执行备份" );
240395 sender .sendMessage (ChatColor .YELLOW + "/ca backup list" + ChatColor .WHITE + " - 查看备份列表" );
241396 sender .sendMessage (ChatColor .YELLOW + "/ca backup restore <文件名>" + ChatColor .WHITE + " - 恢复备份" );
397+ sender .sendMessage (ChatColor .YELLOW + "/ca whitelist add <玩家名> [备注]" + ChatColor .WHITE + " - 添加白名单" );
398+ sender .sendMessage (ChatColor .YELLOW + "/ca whitelist remove <玩家名>" + ChatColor .WHITE + " - 移除白名单" );
399+ sender .sendMessage (ChatColor .YELLOW + "/ca whitelist list" + ChatColor .WHITE + " - 查看白名单列表" );
400+ sender .sendMessage (ChatColor .YELLOW + "/ca whitelist check <玩家名>" + ChatColor .WHITE + " - 检查是否在白名单" );
401+ sender .sendMessage (ChatColor .YELLOW + "/ca whitelist sync" + ChatColor .WHITE + " - 触发白名单同步" );
242402 sender .sendMessage (ChatColor .YELLOW + "/ca help" + ChatColor .WHITE + " - 显示此帮助信息" );
243403
244404 // 显示API端点信息
0 commit comments