taslim19
Update devtools.py: add case-insensitive and flexible command triggers for userbot devtools
abc89fd
import time, re, os
from config import BOT_USERNAME
from pyrogram.enums import MessageEntityType
from pyrogram import filters
from pyrogram.types import Message
from DragMusic import app
from DragMusic.Mongo.readable_time import get_readable_time
from DragMusic.Mongo.afkdb import add_afk, is_afk, remove_afk
@app.on_message(
filters.command(["afk", "brb", "Afk", "Brb"], prefixes=["/", "!","."]) |
filters.regex(r"^(afk|brb|Afk|Brb)(?:\s+(.+))?$"))
async def active_afk(_, message: Message):
if message.sender_chat:
return
user_id = message.from_user.id
verifier, reasondb = await is_afk(user_id)
if verifier:
await remove_afk(user_id)
try:
afktype = reasondb["type"]
timeafk = reasondb["time"]
data = reasondb["data"]
reasonafk = reasondb["reason"]
seenago = get_readable_time((int(time.time() - timeafk)))
if afktype == "text":
send = await message.reply_text(
f"{message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}",
disable_web_page_preview=True,
)
if afktype == "text_reason":
send = await message.reply_text(
f"{message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\nReason: {reasonafk}",
disable_web_page_preview=True,
)
if afktype == "animation":
if str(reasonafk) == "None":
send = await message.reply_animation(
data,
caption=f"{message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ for {seenago}",
)
else:
send = await message.reply_animation(
data,
caption=f"{message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ for {seenago}\n\nReason: {reasonafk}",
)
if afktype == "photo":
if str(reasonafk) == "None":
send = await message.reply_photo(
photo=f"/tmp/downloads/{user_id}.jpg",
caption=f"{message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}",
)
else:
send = await message.reply_photo(
photo=f"/tmp/downloads/{user_id}.jpg",
caption=f"{message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\nReason: {reasonafk}",
)
except Exception:
send = await message.reply_text(
f"{message.from_user.first_name} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ",
disable_web_page_preview=True,
)
return
# Handle both command format and plain text format
details = None # Ensure details is always defined
if message.command:
# Command format: /afk or /afk reason
if len(message.command) == 1 and not message.reply_to_message:
details = {
"type": "text",
"time": time.time(),
"data": None,
"reason": None,
}
elif len(message.command) > 1 and not message.reply_to_message:
_reason = (message.text.split(None, 1)[1].strip())[:100]
details = {
"type": "text_reason",
"time": time.time(),
"data": None,
"reason": _reason,
}
else:
# Plain text format: afk or afk reason
text_parts = message.text.strip().split(None, 1)
if len(text_parts) == 1:
details = {
"type": "text",
"time": time.time(),
"data": None,
"reason": None,
}
else:
_reason = text_parts[1].strip()[:100]
details = {
"type": "text_reason",
"time": time.time(),
"data": None,
"reason": _reason,
}
# Fallback if details is still None (shouldn't happen, but just in case)
if details is None:
details = {
"type": "text",
"time": time.time(),
"data": None,
"reason": None,
}
# Handle reply to media (works for both command and plain text)
if message.reply_to_message:
if message.reply_to_message.animation:
_data = message.reply_to_message.animation.file_id
if details.get("reason"):
details.update({
"type": "animation",
"data": _data,
})
else:
details.update({
"type": "animation",
"data": _data,
"reason": None,
})
elif message.reply_to_message.photo:
await app.download_media(
message.reply_to_message, file_name=f"/tmp/downloads/{user_id}.jpg"
)
if details.get("reason"):
details.update({
"type": "photo",
"data": None,
})
else:
details.update({
"type": "photo",
"data": None,
"reason": None,
})
elif message.reply_to_message.sticker:
if message.reply_to_message.sticker.is_animated:
if details.get("reason"):
details.update({
"type": "text_reason",
"data": None,
})
else:
details.update({
"type": "text",
"data": None,
"reason": None,
})
else:
await app.download_media(
message.reply_to_message, file_name=f"/tmp/downloads/{user_id}.jpg"
)
if details.get("reason"):
details.update({
"type": "photo",
"data": None,
})
else:
details.update({
"type": "photo",
"data": None,
"reason": None,
})
await add_afk(user_id, details)
await message.reply_text(f"{message.from_user.first_name} ɪs ɴᴏᴡ ᴀғᴋ!")
chat_watcher_group = 1
@app.on_message(
~filters.me & ~filters.bot & ~filters.via_bot,
group=chat_watcher_group,
)
async def chat_watcher_func(_, message):
if message.sender_chat:
return
message_text = (message.text or message.caption or "").lower()
if message.command and message.command[0].lower() in ["afk", "brb"]:
return
if re.match(r"^(afk|brb)(?:\s+.*)?$", message_text):
return
userid = message.from_user.id
user_name = message.from_user.first_name
if message.entities:
possible = ["/afk", f"/afk@{BOT_USERNAME}"]
message_text = message.text or message.caption
for entity in message.entities:
if entity.type == MessageEntityType.BOT_COMMAND:
if (message_text[0 : 0 + entity.length]).lower() in possible:
return
msg = ""
replied_user_id = 0
verifier, reasondb = await is_afk(userid)
if verifier:
await remove_afk(userid)
try:
afktype = reasondb["type"]
timeafk = reasondb["time"]
data = reasondb["data"]
reasonafk = reasondb["reason"]
seenago = get_readable_time((int(time.time() - timeafk)))
if afktype == "text":
msg += f"{user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n"
if afktype == "text_reason":
msg += f"{user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\nReason: {reasonafk}\n\n"
if afktype == "animation":
if str(reasonafk) == "None":
send = await message.reply_animation(
data,
caption=f"{user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n",
)
else:
send = await message.reply_animation(
data,
caption=f"{user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\nReason: {reasonafk}\n\n",
)
if afktype == "photo":
if str(reasonafk) == "None":
send = await message.reply_photo(
photo=f"/tmp/downloads/{userid}.jpg",
caption=f"{user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\n",
)
else:
send = await message.reply_photo(
photo=f"/tmp/downloads/{userid}.jpg",
caption=f"{user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ ᴀɴᴅ ᴡᴀs ᴀᴡᴀʏ ғᴏʀ {seenago}\n\nReason: {reasonafk}\n\n",
)
except:
msg += f"{user_name[:25]} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ\n\n"
if message.reply_to_message:
try:
replied_first_name = message.reply_to_message.from_user.first_name
replied_user_id = message.reply_to_message.from_user.id
verifier, reasondb = await is_afk(replied_user_id)
if verifier:
try:
afktype = reasondb["type"]
timeafk = reasondb["time"]
data = reasondb["data"]
reasonafk = reasondb["reason"]
seenago = get_readable_time((int(time.time() - timeafk)))
if afktype == "text":
msg += (
f"{replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n"
)
if afktype == "text_reason":
msg += f"{replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\nReason: {reasonafk}\n\n"
if afktype == "animation":
if str(reasonafk) == "None":
send = await message.reply_animation(
data,
caption=f"{replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n",
)
else:
send = await message.reply_animation(
data,
caption=f"{replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\nReason: {reasonafk}\n\n",
)
if afktype == "photo":
if str(reasonafk) == "None":
send = await message.reply_photo(
photo=f"/tmp/downloads/{replied_user_id}.jpg",
caption=f"{replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n",
)
else:
send = await message.reply_photo(
photo=f"/tmp/downloads/{replied_user_id}.jpg",
caption=f"{replied_first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\nReason: {reasonafk}\n\n",
)
except:
msg += f"{replied_first_name[:25]} ɪs ᴀғᴋ\n\n"
except:
pass
if message.entities:
entity = message.entities
j = 0
for x in range(len(entity)):
if (entity[j].type) == MessageEntityType.MENTION:
found = re.findall("@([_0-9a-zA-Z]+)", message.text)
try:
get_user = found[j]
user = await app.get_users(get_user)
if user.id == replied_user_id:
j += 1
continue
except:
j += 1
continue
verifier, reasondb = await is_afk(user.id)
if verifier:
try:
afktype = reasondb["type"]
timeafk = reasondb["time"]
data = reasondb["data"]
reasonafk = reasondb["reason"]
seenago = get_readable_time((int(time.time() - timeafk)))
if afktype == "text":
msg += (
f"{user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n"
)
if afktype == "text_reason":
msg += f"{user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\nAlasan: {reasonafk}\n\n"
if afktype == "animation":
if str(reasonafk) == "None":
send = await message.reply_animation(
data,
caption=f"{user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n",
)
else:
send = await message.reply_animation(
data,
caption=f"{user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\nAlasan: {reasonafk}\n\n",
)
if afktype == "photo":
if str(reasonafk) == "None":
send = await message.reply_photo(
photo=f"/tmp/downloads/{user.id}.jpg",
caption=f"{user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n",
)
else:
send = await message.reply_photo(
photo=f"/tmp/downloads/{user.id}.jpg",
caption=f"{user.first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\nAlasan: {reasonafk}\n\n",
)
except:
msg += f"{user.first_name[:25]} ɪs ᴀғᴋ\n\n"
elif (entity[j].type) == MessageEntityType.TEXT_MENTION:
try:
user_id = entity[j].user.id
if user_id == replied_user_id:
j += 1
continue
first_name = entity[j].user.first_name
except:
j += 1
continue
verifier, reasondb = await is_afk(user_id)
if verifier:
try:
afktype = reasondb["type"]
timeafk = reasondb["time"]
data = reasondb["data"]
reasonafk = reasondb["reason"]
seenago = get_readable_time((int(time.time() - timeafk)))
if afktype == "text":
msg += f"{first_name[:25]}** ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n"
if afktype == "text_reason":
msg += f"{first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\nAlasan: {reasonafk}\n\n"
if afktype == "animation":
if str(reasonafk) == "None":
send = await message.reply_animation(
data,
caption=f"{first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n",
)
else:
send = await message.reply_animation(
data,
caption=f"{first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\nAlasan: {reasonafk}\n\n",
)
if afktype == "photo":
if str(reasonafk) == "None":
send = await message.reply_photo(
photo=f"/tmp/downloads/{user_id}.jpg",
caption=f"{first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\n",
)
else:
send = await message.reply_photo(
photo=f"/tmp/downloads/{user_id}.jpg",
caption=f"{first_name[:25]} ɪs ᴀғᴋ sɪɴᴄᴇ {seenago}\n\nAlasan: {reasonafk}\n\n",
)
except:
msg += f"{first_name[:25]} ɪs ᴀғᴋ\n\n"
j += 1
if msg != "":
try:
send = await message.reply_text(msg, disable_web_page_preview=True)
except:
pass