diff --git a/his/main.py b/his/main.py
new file mode 100644
index 0000000..9cfe95e
--- /dev/null
+++ b/his/main.py
@@ -0,0 +1,157 @@
+"""
+Pagermaid_Pyro group message history query plugin. Plugin by @tom-snow (@caiji_shiwo)
+"""
+from pagermaid import log
+from pagermaid.enums import Client, Message
+from pagermaid.listener import listener
+from pagermaid.utils import alias_command
+from pagermaid.config import Config
+
+
+class HisMsg:
+ LANGUAGES = {
+ "en": {
+ "name": "",
+ "arg": "<user> [-n <num>]",
+ "help": "Query the message history of the specified user in the group\n"
+ f"Usage: \n`,{alias_command('his')} <user> [-n <num>]`"
+ "\n user: username or user_id; num: Limits the number of messages to be retrieved\n"
+ "You can just reply to a message without user argument",
+ "processing": f",{alias_command('his')}: Querying...",
+ "media": {
+ "AUDIO": "[AUDIO]:",
+ "DOCUMENT": "[DOCUMENT]:",
+ "PHOTO": "[PHOTO]:",
+ "STICKER": "[STICKER]:",
+ "VIDEO": "[VIDEO]:",
+ "ANIMATION": "[ANIMATION]:",
+ "VOICE": "[VOICE]:",
+ "VIDEO_NOTE": "[VIDEO_NOTE]:",
+ "CONTACT": "[CONTACT]:",
+ "LOCATION": "[LOCATION]:",
+ "VENUE": "[VENUE]:",
+ "POLL": "[POLL]:",
+ "WEB_PAGE": "[WEB_PAGE]:",
+ "DICE": "[DICE]:",
+ "GAME": "[GAME]:"
+ },
+ "service": {
+ "service": "[Service_Message]: ",
+ "PINNED_MESSAGE": "Pinned: ",
+ "NEW_CHAT_TITLE": "New chat title: ",
+ },
+ "query_success": "Queryed history message. chat_id: {chat_id} user: {user}"
+ },
+ "zh-cn": {
+ "help": "查询指定用户在群内的发言历史\n"
+ f"使用方法: \n`,{alias_command('his')} <user> [-n <num>]`"
+ "\n user: 可以是用户名或者用户id; num: 可选,消息数量\n"
+ "你也可以直接回复一条消息,不带 user 参数",
+ "processing": f",{alias_command('his')}: 正在查询...",
+ "media": {
+ "AUDIO": "[音频]:",
+ "DOCUMENT": "[文档]:",
+ "PHOTO": "[图片]:",
+ "STICKER": "[贴纸]:",
+ "VIDEO": "[视频]:",
+ "ANIMATION": "[动画表情]:",
+ "VOICE": "[语音]:",
+ "VIDEO_NOTE": "[视频备注]:",
+ "CONTACT": "[联系人]:",
+ "LOCATION": "[位置]:",
+ "VENUE": "[场地]:",
+ "POLL": "[投票]:",
+ "WEB_PAGE": "[网页]:",
+ "DICE": "[骰子]:",
+ "GAME": "[游戏]:"
+ },
+ "service": {
+ "service": "[服务消息]: ",
+ "PINNED_MESSAGE": "置顶了: ",
+ "NEW_CHAT_TITLE": "新的群组名字: ",
+ },
+ "query_success": "查询历史消息完成. 群组id: {chat_id} 用户: {user}"
+ }
+ }
+ MAX_COUNT = 30
+
+ def __init__(self):
+ try:
+ self.lang_dict = self.LANGUAGES[Config.LANGUAGE]
+ except:
+ self.lang_dict = self.LANGUAGES["en"]
+
+ def lang(self, text: str, default: str = "") -> str:
+ res = self.lang_dict.get(text, default)
+ if res == "":
+ res = text
+ return res
+
+his_msg = HisMsg()
+
+
+@listener(command="his",
+ groups_only=True,
+ need_admin=True,
+ description=his_msg.lang("help"),
+ parameters=his_msg.lang("arg", "<user> [-n <num>]"))
+async def his(bot: Client, message: Message):
+ user = ""
+ num = 9999999
+ chat_id = message.chat.id
+ # 指定用户和数量
+ if len(message.parameter) == 3 and message.parameter[1] == "-n":
+ user = message.parameter[0]
+ num = int(message.parameter[2])
+ # 指定用户
+ elif len(message.parameter) == 1:
+ user = message.parameter[0]
+ # 回复消息+指定数量
+ elif len(message.parameter) == 2 and (message.reply_to_message_id is not None) and message.parameter[0] == "-n" :
+ user = int(message.reply_to_message.from_user.id)
+ num = int(message.parameter[1])
+ # 回复消息
+ elif (message.reply_to_message_id is not None):
+ user = int(message.reply_to_message.from_user.id)
+ # 预期外的调用方式
+ else:
+ return await message.edit(his_msg.lang('help'))
+
+ await message.edit(his_msg.lang("processing"))
+
+ count = 0
+ results = ""
+ try:
+ async for msg in bot.search_messages(chat_id, limit=min(num, his_msg.MAX_COUNT), from_user=user):
+ if msg.empty:
+ continue
+ count += 1
+ message_link = msg.link
+ message_text = msg.text
+
+ if message_text is None and msg.media is not None: # 媒体消息
+ media_type = str(msg.media).split(".")[1]
+ media_caption = msg.caption if msg.caption is not None else ""
+ message_text = his_msg.lang("media")[media_type] + media_caption
+ if msg.service is not None: # 服务消息
+ service_text = ""
+ service_type = str(msg.service).split(".")[1]
+ if service_type == "PINNED_MESSAGE" and msg.pinned_message.text is not None:
+ service_text = his_msg.lang("service")[service_type] + msg.pinned_message.text[:20]
+ elif service_type == "NEW_CHAT_TITLE" and msg.new_chat_title is not None:
+ service_text = his_msg.lang("service")[service_type] + msg.new_chat_title
+ else:
+ service_text = service_type
+ message_text = his_msg.lang("service")["service"] + service_text
+
+ if len(message_text) > 20: # 消息过长截取前面的
+ message_text = f"{count}. {message_text[:20]}..."
+ else:
+ message_text = f"{count}. {message_text}"
+ results += f"\n{message_text} \n"
+
+ await message.edit(f"Message History | {user}
| 🔍 \n{results}", disable_web_page_preview=True)
+ await log(his_msg.lang('query_success').format(chat_id=chat_id, user=user))
+ except Exception as e:
+ await message.edit(f"[HIS_ERROR]: {e}")
+ await log(f"[HIS_ERROR]: {e}")