Переглянути джерело

feat(覆盖规则): 支持配置命中后的响应字段覆写

tk_override_rules 新增 response_success、response_message、response_reason,命中规则后覆写 success/message/reason(reason 同时作为 sub_message 输出),留空沿用默认值,转链日志与统计同步使用覆写结果;默认成功,兼容原有规则。
命中规则时返回规则副本,修复占位符替换结果写回缓存导致后续请求沿用首次 query_text 的问题。
dodo hold 2 днів тому
батько
коміт
e0cd142b27

+ 5 - 2
molilian.core/Core/OverrideRuleCore.cs

@@ -180,8 +180,11 @@ namespace molilian.core
                 if (output_text.Contains("{url2:query_text}")) output_text = output_text.Replace("{url2:query_text}", HttpUtility.UrlEncode(HttpUtility.UrlEncode(original_text)));
                 if (output_text.Contains("{url3:query_text}")) output_text = output_text.Replace("{url3:query_text}", HttpUtility.UrlEncode(HttpUtility.UrlEncode(HttpUtility.UrlEncode(original_text))));
                 if (output_text.Contains("{query_text}")) output_text = output_text.Replace("{query_text}", original_text);
-                item.output_text = output_text;
-                return item;
+
+                // 返回副本,避免占位符替换结果写回缓存中的规则
+                var matched = item.Clone();
+                matched.output_text = output_text;
+                return matched;
             }
             return null;
         }

+ 18 - 11
molilian.core/Core/taoke/UnionParseCore/UnionParseCore.cs

@@ -457,7 +457,9 @@ namespace molilian.core
                 var overrideContent = await OverrideRuleCore.ProcessAsync(request);
                 if (overrideContent != null)
                 {
-                    result.success = true;
+                    result.success = overrideContent.response_success;
+                    result.message = overrideContent.ResolveMessage(result.message);
+                    result.reason = overrideContent.ResolveReason(result.reason);
                     result.deeplink_url = overrideContent.output_text;
 
                     _ = TkLogCore.ParseLogAsync(result);
@@ -1094,8 +1096,9 @@ namespace molilian.core
                 var overrideContent = await OverrideRuleCore.ProcessAsync(request);
                 if (overrideContent != null)
                 {
-                    result.success = true;
-                    result.message = "OK";
+                    result.success = overrideContent.response_success;
+                    result.message = overrideContent.ResolveMessage("OK");
+                    result.reason = overrideContent.ResolveReason(result.reason);
                     result.commercial = true;
                     result.deeplink_url = overrideContent.output_text;
 
@@ -1268,8 +1271,9 @@ namespace molilian.core
                 var overrideContent = await OverrideRuleCore.ProcessAsync(request);
                 if (overrideContent != null)
                 {
-                    result.success = true;
-                    result.message = "OK";
+                    result.success = overrideContent.response_success;
+                    result.message = overrideContent.ResolveMessage("OK");
+                    result.reason = overrideContent.ResolveReason(result.reason);
                     result.deeplink_url = overrideContent.output_text;
 
                     _ = TkLogCore.ParseLogAsync(result);
@@ -1357,8 +1361,9 @@ namespace molilian.core
             var overrideContent = await OverrideRuleCore.ProcessAsync(request);
             if (overrideContent != null)
             {
-                result.success = true;
-                result.message = "OK";
+                result.success = overrideContent.response_success;
+                result.message = overrideContent.ResolveMessage("OK");
+                result.reason = overrideContent.ResolveReason(result.reason);
                 result.commercial = true;
                 result.deeplink_url = overrideContent.output_text;
 
@@ -1776,8 +1781,9 @@ namespace molilian.core
                 var overrideContent = await OverrideRuleCore.ProcessAsync(request);
                 if (overrideContent != null)
                 {
-                    result.success = true;
-                    result.message = "OK";
+                    result.success = overrideContent.response_success;
+                    result.message = overrideContent.ResolveMessage("OK");
+                    result.reason = overrideContent.ResolveReason(result.reason);
                     result.deeplink_url = overrideContent.output_text;
 
                     _ = TkLogCore.ParseLogAsync(result);
@@ -1911,8 +1917,9 @@ namespace molilian.core
                 var overrideContent = await OverrideRuleCore.ProcessAsync(request);
                 if (overrideContent != null)
                 {
-                    result.success = true;
-                    result.message = "OK";
+                    result.success = overrideContent.response_success;
+                    result.message = overrideContent.ResolveMessage("OK");
+                    result.reason = overrideContent.ResolveReason(result.reason);
                     result.deeplink_url = overrideContent.output_text;
                     return new APIResult(new { result.success, result.message, result.reason, result.deeplink_url });
                 }

+ 9 - 5
molilian.core/Core/taoke/UnionParseCore/dp2dp.cs

@@ -39,7 +39,9 @@ namespace molilian.core
                 var overrideContent = await OverrideRuleCore.ProcessAsync(request);
                 if (overrideContent != null)
                 {
-                    result.success = true;
+                    result.success = overrideContent.response_success;
+                    result.message = overrideContent.ResolveMessage(result.message);
+                    result.reason = overrideContent.ResolveReason(result.reason);
                     result.deeplink_url = overrideContent.output_text;
 
                     _ = TkLogCore.ParseLogAsync(result);
@@ -538,8 +540,9 @@ namespace molilian.core
                 var overrideContent = await OverrideRuleCore.ProcessAsync(request);
                 if (overrideContent != null)
                 {
-                    result.success = true;
-                    result.message = "OK";
+                    result.success = overrideContent.response_success;
+                    result.message = overrideContent.ResolveMessage("OK");
+                    result.reason = overrideContent.ResolveReason(result.reason);
                     result.commercial = true;
                     result.deeplink_url = overrideContent.output_text;
 
@@ -717,8 +720,9 @@ namespace molilian.core
                 var overrideContent = await OverrideRuleCore.ProcessAsync(request);
                 if (overrideContent != null)
                 {
-                    result.success = true;
-                    result.message = "OK";
+                    result.success = overrideContent.response_success;
+                    result.message = overrideContent.ResolveMessage("OK");
+                    result.reason = overrideContent.ResolveReason(result.reason);
                     result.commercial = true;
                     result.deeplink_url = overrideContent.output_text;
 

+ 4 - 2
molilian.core/Core/tool/DeeplinkParseCore.cs

@@ -63,8 +63,9 @@ namespace molilian.core
             var overrideContent = await OverrideRuleCore.ProcessAsync(request);
             if (overrideContent != null)
             {
-                result.success = true;
-                result.message = "OK";
+                result.success = overrideContent.response_success;
+                result.message = overrideContent.ResolveMessage("OK");
+                result.reason = overrideContent.ResolveReason(result.reason);
                 result.deeplink_url = overrideContent.output_text;
 
                 _ = TkLogCore.ParseLogAsync(result);
@@ -72,6 +73,7 @@ namespace molilian.core
                 {
                     result.success,
                     result.message,
+                    result.reason,
                     channel = result.channel_name,
                     result.deeplink_url
                 });

+ 22 - 0
molilian.core/DTO/OverrideRuleDTO.cs

@@ -53,5 +53,27 @@ namespace molilian.core
         public int use_special_text { get; set; }
         public int sort { get; set; }
 
+        /// <summary>
+        /// 命中规则后覆写的响应结果 success:true成功,false失败
+        /// </summary>
+        [JsonConverter(typeof(NumericBooleanConverter))]
+        public bool response_success { get; set; } = true;
+
+        /// <summary>
+        /// 命中规则后覆写的 message,为空时沿用默认值
+        /// </summary>
+        public string response_message { get; set; } = string.Empty;
+
+        /// <summary>
+        /// 命中规则后覆写的 reason(同时作为 sub_message 输出),为空时沿用默认值
+        /// </summary>
+        public string response_reason { get; set; } = string.Empty;
+
+        public string ResolveMessage(string fallback) => string.IsNullOrEmpty(response_message) ? fallback : response_message;
+
+        public string ResolveReason(string fallback) => string.IsNullOrEmpty(response_reason) ? fallback : response_reason;
+
+        public OverrideRuleDTO Clone() => (OverrideRuleDTO)MemberwiseClone();
+
     }
 }

+ 53 - 0
sql/20261022_add_tk_override_rules_response.sql

@@ -0,0 +1,53 @@
+SET @column_exists := (
+    SELECT COUNT(*)
+    FROM information_schema.columns
+    WHERE table_schema = DATABASE()
+      AND table_name = 'tk_override_rules'
+      AND column_name = 'response_success'
+);
+
+SET @sql := IF(
+    @column_exists = 0,
+    'ALTER TABLE tk_override_rules ADD COLUMN response_success TINYINT(1) NOT NULL DEFAULT 1 COMMENT ''命中规则后覆写的响应结果 success:1成功 0失败''',
+    'SELECT 1'
+);
+
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+SET @column_exists := (
+    SELECT COUNT(*)
+    FROM information_schema.columns
+    WHERE table_schema = DATABASE()
+      AND table_name = 'tk_override_rules'
+      AND column_name = 'response_message'
+);
+
+SET @sql := IF(
+    @column_exists = 0,
+    'ALTER TABLE tk_override_rules ADD COLUMN response_message VARCHAR(255) NOT NULL DEFAULT '''' COMMENT ''命中规则后覆写的 message,为空沿用默认值''',
+    'SELECT 1'
+);
+
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+SET @column_exists := (
+    SELECT COUNT(*)
+    FROM information_schema.columns
+    WHERE table_schema = DATABASE()
+      AND table_name = 'tk_override_rules'
+      AND column_name = 'response_reason'
+);
+
+SET @sql := IF(
+    @column_exists = 0,
+    'ALTER TABLE tk_override_rules ADD COLUMN response_reason VARCHAR(255) NOT NULL DEFAULT '''' COMMENT ''命中规则后覆写的 reason/sub_message,为空沿用默认值''',
+    'SELECT 1'
+);
+
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;