autodel 在指定的时间后删除他人的消息

This commit is contained in:
xtaodada 2021-08-19 14:42:24 +08:00
parent 7b14e16cb9
commit 881349b277
No known key found for this signature in database
GPG Key ID: EE4DC37B55E24736
4 changed files with 179 additions and 3 deletions

166
autodel.py Normal file
View 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
View File

@ -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:

View File

@ -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
View File

@ -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: