Merge pull request #59 from kemingy/user_stat

feat: get user stats in the group
This commit is contained in:
yihong
2025-07-15 17:33:53 +08:00
committed by GitHub
3 changed files with 34 additions and 2 deletions

View File

@ -87,9 +87,16 @@ def stats_command(message: Message, bot: TeleBot):
stats_text = "\n".join(
f"{entry.date}: {entry.message_count} messages" for entry in stats
)
user_stats = store.get_user_stats(message.chat.id)
user_text = "\n".join(
f"{entry.user_name}: {entry.message_count}" for entry in user_stats
)
bot.reply_to(
message,
f"📊 群组消息统计信息:\n```\n{stats_text}\n```",
(
f"📊 群组消息统计信息:\n```\n{stats_text}\n```\n",
f"👤 用户消息统计信息:\n```\n{user_text}\n```",
),
parse_mode="MarkdownV2",
)

View File

@ -20,6 +20,13 @@ class StatsEntry:
message_count: int
@dataclass(frozen=True)
class UserStatsEntry:
user_id: int
user_name: str
message_count: int
class MessageStore:
def __init__(self, db_file: str):
parent_folder = os.path.dirname(db_file)
@ -124,6 +131,25 @@ class MessageStore:
rows = cursor.fetchall()
return [StatsEntry(date=row[0], message_count=row[1]) for row in rows]
def get_user_stats(self, chat_id: int, topk: int = 10) -> list[UserStatsEntry]:
with self.connect() as conn:
self._clean_old_messages(chat_id, conn)
cursor = conn.cursor()
cursor.execute(
"""
SELECT user_id,
(SELECT user_name FROM messages m0 WHERE m0.user_id = m1.user_id LIMIT 1) AS name,
COUNT(*) AS num
FROM messages m1
WHERE chat_id = ?
GROUP BY user_id
ORDER BY num DESC
LIMIT ?;""",
(chat_id, topk),
)
rows = cursor.fetchall()
return [UserStatsEntry(*row) for row in rows]
def search_messages(
self, chat_id: int, keyword: str, limit: int = 10
) -> list[ChatMessage]:

View File

@ -14,7 +14,6 @@ dependencies = [
"openai",
"requests",
"urlextract",
"requests",
"groq",
"together>=1.1.5",
"dify-client>=0.1.10",