98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
|
import asyncio
|
|||
|
|
|||
|
from core import command
|
|||
|
from core.custom import is_traced
|
|||
|
from loguru import logger
|
|||
|
from pyrogram import Client
|
|||
|
from pyrogram.errors import BadRequest, FloodWait, RPCError
|
|||
|
from pyrogram.types import Message
|
|||
|
from tools.constants import REACTIONS, STORE_TRACE_DATA
|
|||
|
from tools.helpers import Parameters, delete_this
|
|||
|
from tools.storage import SimpleStore
|
|||
|
|
|||
|
|
|||
|
@Client.on_message(is_traced(), group=-4)
|
|||
|
async def trace_event(cli: Client, msg: Message):
|
|||
|
user = msg.from_user
|
|||
|
async with SimpleStore(auto_flush=False) as store:
|
|||
|
try:
|
|||
|
emoji = store.get_data(STORE_TRACE_DATA).get(user.id)
|
|||
|
await cli.send_reaction(
|
|||
|
msg.chat.id, msg.message_id, emoji
|
|||
|
)
|
|||
|
except BadRequest:
|
|||
|
failure = f"Group named <{msg.chat.title}> can't use {emoji} to react."
|
|||
|
store.data[STORE_TRACE_DATA].pop(user.id, None)
|
|||
|
store.flush()
|
|||
|
await cli.send_message('me', failure)
|
|||
|
except RPCError as e:
|
|||
|
logger.error(e)
|
|||
|
|
|||
|
|
|||
|
@Client.on_message(command('trace'))
|
|||
|
async def trace(cli: Client, msg: Message):
|
|||
|
"""群组中追着丢emoji
|
|||
|
指令:-trace
|
|||
|
用法:-trace <emoji|clear|list> 用于回复一条消息
|
|||
|
"""
|
|||
|
cmd, opt = Parameters.get(msg)
|
|||
|
replied_msg = msg.reply_to_message
|
|||
|
|
|||
|
if not opt and not replied_msg:
|
|||
|
await msg.edit_text(f'❗️ Use `{cmd}` to reply a message.')
|
|||
|
return
|
|||
|
|
|||
|
if opt != 'clear' and opt != 'list':
|
|||
|
emoji = '💩' if opt not in REACTIONS else opt
|
|||
|
user = replied_msg.from_user
|
|||
|
try:
|
|||
|
await cli.send_reaction(
|
|||
|
msg.chat.id,
|
|||
|
replied_msg.message_id,
|
|||
|
emoji
|
|||
|
)
|
|||
|
except RPCError as e:
|
|||
|
logger.warning(e)
|
|||
|
await msg.edit_text(f"❗️ Can't use {emoji} in this chat.")
|
|||
|
return
|
|||
|
|
|||
|
async with SimpleStore() as store:
|
|||
|
trace_data = store.get_data(STORE_TRACE_DATA)
|
|||
|
if opt != 'clear' and opt != 'list':
|
|||
|
# 追踪列表中没有,则添加
|
|||
|
if not trace_data.get(user.id):
|
|||
|
trace_data[user.id] = emoji
|
|||
|
text = f"✅ 添加 {user.mention(style='md')} 到trace列表"
|
|||
|
logger.success(text)
|
|||
|
# 追踪列表有,则删除
|
|||
|
elif trace_data.pop(user.id, False):
|
|||
|
text = f"✅ 将 {user.mention(style='md')} 从trace列表移除"
|
|||
|
logger.success(text)
|
|||
|
# 删除失败??
|
|||
|
else:
|
|||
|
text = f"❌ 竟然将 {user.mention(style='md')} 从trace列表移除失败!!!"
|
|||
|
logger.warning(text)
|
|||
|
elif opt == 'clear':
|
|||
|
trace_data.clear()
|
|||
|
text = "✅ 已清空trace名单"
|
|||
|
elif opt == 'list':
|
|||
|
tmp = '\n'.join(f"`{k}` | {v}" for k, v in trace_data.items())
|
|||
|
text = f"📢 trace名单:\n{tmp}"
|
|||
|
|
|||
|
try:
|
|||
|
await msg.edit_text(text, parse_mode='md')
|
|||
|
|
|||
|
except FloodWait as e:
|
|||
|
await asyncio.sleep(e.x)
|
|||
|
await msg.edit_text(text, parse_mode='md')
|
|||
|
|
|||
|
except RPCError as e:
|
|||
|
logger.error(e)
|
|||
|
await msg.edit_text(f"Network error | `{e}`")
|
|||
|
|
|||
|
finally:
|
|||
|
if opt != 'clear' and opt != 'list':
|
|||
|
await asyncio.sleep(3)
|
|||
|
await delete_this(msg)
|
|||
|
await logger.complete()
|