diff --git a/config-template.py b/config-template.py index 3ade6830..f7df2096 100644 --- a/config-template.py +++ b/config-template.py @@ -123,13 +123,36 @@ preset_mode = "normal" # 注意:由消息前缀(prefix)匹配的消息中将会删除此前缀,正则表达式(regexp)匹配的消息不会删除匹配的部分 # 前缀匹配优先级高于正则表达式匹配 # 正则表达式简明教程:https://www.runoob.com/regexp/regexp-tutorial.html +# +# 支持针对不同群设置不同的响应规则,例如: +# response_rules = { +# "default": { +# "at": True, +# "prefix": ["/ai", "!ai", "!ai", "ai"], +# "regexp": [], +# "random_rate": 0.0, +# }, +# "12345678": { +# "at": False, +# "prefix": ["/ai", "!ai", "!ai", "ai"], +# "regexp": [], +# "random_rate": 0.0, +# }, +# } +# +# 以上设置将会在群号为12345678的群中关闭at响应 +# 未单独设置的群将使用default规则 response_rules = { - "at": True, # 是否响应at机器人的消息 - "prefix": ["/ai", "!ai", "!ai", "ai"], - "regexp": [], # "为什么.*", "怎么?样.*", "怎么.*", "如何.*", "[Hh]ow to.*", "[Ww]hy not.*", "[Ww]hat is.*", ".*怎么办", ".*咋办" - "random_rate": 0.0, # 随机响应概率,0.0-1.0,0.0为不随机响应,1.0为响应所有消息, 仅在前几项判断不通过时生效 + "default": { + "at": True, # 是否响应at机器人的消息 + "prefix": ["/ai", "!ai", "!ai", "ai"], + "regexp": [], # "为什么.*", "怎么?样.*", "怎么.*", "如何.*", "[Hh]ow to.*", "[Ww]hy not.*", "[Ww]hat is.*", ".*怎么办", ".*咋办" + "random_rate": 0.0, # 随机响应概率,0.0-1.0,0.0为不随机响应,1.0为响应所有消息, 仅在前几项判断不通过时生效 + }, } + + # 消息忽略规则 # 适用于私聊及群聊 # 符合此规则的消息将不会被响应 diff --git a/override-all.json b/override-all.json index 737afb34..b99b91c0 100644 --- a/override-all.json +++ b/override-all.json @@ -27,15 +27,17 @@ }, "preset_mode": "normal", "response_rules": { - "at": true, - "prefix": [ - "/ai", - "!ai", - "!ai", - "ai" - ], - "regexp": [], - "random_rate": 0.0 + "default": { + "at": true, + "prefix": [ + "/ai", + "!ai", + "!ai", + "ai" + ], + "regexp": [], + "random_rate": 0.0 + } }, "ignore_rules": { "prefix": [ diff --git a/pkg/qqbot/manager.py b/pkg/qqbot/manager.py index 4a1b8c78..91e9da46 100644 --- a/pkg/qqbot/manager.py +++ b/pkg/qqbot/manager.py @@ -25,10 +25,18 @@ import pkg.qqbot.adapter as msadapter # 检查消息是否符合泛响应匹配机制 -def check_response_rule(text: str): +def check_response_rule(group_id:int, text: str): config = pkg.utils.context.get_config() rules = config.response_rules + + # 检查是否有特定规则 + if 'prefix' not in config.response_rules: + if str(group_id) in config.response_rules: + rules = config.response_rules[str(group_id)] + else: + rules = config.response_rules['default'] + # 检查前缀匹配 if 'prefix' in rules: for rule in rules['prefix']: @@ -46,19 +54,39 @@ def check_response_rule(text: str): return False, "" -def response_at(): +def response_at(group_id: int): config = pkg.utils.context.get_config() - if 'at' not in config.response_rules: + + use_response_rule = config.response_rules + + # 检查是否有特定规则 + if 'prefix' not in config.response_rules: + if str(group_id) in config.response_rules: + use_response_rule = config.response_rules[str(group_id)] + else: + use_response_rule = config.response_rules['default'] + + if 'at' not in use_response_rule: return True - return config.response_rules['at'] + return use_response_rule['at'] -def random_responding(): +def random_responding(group_id): config = pkg.utils.context.get_config() - if 'random_rate' in config.response_rules: + + use_response_rule = config.response_rules + + # 检查是否有特定规则 + if 'prefix' not in config.response_rules: + if str(group_id) in config.response_rules: + use_response_rule = config.response_rules[str(group_id)] + else: + use_response_rule = config.response_rules['default'] + + if 'random_rate' in use_response_rule: import random - return random.random() < config.response_rules['random_rate'] + return random.random() < use_response_rule['random_rate'] return False @@ -317,16 +345,16 @@ class QQBotManager: if Image in event.message_chain: pass else: - if At(self.bot_account_id) in event.message_chain and response_at(): + if At(self.bot_account_id) in event.message_chain and response_at(event.group.id): # 直接调用 reply = process() else: - check, result = check_response_rule(str(event.message_chain).strip()) + check, result = check_response_rule(event.group.id, str(event.message_chain).strip()) if check: reply = process(result.strip()) # 检查是否随机响应 - elif random_responding(): + elif random_responding(event.group.id): logging.info("随机响应group_{}消息".format(event.group.id)) reply = process()