mirror of
https://github.com/TeamPGM/PagerMaid_Plugins.git
synced 2024-11-22 12:55:38 +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
|
return
|
||||||
dme_msg = "别搁这防撤回了。。。"
|
dme_msg = "别搁这防撤回了。。。"
|
||||||
if len(context.parameter) == 1:
|
if len(context.parameter) == 1:
|
||||||
if not redis_status:
|
if not redis_status():
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
|
10
list.json
10
list.json
@ -739,6 +739,16 @@
|
|||||||
"supported": true,
|
"supported": true,
|
||||||
"des-short": "获取所回复贴纸的贴纸包信息",
|
"des-short": "获取所回复贴纸的贴纸包信息",
|
||||||
"des": "获取所回复贴纸的贴纸包信息。\n指令:-getstickerset"
|
"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("获取中 . . .")
|
await context.edit("获取中 . . .")
|
||||||
if len(context.parameter) == 2:
|
if len(context.parameter) == 2:
|
||||||
if context.parameter[0] == 'set':
|
if context.parameter[0] == 'set':
|
||||||
if not redis_status:
|
if not redis_status():
|
||||||
await context.edit('redis 数据库离线 无法更改镜像源。')
|
await context.edit('redis 数据库离线 无法更改镜像源。')
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
@ -127,7 +127,7 @@ async def pixiv(context):
|
|||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
if not redis_status:
|
if not redis_status():
|
||||||
num = 3
|
num = 3
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
|
Loading…
Reference in New Issue
Block a user