Skip to content

Commit 89e44ac

Browse files
committed
feat: 新增伺服器狀態更新運行時間計算功能,並更新配置選項
1 parent 0160841 commit 89e44ac

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

Cogs/serverstats/serverstats.py

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import discord
33
from discord.ext import tasks, commands
4+
import time
45

56
logger = logging.getLogger(__name__)
67

@@ -12,6 +13,31 @@
1213
}
1314

1415
class 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+
432505
async def setup(bot):
433506
if not bot.config.get("server_status", {}).get("enable", False):
434507
logger.info(f"跳過載入 {COG_INTRO['name']},因為它被禁用。")

cfg.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,7 @@ reaction_roles:
411411
serverstats:
412412
enabled: true # 是否啟用伺服器統計
413413
loop_interval: 120 # 更新間隔(秒)
414+
count_run_time: True # 是否計算運行時間
414415
counters: # 統計項目
415416
# 你可以使用以下Placeholder:
416417
# {count} - 該項目計算出的結果

0 commit comments

Comments
 (0)