From 6cbaf243f5420a9a9615a7d3e66f33669056f8f7 Mon Sep 17 00:00:00 2001 From: "sourcery-ai[bot]" <58596630+sourcery-ai[bot]@users.noreply.github.com> Date: Tue, 4 Apr 2023 23:47:58 +0800 Subject: [PATCH] auto_send_reactions Co-authored-by: SuperManito <68613938+SuperManito@users.noreply.github.com> Co-authored-by: Sourcery AI <> Co-authored-by: omg-xtao <100690902+omg-xtao@users.noreply.github.com> --- auto_send_reactions/DES.md | 1 + auto_send_reactions/main.py | 263 ++++++++++++++++++++++++++++++++++++ list.json | 2 +- 3 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 auto_send_reactions/DES.md create mode 100644 auto_send_reactions/main.py diff --git a/auto_send_reactions/DES.md b/auto_send_reactions/DES.md new file mode 100644 index 0000000..655f84b --- /dev/null +++ b/auto_send_reactions/DES.md @@ -0,0 +1 @@ +向别人的消息自动回复Emoji \ No newline at end of file diff --git a/auto_send_reactions/main.py b/auto_send_reactions/main.py new file mode 100644 index 0000000..dcdb27b --- /dev/null +++ b/auto_send_reactions/main.py @@ -0,0 +1,263 @@ +""" +自动回复Emoji插件 +Author: SuperManito +""" + +from pagermaid import bot, log +from pagermaid.single_utils import sqlite +from pagermaid.enums import Client, Message +from pagermaid.utils import lang, edit_delete, pip_install +from pagermaid.listener import listener + +pip_install("emoji") + +import emoji + + +# 获取内容中的表情符号,并用|分割 +def get_emoji(text): + if emojiArr := emoji.distinct_emoji_list(text): + delimiter = '|' + return delimiter.join(emojiArr) + else: + return False + + +@listener(is_plugin=False, + outgoing=True, + command="auto_send_reactions", + description='\n自动回复Emoji插件', + parameters="`\n自动回复Emoji插件,支持同时设置多个目标生效用户,目前仅支持回复用户在群组中发送的消息,默认在所有已加入的群组中生效\n" + "\n**设置插件状态**:" + "\n启用:`,auto_send_reactions enable`" + "\n停用:`,auto_send_reactions disable`" + "\n\n**设置目标生效用户**:" + "\n添加:`,auto_send_reactions set <用户id/用户名> <表情内容>`" + "\n移除:`,auto_send_reactions unset <用户id/用户名>`" + "\n支持直接回复消息以进行快速设置,可以省略用户标识参数" + "\n\n**设置生效群组黑名单**:" + "\n添加:`,auto_send_reactions block <群组id/群组用户名>`" + "\n移除:`,auto_send_reactions unblock <群组id/群组用户名>\n") +async def AutoSendReactions(client: Client, message: Message): + reply = message.reply_to_message + + # 启用插件 + if message.parameter[0] == "enable": + # for ID in ID_FROM_ARRAY : + # # 检查来源频道/群组 + # try: + # channel = await bot.get_chat(ID) + # except Exception as e: + # errorMsg = f"第{e.__traceback__.tb_lineno}行:{e}" + # await message.edit(f"出错了呜呜呜 ~ 无法识别的来源对话。\n\n{errorMsg}") + # return + + if not sqlite.get("AutoSendReactions.Enable"): + sqlite["AutoSendReactions.Enable"] = 'yes' + + # 返回消息 + await edit_delete(message, "✅ **已启用自动回复表情插件**") + + elif message.parameter[0] == "disable": + + if sqlite.get("AutoSendReactions.Enable"): + del sqlite["AutoSendReactions.Enable"] + + # 返回消息 + await edit_delete(message, "❌ **已停用自动回复表情插件**") + + elif message.parameter[0] in ["set", "unset"]: + + ## 设置插件 + if (message.parameter[0] == "set"): + + if not reply and (len(message.parameter) == 3): + target = message.parameter[1] + content = message.parameter[2] + try: + # 获取用户信息 + user_info = await bot.get_users(target) + # 判断参数合法性 + if not user_info: + return await message.edit("❌ **目标用户不存在或参数有误**") + if not content or not get_emoji(content): + return await message.edit("❌ **Emoji参数不能为空或不合法**") + user_name = ( + f'{user_info.first_name} {user_info.last_name}' + if user_info.last_name + else user_info.first_name + ) + # 设置或更新 + hasSetted = sqlite.get(f"AutoSendReactions.{target}") + sqlite[f"AutoSendReactions.{target}"] = content + await edit_delete( + message, + f"✅ 已{'更新' if hasSetted else '添加'}对 __{user_name}__ 的自动回复Emoji设置**" + ) + except Exception as e: + await message.edit(message, f"❌ **在设置中遇到了一些错误** > {e}") + await log(e) # 打印错误日志 + + elif reply and (len(message.parameter) == 2): + from_user = reply.from_user + target = from_user.id + content = message.parameter[1] + try: + # 判断参数合法性 + if not content or not get_emoji(content): + return await message.edit("❌ **Emoji参数不能为空或不合法**") + user_name = ( + f'{from_user.first_name} {from_user.last_name}' + if from_user.last_name + else from_user.first_name + ) + # 设置或更新 + hasSetted = sqlite.get(f"AutoSendReactions.{target}") + sqlite[f"AutoSendReactions.{target}"] = content + await edit_delete( + message, + f"✅ 已{'更新' if hasSetted else '添加'}对 __{user_name}__ 的自动回复Emoji设置" + ) + except Exception as e: + await message.edit(message, f"❌ **在设置中遇到了一些错误** > {e}") + await log(e) # 打印错误日志 + else: + return await message.edit( + f"{lang('error_prefix')}{lang('arg_error')}") + + elif (message.parameter[0] == "unset"): + + if not reply and (len(message.parameter) == 2): + target = message.parameter[1] + try: + # 获取用户信息 + user_info = await bot.get_users(target) + # 判断参数合法性 + if not user_info: + return await message.edit("❌ **目标用户不存在或参数有误**") + user_id = user_info.id + user_name = ( + f'{user_info.first_name} {user_info.last_name}' + if user_info.last_name + else user_info.first_name + ) + if hasSetted := sqlite.get(f"AutoSendReactions.{user_id}"): + del sqlite[f"AutoSendReactions.{user_id}"] + await edit_delete( + message, f"✅ 对 __{user_name}__ 的自动回复Emoji设置已删除") + else: + await edit_delete( + message, f"❌ 还没有对 __{user_name}__ 设置自动回复Emoji哦~") + except Exception as e: + await message.edit(message, f"❌ **在设置中遇到了一些错误** > {e}") + await log(e) # 打印错误日志 + + elif reply and (len(message.parameter) == 1): + from_user = reply.from_user + target = from_user.id + try: + user_name = ( + f'{from_user.first_name} {from_user.last_name}' + if from_user.last_name + else from_user.first_name + ) + if hasSetted := sqlite.get(f"AutoSendReactions.{target}"): + del sqlite[f"AutoSendReactions.{target}"] + await edit_delete( + message, f"✅ 已删除对 __{user_name}__ 的自动回复Emoji设置") + else: + await edit_delete( + message, f"❌ 还没有对 __{user_name}__ 设置自动回复Emoji哦~") + except Exception as e: + await message.edit(message, f"❌ **在设置中遇到了一些错误** > {e}") + await log(e) # 打印错误日志 + else: + return await message.edit( + f"{lang('error_prefix')}{lang('arg_error')}") + + else: + return await message.edit( + f"{lang('error_prefix')}{lang('arg_error')}") + + elif (message.parameter[0] + == "block") or (message.parameter[0] == "unblock") and (len( + message.parameter) == 2): + group = message.parameter[1] + group_info = await bot.get_chat(chat_id=group) + if not group_info: + return await message.edit("❌ **目标群组不存在或参数有误**") + group_id = group_info.id + group_name = group_info.title + + if (message.parameter[0] == "block"): + if hasBlocked := sqlite.get(f"AutoSendReactionsBlock.{group_id}"): + await edit_delete( + message, f"❌ 已经将 __{group_name}__ 加入自动回复Emoji黑名单群组了哦~") + else: + sqlite[f"AutoSendReactionsBlock.{group_id}"] = 'yes' + await edit_delete(message, + f"✅ 已将 __{group_name}__ 加入至自动回复Emoji黑名单群组") + elif (message.parameter[0] == "unblock"): + if hasBlocked := sqlite.get(f"AutoSendReactionsBlock.{group_id}"): + del sqlite[f"AutoSendReactionsBlock.{group_id}"] + await edit_delete(message, + f"✅ 已将 __{group_name}__ 从自动回复Emoji黑名单群组中移除") + else: + await edit_delete( + message, f"❌ 还没有将 __{group_name}__ 加入进自动回复Emoji群组黑名单哦~") + + else: + return await message.edit(f"{lang('error_prefix')}{lang('arg_error')}" + ) + + +@listener(is_plugin=False, incoming=True, ignore_edited=True) +async def AutoSendReactions(message: Message): + from_user = '' + try: + # 判断是否启用了本插件 + if not sqlite.get("AutoSendReactions.Enable"): + return + if 'GROUP' not in str(message.chat.type): + return + # 判断是否在黑名单中 + if sqlite.get(f"AutoSendReactionsBlock.{message.chat.id}"): + return + if not message.from_user: + # 过滤匿名管理员 + return + + from_user = message.from_user + if not sqlite.get(f"AutoSendReactions.{from_user.id}"): + return + # 判断群组是否启用了表情回应功能 + group_info = await bot.get_chat(chat_id=message.chat.id) + if not group_info.available_reactions: + return + + # 发送表情 + emoji = sqlite.get(f"AutoSendReactions.{from_user.id}").split('|')[0] + user_name = ( + f'{from_user.first_name} {from_user.last_name}' + if from_user.last_name + else from_user.first_name + ) + try: + await bot.send_reaction(message.chat.id, message.id, emoji) + + except Exception as e: + errorMsg = f"❌ 自动回复Emoji失败({user_name} {emoji})> {e}" + await log(errorMsg) + return False + + # 打印日志 + # text = message.text.markdown + # await log(f"AutoSendReactions 监控到来自 {user_name} 的消息:{str(text)}") + + except Exception as e: + errorMsg = f"❌ 第{e.__traceback__.tb_lineno}行:{e}" + await log(errorMsg) + return False + + +## ⬆️ 不懂勿动 ⬆️ diff --git a/list.json b/list.json index 1d9952a..5d93891 100644 --- a/list.json +++ b/list.json @@ -1021,4 +1021,4 @@ "des": "国际化域名 (IDNA) 编码转换工具\n\n指令:\n- `,punyencode <待编码内容> (支持回复消息)` (编码至 Punycode)\n- `,punydecode <待解码内容> (支持回复消息)` (从 Punycode 解码)" } ] -} \ No newline at end of file +}