for rule in FORWARD_RULES:
rule["_compiled_replacements"] = [
(re.compile(pattern, flags=re.IGNORECASE), repl)
for pattern, repl in rule["replacements"]
]
def process_text(text, rule):
if any(word in text for word in rule["blacklist_keywords"]):
return None, "blacklist"
if rule["whitelist_keywords"] and not any(word in text for word in rule["whitelist_keywords"]):
return None, "whitelist"
new_text = text
for pattern, repl in rule["_compiled_replacements"]:
new_text = pattern.sub(repl, new_text)
return new_text, "pass"
matched_rule = None
for rule in FORWARD_RULES:
is_source = False
for src in rule["sources"]:
if isinstance(src, int) and chat_id == src:
is_source = True
break
elif isinstance(src, str):
sender = await event.get_chat()
if getattr(sender, 'username', None) == src.strip('@'):
is_source = True
break
if is_source:
matched_rule = rule
break
if not matched_rule:
return
# 情况 A:属于媒体组(无论里面是纯图片、纯视频还是图视混合)
if event.grouped_id is not None:
g_id = event.grouped_id
if g_id not in album_cache:
album_cache[g_id] = {"events": [event]}
asyncio.create_task(send_album_after_delay(g_id, matched_rule))
else:
album_cache[g_id]["events"].append(event)
# 情况 B:普通的单条消息
else:
text = event.raw_text or ""
processed_text, status = process_text(text, matched_rule)
if status != "pass":
return
for dest in matched_rule["destinations"]:
try:
if event.media:
# 💡 核心修改:判断单条媒体消息是否为视频
if event.video:
# 启动一个后台异步任务进行延时发送,不阻塞其他消息的监听
asyncio.create_task(send_single_video_after_delay(dest, processed_text, event.media, 35))
else:
# 如果是单张图片或其他非视频媒体,依然立即发送
await client.send_message(dest, processed_text, file=event.media)
print(f"[成功] 单条非视频媒体消息成功转发至 {dest}")
else:
# 纯文本,立即发送
await client.send_message(dest, processed_text)
print(f"[成功] 单条纯文本消息成功转发至 {dest}")
except Exception as e:
print(f"[错误] 单条消息处理失败: {e}")