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 | |
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 | |
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 | |