Commit 874d49e

benny-dou <60535774+benny-dou@users.noreply.github.com>
2025-07-15 17:17:34
feat(favorite): save favorite messages with custom chat_id and message_id
1 parent a9e2038
Changed files (1)
src
src/others/favorite.py
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 import contextlib
+import re
 
 from loguru import logger
 from pyrogram.client import Client
@@ -11,7 +12,7 @@ from database.r2 import get_cf_r2, set_cf_r2
 from messages.parser import parse_msg
 from messages.sender import send2tg
 from messages.utils import equal_prefix, set_reaction, startswith_prefix
-from utils import strings_list, to_int
+from utils import slim_cid, strings_list, to_int
 
 HELP = f"""⭐️**收藏消息**
 - `{FAVORITE.SAVE_PREFIX} keyword` : 保存消息为"keyword"到收藏夹
@@ -46,31 +47,50 @@ async def save_favorite(client: Client, message: Message, **kwargs):
     keyword = info["text"].removeprefix(FAVORITE.SAVE_PREFIX).strip()
     is_force_save = keyword.startswith(("!", "!"))  # noqa: RUF001
     keyword = keyword.removeprefix("!").removeprefix("!")  # noqa: RUF001
+    msg_to_save = message.reply_to_message
+
+    # custom chat_id and message_id
+    if "cid=" in keyword and "mid=" in keyword:
+        cid = msg_to_save.chat.id
+        mid = msg_to_save.id
+        if matched := re.search(r"cid=(-?\w+)", keyword, re.IGNORECASE):
+            cid = to_int(matched.group(1))
+            keyword = re.sub(r"cid=(-?\w+)", "", keyword).strip()
+        if matched := re.search(r"mid=(\d+)", keyword, re.IGNORECASE):
+            mid = to_int(matched.group(1))
+            keyword = re.sub(r"mid=(\d+)", "", keyword).strip()
+        msg: Message = await client.get_messages(cid, mid)  # type: ignore
+        if isinstance(msg, Message):
+            msg_to_save = msg
+        else:
+            await send2tg(client, message, texts=f"❌获取此消息失败, 可能是消息已被删除或者无访问权限.\nChatID={cid}, MessageID={mid}", **kwargs)
+            return
+
     if not keyword:
         return
-    if keyword.lower() in PRESERVED_KEYS:
-        await message.reply(f"【{keyword}】为保留关键字, 请使用其他关键词", quote=True)
-        return
     keywords = strings_list(keyword.replace(",", ","))  # noqa: RUF001
     # check if key is existed
     for key in keywords:
         if not is_force_save and await get_cf_r2(FAVORITE.R2_PREFIX + key):
             await send2tg(client, message, texts=f"⚠️【{key}】已存在\n🔄请使用以下命令覆盖收藏:\n`{FAVORITE.SAVE_PREFIX}! {keyword}`", **kwargs)
             return
+        if key.lower() in PRESERVED_KEYS:
+            await message.reply(f"【{key}】为保留关键字, 请使用其他关键词", quote=True)
+            return
 
     # forward message to backup chat
-    reply_msg = message.reply_to_message
-    if reply_msg.media_group_id:
-        messages = await client.get_media_group(reply_msg.chat.id, reply_msg.id)
+    if msg_to_save.media_group_id:
+        messages = await client.get_media_group(msg_to_save.chat.id, msg_to_save.id)
         save_msgs: list[Message] = await client.forward_messages(
             chat_id=to_int(FAVORITE.BACKUP_CHAT),
-            from_chat_id=reply_msg.chat.id,
+            from_chat_id=msg_to_save.chat.id,
             message_ids=[m.id for m in messages],
         )  # type: ignore
         save_msg = save_msgs[0]
     else:
-        save_msg: Message = await reply_msg.forward(to_int(FAVORITE.BACKUP_CHAT))  # type: ignore
-    await save_msg.reply(" ".join([f"#{key}" for key in keywords]), quote=True)
+        save_msg: Message = await msg_to_save.forward(to_int(FAVORITE.BACKUP_CHAT))  # type: ignore
+    metainfo = " ".join([f"#{key}" for key in keywords]) + f"\nhttps://t.me/c/{slim_cid(msg_to_save.chat.id)}/{msg_to_save.id}"
+    await save_msg.reply(metainfo, quote=True)
     save_info = parse_msg(save_msg, silent=True, use_cache=False)
     # only allow standard type
     keys_to_remove = []