mirror of
https://github.com/TeamPGM/PagerMaid_Plugins.git
synced 2024-11-25 10:02:23 +00:00
autodel 在指定的时间后删除他人的消息
This commit is contained in:
parent
7b14e16cb9
commit
881349b277
166
autodel.py
Normal file
166
autodel.py
Normal file
@ -0,0 +1,166 @@
|
||||
""" Remove Someone's Msg After A Specified Time. """
|
||||
# extra requirements: dateparser, redis
|
||||
|
||||
import time
|
||||
import traceback
|
||||
|
||||
from sys import executable
|
||||
from asyncio import sleep
|
||||
from telethon.tl.types import PeerUser
|
||||
from telethon.tl.custom import Message
|
||||
from pagermaid import redis, redis_status
|
||||
from pagermaid.listener import listener
|
||||
from pagermaid.utils import alias_command
|
||||
|
||||
try:
|
||||
import dateparser
|
||||
imported = True
|
||||
except ImportError:
|
||||
imported = False
|
||||
|
||||
|
||||
# https://stackoverflow.com/questions/1111056/get-time-zone-information-of-the-system-in-python
|
||||
def local_time_offset(t=None):
|
||||
"""Return offset of local zone from GMT, either at present or at time t."""
|
||||
# python2.3 localtime() can't take None
|
||||
if t is None:
|
||||
t = time.time()
|
||||
|
||||
if time.localtime(t).tm_isdst and time.daylight:
|
||||
return -time.altzone
|
||||
else:
|
||||
return -time.timezone
|
||||
|
||||
|
||||
@listener(incoming=True, ignore_edited=True)
|
||||
async def remove_others_message(context):
|
||||
""" Event handler to infinitely remove messages. """
|
||||
if not redis_status():
|
||||
return
|
||||
if not context.is_group:
|
||||
return
|
||||
chat_id = context.chat_id
|
||||
if not isinstance(context.from_id, PeerUser):
|
||||
return
|
||||
uid = context.from_id.user_id
|
||||
mid = context.id
|
||||
data = redis.get(f"autodel.{chat_id}.{uid}")
|
||||
if data:
|
||||
delta = float(data.decode())
|
||||
await sleep(delta)
|
||||
# 检查消息是否仍然存在
|
||||
chat = await context.get_chat()
|
||||
msg = await context.client.get_messages(chat, ids=mid)
|
||||
if msg:
|
||||
try:
|
||||
await context.delete()
|
||||
except Exception as e:
|
||||
try:
|
||||
await send_msg(context, await context.get_chat(), str(e))
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
||||
@listener(is_plugin=True, outgoing=True, command=alias_command("autodel"),
|
||||
diagnostics=True,
|
||||
description="""
|
||||
在指定的时间后删除所回复用户发送的消息。只对当前群组有效。
|
||||
|
||||
i.e.
|
||||
-autodel 4 seconds
|
||||
-autodel 1 minutes
|
||||
-autodel 1 hours
|
||||
|
||||
取消删除消息:
|
||||
|
||||
-autodel cancel
|
||||
""",
|
||||
parameters="<time>")
|
||||
async def auto_del(context: Message):
|
||||
try:
|
||||
chat_id = context.chat_id
|
||||
# 读取参数
|
||||
args = context.arguments if context.arguments is not None else ""
|
||||
args = args.strip()
|
||||
reply = await context.get_reply_message()
|
||||
|
||||
if not imported:
|
||||
await edit(context, f"请先安装 `dateparser` 依赖: `{executable} -m pip install dateparser`")
|
||||
return
|
||||
if not redis_status():
|
||||
await edit(context, f"出错了呜呜呜 ~ 数据库离线。")
|
||||
return
|
||||
if not reply:
|
||||
await edit(context, f"出错了呜呜呜 ~ 没有回复一条消息。")
|
||||
return
|
||||
if not reply.sender:
|
||||
await edit(context, f"出错了呜呜呜 ~ 无法获取回复的用户。")
|
||||
return
|
||||
if not context.is_group:
|
||||
await edit(context, f"出错了呜呜呜 ~ 没有在群组中执行。")
|
||||
return
|
||||
uid = reply.sender.id
|
||||
# 处理参数
|
||||
if len(args) == 0:
|
||||
await edit(context, "参数不能为空。使用 -help autodel 以查看帮助。")
|
||||
return
|
||||
if args.find("cancel") == -1 and not any(char.isdigit() for char in args):
|
||||
await edit(context, "指定的参数中似乎没有时间长度。")
|
||||
return
|
||||
if args.find("cancel") == -1 and all(char.isdigit() for char in args):
|
||||
await edit(context, "请指定时间长度的单位。")
|
||||
return
|
||||
if args.find(":") != -1 or args.find("-") != -1:
|
||||
await edit(context, "请使用相对时间长度,而非绝对时间长度:不能含 : 或 -。")
|
||||
return
|
||||
# 处理取消
|
||||
if args.startswith("cancel"):
|
||||
if redis.get(f"autodel.{chat_id}.{uid}"):
|
||||
redis.delete(f"autodel.{chat_id}.{uid}")
|
||||
await context.edit('成功在当前群取消定时删除所回复对象的消息。')
|
||||
else:
|
||||
await context.edit('未在当前群启用定时删除所回复对象的消息。')
|
||||
return
|
||||
# 解析时间长度
|
||||
offset = local_time_offset() // 3600
|
||||
sign = "+" if offset >= 0 else "-"
|
||||
offset = abs(offset)
|
||||
offset_str = str(offset)
|
||||
offset_str = offset_str if len(offset_str) == 2 else f"0{offset_str}"
|
||||
|
||||
settings = {'TIMEZONE': f'{sign}{offset_str}00'}
|
||||
dt = dateparser.parse(args, settings=settings)
|
||||
|
||||
if dt is None:
|
||||
await edit(context, "无法解析所指定的时间长度。")
|
||||
return
|
||||
|
||||
delta = time.time() - dt.timestamp()
|
||||
if delta <= 3:
|
||||
await edit(context, "所指定的时间长度过短。")
|
||||
return
|
||||
# 写入数据库
|
||||
redis.set(f"autodel.{chat_id}.{uid}", f"{delta}")
|
||||
await edit(context, "成功在当前群启用定时删除所回复对象的消息。")
|
||||
return
|
||||
except Exception as e:
|
||||
await edit(context, f"Error: {str(e)}")
|
||||
return
|
||||
|
||||
|
||||
async def edit(context, text):
|
||||
chat = await context.get_chat()
|
||||
try:
|
||||
return await context.edit(text)
|
||||
except Exception as e:
|
||||
if str(e).find("you can't do that operation") == -1:
|
||||
stack = "\n".join(traceback.format_stack())
|
||||
return await send_msg(context, chat, f"{text} {str(e)} {stack}")
|
||||
else:
|
||||
return context
|
||||
|
||||
|
||||
async def send_msg(context, chat, origin_text):
|
||||
text = origin_text.strip()
|
||||
msg = await context.client.send_message(chat, text)
|
||||
return msg
|
2
dme.py
2
dme.py
@ -53,7 +53,7 @@ async def dme(context):
|
||||
return
|
||||
dme_msg = "别搁这防撤回了。。。"
|
||||
if len(context.parameter) == 1:
|
||||
if not redis_status:
|
||||
if not redis_status():
|
||||
pass
|
||||
else:
|
||||
try:
|
||||
|
10
list.json
10
list.json
@ -739,6 +739,16 @@
|
||||
"supported": true,
|
||||
"des-short": "获取所回复贴纸的贴纸包信息",
|
||||
"des": "获取所回复贴纸的贴纸包信息。\n指令:-getstickerset"
|
||||
},
|
||||
{
|
||||
"name": "autodel",
|
||||
"version": "1.0",
|
||||
"section": "chat",
|
||||
"maintainer": "xtaodada",
|
||||
"size": "5.7 kb",
|
||||
"supported": true,
|
||||
"des-short": "在指定的时间后删除他人的消息。",
|
||||
"des": "在指定的时间后删除所回复用户发送的消息。\n指令:-autodel"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
4
vip.py
4
vip.py
@ -105,7 +105,7 @@ async def pixiv(context):
|
||||
await context.edit("获取中 . . .")
|
||||
if len(context.parameter) == 2:
|
||||
if context.parameter[0] == 'set':
|
||||
if not redis_status:
|
||||
if not redis_status():
|
||||
await context.edit('redis 数据库离线 无法更改镜像源。')
|
||||
return
|
||||
else:
|
||||
@ -127,7 +127,7 @@ async def pixiv(context):
|
||||
return
|
||||
else:
|
||||
pass
|
||||
if not redis_status:
|
||||
if not redis_status():
|
||||
num = 3
|
||||
else:
|
||||
try:
|
||||
|
Loading…
Reference in New Issue
Block a user