如何检测两个变量值相等?Discord bot账户系统JSON注册用户匹配实现
Discord Bot 注册用户匹配功能可运行实现代码
核心适配特性
- 基于异步逻辑设计,不会阻塞Discord Bot的主事件循环,不影响消息接收、指令响应等基础功能
- 内置可控轮询间隔,避免无间隔高频读取JSON文件造成的磁盘IO浪费
- 全链路异常捕获,覆盖JSON文件损坏、临时写入中、字段缺失等常见场景,不会因读文件异常导致Bot崩溃
- 匹配逻辑可灵活调整,适配不同结构的JSON用户存储格式
可直接复用的实现代码
import json import asyncio import os # 基础配置项 JSON_STORE_PATH = "./registered_users.json" # 已注册用户存储的JSON文件路径 POLL_INTERVAL = 3 # 轮询读取文件的间隔,单位秒 MATCH_KEY_1 = "discord_uid" # 待匹配的第一个变量对应的JSON键 MATCH_KEY_2 = "platform_bound_uid" # 待匹配的第二个变量对应的JSON键 async def run_user_match_cycle(): # 持续循环直到匹配成功 while True: try: # 校验文件是否存在,不存在则跳过本轮读取 if not os.path.exists(JSON_STORE_PATH): await asyncio.sleep(POLL_INTERVAL) with open(JSON_STORE_PATH, "r", encoding="utf-8") as f: registered_user_list = json.load(f) # 遍历所有注册用户,检测两个变量取值是否相等 for user in registered_user_list: # 匹配判断逻辑:同一用户条目下两个变量取值完全一致 if user[MATCH_KEY_1] == user[MATCH_KEY_2]: # 匹配成功后可自定义后续逻辑:发送绑定通知、赋予对应权限等 print(f"用户匹配完成,匹配到的用户信息:{user}") return user except json.JSONDecodeError: # 捕获文件临时写入导致的解析错误,跳过本轮 await asyncio.sleep(POLL_INTERVAL) continue except KeyError: # 捕获字段缺失的异常,跳过无效条目 continue # 本轮未匹配到目标,等待间隔后重新读取 await asyncio.sleep(POLL_INTERVAL) # 对接Discord Bot的启动流程:在on_ready事件中挂载轮询任务 @bot.event async def on_ready(): # 创建独立异步任务运行轮询,不阻塞Bot主流程 asyncio.create_task(run_user_match_cycle())
自定义调整说明
- 可根据实际匹配需求修改判断逻辑,比如改为
user[MATCH_KEY_1] == 指定固定值 and user[MATCH_KEY_2] == 指定固定值,实现两个变量同时等于指定值的匹配规则 - 若JSON存储结构为键值对字典(如以Discord ID为外层键的字典格式),只需将遍历部分修改为遍历
registered_user_list.values()即可适配 - 可根据业务对实时性的要求调整轮询间隔,平衡匹配响应速度和系统资源消耗
内容的提问来源于stack exchange,提问作者AidanGamin
相关产品推荐
相关产品推荐

