11import logging
22import discord
33from discord .ext import tasks , commands
4+ import time
45
56logger = logging .getLogger (__name__ )
67
1213}
1314
1415class ServerStatus (commands .Cog ):
16+ """
17+ 伺服器狀態類別
18+ 在伺服器中的狀態類別建立多個頻道,並由機器人自動更新狀態,如人數、身分組數。
19+
20+ Attributes:
21+ bot (commands.Bot): 機器人實例
22+ config (dict): 機器人配置
23+ ct_config (dict): 計數器配置
24+ update_status (tasks.Loop): 定時更新狀態的任務
25+ last_update_time (str): 上次更新的時間
26+
27+ Methods:
28+ _update_channel_name(channel_id, channel_name_format, count, counter_name):
29+ 更新頻道名稱的函式
30+ update_status():
31+ 定時更新伺服器狀態
32+ before_update_status():
33+ 在更新狀態之前執行的函式
34+ start_update_status(ctx):
35+ 開始更新伺服器狀態
36+ stop_update_status(ctx):
37+ 停止更新伺服器狀態
38+ check_update_status(ctx):
39+ 檢查伺服器狀態更新的狀態
40+ """
1541 def __init__ (self , bot : commands .Bot ):
1642 self .bot = bot
1743 self .config = bot .config .get ("server_status" , {})
@@ -23,6 +49,7 @@ def __init__(self, bot: commands.Bot):
2349 logger .warning (f"配置中的 interval ({ interval } ) 無效,將使用預設值 60 秒。" )
2450 interval = 60
2551 self .update_status .change_interval (seconds = interval ) # 更新循環間隔
52+ self .last_update_time = "Null" # 記錄上次更新的時間
2653
2754 # 將更新頻道的指令獨立成函式
2855 async def _update_channel_name (self , channel_id : int , channel_name_format : str , count : int , counter_name : str ):
@@ -43,12 +70,15 @@ async def _update_channel_name(self, channel_id: int, channel_name_format: str,
4370 logger .warning (f"無法更新頻道 { channel .name } ({ channel_id } ) [{ counter_name } ] 的名稱,權限不足。" )
4471 except discord .HTTPException as e :
4572 logger .error (f"更新頻道 { channel .name } ({ channel_id } ) [{ counter_name } ] 時發生錯誤:{ e } " )
73+ else :
74+ logger .warning (f"找不到頻道 { channel_id } ,無法更新名稱。" )
4675
47-
4876 # 定時更新狀態
4977 @tasks .loop (seconds = 60 )
5078 async def update_status (self ):
5179 logger .info (f"開始更新伺服器狀態。" )
80+ start_time = time .time ()
81+
5282 # 取得伺服器資訊
5383 guild = self .bot .get_guild (self .bot .guilds [0 ].id )
5484
@@ -422,13 +452,56 @@ async def update_status(self):
422452 del stickers_config
423453 del stickers
424454
425- logger .info (f"伺服器狀態更新完成。" )
455+ end_time = time .time ()
456+ elapsed_time = end_time - start_time
457+ logger .info (f"更新伺服器狀態完成,共耗時 { elapsed_time :.2f} 秒。" )
426458
459+ # 更新上次更新的時間
460+ self .last_update_time = time .ctime (time .time ())
461+
462+ # 檢查最佳做法
463+ if elapsed_time > 60 :
464+ logger .warning (f"更新伺服器狀態耗時過長:{ elapsed_time :.2f} 秒,請檢查配置或伺服器狀態。" )
465+
466+ if elapsed_time > self .update_status .interval :
467+ logger .warning (f"更新伺服器狀態的時間 ({ elapsed_time :.2f} 秒) 超過了設定的間隔 ({ self .update_status .interval } 秒),\n \
468+ 如此在前次更新尚未結束時就將開始下次更新,並不是建議的最佳作法。\n \
469+ 建議將loop_interval提升至更高的數值(如 { self .update_status .interval + 5 } 秒以上),或是將更新狀態的頻率降低。" )
470+
427471 @update_status .before_loop
428472 async def before_update_status (self ):
429473 await self .bot .wait_until_ready ()
430474 logger .info (f"準備開始計時更新伺服器狀態。" )
431475
476+ # 建立指令來啟動或停止更新狀態
477+ g_update_status = commands .Group (name = "update_status" , description = "更新伺服器狀態的指令" )
478+
479+ @g_update_status .command (name = "start" , description = "開始更新伺服器狀態" )
480+ async def start_update_status (self , ctx : commands .Context ):
481+ """開始更新伺服器狀態"""
482+ if self .update_status .is_running ():
483+ await ctx .send ("伺服器狀態更新已經在運行中。" )
484+ else :
485+ self .update_status .start ()
486+ await ctx .send ("伺服器狀態更新已開始。" )
487+
488+ @g_update_status .command (name = "stop" , description = "停止更新伺服器狀態" )
489+ async def stop_update_status (self , ctx : commands .Context ):
490+ """停止更新伺服器狀態"""
491+ if self .update_status .is_running ():
492+ self .update_status .stop ()
493+ await ctx .send ("伺服器狀態更新已停止。" )
494+ else :
495+ await ctx .send ("伺服器狀態更新尚未開始。" )
496+
497+ @g_update_status .command (name = "status" , description = "檢查伺服器狀態更新的狀態" )
498+ async def check_update_status (self , ctx : commands .Context ):
499+ """檢查伺服器狀態更新的狀態"""
500+ if self .update_status .is_running ():
501+ await ctx .send ("伺服器狀態更新正在運行中。" )
502+ else :
503+ await ctx .send ("伺服器狀態更新已停止。" )
504+
432505async def setup (bot ):
433506 if not bot .config .get ("server_status" , {}).get ("enable" , False ):
434507 logger .info (f"跳過載入 { COG_INTRO ['name' ]} ,因為它被禁用。" )
0 commit comments