sycgram/plugins/cc.py
2022-04-09 13:11:35 +08:00

108 lines
3.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import asyncio
import re
from random import choice, random
from typing import List
from core import command
from loguru import logger
from pyrogram import Client
from pyrogram.errors import FloodWait
from pyrogram.types import Message
from tools.constants import CC_MAX_TIMES, REACTIONS, STORE_CC_DATA, TG_GROUPS
from tools.helpers import Parameters, delete_this, emoji_sender, show_cmd_tip
from tools.storage import SimpleStore
@Client.on_message(command('cc'))
async def cc(cli: Client, msg: Message):
"""
cc:
format: -cc <数量> or -cc <emoji|set>
usage:
回复使用:遍历该消息的主人发过的消息并丢<数量>个<emoji>给Ta直接使用
指令<emoji>为默认emoji。默认💩
"""
cmd, opt = Parameters.get(msg)
replied_msg = msg.reply_to_message
async with SimpleStore(auto_flush=False) as store:
cc_emoji = store.data.get(STORE_CC_DATA)
if not cc_emoji:
cc_emoji = store.data[STORE_CC_DATA] = '💩'
if replied_msg and bool(re.match(r"[0-9]+", opt)):
cc_times = int(opt)
elif opt in REACTIONS or opt == 'set':
store.data[STORE_CC_DATA] = choice(
REACTIONS) if opt == 'set' else opt
tmp = store.data[STORE_CC_DATA]
store.flush()
await msg.edit_text(f"Default emoji changed to `{tmp}`")
return
else:
return await show_cmd_tip(msg, cmd)
# 攻击次数
cc_times = cc_times if 1 <= cc_times <= CC_MAX_TIMES else CC_MAX_TIMES
cc_msgs: List[int] = []
from_user_id = replied_msg.from_user.id if replied_msg.from_user else replied_msg.sender_chat.id
# 遍历和搜索消息
if msg.chat.type in TG_GROUPS:
async for target in cli.search_messages(
chat_id=msg.chat.id, limit=1000,
from_user=from_user_id,
):
if target.message_id > 1 and (target.from_user or target.sender_chat):
cc_msgs.append(target.message_id)
if len(cc_msgs) == cc_times:
break
else:
async for target in cli.iter_history(msg.chat.id, limit=1000):
if target.message_id > 1 and target.from_user and \
target.from_user.id == replied_msg.from_user.id:
cc_msgs.append(target.message_id)
if len(cc_msgs) == cc_times:
break
if len(cc_msgs) > 0:
await msg.edit_text("🔥 `Attacking ...`")
shot = 0
for n, cc_msg_id in enumerate(cc_msgs):
try:
res = await emoji_sender(
cli=cli,
chat_id=msg.chat.id,
msg_id=cc_msg_id,
emoji=cc_emoji
)
except FloodWait as e:
await asyncio.sleep(e + 1)
res = await emoji_sender(
cli=cli,
chat_id=msg.chat.id,
msg_id=cc_msg_id,
emoji=cc_emoji
)
if not res and shot == 0:
await msg.edit_text(
f"This chat don't allow using {cc_emoji} to react."
)
return
shot = shot + 1
logger.success(f"{cmd} | attacking | {n+1}")
await asyncio.sleep(random() / 5)
# Finished
text = f"✅ Finished and the hit rate is {shot/cc_times*100}%"
else:
# Finished
text = "❓ Unable to find attack target"
await delete_this(msg)
res = await cli.send_message(msg.chat.id, text)
await asyncio.sleep(3)
await delete_this(res)