diff --git a/configs/stat b/configs/stat new file mode 100644 index 000000000..e69de29bb diff --git a/cores/qqbot/core.py b/cores/qqbot/core.py index 0cccdd8bc..5596cf5f7 100644 --- a/cores/qqbot/core.py +++ b/cores/qqbot/core.py @@ -21,12 +21,48 @@ gpt_config = { 'presence_penalty': '', 'max_tokens': '', } +count = { +} +stat_file = '' class botClient(botpy.Client): async def on_at_message_create(self, message: Message): + global stat_file + try: + if str(message.guild_id) not in count: + count[str(message.guild_id)] = { + 'count': 1, + 'direct_count': 0, + } + else: + count[str(message.guild_id)]['count'] += 1 + stat_file = open("./configs/stat", 'w', encoding='utf-8') + stat_file.write(json.dumps(count)) + stat_file.flush() + stat_file.close() + except BaseException: + pass + await oper_msg(message=message, at=True) async def on_direct_message_create(self, message: DirectMessage): + global stat_file + try: + if str(message.guild_id) not in count: + count[str(message.guild_id)] = { + 'count': 1, + 'direct_count': 1, + } + else: + count[str(message.guild_id)]['count'] += 1 + count[str(message.guild_id)]['direct_count'] += 1 + stat_file = open("./configs/stat", 'w', encoding='utf-8') + stat_file.write(json.dumps(count)) + stat_file.flush() + stat_file.close() + except BaseException: + pass + await oper_msg(message=message, at=False) def initBot(chatgpt_inst): @@ -39,6 +75,20 @@ def initBot(chatgpt_inst): global gpt_config gpt_config = chatgpt_inst.getConfigs() gpt_config['key'] = "***" + + # 读统计信息 + global stat_file + stat_file = open("./configs/stat", 'r', encoding='utf-8') + global count + res = stat_file.read() + if res == '': + count = {} + else: + try: + count = json.loads(res) + except BaseException: + pass + with open("./configs/config.yaml", 'r', encoding='utf-8') as ymlfile: cfg = yaml.safe_load(ymlfile) if cfg['qqbot']['appid'] != '' or cfg['qqbot']['token'] != '': @@ -50,6 +100,7 @@ def initBot(chatgpt_inst): raise BaseException("请在config中完善你的appid和token") + async def get_chatGPT_response(prompts_str): res = '' usage = '' @@ -95,14 +146,14 @@ async def oper_msg(message, at=False): else: qq_msg = message.content - # 检测用户id,返回对应缓存的prompt - # session_id_pattern = r"<@!\d+>" - # session_id_result = re.search(session_id_pattern, message.content) session_id = message.author.id if session_id: if qq_msg == "/reset": session_dict[session_id] = [] - await message.reply(content=f"{message.member.nick}(id: {session_id}) 的历史记录重置成功") + if at: + await message.reply(content=f"{message.member.nick}(id: {session_id}) 的历史记录重置成功") + else: + await message.reply(content=f"你的历史记录重置成功") return if qq_msg[:4] == "/his": @@ -114,21 +165,46 @@ async def oper_msg(message, at=False): l = session_dict[session_id] max_page = len(l)//size_per_page + 1 if len(l)%size_per_page != 0 else len(l)//size_per_page p = get_prompts_by_cache_list(session_dict[session_id], divide=True, paging=True, size=size_per_page, page=page) - await message.reply(content=f"{message.member.nick} 的历史记录如下:\n{p}\n第{page}页 | 共{max_page}页\n*输入/his 2跳转到第2页") + if at: + await message.reply(content=f"{message.member.nick} 的历史记录如下:\n{p}\n第{page}页 | 共{max_page}页\n*输入/his 2跳转到第2页") + else: + await message.reply(content=f"历史记录如下:\n{p}\n第{page}页 | 共{max_page}页\n*输入/his 2跳转到第2页") + return if qq_msg == "/token": - await message.reply(content=f"{message.member.nick} 会话的token数: {get_user_usage_tokens(session_dict[session_id])}\n系统最大缓存token数: {max_tokens}") + if at: + await message.reply(content=f"{message.member.nick} 会话的token数: {get_user_usage_tokens(session_dict[session_id])}\n系统最大缓存token数: {max_tokens}") + else: + await message.reply(content=f"会话的token数: {get_user_usage_tokens(session_dict[session_id])}\n系统最大缓存token数: {max_tokens}") + return if qq_msg == "/status": chatgpt_cfg_str = "" for k, v in gpt_config.items(): if k == "key": - v = "***" + continue chatgpt_cfg_str += f"{k}: {v}" await message.reply(content=f"ChatGPT配置:\n - {chatgpt_cfg_str}\n QQChannelChatGPT 版本: {version}") return + + if qq_msg == "/count": + f = open("./configs/stat", "r", encoding="utf-8") + fjson = json.loads(f.read()) + f.close() + guild_count = 0 + guild_msg_count = 0 + guild_direct_msg_count = 0 + for k,v in fjson.items(): + guild_count += 1 + guild_msg_count += v['count'] + guild_direct_msg_count += v['direct_count'] + await message.reply(content=f"当前会话数: {len(session_dict)}\n共有频道数: {guild_count} \n共有消息数: {guild_msg_count}\n私信数: {guild_direct_msg_count}") + return + if qq_msg == "/help": + await message.reply(content=f"请联系频道管理员或者前往github(仓库名: QQChannelChatGPT)提issue~") + return if session_id not in session_dict: session_dict[session_id] = [] @@ -151,7 +227,7 @@ async def oper_msg(message, at=False): chatgpt_res, current_usage_tokens = await get_chatGPT_response(cache_prompt) except (BaseException) as e: print("OpenAI API错误:(") - await message.reply(content=f"OpenAI API错误:( 原因如下:\n{str(e)} \n*可前往github . com/Soulter/QQChannelChatGPT进行反馈") + await message.reply(content=f"OpenAI API错误:( 原因如下:\n{str(e)} \n*前往github(仓库名: QQChannelChatGPT)反馈~") # 超过指定tokens, 尽可能的保留最多的条目,直到小于max_tokens # print("current_usage_tokens: ", current_usage_tokens)