import logging from db_utils import get_db_connection, release_db_connection from bot_utils import send_bot_message def get_user_config(user_id, chat_id): """获取用户的配置信息。""" db_connection = get_db_connection() if not db_connection: return {} try: with db_connection.cursor() as cursor: query = "SELECT user_id, chat_id, ai_api, ai_model, ai_key, ai_prompt, max_token, message_delete_delay, created_at FROM user_configs WHERE " params = [] if chat_id < 0: query += "chat_id = %s" params.append(chat_id) else: query += "user_id = %s AND chat_id = %s" params.extend([user_id, chat_id]) cursor.execute(query, params) row = cursor.fetchone() if row: return dict(zip(["user_id", "chat_id", "ai_api", "ai_model", "ai_key", "ai_prompt", "max_token", "message_delete_delay", "created_at"], row)) else: return {} except Exception as e: logging.error(f"获取用户 {user_id} 在聊天 {chat_id} 中的配置失败: {e}") return {} finally: release_db_connection(db_connection) def set_user_config(user_id, config, chat_id, message=None, bot=None): db_connection = get_db_connection() if not db_connection: logging.error("无法获取数据库连接,配置设置失败") return False try: with db_connection.cursor() as cursor: if chat_id < 0 and not is_group_admin(chat_id, user_id, message, bot): if bot: send_bot_message(bot, chat_id, "群组配置仅限于管理员", parse_mode="MarkdownV2") else: logging.error("在 set_user_config 中尝试发送消息,但 bot 对象未初始化") return False user_id = 0 if chat_id < 0 else user_id cursor.execute(""" INSERT INTO user_configs (user_id, chat_id, ai_api, ai_model, ai_key, ai_prompt, max_token, message_delete_delay) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) ON CONFLICT (user_id, chat_id) DO UPDATE SET ai_api = EXCLUDED.ai_api, ai_model = EXCLUDED.ai_model, ai_key = EXCLUDED.ai_key, ai_prompt = EXCLUDED.ai_prompt, max_token = EXCLUDED.max_token, message_delete_delay = EXCLUDED.message_delete_delay """, (user_id, chat_id, config.get("ai_api"), config.get("ai_model"), config.get("ai_key"), config.get("ai_prompt"), config.get("max_token"), config.get("message_delete_delay"))) db_connection.commit() logging.info(f"用户 {user_id} 在聊天 {chat_id} 中的配置已更新") return True except Exception as e: logging.error(f"设置用户 {user_id} 在聊天 {chat_id} 中的配置失败: {e}") return False finally: release_db_connection(db_connection) def is_config_complete(config, chat_id, message): required_keys = ["ai_api", "ai_model", "ai_key"] return all(config.get(key) for key in required_keys) def is_group_admin(chat_id, user_id, message, bot): try: if not bot: logging.error("在 is_group_admin 中尝试获取管理员状态,但 bot 对象未初始化") return False if message and message.sender_chat and message.sender_chat.id == chat_id: return True member_status = bot.get_chat_member(chat_id, user_id).status return member_status in ["administrator", "creator"] except Exception as e: logging.error(f"验证用户 {user_id} 在聊天 {chat_id} 中的管理员状态失败: {e}") return False def update_config_value(user_id, chat_id, config_map, command, new_value, message=None, bot=None): config = get_user_config(user_id, chat_id) if command == "prompt" and new_value is None: config["ai_prompt"] = None elif command == "max_token" and new_value is None: config["max_token"] = None elif command == "message_delete_delay" and new_value is None: config["message_delete_delay"] = None # 确保 message_delete_delay 可以被设置为 None else: config[config_map[command]["key"]] = new_value logging.info(f"更新配置: {config}") if set_user_config(user_id, config, chat_id, message, bot): if command == "prompt" and new_value is None: send_bot_message(bot, chat_id, "系统提示已清空", parse_mode="MarkdownV2") elif command == "max_token" and new_value is None: send_bot_message(bot, chat_id, "最大 token 限制已清空", parse_mode="MarkdownV2") elif command == "message_delete_delay" and new_value is None: send_bot_message(bot, chat_id, "消息删除延迟已清空", parse_mode="MarkdownV2") else: send_bot_message(bot, chat_id, f"配置项 `{command}` 已设定", parse_mode="MarkdownV2")