# Ultroid - UserBot
# Copyright (C) 2021-2026 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
# .
"""
✘ Commands Available -
• `{i}delayspam `
Spam a message `count` times with `delay` seconds between each.
Reply to a message to spam that message instead.
• `{i}stopspam`
Stop an ongoing delayspam.
Examples:
`{i}delayspam 5 2 Hello!` — sends "Hello!" 5 times with 2s delay
`{i}delayspam 10 1` (reply to a message) — forwards replied msg 10 times with 1s delay
"""
import asyncio
from . import HNDLR, eod, get_string, udB, ultroid_bot, ultroid_cmd
_spam_tasks = {}
@ultroid_cmd(pattern=r"delayspam( (.*)|$)")
async def delayspam_cmd(ult):
args = ult.pattern_match.group(1).strip().split(None, 2)
reply = await ult.get_reply_message()
if len(args) < 2:
return await ult.eor(
f"`Usage: {HNDLR}delayspam [message]\n"
f"Or reply to a message: {HNDLR}delayspam `",
time=10,
)
try:
count = int(args[0])
delay = float(args[1])
except ValueError:
return await ult.eor("`count and delay must be numbers.`", time=5)
if count > 200:
return await ult.eor("`Max 200 repetitions allowed.`", time=5)
if delay < 0.5:
return await ult.eor("`Minimum delay is 0.5 seconds.`", time=5)
text = args[2] if len(args) > 2 else None
chat_id = ult.chat_id
if not text and not reply:
return await ult.eor(
f"`Provide a message or reply to one.\nUsage: {HNDLR}delayspam `",
time=8,
)
await ult.delete()
task_key = f"{ult.sender_id}_{chat_id}"
if task_key in _spam_tasks:
_spam_tasks[task_key].cancel()
async def _do_spam():
for i in range(count):
if task_key not in _spam_tasks:
break
try:
if reply:
await ultroid_bot.send_message(
chat_id, reply.text or "", file=reply.media
)
else:
await ultroid_bot.send_message(chat_id, text)
except Exception:
break
await asyncio.sleep(delay)
_spam_tasks.pop(task_key, None)
task = asyncio.get_event_loop().create_task(_do_spam())
_spam_tasks[task_key] = task
@ultroid_cmd(pattern="stopspam$")
async def stopspam_cmd(ult):
task_key = f"{ult.sender_id}_{ult.chat_id}"
if task_key in _spam_tasks:
_spam_tasks.pop(task_key).cancel()
await ult.eor("`Spam stopped.`", time=3)
else:
await ult.eor("`No active spam in this chat.`", time=3)