mirror of
https://github.com/yasirarism/MissKatyPyro.git
synced 2025-12-29 17:44:50 +00:00
Format code with black and isort (#9)
This commit fixes the style issues introduced in 95ecce1 according to the output
from black and isort.
Details: https://deepsource.io/gh/yasirarism/MissKatyPyro/transform/2b5c318f-57d7-4419-8e76-1d6c31d72999/
Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com>
This commit is contained in:
parent
95ecce151c
commit
0dbab68a39
64 changed files with 1471 additions and 426 deletions
|
|
@ -6,6 +6,7 @@
|
|||
* Copyright @YasirPedia All rights reserved
|
||||
"""
|
||||
from motor.motor_asyncio import AsyncIOMotorClient as MongoClient
|
||||
|
||||
from misskaty.vars import DATABASE_URI
|
||||
|
||||
mongo = MongoClient(DATABASE_URI)
|
||||
|
|
|
|||
|
|
@ -47,7 +47,9 @@ async def is_afk(user_id: int) -> bool:
|
|||
|
||||
|
||||
async def add_afk(user_id: int, mode):
|
||||
await usersdb.update_one({"user_id": user_id}, {"$set": {"reason": mode}}, upsert=True)
|
||||
await usersdb.update_one(
|
||||
{"user_id": user_id}, {"$set": {"reason": mode}}, upsert=True
|
||||
)
|
||||
|
||||
|
||||
async def remove_afk(user_id: int):
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from typing import Dict, List, Union
|
||||
|
||||
from database import dbname
|
||||
from typing import Dict, Union, List
|
||||
|
||||
filtersdb = dbname.filters
|
||||
|
||||
|
|
|
|||
|
|
@ -2,15 +2,19 @@ from database import dbname
|
|||
|
||||
imbd_db = dbname.imdb
|
||||
|
||||
|
||||
async def is_imdbset(user_id: int) -> bool:
|
||||
user = await imbd_db.find_one({"user_id": user_id})
|
||||
return (True, user["lang"]) if user else (False, {})
|
||||
|
||||
|
||||
async def add_imdbset(user_id: int, lang):
|
||||
await imbd_db.update_one({"user_id": user_id}, {"$set": {"lang": lang}}, upsert=True)
|
||||
await imbd_db.update_one(
|
||||
{"user_id": user_id}, {"$set": {"lang": lang}}, upsert=True
|
||||
)
|
||||
|
||||
|
||||
async def remove_imdbset(user_id: int):
|
||||
user = await imbd_db.find_one({"user_id": user_id})
|
||||
if user:
|
||||
return await imbd_db.delete_one({"user_id": user_id})
|
||||
return await imbd_db.delete_one({"user_id": user_id})
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
from typing import Dict, Union
|
||||
from misskaty.helper.functions import int_to_alpha
|
||||
|
||||
from database import dbname
|
||||
from misskaty.helper.functions import int_to_alpha
|
||||
|
||||
karmadb = dbname.karma
|
||||
|
||||
|
|
@ -42,7 +43,9 @@ async def update_karma(chat_id: int, name: str, karma: dict):
|
|||
name = name.lower().strip()
|
||||
karmas = await get_karmas(chat_id)
|
||||
karmas[name] = karma
|
||||
await karmadb.update_one({"chat_id": chat_id}, {"$set": {"karma": karmas}}, upsert=True)
|
||||
await karmadb.update_one(
|
||||
{"chat_id": chat_id}, {"$set": {"karma": karmas}}, upsert=True
|
||||
)
|
||||
|
||||
|
||||
async def is_karma_on(chat_id: int) -> bool:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from typing import Dict, List, Union
|
||||
|
||||
from database import dbname
|
||||
from typing import Dict, Union, List
|
||||
|
||||
notesdb = dbname.notes
|
||||
|
||||
|
|
@ -41,4 +42,6 @@ async def save_note(chat_id: int, name: str, note: dict):
|
|||
_notes = await _get_notes(chat_id)
|
||||
_notes[name] = note
|
||||
|
||||
await notesdb.update_one({"chat_id": chat_id}, {"$set": {"notes": _notes}}, upsert=True)
|
||||
await notesdb.update_one(
|
||||
{"chat_id": chat_id}, {"$set": {"notes": _notes}}, upsert=True
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import motor.motor_asyncio
|
||||
|
||||
from misskaty.vars import DATABASE_NAME, DATABASE_URI
|
||||
|
||||
|
||||
|
|
@ -79,14 +80,18 @@ class Database:
|
|||
is_disabled=False,
|
||||
reason="",
|
||||
)
|
||||
await self.grp.update_one({"id": int(id)}, {"$set": {"chat_status": chat_status}})
|
||||
await self.grp.update_one(
|
||||
{"id": int(id)}, {"$set": {"chat_status": chat_status}}
|
||||
)
|
||||
|
||||
async def disable_chat(self, chat, reason="No Reason"):
|
||||
chat_status = dict(
|
||||
is_disabled=True,
|
||||
reason=reason,
|
||||
)
|
||||
await self.grp.update_one({"id": int(chat)}, {"$set": {"chat_status": chat_status}})
|
||||
await self.grp.update_one(
|
||||
{"id": int(chat)}, {"$set": {"chat_status": chat_status}}
|
||||
)
|
||||
|
||||
async def total_chat_count(self):
|
||||
return await self.grp.count_documents({})
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
from typing import Dict, Union
|
||||
|
||||
from database import dbname
|
||||
|
||||
warnsdb = dbname.warn
|
||||
|
|
@ -31,7 +32,9 @@ async def add_warn(chat_id: int, name: str, warn: dict):
|
|||
warns = await get_warns(chat_id)
|
||||
warns[name] = warn
|
||||
|
||||
await warnsdb.update_one({"chat_id": chat_id}, {"$set": {"warns": warns}}, upsert=True)
|
||||
await warnsdb.update_one(
|
||||
{"chat_id": chat_id}, {"$set": {"warns": warns}}, upsert=True
|
||||
)
|
||||
|
||||
|
||||
async def remove_warns(chat_id: int, name: str) -> bool:
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
from logging import getLogger, basicConfig, FileHandler, StreamHandler, INFO, ERROR
|
||||
import time
|
||||
from logging import ERROR, INFO, FileHandler, StreamHandler, basicConfig, getLogger
|
||||
|
||||
from pyrogram import Client
|
||||
from misskaty.vars import API_ID, API_HASH, BOT_TOKEN, USER_SESSION
|
||||
|
||||
from misskaty.vars import API_HASH, API_ID, BOT_TOKEN, USER_SESSION
|
||||
|
||||
basicConfig(
|
||||
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
||||
|
|
|
|||
|
|
@ -5,28 +5,32 @@
|
|||
* @projectName MissKatyPyro
|
||||
* Copyright @YasirPedia All rights reserved
|
||||
"""
|
||||
import asyncio, importlib, re
|
||||
import asyncio
|
||||
import importlib
|
||||
import re
|
||||
from logging import getLogger
|
||||
|
||||
from pyrogram import __version__, filters, idle
|
||||
from pyrogram.raw.all import layer
|
||||
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
||||
|
||||
from database.users_chats_db import db
|
||||
from misskaty import (
|
||||
app,
|
||||
user,
|
||||
HELPABLE,
|
||||
BOT_ID,
|
||||
BOT_NAME,
|
||||
BOT_USERNAME,
|
||||
HELPABLE,
|
||||
UBOT_ID,
|
||||
UBOT_NAME,
|
||||
UBOT_USERNAME,
|
||||
app,
|
||||
user,
|
||||
)
|
||||
from misskaty.plugins import ALL_MODULES
|
||||
from misskaty.helper import paginate_modules, bot_sys_stats
|
||||
from misskaty.core.message_utils import *
|
||||
from database.users_chats_db import db
|
||||
from misskaty.helper import bot_sys_stats, paginate_modules
|
||||
from misskaty.plugins import ALL_MODULES
|
||||
from misskaty.vars import LOG_CHANNEL, SUDO
|
||||
from utils import temp, auto_clean
|
||||
from pyrogram.raw.all import layer
|
||||
from pyrogram import idle, __version__, filters
|
||||
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
||||
from utils import auto_clean, temp
|
||||
|
||||
LOGGER = getLogger(__name__)
|
||||
loop = asyncio.get_event_loop()
|
||||
|
|
@ -338,10 +342,12 @@ General command are:
|
|||
|
||||
return await client.answer_callback_query(query.id)
|
||||
|
||||
|
||||
async def cleanup():
|
||||
await app.stop()
|
||||
await user.stop()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
loop.run_until_complete(start_bot())
|
||||
|
|
|
|||
|
|
@ -1,9 +1,12 @@
|
|||
import traceback, asyncio
|
||||
import asyncio
|
||||
import traceback
|
||||
from functools import wraps
|
||||
from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden
|
||||
|
||||
from pyrogram.errors.exceptions.flood_420 import FloodWait
|
||||
from misskaty.vars import LOG_CHANNEL
|
||||
from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden
|
||||
|
||||
from misskaty import app
|
||||
from misskaty.vars import LOG_CHANNEL
|
||||
|
||||
|
||||
def asyncify(func):
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
from functools import wraps
|
||||
from time import time
|
||||
from traceback import format_exc as err
|
||||
|
||||
from pyrogram import enums
|
||||
from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden
|
||||
from pyrogram.types import Message
|
||||
from pyrogram import enums
|
||||
|
||||
from misskaty import app
|
||||
from misskaty.vars import SUDO
|
||||
from time import time
|
||||
|
||||
|
||||
async def member_permissions(chat_id: int, user_id: int):
|
||||
|
|
@ -49,7 +51,12 @@ async def list_admins(chat_id: int):
|
|||
|
||||
admins_in_chat[chat_id] = {
|
||||
"last_updated_at": time(),
|
||||
"data": [member.user.id async for member in app.get_chat_members(chat_id, filter=enums.ChatMembersFilter.ADMINISTRATORS)],
|
||||
"data": [
|
||||
member.user.id
|
||||
async for member in app.get_chat_members(
|
||||
chat_id, filter=enums.ChatMembersFilter.ADMINISTRATORS
|
||||
)
|
||||
],
|
||||
}
|
||||
return admins_in_chat[chat_id]["data"]
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,12 @@ def keyboard(buttons_list, row_width: int = 2):
|
|||
if theres, a url, it will make url button, else callback button
|
||||
"""
|
||||
buttons = InlineKeyboard(row_width=row_width)
|
||||
data = [Ikb(text=str(i[0]), url=str(i[1])) if is_url(i[1]) else Ikb(text=str(i[0]), callback_data=str(i[1])) for i in buttons_list]
|
||||
data = [
|
||||
Ikb(text=str(i[0]), url=str(i[1]))
|
||||
if is_url(i[1])
|
||||
else Ikb(text=str(i[0]), callback_data=str(i[1]))
|
||||
for i in buttons_list
|
||||
]
|
||||
|
||||
buttons.add(*data)
|
||||
return buttons
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import asyncio
|
||||
from logging import getLogger
|
||||
from pyrogram.errors import ChatWriteForbidden, MessageNotModified, FloodWait
|
||||
|
||||
from pyrogram.errors import ChatWriteForbidden, FloodWait, MessageNotModified
|
||||
|
||||
LOGGER = getLogger(__name__)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
import asyncio
|
||||
import os
|
||||
import time
|
||||
from pyrogram.types import InputMediaPhoto
|
||||
from misskaty.plugins.dev import shell_exec
|
||||
|
||||
from pyrogram.errors import FloodWait
|
||||
from pyrogram.types import InputMediaPhoto
|
||||
|
||||
from misskaty.plugins.dev import shell_exec
|
||||
|
||||
|
||||
def hhmmss(seconds):
|
||||
|
|
@ -31,7 +33,9 @@ async def ssgen_link(video, output_directory, ttl):
|
|||
"image2",
|
||||
out_put_file_name,
|
||||
]
|
||||
process = await asyncio.create_subprocess_exec(*cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE)
|
||||
process = await asyncio.create_subprocess_exec(
|
||||
*cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
|
||||
)
|
||||
|
||||
stdout, stderr = await process.communicate()
|
||||
stderr.decode().strip()
|
||||
|
|
@ -40,7 +44,11 @@ async def ssgen_link(video, output_directory, ttl):
|
|||
|
||||
|
||||
async def genss_link(msg, video_link, output_directory, min_duration, no_of_photos):
|
||||
metadata = (await shell_exec(f"ffprobe -i {video_link} -show_entries format=duration -v quiet -of csv='p=0'"))[0]
|
||||
metadata = (
|
||||
await shell_exec(
|
||||
f"ffprobe -i {video_link} -show_entries format=duration -v quiet -of csv='p=0'"
|
||||
)
|
||||
)[0]
|
||||
duration = round(float(metadata))
|
||||
if duration > min_duration:
|
||||
images = []
|
||||
|
|
@ -48,12 +56,20 @@ async def genss_link(msg, video_link, output_directory, min_duration, no_of_phot
|
|||
current_ttl = ttl_step
|
||||
for looper in range(no_of_photos):
|
||||
ss_img = await ssgen_link(video_link, output_directory, current_ttl)
|
||||
images.append(InputMediaPhoto(media=ss_img, caption=f"Screenshot at {hhmmss(current_ttl)}"))
|
||||
images.append(
|
||||
InputMediaPhoto(
|
||||
media=ss_img, caption=f"Screenshot at {hhmmss(current_ttl)}"
|
||||
)
|
||||
)
|
||||
try:
|
||||
await msg.edit(f"📸 <b>Take Screenshoot:</b>\n<code>{looper+1} of {no_of_photos} screenshot generated..</code>")
|
||||
await msg.edit(
|
||||
f"📸 <b>Take Screenshoot:</b>\n<code>{looper+1} of {no_of_photos} screenshot generated..</code>"
|
||||
)
|
||||
except FloodWait as e:
|
||||
await asyncio.sleep(e.value)
|
||||
await msg.edit(f"📸 <b>Take Screenshoot:</b>\n<code>{looper+1} of {no_of_photos} screenshot generated..</code>")
|
||||
await msg.edit(
|
||||
f"📸 <b>Take Screenshoot:</b>\n<code>{looper+1} of {no_of_photos} screenshot generated..</code>"
|
||||
)
|
||||
current_ttl = current_ttl + ttl_step
|
||||
await asyncio.sleep(2)
|
||||
return images
|
||||
|
|
|
|||
|
|
@ -53,14 +53,20 @@ async def resize_file_to_sticker_size(file_path: str) -> str:
|
|||
im.save(file_path)
|
||||
|
||||
|
||||
async def upload_document(client: Client, file_path: str, chat_id: int) -> raw.base.InputDocument:
|
||||
async def upload_document(
|
||||
client: Client, file_path: str, chat_id: int
|
||||
) -> raw.base.InputDocument:
|
||||
media = await client.send(
|
||||
raw.functions.messages.UploadMedia(
|
||||
peer=await client.resolve_peer(chat_id),
|
||||
media=raw.types.InputMediaUploadedDocument(
|
||||
mime_type=client.guess_mime_type(file_path) or "application/zip",
|
||||
file=await client.save_file(file_path),
|
||||
attributes=[raw.types.DocumentAttributeFilename(file_name=os.path.basename(file_path))],
|
||||
attributes=[
|
||||
raw.types.DocumentAttributeFilename(
|
||||
file_name=os.path.basename(file_path)
|
||||
)
|
||||
],
|
||||
),
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
from pyrogram import enums
|
||||
from datetime import datetime, timedelta
|
||||
from re import findall
|
||||
from re import sub as re_sub
|
||||
from string import ascii_lowercase
|
||||
from re import findall, sub as re_sub
|
||||
|
||||
from pyrogram import enums
|
||||
|
||||
|
||||
def get_urls_from_text(text: str) -> bool:
|
||||
|
|
|
|||
|
|
@ -17,8 +17,9 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
import httpx
|
||||
from asyncio import gather
|
||||
|
||||
import httpx
|
||||
from aiohttp import ClientSession
|
||||
|
||||
# Aiohttp Async Client
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
import os
|
||||
import asyncio
|
||||
from html_telegraph_poster import TelegraphPoster
|
||||
from typing import Tuple
|
||||
import os
|
||||
import shlex
|
||||
from typing import Tuple
|
||||
|
||||
from html_telegraph_poster import TelegraphPoster
|
||||
|
||||
|
||||
def post_to_telegraph(a_title: str, content: str) -> str:
|
||||
|
|
@ -20,7 +21,9 @@ def post_to_telegraph(a_title: str, content: str) -> str:
|
|||
|
||||
|
||||
async def run_subprocess(cmd):
|
||||
process = await asyncio.create_subprocess_exec(*cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE)
|
||||
process = await asyncio.create_subprocess_exec(
|
||||
*cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
|
||||
)
|
||||
return await process.communicate()
|
||||
|
||||
|
||||
|
|
@ -47,7 +50,9 @@ async def get_media_info(file_link):
|
|||
async def runcmd(cmd: str) -> Tuple[str, str, int, int]:
|
||||
"""run command in terminal"""
|
||||
args = shlex.split(cmd)
|
||||
process = await asyncio.create_subprocess_exec(*args, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE)
|
||||
process = await asyncio.create_subprocess_exec(
|
||||
*args, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
|
||||
)
|
||||
stdout, stderr = await process.communicate()
|
||||
return (
|
||||
stdout.decode("utf-8", "replace").strip(),
|
||||
|
|
|
|||
|
|
@ -63,9 +63,15 @@ def paginate_modules(page_n, module_dict, prefix, chat=None):
|
|||
if len(pairs) > COLUMN_SIZE:
|
||||
pairs = pairs[modulo_page * COLUMN_SIZE : COLUMN_SIZE * (modulo_page + 1)] + [
|
||||
(
|
||||
EqInlineKeyboardButton("❮", callback_data=f"{prefix}_prev({modulo_page})"),
|
||||
EqInlineKeyboardButton("Back", callback_data=f"{prefix}_home({modulo_page})"),
|
||||
EqInlineKeyboardButton("❯", callback_data=f"{prefix}_next({modulo_page})"),
|
||||
EqInlineKeyboardButton(
|
||||
"❮", callback_data=f"{prefix}_prev({modulo_page})"
|
||||
),
|
||||
EqInlineKeyboardButton(
|
||||
"Back", callback_data=f"{prefix}_home({modulo_page})"
|
||||
),
|
||||
EqInlineKeyboardButton(
|
||||
"❯", callback_data=f"{prefix}_next({modulo_page})"
|
||||
),
|
||||
)
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@
|
|||
import asyncio
|
||||
import math
|
||||
import time
|
||||
from pyrogram.errors import MessageNotModified, FloodWait
|
||||
|
||||
from pyrogram.errors import FloodWait, MessageNotModified
|
||||
|
||||
|
||||
async def progress_for_pyrogram(current, total, ud_type, message, start):
|
||||
|
|
|
|||
|
|
@ -22,7 +22,9 @@ from typing import List
|
|||
from pyrogram import Client, errors, raw
|
||||
|
||||
|
||||
async def get_sticker_set_by_name(client: Client, name: str) -> raw.base.messages.StickerSet:
|
||||
async def get_sticker_set_by_name(
|
||||
client: Client, name: str
|
||||
) -> raw.base.messages.StickerSet:
|
||||
try:
|
||||
return await client.invoke(
|
||||
raw.functions.messages.GetStickerSet(
|
||||
|
|
@ -63,11 +65,15 @@ async def add_sticker_to_set(
|
|||
) -> raw.base.messages.StickerSet:
|
||||
return await client.invoke(
|
||||
raw.functions.stickers.AddStickerToSet(
|
||||
stickerset=raw.types.InputStickerSetShortName(short_name=stickerset.set.short_name),
|
||||
stickerset=raw.types.InputStickerSetShortName(
|
||||
short_name=stickerset.set.short_name
|
||||
),
|
||||
sticker=sticker,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def create_sticker(sticker: raw.base.InputDocument, emoji: str) -> raw.base.InputStickerSetItem:
|
||||
async def create_sticker(
|
||||
sticker: raw.base.InputDocument, emoji: str
|
||||
) -> raw.base.InputStickerSetItem:
|
||||
return raw.types.InputStickerSetItem(document=sticker, emoji=emoji)
|
||||
|
|
|
|||
|
|
@ -1,14 +1,16 @@
|
|||
import os
|
||||
import random
|
||||
import string
|
||||
import psutil
|
||||
import time
|
||||
import os
|
||||
from misskaty import BOT_NAME, UBOT_NAME, botStartTime
|
||||
from misskaty.plugins import ALL_MODULES
|
||||
from misskaty.helper.human_read import get_readable_time
|
||||
from misskaty.helper.http import http
|
||||
from http.cookies import SimpleCookie
|
||||
|
||||
import psutil
|
||||
|
||||
from misskaty import BOT_NAME, UBOT_NAME, botStartTime
|
||||
from misskaty.helper.http import http
|
||||
from misskaty.helper.human_read import get_readable_time
|
||||
from misskaty.plugins import ALL_MODULES
|
||||
|
||||
GENRES_EMOJI = {
|
||||
"Action": "👊",
|
||||
"Adventure": random.choice(["🪂", "🧗♀", "🌋"]),
|
||||
|
|
@ -55,7 +57,10 @@ TOTAL PLUGINS: {len(ALL_MODULES)}
|
|||
|
||||
|
||||
def get_random_string(length: int = 5):
|
||||
text_str = "".join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(length))
|
||||
text_str = "".join(
|
||||
random.SystemRandom().choice(string.ascii_letters + string.digits)
|
||||
for _ in range(length)
|
||||
)
|
||||
return text_str.upper()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
import string
|
||||
import os
|
||||
import requests
|
||||
import time
|
||||
import random
|
||||
import string
|
||||
import time
|
||||
|
||||
import requests
|
||||
|
||||
from misskaty.helper.human_read import get_readable_file_size
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -20,18 +20,32 @@ def __list_all_modules():
|
|||
# This generates a list of modules in this
|
||||
# folder for the * in __main__ to work.
|
||||
mod_paths = glob.glob(f"{dirname(__file__)}/*.py")
|
||||
all_modules = [basename(f)[:-3] for f in mod_paths if isfile(f) and f.endswith(".py") and not f.endswith("__init__.py") and not f.endswith("__main__.py")]
|
||||
all_modules = [
|
||||
basename(f)[:-3]
|
||||
for f in mod_paths
|
||||
if isfile(f)
|
||||
and f.endswith(".py")
|
||||
and not f.endswith("__init__.py")
|
||||
and not f.endswith("__main__.py")
|
||||
]
|
||||
|
||||
if MOD_LOAD or MOD_NOLOAD:
|
||||
to_load = MOD_LOAD
|
||||
if to_load:
|
||||
if not all(any(mod == module_name for module_name in all_modules) for mod in to_load):
|
||||
if not all(
|
||||
any(mod == module_name for module_name in all_modules)
|
||||
for mod in to_load
|
||||
):
|
||||
sys.exit()
|
||||
|
||||
else:
|
||||
to_load = all_modules
|
||||
|
||||
return [item for item in to_load if item not in MOD_NOLOAD] if MOD_NOLOAD else to_load
|
||||
return (
|
||||
[item for item in to_load if item not in MOD_NOLOAD]
|
||||
if MOD_NOLOAD
|
||||
else to_load
|
||||
)
|
||||
|
||||
return all_modules
|
||||
|
||||
|
|
|
|||
|
|
@ -10,9 +10,19 @@ from pyrogram.types import ChatPermissions
|
|||
from database.warn_db import add_warn, get_warn, remove_warns
|
||||
from misskaty import app
|
||||
from misskaty.core.decorator.errors import capture_err
|
||||
from misskaty.core.decorator.permissions import admins_in_chat, adminsOnly, list_admins, member_permissions
|
||||
from misskaty.core.decorator.permissions import (
|
||||
admins_in_chat,
|
||||
adminsOnly,
|
||||
list_admins,
|
||||
member_permissions,
|
||||
)
|
||||
from misskaty.core.keyboard import ikb
|
||||
from misskaty.helper.functions import extract_user, extract_user_and_reason, int_to_alpha, time_converter
|
||||
from misskaty.helper.functions import (
|
||||
extract_user,
|
||||
extract_user_and_reason,
|
||||
int_to_alpha,
|
||||
time_converter,
|
||||
)
|
||||
from misskaty.vars import COMMAND_HANDLER, SUDO
|
||||
|
||||
LOGGER = getLogger(__name__)
|
||||
|
|
@ -53,7 +63,12 @@ async def admin_cache_func(_, cmu):
|
|||
try:
|
||||
admins_in_chat[cmu.chat.id] = {
|
||||
"last_updated_at": time(),
|
||||
"data": [member.user.id async for member in app.get_chat_members(cmu.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS)],
|
||||
"data": [
|
||||
member.user.id
|
||||
async for member in app.get_chat_members(
|
||||
cmu.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS
|
||||
)
|
||||
],
|
||||
}
|
||||
LOGGER.info(f"Updated admin cache for {cmu.chat.id} [{cmu.chat.title}]")
|
||||
except:
|
||||
|
|
@ -143,7 +158,9 @@ async def kickFunc(client, message):
|
|||
|
||||
|
||||
# Ban/DBan/TBan User
|
||||
@app.on_message(filters.command(["ban", "dban", "tban"], COMMAND_HANDLER) & ~filters.private)
|
||||
@app.on_message(
|
||||
filters.command(["ban", "dban", "tban"], COMMAND_HANDLER) & ~filters.private
|
||||
)
|
||||
@adminsOnly("can_restrict_members")
|
||||
async def banFunc(client, message):
|
||||
user_id, reason = await extract_user_and_reason(message, sender_chat=True)
|
||||
|
|
@ -155,14 +172,23 @@ async def banFunc(client, message):
|
|||
if user_id in SUDO:
|
||||
return await message.reply_text("You Wanna Ban The Elevated One?, RECONSIDER!")
|
||||
if user_id in (await list_admins(message.chat.id)):
|
||||
return await message.reply_text("I can't ban an admin, You know the rules, so do i.")
|
||||
return await message.reply_text(
|
||||
"I can't ban an admin, You know the rules, so do i."
|
||||
)
|
||||
|
||||
try:
|
||||
mention = (await app.get_users(user_id)).mention
|
||||
except IndexError:
|
||||
mention = message.reply_to_message.sender_chat.title if message.reply_to_message else "Anon"
|
||||
mention = (
|
||||
message.reply_to_message.sender_chat.title
|
||||
if message.reply_to_message
|
||||
else "Anon"
|
||||
)
|
||||
|
||||
msg = f"**Banned User:** {mention}\n" f"**Banned By:** {message.from_user.mention if message.from_user else 'Anon'}\n"
|
||||
msg = (
|
||||
f"**Banned User:** {mention}\n"
|
||||
f"**Banned By:** {message.from_user.mention if message.from_user else 'Anon'}\n"
|
||||
)
|
||||
if message.command[0][0] == "d":
|
||||
await message.reply_to_message.delete()
|
||||
if message.command[0] == "tban":
|
||||
|
|
@ -210,25 +236,33 @@ async def unban_func(_, message):
|
|||
elif len(message.command) == 1 and reply:
|
||||
user = message.reply_to_message.from_user.id
|
||||
else:
|
||||
return await message.reply_text("Provide a username or reply to a user's message to unban.")
|
||||
return await message.reply_text(
|
||||
"Provide a username or reply to a user's message to unban."
|
||||
)
|
||||
await message.chat.unban_member(user)
|
||||
umention = (await app.get_users(user)).mention
|
||||
await message.reply_text(f"Unbanned! {umention}")
|
||||
|
||||
|
||||
# Ban users listed in a message
|
||||
@app.on_message(filters.user(SUDO) & filters.command("listban", COMMAND_HANDLER) & ~filters.private)
|
||||
@app.on_message(
|
||||
filters.user(SUDO) & filters.command("listban", COMMAND_HANDLER) & ~filters.private
|
||||
)
|
||||
async def list_ban_(c, message):
|
||||
userid, msglink_reason = await extract_user_and_reason(message)
|
||||
if not userid or not msglink_reason:
|
||||
return await message.reply_text("Provide a userid/username along with message link and reason to list-ban")
|
||||
return await message.reply_text(
|
||||
"Provide a userid/username along with message link and reason to list-ban"
|
||||
)
|
||||
if len(msglink_reason.split(" ")) == 1: # message link included with the reason
|
||||
return await message.reply_text("You must provide a reason to list-ban")
|
||||
# seperate messge link from reason
|
||||
lreason = msglink_reason.split()
|
||||
messagelink, reason = lreason[0], " ".join(lreason[1:])
|
||||
|
||||
if not re.search(r"(https?://)?t(elegram)?\.me/\w+/\d+", messagelink): # validate link
|
||||
if not re.search(
|
||||
r"(https?://)?t(elegram)?\.me/\w+/\d+", messagelink
|
||||
): # validate link
|
||||
return await message.reply_text("Invalid message link provided")
|
||||
|
||||
if userid == c.me.id:
|
||||
|
|
@ -237,7 +271,9 @@ async def list_ban_(c, message):
|
|||
return await message.reply_text("You Wanna Ban The Elevated One?, RECONSIDER!")
|
||||
splitted = messagelink.split("/")
|
||||
uname, mid = splitted[-2], int(splitted[-1])
|
||||
m = await message.reply_text("`Banning User from multiple groups. This may take some time`")
|
||||
m = await message.reply_text(
|
||||
"`Banning User from multiple groups. This may take some time`"
|
||||
)
|
||||
try:
|
||||
msgtext = (await app.get_messages(uname, mid)).text
|
||||
gusernames = re.findall("@\w+", msgtext)
|
||||
|
|
@ -266,11 +302,17 @@ async def list_ban_(c, message):
|
|||
|
||||
|
||||
# Unban users listed in a message
|
||||
@app.on_message(filters.user(SUDO) & filters.command("listunban", COMMAND_HANDLER) & ~filters.private)
|
||||
@app.on_message(
|
||||
filters.user(SUDO)
|
||||
& filters.command("listunban", COMMAND_HANDLER)
|
||||
& ~filters.private
|
||||
)
|
||||
async def list_unban_(c, message):
|
||||
userid, msglink = await extract_user_and_reason(message)
|
||||
if not userid or not msglink:
|
||||
return await message.reply_text("Provide a userid/username along with message link to list-unban")
|
||||
return await message.reply_text(
|
||||
"Provide a userid/username along with message link to list-unban"
|
||||
)
|
||||
|
||||
if not re.search(r"(https?://)?t(elegram)?\.me/\w+/\d+", msglink): # validate link
|
||||
return await message.reply_text("Invalid message link provided")
|
||||
|
|
@ -320,7 +362,9 @@ async def deleteFunc(_, message):
|
|||
|
||||
|
||||
# Promote Members
|
||||
@app.on_message(filters.command(["promote", "fullpromote"], COMMAND_HANDLER) & ~filters.private)
|
||||
@app.on_message(
|
||||
filters.command(["promote", "fullpromote"], COMMAND_HANDLER) & ~filters.private
|
||||
)
|
||||
@adminsOnly("can_promote_members")
|
||||
async def promoteFunc(client, message):
|
||||
try:
|
||||
|
|
@ -430,10 +474,15 @@ async def mute(client, message):
|
|||
if user_id in SUDO:
|
||||
return await message.reply_text("You wanna mute the elevated one?, RECONSIDER!")
|
||||
if user_id in (await list_admins(message.chat.id)):
|
||||
return await message.reply_text("I can't mute an admin, You know the rules, so do i.")
|
||||
return await message.reply_text(
|
||||
"I can't mute an admin, You know the rules, so do i."
|
||||
)
|
||||
mention = (await app.get_users(user_id)).mention
|
||||
keyboard = ikb({"🚨 Unmute 🚨": f"unmute_{user_id}"})
|
||||
msg = f"**Muted User:** {mention}\n" f"**Muted By:** {message.from_user.mention if message.from_user else 'Anon'}\n"
|
||||
msg = (
|
||||
f"**Muted User:** {mention}\n"
|
||||
f"**Muted By:** {message.from_user.mention if message.from_user else 'Anon'}\n"
|
||||
)
|
||||
if message.command[0] == "tmute":
|
||||
split = reason.split(None, 1)
|
||||
time_value = split[0]
|
||||
|
|
@ -509,7 +558,9 @@ async def warn_user(client, message):
|
|||
if user_id in SUDO:
|
||||
return await message.reply_text("You Wanna Warn The Elevated One?, RECONSIDER!")
|
||||
if user_id in (await list_admins(chat_id)):
|
||||
return await message.reply_text("I can't warn an admin, You know the rules, so do i.")
|
||||
return await message.reply_text(
|
||||
"I can't warn an admin, You know the rules, so do i."
|
||||
)
|
||||
user, warns = await asyncio.gather(
|
||||
app.get_users(user_id),
|
||||
get_warn(chat_id, await int_to_alpha(user_id)),
|
||||
|
|
@ -542,7 +593,8 @@ async def remove_warning(_, cq):
|
|||
permission = "can_restrict_members"
|
||||
if permission not in permissions:
|
||||
return await cq.answer(
|
||||
"You don't have enough permissions to perform this action.\n" + f"Permission needed: {permission}",
|
||||
"You don't have enough permissions to perform this action.\n"
|
||||
+ f"Permission needed: {permission}",
|
||||
show_alert=True,
|
||||
)
|
||||
user_id = cq.data.split("_")[1]
|
||||
|
|
@ -567,7 +619,8 @@ async def unmute_user(_, cq):
|
|||
permission = "can_restrict_members"
|
||||
if permission not in permissions:
|
||||
return await cq.answer(
|
||||
"You don't have enough permissions to perform this action.\n" + f"Permission needed: {permission}",
|
||||
"You don't have enough permissions to perform this action.\n"
|
||||
+ f"Permission needed: {permission}",
|
||||
show_alert=True,
|
||||
)
|
||||
user_id = cq.data.split("_")[1]
|
||||
|
|
@ -586,7 +639,8 @@ async def unban_user(_, cq):
|
|||
permission = "can_restrict_members"
|
||||
if permission not in permissions:
|
||||
return await cq.answer(
|
||||
"You don't have enough permissions to perform this action.\n" + f"Permission needed: {permission}",
|
||||
"You don't have enough permissions to perform this action.\n"
|
||||
+ f"Permission needed: {permission}",
|
||||
show_alert=True,
|
||||
)
|
||||
user_id = cq.data.split("_")[1]
|
||||
|
|
@ -603,7 +657,9 @@ async def unban_user(_, cq):
|
|||
@adminsOnly("can_restrict_members")
|
||||
async def remove_warnings(_, message):
|
||||
if not message.reply_to_message:
|
||||
return await message.reply_text("Reply to a message to remove a user's warnings.")
|
||||
return await message.reply_text(
|
||||
"Reply to a message to remove a user's warnings."
|
||||
)
|
||||
user_id = message.reply_to_message.from_user.id
|
||||
mention = message.reply_to_message.from_user.mention
|
||||
chat_id = message.chat.id
|
||||
|
|
@ -634,7 +690,13 @@ async def check_warns(_, message):
|
|||
|
||||
|
||||
# Report User in Group
|
||||
@app.on_message((filters.command("report", COMMAND_HANDLER) | filters.command(["admins", "admin"], prefixes="@")) & ~filters.private)
|
||||
@app.on_message(
|
||||
(
|
||||
filters.command("report", COMMAND_HANDLER)
|
||||
| filters.command(["admins", "admin"], prefixes="@")
|
||||
)
|
||||
& ~filters.private
|
||||
)
|
||||
@capture_err
|
||||
async def report_user(_, message):
|
||||
if not message.reply_to_message:
|
||||
|
|
@ -649,13 +711,28 @@ async def report_user(_, message):
|
|||
linked_chat = (await app.get_chat(message.chat.id)).linked_chat
|
||||
if linked_chat is None:
|
||||
if reply_id in list_of_admins or reply_id == message.chat.id:
|
||||
return await message.reply_text("Do you know that the user you are replying is an admin ?")
|
||||
return await message.reply_text(
|
||||
"Do you know that the user you are replying is an admin ?"
|
||||
)
|
||||
|
||||
elif reply_id in list_of_admins or reply_id == message.chat.id or reply_id == linked_chat.id:
|
||||
return await message.reply_text("Do you know that the user you are replying is an admin ?")
|
||||
user_mention = reply.from_user.mention if reply.from_user else reply.sender_chat.title
|
||||
elif (
|
||||
reply_id in list_of_admins
|
||||
or reply_id == message.chat.id
|
||||
or reply_id == linked_chat.id
|
||||
):
|
||||
return await message.reply_text(
|
||||
"Do you know that the user you are replying is an admin ?"
|
||||
)
|
||||
user_mention = (
|
||||
reply.from_user.mention if reply.from_user else reply.sender_chat.title
|
||||
)
|
||||
text = f"Reported {user_mention} to admins!"
|
||||
admin_data = [m async for m in app.get_chat_members(message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS)]
|
||||
admin_data = [
|
||||
m
|
||||
async for m in app.get_chat_members(
|
||||
message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS
|
||||
)
|
||||
]
|
||||
for admin in admin_data:
|
||||
if admin.user.is_bot or admin.user.is_deleted:
|
||||
# return bots or deleted admins
|
||||
|
|
|
|||
|
|
@ -10,7 +10,9 @@
|
|||
|
||||
# Modified plugin by me from https://github.com/TeamYukki/YukkiAFKBot to make compatible with pyrogram v2
|
||||
import time
|
||||
|
||||
from pyrogram import filters
|
||||
|
||||
from database.afk_db import add_afk, cleanmode_off, cleanmode_on, is_afk, remove_afk
|
||||
from misskaty import app
|
||||
from misskaty.core.decorator.errors import capture_err
|
||||
|
|
@ -141,7 +143,9 @@ async def active_afk(_, message):
|
|||
"reason": None,
|
||||
}
|
||||
else:
|
||||
await app.download_media(message.reply_to_message, file_name=f"{user_id}.jpg")
|
||||
await app.download_media(
|
||||
message.reply_to_message, file_name=f"{user_id}.jpg"
|
||||
)
|
||||
details = {
|
||||
"type": "photo",
|
||||
"time": time.time(),
|
||||
|
|
@ -158,7 +162,9 @@ async def active_afk(_, message):
|
|||
"reason": _reason,
|
||||
}
|
||||
else:
|
||||
await app.download_media(message.reply_to_message, file_name=f"{user_id}.jpg")
|
||||
await app.download_media(
|
||||
message.reply_to_message, file_name=f"{user_id}.jpg"
|
||||
)
|
||||
details = {
|
||||
"type": "photo",
|
||||
"time": time.time(),
|
||||
|
|
@ -174,7 +180,9 @@ async def active_afk(_, message):
|
|||
}
|
||||
|
||||
await add_afk(user_id, details)
|
||||
send = await message.reply_text(f"{message.from_user.mention} [<code>{message.from_user.id}</code>] is now AFK!.")
|
||||
send = await message.reply_text(
|
||||
f"{message.from_user.mention} [<code>{message.from_user.id}</code>] is now AFK!."
|
||||
)
|
||||
await put_cleanmode(message.chat.id, send.id)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -20,8 +20,12 @@ async def approve_join_chat(c, m):
|
|||
markup = InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(text="Sudah", callback_data=f"approve_{m.chat.id}"),
|
||||
InlineKeyboardButton(text="Belum", callback_data=f"declined_{m.chat.id}"),
|
||||
InlineKeyboardButton(
|
||||
text="Sudah", callback_data=f"approve_{m.chat.id}"
|
||||
),
|
||||
InlineKeyboardButton(
|
||||
text="Belum", callback_data=f"declined_{m.chat.id}"
|
||||
),
|
||||
]
|
||||
]
|
||||
)
|
||||
|
|
@ -39,10 +43,14 @@ async def approve_join_chat(c, m):
|
|||
async def approve_chat(c, q):
|
||||
i, chat = q.data.split("_")
|
||||
try:
|
||||
await q.message.edit("Yeayy, selamat kamu bisa bergabung di Channel YMovieZ Reborn...")
|
||||
await q.message.edit(
|
||||
"Yeayy, selamat kamu bisa bergabung di Channel YMovieZ Reborn..."
|
||||
)
|
||||
await c.approve_chat_join_request(chat, q.from_user.id)
|
||||
except UserAlreadyParticipant:
|
||||
await q.message.edit("Kamu sudah di acc join grup, jadi ga perlu menekan button.")
|
||||
await q.message.edit(
|
||||
"Kamu sudah di acc join grup, jadi ga perlu menekan button."
|
||||
)
|
||||
except Exception as err:
|
||||
await q.message.edit(err)
|
||||
|
||||
|
|
@ -51,9 +59,13 @@ async def approve_chat(c, q):
|
|||
async def decline_chat(c, q):
|
||||
i, chat = q.data.split("_")
|
||||
try:
|
||||
await q.message.edit("Yahh, kamu ditolak join channel. Biasakan rajin membaca yahhh..")
|
||||
await q.message.edit(
|
||||
"Yahh, kamu ditolak join channel. Biasakan rajin membaca yahhh.."
|
||||
)
|
||||
await c.decline_chat_join_request(chat, q.from_user.id)
|
||||
except UserAlreadyParticipant:
|
||||
await q.message.edit("Kamu sudah di acc join grup, jadi ga perlu menekan button.")
|
||||
await q.message.edit(
|
||||
"Kamu sudah di acc join grup, jadi ga perlu menekan button."
|
||||
)
|
||||
except Exception as err:
|
||||
await q.message.edit(err)
|
||||
|
|
|
|||
|
|
@ -7,13 +7,22 @@ from pyrogram.errors import FloodWait
|
|||
from pyrogram.types import Message
|
||||
|
||||
from misskaty import user
|
||||
from misskaty.vars import BLOCK_FILES_WITHOUT_EXTENSIONS, BLOCKED_EXTENSIONS, FORWARD_FILTERS, FORWARD_FROM_CHAT_ID, FORWARD_TO_CHAT_ID, MINIMUM_FILE_SIZE
|
||||
from misskaty.vars import (
|
||||
BLOCK_FILES_WITHOUT_EXTENSIONS,
|
||||
BLOCKED_EXTENSIONS,
|
||||
FORWARD_FILTERS,
|
||||
FORWARD_FROM_CHAT_ID,
|
||||
FORWARD_TO_CHAT_ID,
|
||||
MINIMUM_FILE_SIZE,
|
||||
)
|
||||
|
||||
LOGGER = getLogger(__name__)
|
||||
|
||||
|
||||
async def FilterMessage(message: Message):
|
||||
if (message.forward_from or message.forward_from_chat) and ("forwarded" not in FORWARD_FILTERS):
|
||||
if (message.forward_from or message.forward_from_chat) and (
|
||||
"forwarded" not in FORWARD_FILTERS
|
||||
):
|
||||
return 400
|
||||
if (len(FORWARD_FILTERS) == 9) or (
|
||||
(message.video and ("video" in FORWARD_FILTERS))
|
||||
|
|
@ -37,7 +46,10 @@ async def CheckBlockedExt(event: Message):
|
|||
if (media is not None) and (media.file_name is not None):
|
||||
_file = media.file_name.rsplit(".", 1)
|
||||
if len(_file) == 2:
|
||||
return _file[-1].lower() in BLOCKED_EXTENSIONS or _file[-1].upper() in BLOCKED_EXTENSIONS
|
||||
return (
|
||||
_file[-1].lower() in BLOCKED_EXTENSIONS
|
||||
or _file[-1].upper() in BLOCKED_EXTENSIONS
|
||||
)
|
||||
|
||||
else:
|
||||
return False
|
||||
|
|
@ -71,7 +83,9 @@ async def ForwardMessage(client: user, msg: Message):
|
|||
LOGGER.warning(f"#FloodWait: Stopped Forwarder for {e.x}s!")
|
||||
await ForwardMessage(client, msg)
|
||||
except Exception as err:
|
||||
LOGGER.warning(f"#ERROR: {err}\n\nUnable to Forward Message to {str(FORWARD_TO_CHAT_ID[i])}, reason: <code>{err}</code>")
|
||||
LOGGER.warning(
|
||||
f"#ERROR: {err}\n\nUnable to Forward Message to {str(FORWARD_TO_CHAT_ID[i])}, reason: <code>{err}</code>"
|
||||
)
|
||||
except Exception as err:
|
||||
LOGGER.warning(f"#ERROR: {err}")
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,9 @@ from utils import temp
|
|||
|
||||
|
||||
async def banned_users(_, client, message: Message):
|
||||
return (message.from_user is not None or not message.sender_chat) and message.from_user.id in temp.BANNED_USERS
|
||||
return (
|
||||
message.from_user is not None or not message.sender_chat
|
||||
) and message.from_user.id in temp.BANNED_USERS
|
||||
|
||||
|
||||
banned_user = filters.create(banned_users)
|
||||
|
|
@ -24,7 +26,9 @@ disabled_group = filters.create(disabled_chat)
|
|||
@app.on_message(filters.private & banned_user & filters.incoming)
|
||||
async def ban_reply(bot, message):
|
||||
ban = await db.get_ban_status(message.from_user.id)
|
||||
await message.reply(f'Sorry Dude, You are Banned to use Me. \nBan Reason: {ban["ban_reason"]}')
|
||||
await message.reply(
|
||||
f'Sorry Dude, You are Banned to use Me. \nBan Reason: {ban["ban_reason"]}'
|
||||
)
|
||||
|
||||
|
||||
@app.on_message(filters.group & disabled_group & filters.incoming)
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import datetime
|
|||
import time
|
||||
|
||||
from pyrogram import filters
|
||||
|
||||
from database.users_chats_db import db
|
||||
from misskaty import app
|
||||
from misskaty.vars import SUDO
|
||||
|
|
@ -36,6 +37,10 @@ async def broadcast(bot, message):
|
|||
done += 1
|
||||
await asyncio.sleep(2)
|
||||
if not done % 20:
|
||||
await sts.edit(f"Broadcast in progress:\n\nTotal Users {total_users}\nCompleted: {done} / {total_users}\nSuccess: {success}\nBlocked: {blocked}\nDeleted: {deleted}")
|
||||
await sts.edit(
|
||||
f"Broadcast in progress:\n\nTotal Users {total_users}\nCompleted: {done} / {total_users}\nSuccess: {success}\nBlocked: {blocked}\nDeleted: {deleted}"
|
||||
)
|
||||
time_taken = datetime.timedelta(seconds=int(time.time() - start_time))
|
||||
await sts.edit(f"Broadcast Completed:\nCompleted in {time_taken} seconds.\n\nTotal Users {total_users}\nCompleted: {done} / {total_users}\nSuccess: {success}\nBlocked: {blocked}\nDeleted: {deleted}")
|
||||
await sts.edit(
|
||||
f"Broadcast Completed:\nCompleted in {time_taken} seconds.\n\nTotal Users {total_users}\nCompleted: {done} / {total_users}\nSuccess: {success}\nBlocked: {blocked}\nDeleted: {deleted}"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -45,7 +45,10 @@ async def pling_bypass(url):
|
|||
res = await http.get(link)
|
||||
json_dic_files = res.json().pop("files")
|
||||
msg = f"\n**Source Link** :\n`{url}`\n**Direct Link :**\n"
|
||||
msg += "\n".join(f'**→ [{i["name"]}]({unquote(i["url"])}) ({get_readable_file_size(int(i["size"]))})**' for i in json_dic_files)
|
||||
msg += "\n".join(
|
||||
f'**→ [{i["name"]}]({unquote(i["url"])}) ({get_readable_file_size(int(i["size"]))})**'
|
||||
for i in json_dic_files
|
||||
)
|
||||
return msg
|
||||
except Exception as e:
|
||||
return e
|
||||
|
|
@ -78,7 +81,9 @@ def wetransfer_bypass(url: str) -> str:
|
|||
r = s.get("https://wetransfer.com/")
|
||||
m = re.search('name="csrf-token" content="([^"]+)"', r.text)
|
||||
s.headers.update({"x-csrf-token": m[1], "x-requested-with": "XMLHttpRequest"})
|
||||
r = s.post(f"https://wetransfer.com/api/v4/transfers/{transfer_id}/download", json=j)
|
||||
r = s.post(
|
||||
f"https://wetransfer.com/api/v4/transfers/{transfer_id}/download", json=j
|
||||
)
|
||||
j = r.json()
|
||||
dl_url = j["direct_link"]
|
||||
|
||||
|
|
@ -89,7 +94,9 @@ def wetransfer_bypass(url: str) -> str:
|
|||
@capture_err
|
||||
async def bypass(_, message):
|
||||
if len(message.command) == 1:
|
||||
return await message.reply(f"Gunakan perintah /{message.command[0]} untuk bypass url")
|
||||
return await message.reply(
|
||||
f"Gunakan perintah /{message.command[0]} untuk bypass url"
|
||||
)
|
||||
url = message.command[1]
|
||||
urllib.parse.urlparse(url).netloc
|
||||
msg = await message.reply("Bypassing URL..", quote=True)
|
||||
|
|
|
|||
|
|
@ -9,7 +9,9 @@ from misskaty.vars import COMMAND_HANDLER, OPENAI_API
|
|||
@app.on_message(filters.command("ask", COMMAND_HANDLER))
|
||||
async def chatbot(c, m):
|
||||
if len(m.command) == 1:
|
||||
return await m.reply(f"Gunakan perintah <code>/{m.command[0]} [pertanyaan]</code> untuk menanyakan pertanyaan menggunakan AI.")
|
||||
return await m.reply(
|
||||
f"Gunakan perintah <code>/{m.command[0]} [pertanyaan]</code> untuk menanyakan pertanyaan menggunakan AI."
|
||||
)
|
||||
pertanyaan = m.text.split(" ", maxsplit=1)[1]
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
|
|
@ -24,7 +26,11 @@ async def chatbot(c, m):
|
|||
}
|
||||
msg = await m.reply("Wait a moment looking for your answer..")
|
||||
try:
|
||||
response = (await http.post("https://api.openai.com/v1/completions", headers=headers, json=json_data)).json()
|
||||
response = (
|
||||
await http.post(
|
||||
"https://api.openai.com/v1/completions", headers=headers, json=json_data
|
||||
)
|
||||
).json()
|
||||
await msg.edit(response["choices"][0]["text"])
|
||||
except MessageNotModified:
|
||||
pass
|
||||
|
|
|
|||
|
|
@ -67,7 +67,9 @@ async def glot(lang, langcode, code):
|
|||
"content-type": "application/json",
|
||||
"Authorization": "Token b8a2b75a-a078-4089-869c-e53d448b1ebb",
|
||||
}
|
||||
r = await session.post(f"https://glot.io/api/run/{lang}/latest", headers=headers, json=data)
|
||||
r = await session.post(
|
||||
f"https://glot.io/api/run/{lang}/latest", headers=headers, json=data
|
||||
)
|
||||
return await r.json()
|
||||
|
||||
|
||||
|
|
@ -75,7 +77,9 @@ async def glot(lang, langcode, code):
|
|||
async def list_lang(client, message):
|
||||
daftarlang = await listcode()
|
||||
list_ = "".join(f"~> {i['name']}\n" for i in daftarlang)
|
||||
return await message.reply(f"<b>List of Supported Programming Languages:</b>\n{list_}")
|
||||
return await message.reply(
|
||||
f"<b>List of Supported Programming Languages:</b>\n{list_}"
|
||||
)
|
||||
|
||||
|
||||
@app.on_message(filters.command(["assembly"], "!"))
|
||||
|
|
|
|||
|
|
@ -195,7 +195,9 @@ async def chat_watcher_func(_, message):
|
|||
reasonafk = reasondb["reason"]
|
||||
seenago = get_readable_time2((int(time.time() - timeafk)))
|
||||
if afktype == "text":
|
||||
msg += f"**{first_name[:25]}** is AFK since {seenago} ago.\n\n"
|
||||
msg += (
|
||||
f"**{first_name[:25]}** is AFK since {seenago} ago.\n\n"
|
||||
)
|
||||
if afktype == "text_reason":
|
||||
msg += f"**{first_name[:25]}** is AFK since {seenago} ago.\n\n**Reason:** {reasonafk}\n\n"
|
||||
if afktype == "animation":
|
||||
|
|
|
|||
|
|
@ -52,7 +52,9 @@ async def donate(_, message):
|
|||
)
|
||||
|
||||
|
||||
@app.on_message(filters.command(["balas"], COMMAND_HANDLER) & filters.user(SUDO) & filters.reply)
|
||||
@app.on_message(
|
||||
filters.command(["balas"], COMMAND_HANDLER) & filters.user(SUDO) & filters.reply
|
||||
)
|
||||
async def balas(c, m):
|
||||
pesan = m.text.split(" ", 1)
|
||||
await m.delete()
|
||||
|
|
@ -66,7 +68,9 @@ async def neofetch(c, m):
|
|||
|
||||
|
||||
@app.on_message(filters.command(["shell", "sh"], COMMAND_HANDLER) & filters.user(SUDO))
|
||||
@app.on_edited_message(filters.command(["shell", "sh"], COMMAND_HANDLER) & filters.user(SUDO))
|
||||
@app.on_edited_message(
|
||||
filters.command(["shell", "sh"], COMMAND_HANDLER) & filters.user(SUDO)
|
||||
)
|
||||
async def shell(_, m):
|
||||
cmd = m.text.split(" ", 1)
|
||||
if len(cmd) == 1:
|
||||
|
|
@ -79,7 +83,15 @@ async def shell(_, m):
|
|||
await m.reply_document(
|
||||
document=doc,
|
||||
file_name=doc.name,
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="❌ Close", callback_data=f"close#{m.from_user.id}")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="❌ Close", callback_data=f"close#{m.from_user.id}"
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
try:
|
||||
os.remove("shell_output.txt")
|
||||
|
|
@ -89,7 +101,15 @@ async def shell(_, m):
|
|||
await m.reply(
|
||||
shell,
|
||||
parse_mode=enums.ParseMode.HTML,
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="❌ Close", callback_data=f"close#{m.from_user.id}")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="❌ Close", callback_data=f"close#{m.from_user.id}"
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
else:
|
||||
await m.reply("No Reply")
|
||||
|
|
@ -139,7 +159,15 @@ async def evaluation_cmd_t(_, m):
|
|||
document="MissKatyEval.txt",
|
||||
caption=f"<code>{cmd[: 4096 // 4 - 1]}</code>",
|
||||
disable_notification=True,
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="❌ Close", callback_data=f"close#{m.from_user.id}")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="❌ Close", callback_data=f"close#{m.from_user.id}"
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
os.remove("MissKatyEval.txt")
|
||||
await status_message.delete()
|
||||
|
|
@ -147,17 +175,32 @@ async def evaluation_cmd_t(_, m):
|
|||
await status_message.edit(
|
||||
final_output,
|
||||
parse_mode=enums.ParseMode.MARKDOWN,
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="❌ Close", callback_data=f"close#{m.from_user.id}")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="❌ Close", callback_data=f"close#{m.from_user.id}"
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def aexec(code, c, m):
|
||||
exec("async def __aexec(c, m): " + "\n p = print" + "\n replied = m.reply_to_message" + "".join(f"\n {l_}" for l_ in code.split("\n")))
|
||||
exec(
|
||||
"async def __aexec(c, m): "
|
||||
+ "\n p = print"
|
||||
+ "\n replied = m.reply_to_message"
|
||||
+ "".join(f"\n {l_}" for l_ in code.split("\n"))
|
||||
)
|
||||
return await locals()["__aexec"](c, m)
|
||||
|
||||
|
||||
async def shell_exec(code, treat=True):
|
||||
process = await asyncio.create_subprocess_shell(code, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT)
|
||||
process = await asyncio.create_subprocess_shell(
|
||||
code, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT
|
||||
)
|
||||
|
||||
stdout = (await process.communicate())[0]
|
||||
if treat:
|
||||
|
|
|
|||
|
|
@ -50,7 +50,15 @@ async def upload(bot, message):
|
|||
text = callapi.json()
|
||||
output = f'<u>File Uploaded to Anonfile</u>\n\n📂 File Name: {text["data"]["file"]["metadata"]["name"]}\n\n📦 File Size: {text["data"]["file"]["metadata"]["size"]["readable"]}\n\n📥 Download Link: {text["data"]["file"]["url"]["full"]}'
|
||||
|
||||
btn = InlineKeyboardMarkup([[InlineKeyboardButton("📥 Download 📥", url=f"{text['data']['file']['url']['full']}")]])
|
||||
btn = InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
"📥 Download 📥", url=f"{text['data']['file']['url']['full']}"
|
||||
)
|
||||
]
|
||||
]
|
||||
)
|
||||
await m.edit(output, reply_markup=btn)
|
||||
except Exception as e:
|
||||
await bot.send_message(message.chat.id, text=f"Something Went Wrong!\n\n{e}")
|
||||
|
|
@ -71,7 +79,9 @@ async def download(client, message):
|
|||
)
|
||||
end_t = datetime.now()
|
||||
ms = (end_t - start_t).seconds
|
||||
await pesan.edit(f"Downloaded to <code>{the_real_download_location}</code> in <u>{ms}</u> seconds.")
|
||||
await pesan.edit(
|
||||
f"Downloaded to <code>{the_real_download_location}</code> in <u>{ms}</u> seconds."
|
||||
)
|
||||
elif len(message.command) > 1:
|
||||
start_t = datetime.now()
|
||||
the_url_parts = " ".join(message.command[1:])
|
||||
|
|
@ -107,10 +117,14 @@ async def download(client, message):
|
|||
current_message += f"File Name: <code>{custom_file_name}</code>\n"
|
||||
current_message += f"Speed: {speed}\n"
|
||||
current_message += f"{progress_str}\n"
|
||||
current_message += f"{humanbytes(downloaded)} of {humanbytes(total_length)}\n"
|
||||
current_message += (
|
||||
f"{humanbytes(downloaded)} of {humanbytes(total_length)}\n"
|
||||
)
|
||||
current_message += f"ETA: {estimated_total_time}"
|
||||
if round(diff % 10.00) == 0 and current_message != display_message:
|
||||
await pesan.edit(disable_web_page_preview=True, text=current_message)
|
||||
await pesan.edit(
|
||||
disable_web_page_preview=True, text=current_message
|
||||
)
|
||||
display_message = current_message
|
||||
await asyncio.sleep(10)
|
||||
except Exception as e:
|
||||
|
|
@ -118,16 +132,22 @@ async def download(client, message):
|
|||
if os.path.exists(download_file_path):
|
||||
end_t = datetime.now()
|
||||
ms = (end_t - start_t).seconds
|
||||
await pesan.edit(f"Downloaded to <code>{download_file_path}</code> in {ms} seconds")
|
||||
await pesan.edit(
|
||||
f"Downloaded to <code>{download_file_path}</code> in {ms} seconds"
|
||||
)
|
||||
else:
|
||||
await pesan.edit("Reply to a Telegram Media, to download it to my local server.")
|
||||
await pesan.edit(
|
||||
"Reply to a Telegram Media, to download it to my local server."
|
||||
)
|
||||
|
||||
|
||||
@app.on_message(filters.command(["tiktokdl"], COMMAND_HANDLER))
|
||||
@capture_err
|
||||
async def tiktokdl(client, message):
|
||||
if len(message.command) == 1:
|
||||
return await message.reply(f"Use command /{message.command[0]} [link] to download tiktok video.")
|
||||
return await message.reply(
|
||||
f"Use command /{message.command[0]} [link] to download tiktok video."
|
||||
)
|
||||
link = message.command[1]
|
||||
msg = await message.reply("Trying download...")
|
||||
try:
|
||||
|
|
@ -146,7 +166,9 @@ async def tiktokdl(client, message):
|
|||
@capture_err
|
||||
async def fbdl(client, message):
|
||||
if len(message.command) == 1:
|
||||
return await message.reply(f"Use command /{message.command[0]} [link] to download Facebook video.")
|
||||
return await message.reply(
|
||||
f"Use command /{message.command[0]} [link] to download Facebook video."
|
||||
)
|
||||
link = message.command[1]
|
||||
msg = await message.reply("Trying download...")
|
||||
try:
|
||||
|
|
@ -168,5 +190,7 @@ async def fbdl(client, message):
|
|||
except:
|
||||
pass
|
||||
except Exception as e:
|
||||
await message.reply(f"Failed to download Facebook video..\n\n<b>Reason:</b> {e}")
|
||||
await message.reply(
|
||||
f"Failed to download Facebook video..\n\n<b>Reason:</b> {e}"
|
||||
)
|
||||
await msg.delete()
|
||||
|
|
|
|||
|
|
@ -19,17 +19,28 @@ async def start(_, message):
|
|||
await message.reply_text(text=f"Wa'alaikumsalam {message.from_user.mention} 😇")
|
||||
|
||||
|
||||
@app.on_message(filters.regex(r"#request|#req", re.I) & (filters.text | filters.photo) & filters.chat(-1001255283935) & ~filters.channel)
|
||||
@app.on_message(
|
||||
filters.regex(r"#request|#req", re.I)
|
||||
& (filters.text | filters.photo)
|
||||
& filters.chat(-1001255283935)
|
||||
& ~filters.channel
|
||||
)
|
||||
@capture_err
|
||||
async def request_user(client, message):
|
||||
if message.sender_chat:
|
||||
return await message.reply(f"{message.from_user.mention} mohon gunakan akun asli saat request.")
|
||||
return await message.reply(
|
||||
f"{message.from_user.mention} mohon gunakan akun asli saat request."
|
||||
)
|
||||
is_in_gap, sleep_time = await check_time_gap(message.from_user.id)
|
||||
if is_in_gap:
|
||||
return await message.reply("Sabar dikit napa.. 🙄")
|
||||
markup = InlineKeyboardMarkup(
|
||||
[
|
||||
[InlineKeyboardButton(text="💬 Lihat Pesan", url=f"https://t.me/c/1255283935/{message.id}")],
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="💬 Lihat Pesan", url=f"https://t.me/c/1255283935/{message.id}"
|
||||
)
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="🚫 Tolak",
|
||||
|
|
@ -61,7 +72,9 @@ async def request_user(client, message):
|
|||
else:
|
||||
REQUEST_DB[user_id] = 1
|
||||
if REQUEST_DB[user_id] > 3:
|
||||
return await message.reply(f"Mohon maaf {message.from_user.mention}, maksimal request hanya 3x perhari. Kalo mau tambah 5k per request 😝😝.")
|
||||
return await message.reply(
|
||||
f"Mohon maaf {message.from_user.mention}, maksimal request hanya 3x perhari. Kalo mau tambah 5k per request 😝😝."
|
||||
)
|
||||
if message.text:
|
||||
forward = await client.send_message(
|
||||
-1001575525902,
|
||||
|
|
@ -142,18 +155,36 @@ async def _callbackreq(c, q):
|
|||
if q.message.caption:
|
||||
await q.message.edit_text(
|
||||
f"<b>COMPLETED</b>\n\n<s>{q.message.caption}</s>",
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="✅ Request Completed", callback_data="reqcompl")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="✅ Request Completed", callback_data="reqcompl"
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
else:
|
||||
await q.message.edit_text(
|
||||
f"<b>COMPLETED</b>\n\n<s>{q.message.text}</s>",
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="✅ Request Completed", callback_data="reqcompl")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="✅ Request Completed", callback_data="reqcompl"
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
await q.answer("Request berhasil diselesaikan ✅")
|
||||
else:
|
||||
await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True)
|
||||
except UserNotParticipant:
|
||||
return await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10)
|
||||
return await q.answer(
|
||||
"Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10
|
||||
)
|
||||
except PeerIdInvalid:
|
||||
return await q.answer(
|
||||
"Silahkan kirim pesan digrup supaya bot bisa merespon.",
|
||||
|
|
@ -209,7 +240,9 @@ async def _callbackreqada(c, q):
|
|||
else:
|
||||
await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True)
|
||||
except UserNotParticipant:
|
||||
return await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10)
|
||||
return await q.answer(
|
||||
"Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10
|
||||
)
|
||||
except PeerIdInvalid:
|
||||
return await q.answer(
|
||||
"Silahkan kirim pesan digrup supaya bot bisa merespon.",
|
||||
|
|
@ -236,18 +269,36 @@ async def _callbackreject(c, q):
|
|||
if q.message.caption:
|
||||
await q.message.edit_text(
|
||||
f"<b>REJECTED</b>\n\n<s>{q.message.caption}</s>",
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="🚫 Request Rejected", callback_data="reqreject")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="🚫 Request Rejected", callback_data="reqreject"
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
else:
|
||||
await q.message.edit_text(
|
||||
f"<b>REJECTED</b>\n\n<s>{q.message.text}</s>",
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="🚫 Request Rejected", callback_data="reqreject")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="🚫 Request Rejected", callback_data="reqreject"
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
await q.answer("Request berhasil ditolak 🚫")
|
||||
else:
|
||||
await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True)
|
||||
except UserNotParticipant:
|
||||
await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10)
|
||||
await q.answer(
|
||||
"Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10
|
||||
)
|
||||
except PeerIdInvalid:
|
||||
return await q.answer(
|
||||
"Silahkan kirim pesan digrup supaya bot bisa merespon.",
|
||||
|
|
@ -299,7 +350,9 @@ async def _callbackunav(c, q):
|
|||
]
|
||||
),
|
||||
)
|
||||
await q.answer("Request tidak tersedia, mungkin belum rilis atau memang tidak tersedia versi digital.")
|
||||
await q.answer(
|
||||
"Request tidak tersedia, mungkin belum rilis atau memang tidak tersedia versi digital."
|
||||
)
|
||||
else:
|
||||
await q.answer(
|
||||
"Apa motivasi kamu menekan tombol ini?",
|
||||
|
|
@ -307,7 +360,9 @@ async def _callbackunav(c, q):
|
|||
cache_time=1000,
|
||||
)
|
||||
except UserNotParticipant:
|
||||
await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10)
|
||||
await q.answer(
|
||||
"Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10
|
||||
)
|
||||
except PeerIdInvalid:
|
||||
return await q.answer(
|
||||
"Silahkan kirim pesan digrup supaya bot bisa merespon.",
|
||||
|
|
@ -345,7 +400,9 @@ async def _callbackaft_unav(c, q):
|
|||
|
||||
@app.on_callback_query(filters.regex(r"^reqavailable$"))
|
||||
async def _callbackaft_dahada(c, q):
|
||||
await q.answer("Request ini sudah ada, silahkan cari 🔍 di channelnya yaa 😉..", show_alert=True)
|
||||
await q.answer(
|
||||
"Request ini sudah ada, silahkan cari 🔍 di channelnya yaa 😉..", show_alert=True
|
||||
)
|
||||
|
||||
|
||||
scheduler = AsyncIOScheduler(timezone="Asia/Jakarta")
|
||||
|
|
|
|||
|
|
@ -25,7 +25,12 @@ import re
|
|||
|
||||
from pyrogram import filters
|
||||
|
||||
from database.filters_db import delete_filter, get_filter, get_filters_names, save_filter
|
||||
from database.filters_db import (
|
||||
delete_filter,
|
||||
get_filter,
|
||||
get_filters_names,
|
||||
save_filter,
|
||||
)
|
||||
from misskaty import app
|
||||
from misskaty.core.decorator.errors import capture_err
|
||||
from misskaty.core.decorator.permissions import adminsOnly
|
||||
|
|
@ -45,9 +50,13 @@ You can use markdown or html to save text too.
|
|||
@adminsOnly("can_change_info")
|
||||
async def save_filters(_, message):
|
||||
if len(message.command) == 1 or not message.reply_to_message:
|
||||
return await message.reply_text("**Usage:**\nReply to a text or sticker with /filter [FILTER_NAME] to save it.")
|
||||
return await message.reply_text(
|
||||
"**Usage:**\nReply to a text or sticker with /filter [FILTER_NAME] to save it."
|
||||
)
|
||||
if not message.reply_to_message.text and not message.reply_to_message.sticker:
|
||||
return await message.reply_text("__**You can only save text or stickers in filters for now.**__")
|
||||
return await message.reply_text(
|
||||
"__**You can only save text or stickers in filters for now.**__"
|
||||
)
|
||||
name = message.text.split(None, 1)[1].strip()
|
||||
if not name:
|
||||
return await message.reply_text("**Usage:**\n__/filter [FILTER_NAME]__")
|
||||
|
|
@ -55,7 +64,9 @@ async def save_filters(_, message):
|
|||
_type = "text" if message.reply_to_message.text else "sticker"
|
||||
_filter = {
|
||||
"type": _type,
|
||||
"data": message.reply_to_message.text.markdown if _type == "text" else message.reply_to_message.sticker.file_id,
|
||||
"data": message.reply_to_message.text.markdown
|
||||
if _type == "text"
|
||||
else message.reply_to_message.sticker.file_id,
|
||||
}
|
||||
await save_filter(chat_id, name, _filter)
|
||||
await message.reply(f"__**Saved filter {name}.**__")
|
||||
|
|
|
|||
|
|
@ -44,7 +44,9 @@ async def genss(client, message):
|
|||
media = v
|
||||
break
|
||||
if media is None:
|
||||
return await message.reply("Reply to a Telegram Video or document as video to generate screenshoot!")
|
||||
return await message.reply(
|
||||
"Reply to a Telegram Video or document as video to generate screenshoot!"
|
||||
)
|
||||
process = await message.reply_text("`Processing, please wait..`")
|
||||
c_time = time.time()
|
||||
the_real_download_location = await client.download_media(
|
||||
|
|
@ -66,12 +68,16 @@ async def genss(client, message):
|
|||
chat_id=message.chat.id,
|
||||
message_id=process.id,
|
||||
)
|
||||
await client.send_chat_action(chat_id=message.chat.id, action=enums.ChatAction.UPLOAD_PHOTO)
|
||||
await client.send_chat_action(
|
||||
chat_id=message.chat.id, action=enums.ChatAction.UPLOAD_PHOTO
|
||||
)
|
||||
|
||||
try:
|
||||
await gather(
|
||||
*[
|
||||
message.reply_document(images, reply_to_message_id=message.id),
|
||||
message.reply_document(
|
||||
images, reply_to_message_id=message.id
|
||||
),
|
||||
message.reply_photo(images, reply_to_message_id=message.id),
|
||||
]
|
||||
)
|
||||
|
|
@ -79,7 +85,9 @@ async def genss(client, message):
|
|||
await sleep(e.value)
|
||||
await gather(
|
||||
*[
|
||||
message.reply_document(images, reply_to_message_id=message.id),
|
||||
message.reply_document(
|
||||
images, reply_to_message_id=message.id
|
||||
),
|
||||
message.reply_photo(images, reply_to_message_id=message.id),
|
||||
]
|
||||
)
|
||||
|
|
@ -111,9 +119,13 @@ async def genss_link(client, message):
|
|||
try:
|
||||
link = message.text.split(" ")[1]
|
||||
if link.startswith("https://file.yasirweb.my.id"):
|
||||
link = link.replace("https://file.yasirweb.my.id", "https://file.yasiraris.workers.dev")
|
||||
link = link.replace(
|
||||
"https://file.yasirweb.my.id", "https://file.yasiraris.workers.dev"
|
||||
)
|
||||
if link.startswith("https://link.yasirweb.my.id"):
|
||||
link = link.replace("https://link.yasirweb.my.id", "https://yasirrobot.herokuapp.com")
|
||||
link = link.replace(
|
||||
"https://link.yasirweb.my.id", "https://yasirrobot.herokuapp.com"
|
||||
)
|
||||
process = await message.reply_text("`Processing, please wait..`")
|
||||
tmp_directory_for_each_user = f"./MissKaty_Genss/{str(message.from_user.id)}"
|
||||
if not os.path.isdir(tmp_directory_for_each_user):
|
||||
|
|
@ -125,7 +137,9 @@ async def genss_link(client, message):
|
|||
chat_id=message.chat.id,
|
||||
message_id=process.id,
|
||||
)
|
||||
await client.send_chat_action(chat_id=message.chat.id, action=enums.ChatAction.UPLOAD_PHOTO)
|
||||
await client.send_chat_action(
|
||||
chat_id=message.chat.id, action=enums.ChatAction.UPLOAD_PHOTO
|
||||
)
|
||||
try:
|
||||
await message.reply_media_group(images, reply_to_message_id=message.id)
|
||||
except FloodWait as e:
|
||||
|
|
|
|||
|
|
@ -6,7 +6,13 @@ from logging import getLogger
|
|||
|
||||
from PIL import Image, ImageChops, ImageDraw, ImageFont
|
||||
from pyrogram import enums, filters
|
||||
from pyrogram.errors import ChatAdminRequired, ChatSendMediaForbidden, MessageTooLong, RPCError, SlowmodeWait
|
||||
from pyrogram.errors import (
|
||||
ChatAdminRequired,
|
||||
ChatSendMediaForbidden,
|
||||
MessageTooLong,
|
||||
RPCError,
|
||||
SlowmodeWait,
|
||||
)
|
||||
from pyrogram.types import ChatMemberUpdated, InlineKeyboardButton, InlineKeyboardMarkup
|
||||
|
||||
from database.users_chats_db import db
|
||||
|
|
@ -41,7 +47,9 @@ def draw_multiple_line_text(image, text, font, text_start_height):
|
|||
lines = textwrap.wrap(text, width=50)
|
||||
for line in lines:
|
||||
line_width, line_height = font.getsize(line)
|
||||
draw.text(((image_width - line_width) / 2, y_text), line, font=font, fill="black")
|
||||
draw.text(
|
||||
((image_width - line_width) / 2, y_text), line, font=font, fill="black"
|
||||
)
|
||||
y_text += line_height
|
||||
|
||||
|
||||
|
|
@ -51,8 +59,12 @@ def welcomepic(pic, user, chat, count, id):
|
|||
background = background.resize((1024, 500), Image.ANTIALIAS)
|
||||
pfp = Image.open(pic).convert("RGBA")
|
||||
pfp = circle(pfp)
|
||||
pfp = pfp.resize((265, 265)) # Resizes the Profilepicture so it fits perfectly in the circle
|
||||
font = ImageFont.truetype("Calistoga-Regular.ttf", 37) # <- Text Font of the Member Count. Change the text size for your preference
|
||||
pfp = pfp.resize(
|
||||
(265, 265)
|
||||
) # Resizes the Profilepicture so it fits perfectly in the circle
|
||||
font = ImageFont.truetype(
|
||||
"Calistoga-Regular.ttf", 37
|
||||
) # <- Text Font of the Member Count. Change the text size for your preference
|
||||
member_text = f"User#{count}, Selamat Datang {user}" # <- Text under the Profilepicture with the Membercount
|
||||
draw_multiple_line_text(background, member_text, font, 395)
|
||||
draw_multiple_line_text(background, chat, font, 47)
|
||||
|
|
@ -63,15 +75,23 @@ def welcomepic(pic, user, chat, count, id):
|
|||
size=20,
|
||||
align="right",
|
||||
)
|
||||
background.paste(pfp, (379, 123), pfp) # Pastes the Profilepicture on the Background Image
|
||||
background.save(f"downloads/welcome#{id}.png") # Saves the finished Image in the folder with the filename
|
||||
background.paste(
|
||||
pfp, (379, 123), pfp
|
||||
) # Pastes the Profilepicture on the Background Image
|
||||
background.save(
|
||||
f"downloads/welcome#{id}.png"
|
||||
) # Saves the finished Image in the folder with the filename
|
||||
return f"downloads/welcome#{id}.png"
|
||||
|
||||
|
||||
@app.on_chat_member_updated(filters.group & filters.chat(-1001128045651))
|
||||
@capture_err
|
||||
async def member_has_joined(c: app, member: ChatMemberUpdated):
|
||||
if not member.new_chat_member or member.new_chat_member.status in {"banned", "left", "restricted"} or member.old_chat_member:
|
||||
if (
|
||||
not member.new_chat_member
|
||||
or member.new_chat_member.status in {"banned", "left", "restricted"}
|
||||
or member.old_chat_member
|
||||
):
|
||||
return
|
||||
user = member.new_chat_member.user if member.new_chat_member else member.from_user
|
||||
if user.id in SUDO:
|
||||
|
|
@ -90,15 +110,21 @@ async def member_has_joined(c: app, member: ChatMemberUpdated):
|
|||
pass
|
||||
mention = f"<a href='tg://user?id={user.id}'>{user.first_name}</a>"
|
||||
joined_date = datetime.fromtimestamp(time.time()).strftime("%Y.%m.%d %H:%M:%S")
|
||||
first_name = f"{user.first_name} {user.last_name}" if user.last_name else user.first_name
|
||||
first_name = (
|
||||
f"{user.first_name} {user.last_name}" if user.last_name else user.first_name
|
||||
)
|
||||
id = user.id
|
||||
dc = user.dc_id or "Member tanpa PP"
|
||||
count = await app.get_chat_members_count(member.chat.id)
|
||||
try:
|
||||
pic = await app.download_media(user.photo.big_file_id, file_name=f"pp{user.id}.png")
|
||||
pic = await app.download_media(
|
||||
user.photo.big_file_id, file_name=f"pp{user.id}.png"
|
||||
)
|
||||
except AttributeError:
|
||||
pic = "img/profilepic.png"
|
||||
welcomeimg = await welcomepic(pic, user.first_name, member.chat.title, count, user.id)
|
||||
welcomeimg = await welcomepic(
|
||||
pic, user.first_name, member.chat.title, count, user.id
|
||||
)
|
||||
temp.MELCOW[f"welcome-{member.chat.id}"] = await c.send_photo(
|
||||
member.chat.id,
|
||||
photo=welcomeimg,
|
||||
|
|
@ -107,18 +133,30 @@ async def member_has_joined(c: app, member: ChatMemberUpdated):
|
|||
userspammer = ""
|
||||
# Spamwatch Detection
|
||||
try:
|
||||
headers = {"Authorization": "Bearer XvfzE4AUNXkzCy0DnIVpFDlxZi79lt6EnwKgBj8Quuzms0OSdHvf1k6zSeyzZ_lz"}
|
||||
apispamwatch = (await http.get(f"https://api.spamwat.ch/banlist/{user.id}", headers=headers)).json()
|
||||
headers = {
|
||||
"Authorization": "Bearer XvfzE4AUNXkzCy0DnIVpFDlxZi79lt6EnwKgBj8Quuzms0OSdHvf1k6zSeyzZ_lz"
|
||||
}
|
||||
apispamwatch = (
|
||||
await http.get(
|
||||
f"https://api.spamwat.ch/banlist/{user.id}", headers=headers
|
||||
)
|
||||
).json()
|
||||
if not apispamwatch.get("error"):
|
||||
await app.ban_chat_member(member.chat.id, user.id, datetime.now() + timedelta(seconds=30))
|
||||
await app.ban_chat_member(
|
||||
member.chat.id, user.id, datetime.now() + timedelta(seconds=30)
|
||||
)
|
||||
userspammer += f"<b>#SpamWatch Federation Ban</b>\nUser {mention} [<code>{user.id}</code>] has been kicked because <code>{apispamwatch.get('reason')}</code>.\n"
|
||||
except Exception as err:
|
||||
LOGGER.error(f"ERROR in Spamwatch Detection. {err}")
|
||||
# Combot API Detection
|
||||
try:
|
||||
apicombot = (await http.get(f"https://api.cas.chat/check?user_id={user.id}")).json()
|
||||
apicombot = (
|
||||
await http.get(f"https://api.cas.chat/check?user_id={user.id}")
|
||||
).json()
|
||||
if apicombot.get("ok") == "true":
|
||||
await app.ban_chat_member(member.chat.id, user.id, datetime.now() + timedelta(seconds=30))
|
||||
await app.ban_chat_member(
|
||||
member.chat.id, user.id, datetime.now() + timedelta(seconds=30)
|
||||
)
|
||||
userspammer += f"<b>#CAS Federation Ban</b>\nUser {mention} [<code>{user.id}</code>] detected as spambot and has been kicked. Powered by <a href='https://api.cas.chat/check?user_id={user.id}'>Combot AntiSpam.</a>"
|
||||
except Exception as err:
|
||||
LOGGER.error(f"ERROR in Combot API Detection. {err}")
|
||||
|
|
@ -147,7 +185,9 @@ async def save_group(bot, message):
|
|||
await db.add_chat(message.chat.id, message.chat.title)
|
||||
if message.chat.id in temp.BANNED_CHATS:
|
||||
# Inspired from a boat of a banana tree
|
||||
buttons = [[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]]
|
||||
buttons = [
|
||||
[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]
|
||||
]
|
||||
reply_markup = InlineKeyboardMarkup(buttons)
|
||||
k = await message.reply(
|
||||
text="<b>CHAT NOT ALLOWED 🐞\n\nMy admins has restricted me from working here ! If you want to know more about it contact support..</b>",
|
||||
|
|
@ -162,7 +202,9 @@ async def save_group(bot, message):
|
|||
return
|
||||
buttons = [
|
||||
[
|
||||
InlineKeyboardButton("ℹ️ Help", url=f"https://t.me/{temp.U_NAME}?start=help"),
|
||||
InlineKeyboardButton(
|
||||
"ℹ️ Help", url=f"https://t.me/{temp.U_NAME}?start=help"
|
||||
),
|
||||
InlineKeyboardButton("📢 Updates", url="https://t.me/YasirPediaChannel"),
|
||||
]
|
||||
]
|
||||
|
|
@ -175,10 +217,14 @@ async def save_group(bot, message):
|
|||
for u in message.new_chat_members:
|
||||
count = await app.get_chat_members_count(message.chat.id)
|
||||
try:
|
||||
pic = await app.download_media(u.photo.big_file_id, file_name=f"pp{u.id}.png")
|
||||
pic = await app.download_media(
|
||||
u.photo.big_file_id, file_name=f"pp{u.id}.png"
|
||||
)
|
||||
except AttributeError:
|
||||
pic = "img/profilepic.png"
|
||||
welcomeimg = await welcomepic(pic, u.first_name, message.chat.title, count, u.id)
|
||||
welcomeimg = await welcomepic(
|
||||
pic, u.first_name, message.chat.title, count, u.id
|
||||
)
|
||||
if (temp.MELCOW).get(f"welcome-{message.chat.id}") is not None:
|
||||
try:
|
||||
await (temp.MELCOW[f"welcome-{message.chat.id}"]).delete()
|
||||
|
|
@ -209,7 +255,9 @@ async def leave_a_chat(bot, message):
|
|||
except:
|
||||
chat = chat
|
||||
try:
|
||||
buttons = [[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]]
|
||||
buttons = [
|
||||
[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]
|
||||
]
|
||||
reply_markup = InlineKeyboardMarkup(buttons)
|
||||
await bot.send_message(
|
||||
chat_id=chat,
|
||||
|
|
@ -241,12 +289,16 @@ async def disable_chat(bot, message):
|
|||
if not cha_t:
|
||||
return await message.reply("Chat Not Found In DB")
|
||||
if cha_t["is_disabled"]:
|
||||
return await message.reply(f"This chat is already disabled:\nReason-<code> {cha_t['reason']} </code>")
|
||||
return await message.reply(
|
||||
f"This chat is already disabled:\nReason-<code> {cha_t['reason']} </code>"
|
||||
)
|
||||
await db.disable_chat(chat_, reason)
|
||||
temp.BANNED_CHATS.append(chat_)
|
||||
await message.reply("Chat Succesfully Disabled")
|
||||
try:
|
||||
buttons = [[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]]
|
||||
buttons = [
|
||||
[InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")]
|
||||
]
|
||||
reply_markup = InlineKeyboardMarkup(buttons)
|
||||
await bot.send_message(
|
||||
chat_id=chat_,
|
||||
|
|
@ -291,7 +343,9 @@ async def gen_invite(bot, message):
|
|||
try:
|
||||
link = await bot.create_chat_invite_link(chat)
|
||||
except ChatAdminRequired:
|
||||
return await message.reply("Invite Link Generation Failed, Iam Not Having Sufficient Rights")
|
||||
return await message.reply(
|
||||
"Invite Link Generation Failed, Iam Not Having Sufficient Rights"
|
||||
)
|
||||
except Exception as e:
|
||||
return await message.reply(f"Error {e}")
|
||||
await message.reply(f"Here is your Invite Link {link.invite_link}")
|
||||
|
|
@ -304,11 +358,15 @@ async def adminlist(_, message):
|
|||
return await message.reply("Perintah ini hanya untuk grup")
|
||||
try:
|
||||
administrators = []
|
||||
async for m in app.get_chat_members(message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS):
|
||||
async for m in app.get_chat_members(
|
||||
message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS
|
||||
):
|
||||
administrators.append(f"{m.user.first_name}")
|
||||
|
||||
res = "".join(f"~ {i}\n" for i in administrators)
|
||||
return await message.reply(f"Daftar Admin di <b>{message.chat.title}</b> ({message.chat.id}):\n~ {res}")
|
||||
return await message.reply(
|
||||
f"Daftar Admin di <b>{message.chat.title}</b> ({message.chat.id}):\n~ {res}"
|
||||
)
|
||||
except Exception as e:
|
||||
await message.reply(f"ERROR: {str(e)}")
|
||||
|
||||
|
|
@ -326,7 +384,9 @@ async def kickme(_, message):
|
|||
await message.reply_text(txt)
|
||||
await message.chat.unban_member(message.from_user.id)
|
||||
except RPCError as ef:
|
||||
await message.reply_text(f"Sepertinya ada error, silahkan report ke owner saya. \nERROR: {str(ef)}")
|
||||
await message.reply_text(
|
||||
f"Sepertinya ada error, silahkan report ke owner saya. \nERROR: {str(ef)}"
|
||||
)
|
||||
except Exception as err:
|
||||
await message.reply(f"ERROR: {err}")
|
||||
|
||||
|
|
|
|||
|
|
@ -3,13 +3,18 @@ import logging
|
|||
import re
|
||||
|
||||
from bs4 import BeautifulSoup
|
||||
from database.imdb_db import *
|
||||
from deep_translator import GoogleTranslator
|
||||
from pykeyboard import InlineButton, InlineKeyboard
|
||||
from pyrogram import filters
|
||||
from pyrogram.errors import MediaEmpty, MessageNotModified, PhotoInvalidDimensions, WebpageMediaEmpty
|
||||
from pyrogram.errors import (
|
||||
MediaEmpty,
|
||||
MessageNotModified,
|
||||
PhotoInvalidDimensions,
|
||||
WebpageMediaEmpty,
|
||||
)
|
||||
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, InputMediaPhoto
|
||||
|
||||
from database.imdb_db import *
|
||||
from misskaty import BOT_USERNAME, app
|
||||
from misskaty.core.decorator.errors import capture_err
|
||||
from misskaty.helper.http import http
|
||||
|
|
@ -32,7 +37,7 @@ async def imdb_choose(_, m):
|
|||
)
|
||||
if m.sender_chat:
|
||||
return await m.reply("This feature not supported for channel..")
|
||||
kuery = m.text.split(None, 1)[1]
|
||||
kuery = m.text.split(None, 1)[1]
|
||||
is_imdb, lang = await is_imdbset(m.from_user.id)
|
||||
if is_imdb:
|
||||
if lang == "eng":
|
||||
|
|
@ -44,14 +49,10 @@ async def imdb_choose(_, m):
|
|||
LIST_CARI[ranval] = kuery
|
||||
buttons.row(
|
||||
InlineButton("🇺🇸 English", f"imdbcari_en#{ranval}#{m.from_user.id}"),
|
||||
InlineButton("🇮🇩 Indonesia", f"imdcari_id#{ranval}#{m.from_user.id}")
|
||||
)
|
||||
buttons.row(
|
||||
InlineButton("🚩 Set Default Language", f"imdbset#{m.from_user.id}")
|
||||
)
|
||||
buttons.row(
|
||||
InlineButton("❌ Close", f"close#{m.from_user.id}")
|
||||
InlineButton("🇮🇩 Indonesia", f"imdcari_id#{ranval}#{m.from_user.id}"),
|
||||
)
|
||||
buttons.row(InlineButton("🚩 Set Default Language", f"imdbset#{m.from_user.id}"))
|
||||
buttons.row(InlineButton("❌ Close", f"close#{m.from_user.id}"))
|
||||
await m.reply_photo(
|
||||
"https://telegra.ph/file/270955ef0d1a8a16831a9.jpg",
|
||||
caption=f"Hi {m.from_user.mention}, Please select the language you want to use on IMDB Search. If you want use default lang for every user, click third button. So no need click select lang if use CMD.",
|
||||
|
|
@ -59,6 +60,7 @@ async def imdb_choose(_, m):
|
|||
quote=True,
|
||||
)
|
||||
|
||||
|
||||
@app.on_callback_query(filters.regex("^imdbset"))
|
||||
async def imdbsetlang(client, query):
|
||||
i, uid = query.data.split("#")
|
||||
|
|
@ -67,17 +69,18 @@ async def imdbsetlang(client, query):
|
|||
buttons = InlineKeyboard()
|
||||
buttons.row(
|
||||
InlineButton("🇺🇸 English", f"setimdb#eng#{query.from_user.id}"),
|
||||
InlineButton("🇮🇩 Indonesia", f"setimdb#ind#{query.from_user.id}")
|
||||
InlineButton("🇮🇩 Indonesia", f"setimdb#ind#{query.from_user.id}"),
|
||||
)
|
||||
is_imdb, lang = await is_imdbset(query.from_user.id)
|
||||
if is_imdb:
|
||||
buttons.row(
|
||||
InlineButton("🗑 Remove UserSetting", f"setimdb#rm#{query.from_user.id}")
|
||||
)
|
||||
buttons.row(
|
||||
InlineButton("❌ Close", f"close#{query.from_user.id}")
|
||||
buttons.row(InlineButton("❌ Close", f"close#{query.from_user.id}"))
|
||||
await query.message.edit_caption(
|
||||
"<i>Please select available language below..</i>", reply_markup=buttons
|
||||
)
|
||||
await query.message.edit_caption("<i>Please select available language below..</i>", reply_markup=buttons)
|
||||
|
||||
|
||||
@app.on_callback_query(filters.regex("^setimdb"))
|
||||
async def imdbsetlang(client, query):
|
||||
|
|
@ -86,24 +89,37 @@ async def imdbsetlang(client, query):
|
|||
return await query.answer("⚠️ Access Denied!", True)
|
||||
if lang == "eng":
|
||||
await add_imdbset(query.from_user.id, lang)
|
||||
await query.message.edit_caption("Language interface for IMDB has been changed to English.")
|
||||
await query.message.edit_caption(
|
||||
"Language interface for IMDB has been changed to English."
|
||||
)
|
||||
elif lang == "ind":
|
||||
await add_imdbset(query.from_user.id, lang)
|
||||
await query.message.edit_caption("Bahasa tampilan IMDB sudah diubah ke Indonesia.")
|
||||
await query.message.edit_caption(
|
||||
"Bahasa tampilan IMDB sudah diubah ke Indonesia."
|
||||
)
|
||||
else:
|
||||
await remove_imdbset(query.from_user.id)
|
||||
await query.message.edit_caption("UserSetting for IMDB has been deleted from database.")
|
||||
await query.message.edit_caption(
|
||||
"UserSetting for IMDB has been deleted from database."
|
||||
)
|
||||
|
||||
|
||||
async def imdb_search_id(kueri, message):
|
||||
BTN = []
|
||||
k = await message.reply_photo("https://telegra.ph/file/270955ef0d1a8a16831a9.jpg", caption=f"🔎 Menelusuri <code>{kueri}</code> di database IMDb ...", quote=True)
|
||||
k = await message.reply_photo(
|
||||
"https://telegra.ph/file/270955ef0d1a8a16831a9.jpg",
|
||||
caption=f"🔎 Menelusuri <code>{kueri}</code> di database IMDb ...",
|
||||
quote=True,
|
||||
)
|
||||
msg = ""
|
||||
buttons = InlineKeyboard(row_width=4)
|
||||
try:
|
||||
r = await http.get(f"https://yasirapi.eu.org/imdb-search?q={kueri}")
|
||||
res = json.loads(r.text).get("result")
|
||||
if not res:
|
||||
return await k.edit_caption(f"⛔️ Tidak ditemukan hasil untuk kueri: <code>{kueri}</code>")
|
||||
return await k.edit_caption(
|
||||
f"⛔️ Tidak ditemukan hasil untuk kueri: <code>{kueri}</code>"
|
||||
)
|
||||
msg += f"🎬 Ditemukan ({len(res)}) hasil untuk kueri: <code>{kueri}</code>\n\n"
|
||||
for num, movie in enumerate(res, start=1):
|
||||
title = movie.get("l")
|
||||
|
|
@ -113,26 +129,44 @@ async def imdb_search_id(kueri, message):
|
|||
msg += f"{num}. {title} {year} - {type}\n"
|
||||
BTN.append(
|
||||
InlineKeyboardButton(
|
||||
text=num, callback_data=f"imdbres_id#{message.from_user.id}#{movieID}"
|
||||
text=num,
|
||||
callback_data=f"imdbres_id#{message.from_user.id}#{movieID}",
|
||||
)
|
||||
)
|
||||
BTN.append(InlineKeyboardButton(text="🚩 Language", callback_data=f"imdbset#{message.from_user.id}"))
|
||||
BTN.append(InlineKeyboardButton(text="❌ Close", callback_data=f"close#{message.from_user.id}"))
|
||||
BTN.append(
|
||||
InlineKeyboardButton(
|
||||
text="🚩 Language", callback_data=f"imdbset#{message.from_user.id}"
|
||||
)
|
||||
)
|
||||
BTN.append(
|
||||
InlineKeyboardButton(
|
||||
text="❌ Close", callback_data=f"close#{message.from_user.id}"
|
||||
)
|
||||
)
|
||||
buttons.add(*BTN)
|
||||
await k.edit_caption(msg, reply_markup=buttons)
|
||||
except Exception as err:
|
||||
await k.edit_caption(f"Ooppss, gagal mendapatkan daftar judul di IMDb.\n\n<b>ERROR:</b> <code>{err}</code>")
|
||||
await k.edit_caption(
|
||||
f"Ooppss, gagal mendapatkan daftar judul di IMDb.\n\n<b>ERROR:</b> <code>{err}</code>"
|
||||
)
|
||||
|
||||
|
||||
async def imdb_search_en(kueri, message):
|
||||
BTN = []
|
||||
k = await message.reply_photo("https://telegra.ph/file/270955ef0d1a8a16831a9.jpg", caption=f"🔎 Searching <code>{kueri}</code> in IMDb Database...", quote=True)
|
||||
k = await message.reply_photo(
|
||||
"https://telegra.ph/file/270955ef0d1a8a16831a9.jpg",
|
||||
caption=f"🔎 Searching <code>{kueri}</code> in IMDb Database...",
|
||||
quote=True,
|
||||
)
|
||||
msg = ""
|
||||
buttons = InlineKeyboard(row_width=4)
|
||||
try:
|
||||
r = await http.get(f"https://yasirapi.eu.org/imdb-search?q={kueri}")
|
||||
res = json.loads(r.text).get("result")
|
||||
if not res:
|
||||
return await k.edit_caption(f"⛔️ Result not found for keywords: <code>{kueri}</code>")
|
||||
return await k.edit_caption(
|
||||
f"⛔️ Result not found for keywords: <code>{kueri}</code>"
|
||||
)
|
||||
msg += f"🎬 Found ({len(res)}) result for keywords: <code>{kueri}</code>\n\n"
|
||||
for num, movie in enumerate(res, start=1):
|
||||
title = movie.get("l")
|
||||
|
|
@ -142,15 +176,27 @@ async def imdb_search_en(kueri, message):
|
|||
msg += f"{num}. {title} {year} - {type}\n"
|
||||
BTN.append(
|
||||
InlineKeyboardButton(
|
||||
text=num, callback_data=f"imdbres_en#{message.from_user.id}#{movieID}"
|
||||
text=num,
|
||||
callback_data=f"imdbres_en#{message.from_user.id}#{movieID}",
|
||||
)
|
||||
)
|
||||
BTN.append(InlineKeyboardButton(text="🚩 Language", callback_data=f"imdbset#{message.from_user.id}"))
|
||||
BTN.append(InlineKeyboardButton(text="❌ Close", callback_data=f"close#{message.from_user.id}"))
|
||||
BTN.append(
|
||||
InlineKeyboardButton(
|
||||
text="🚩 Language", callback_data=f"imdbset#{message.from_user.id}"
|
||||
)
|
||||
)
|
||||
BTN.append(
|
||||
InlineKeyboardButton(
|
||||
text="❌ Close", callback_data=f"close#{message.from_user.id}"
|
||||
)
|
||||
)
|
||||
buttons.add(*BTN)
|
||||
await k.edit_caption(msg, reply_markup=buttons)
|
||||
except Exception as err:
|
||||
await k.edit_caption(f"Failed when requesting movies title.\n\n<b>ERROR:</b> <code>{err}</code>")
|
||||
await k.edit_caption(
|
||||
f"Failed when requesting movies title.\n\n<b>ERROR:</b> <code>{err}</code>"
|
||||
)
|
||||
|
||||
|
||||
@app.on_callback_query(filters.regex("^imdcari_id"))
|
||||
async def imdbcari_id(client, query):
|
||||
|
|
@ -286,18 +332,20 @@ async def imdb_id_callback(bot, query):
|
|||
if r_json.get("aggregateRating"):
|
||||
res_str += f"<b>Peringkat:</b> <code>{r_json['aggregateRating']['ratingValue']}⭐️ dari {r_json['aggregateRating']['ratingCount']} pengguna</code> \n"
|
||||
if sop.select('li[data-testid="title-details-releasedate"]'):
|
||||
rilis = (sop.select(
|
||||
'li[data-testid="title-details-releasedate"]'
|
||||
)[0].find(
|
||||
class_=
|
||||
"ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
|
||||
).text)
|
||||
rilis_url = sop.select(
|
||||
'li[data-testid="title-details-releasedate"]'
|
||||
)[0].find(
|
||||
class_=
|
||||
"ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
|
||||
)["href"]
|
||||
rilis = (
|
||||
sop.select('li[data-testid="title-details-releasedate"]')[0]
|
||||
.find(
|
||||
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
|
||||
)
|
||||
.text
|
||||
)
|
||||
rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[
|
||||
0
|
||||
].find(
|
||||
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
|
||||
)[
|
||||
"href"
|
||||
]
|
||||
res_str += (
|
||||
f"<b>Rilis:</b> <a href='https://www.imdb.com{rilis_url}'>{rilis}</a>\n"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -3,7 +3,10 @@ from asyncio import sleep
|
|||
|
||||
from pyrogram import enums, filters
|
||||
from pyrogram.errors import FloodWait
|
||||
from pyrogram.errors.exceptions.bad_request_400 import ChatAdminRequired, UserAdminInvalid
|
||||
from pyrogram.errors.exceptions.bad_request_400 import (
|
||||
ChatAdminRequired,
|
||||
UserAdminInvalid,
|
||||
)
|
||||
from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden
|
||||
|
||||
from misskaty import app
|
||||
|
|
@ -16,7 +19,9 @@ __HELP__ = """"
|
|||
"""
|
||||
|
||||
|
||||
@app.on_message(filters.incoming & ~filters.private & filters.command(["inkick"], COMMAND_HANDLER))
|
||||
@app.on_message(
|
||||
filters.incoming & ~filters.private & filters.command(["inkick"], COMMAND_HANDLER)
|
||||
)
|
||||
async def inkick(_, message):
|
||||
if message.sender_chat:
|
||||
return await message.reply("This feature not available for channel.")
|
||||
|
|
@ -24,44 +29,61 @@ async def inkick(_, message):
|
|||
if user.status.value in ("administrator", "owner"):
|
||||
if len(message.command) > 1:
|
||||
input_str = message.command
|
||||
sent_message = await message.reply_text("🚮**Sedang membersihkan user, mungkin butuh waktu beberapa saat...**")
|
||||
sent_message = await message.reply_text(
|
||||
"🚮**Sedang membersihkan user, mungkin butuh waktu beberapa saat...**"
|
||||
)
|
||||
count = 0
|
||||
async for member in app.get_chat_members(message.chat.id):
|
||||
if member.user.is_bot:
|
||||
continue
|
||||
if member.user.status.value in input_str and member.status.value not in ("administrator", "owner"):
|
||||
if (
|
||||
member.user.status.value in input_str
|
||||
and member.status.value not in ("administrator", "owner")
|
||||
):
|
||||
try:
|
||||
await message.chat.ban_member(member.user.id)
|
||||
count += 1
|
||||
await sleep(1)
|
||||
await message.chat.unban_member(member.user.id)
|
||||
except (ChatAdminRequired, UserAdminInvalid):
|
||||
await sent_message.edit("❗**Oh tidaakk, saya bukan admin disini**\n__Saya pergi dari sini, tambahkan aku kembali dengan perijinan banned pengguna.__")
|
||||
await sent_message.edit(
|
||||
"❗**Oh tidaakk, saya bukan admin disini**\n__Saya pergi dari sini, tambahkan aku kembali dengan perijinan banned pengguna.__"
|
||||
)
|
||||
await app.leave_chat(message.chat.id)
|
||||
break
|
||||
except FloodWait as e:
|
||||
await sleep(e.value)
|
||||
try:
|
||||
await sent_message.edit(f"✔️ **Berhasil menendang {count} pengguna berdasarkan argumen.**")
|
||||
await sent_message.edit(
|
||||
f"✔️ **Berhasil menendang {count} pengguna berdasarkan argumen.**"
|
||||
)
|
||||
|
||||
except ChatWriteForbidden:
|
||||
await app.leave_chat(message.chat.id)
|
||||
else:
|
||||
await message.reply_text("❗ **Arguments Required**\n__See /help in personal message for more information.__")
|
||||
await message.reply_text(
|
||||
"❗ **Arguments Required**\n__See /help in personal message for more information.__"
|
||||
)
|
||||
else:
|
||||
sent_message = await message.reply_text("❗ **You have to be the group creator to do that.**")
|
||||
sent_message = await message.reply_text(
|
||||
"❗ **You have to be the group creator to do that.**"
|
||||
)
|
||||
await sleep(5)
|
||||
await sent_message.delete()
|
||||
|
||||
|
||||
# Kick User Without Username
|
||||
@app.on_message(filters.incoming & ~filters.private & filters.command(["uname"], COMMAND_HANDLER))
|
||||
@app.on_message(
|
||||
filters.incoming & ~filters.private & filters.command(["uname"], COMMAND_HANDLER)
|
||||
)
|
||||
async def uname(_, message):
|
||||
if message.sender_chat:
|
||||
return await message.reply("This feature not available for channel.")
|
||||
user = await app.get_chat_member(message.chat.id, message.from_user.id)
|
||||
if user.status.value in ("administrator", "owner"):
|
||||
sent_message = await message.reply_text("🚮**Sedang membersihkan user, mungkin butuh waktu beberapa saat...**")
|
||||
sent_message = await message.reply_text(
|
||||
"🚮**Sedang membersihkan user, mungkin butuh waktu beberapa saat...**"
|
||||
)
|
||||
count = 0
|
||||
async for member in app.get_chat_members(message.chat.id):
|
||||
if not member.user.username and member.status.value not in (
|
||||
|
|
@ -74,29 +96,39 @@ async def uname(_, message):
|
|||
await sleep(1)
|
||||
await message.chat.unban_member(member.user.id)
|
||||
except (ChatAdminRequired, UserAdminInvalid):
|
||||
await sent_message.edit("❗**Oh tidaakk, saya bukan admin disini**\n__Saya pergi dari sini, tambahkan aku kembali dengan perijinan banned pengguna.__")
|
||||
await sent_message.edit(
|
||||
"❗**Oh tidaakk, saya bukan admin disini**\n__Saya pergi dari sini, tambahkan aku kembali dengan perijinan banned pengguna.__"
|
||||
)
|
||||
await app.leave_chat(message.chat.id)
|
||||
break
|
||||
except FloodWait as e:
|
||||
await sleep(e.value)
|
||||
try:
|
||||
await sent_message.edit(f"✔️ **Berhasil menendang {count} pengguna berdasarkan argumen.**")
|
||||
await sent_message.edit(
|
||||
f"✔️ **Berhasil menendang {count} pengguna berdasarkan argumen.**"
|
||||
)
|
||||
|
||||
except ChatWriteForbidden:
|
||||
await app.leave_chat(message.chat.id)
|
||||
else:
|
||||
sent_message = await message.reply_text("❗ **You have to be the group creator to do that.**")
|
||||
sent_message = await message.reply_text(
|
||||
"❗ **You have to be the group creator to do that.**"
|
||||
)
|
||||
await sleep(5)
|
||||
await sent_message.delete()
|
||||
|
||||
|
||||
@app.on_message(filters.incoming & ~filters.private & filters.command(["dkick"], COMMAND_HANDLER))
|
||||
@app.on_message(
|
||||
filters.incoming & ~filters.private & filters.command(["dkick"], COMMAND_HANDLER)
|
||||
)
|
||||
async def dkick(client, message):
|
||||
if message.sender_chat:
|
||||
return await message.reply("This feature not available for channel.")
|
||||
user = await app.get_chat_member(message.chat.id, message.from_user.id)
|
||||
if user.status.value in ("administrator", "owner"):
|
||||
sent_message = await message.reply_text("🚮**Sedang membersihkan user, mungkin butuh waktu beberapa saat...**")
|
||||
sent_message = await message.reply_text(
|
||||
"🚮**Sedang membersihkan user, mungkin butuh waktu beberapa saat...**"
|
||||
)
|
||||
count = 0
|
||||
async for member in app.get_chat_members(message.chat.id):
|
||||
if member.user.is_deleted and member.status.value not in (
|
||||
|
|
@ -109,7 +141,9 @@ async def dkick(client, message):
|
|||
await sleep(1)
|
||||
await message.chat.unban_member(member.user.id)
|
||||
except (ChatAdminRequired, UserAdminInvalid):
|
||||
await sent_message.edit("❗**Oh tidaakk, saya bukan admin disini**\n__Saya pergi dari sini, tambahkan aku kembali dengan perijinan banned pengguna.__")
|
||||
await sent_message.edit(
|
||||
"❗**Oh tidaakk, saya bukan admin disini**\n__Saya pergi dari sini, tambahkan aku kembali dengan perijinan banned pengguna.__"
|
||||
)
|
||||
await app.leave_chat(message.chat.id)
|
||||
break
|
||||
except FloodWait as e:
|
||||
|
|
@ -119,12 +153,16 @@ async def dkick(client, message):
|
|||
except ChatWriteForbidden:
|
||||
await app.leave_chat(message.chat.id)
|
||||
else:
|
||||
sent_message = await message.reply_text("❗ **Kamu harus jadi admin atau owner grup untuk melakukan tindakan ini.**")
|
||||
sent_message = await message.reply_text(
|
||||
"❗ **Kamu harus jadi admin atau owner grup untuk melakukan tindakan ini.**"
|
||||
)
|
||||
await sleep(5)
|
||||
await sent_message.delete()
|
||||
|
||||
|
||||
@app.on_message(filters.incoming & ~filters.private & filters.command(["instatus"], COMMAND_HANDLER))
|
||||
@app.on_message(
|
||||
filters.incoming & ~filters.private & filters.command(["instatus"], COMMAND_HANDLER)
|
||||
)
|
||||
async def instatus(client, message):
|
||||
start_time = time.perf_counter()
|
||||
user = await app.get_chat_member(message.chat.id, message.from_user.id)
|
||||
|
|
@ -133,7 +171,9 @@ async def instatus(client, message):
|
|||
enums.ChatMemberStatus.ADMINISTRATOR,
|
||||
enums.ChatMemberStatus.OWNER,
|
||||
):
|
||||
sent_message = await message.reply_text("**Sedang mengumpulkan informasi pengguna...**")
|
||||
sent_message = await message.reply_text(
|
||||
"**Sedang mengumpulkan informasi pengguna...**"
|
||||
)
|
||||
recently = 0
|
||||
within_week = 0
|
||||
within_month = 0
|
||||
|
|
@ -145,9 +185,13 @@ async def instatus(client, message):
|
|||
banned = 0
|
||||
uncached = 0
|
||||
bot = 0
|
||||
async for ban in app.get_chat_members(message.chat.id, filter=enums.ChatMembersFilter.BANNED):
|
||||
async for ban in app.get_chat_members(
|
||||
message.chat.id, filter=enums.ChatMembersFilter.BANNED
|
||||
):
|
||||
banned += 1
|
||||
async for restr in app.get_chat_members(message.chat.id, filter=enums.ChatMembersFilter.RESTRICTED):
|
||||
async for restr in app.get_chat_members(
|
||||
message.chat.id, filter=enums.ChatMembersFilter.RESTRICTED
|
||||
):
|
||||
restricted += 1
|
||||
async for member in app.get_chat_members(message.chat.id):
|
||||
user = member.user
|
||||
|
|
@ -190,6 +234,8 @@ async def instatus(client, message):
|
|||
)
|
||||
)
|
||||
else:
|
||||
sent_message = await message.reply_text("❗ **Kamu harus jadi admin atau owner grup untuk melakukan tindakan ini.**")
|
||||
sent_message = await message.reply_text(
|
||||
"❗ **Kamu harus jadi admin atau owner grup untuk melakukan tindakan ini.**"
|
||||
)
|
||||
await sleep(5)
|
||||
await sent_message.delete()
|
||||
|
|
|
|||
|
|
@ -9,7 +9,14 @@ from motor import version as mongover
|
|||
from pykeyboard import InlineKeyboard
|
||||
from pyrogram import __version__ as pyrover
|
||||
from pyrogram import enums, filters
|
||||
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, InlineQuery, InlineQueryResultArticle, InlineQueryResultPhoto, InputTextMessageContent
|
||||
from pyrogram.types import (
|
||||
InlineKeyboardButton,
|
||||
InlineKeyboardMarkup,
|
||||
InlineQuery,
|
||||
InlineQueryResultArticle,
|
||||
InlineQueryResultPhoto,
|
||||
InputTextMessageContent,
|
||||
)
|
||||
|
||||
from misskaty import BOT_USERNAME, app, user
|
||||
from misskaty.helper.http import http
|
||||
|
|
@ -36,7 +43,12 @@ PRVT_MSGS = {}
|
|||
async def inline_menu(_, inline_query: InlineQuery):
|
||||
if inline_query.query.strip().lower().strip() == "":
|
||||
buttons = InlineKeyboard(row_width=2)
|
||||
buttons.add(*[(InlineKeyboardButton(text=i, switch_inline_query_current_chat=i)) for i in keywords_list])
|
||||
buttons.add(
|
||||
*[
|
||||
(InlineKeyboardButton(text=i, switch_inline_query_current_chat=i))
|
||||
for i in keywords_list
|
||||
]
|
||||
)
|
||||
|
||||
btn = InlineKeyboard(row_width=2)
|
||||
bot_state = "Dead" if not await app.get_me() else "Alive"
|
||||
|
|
@ -60,21 +72,27 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
InlineQueryResultArticle(
|
||||
title="Inline Commands",
|
||||
description="Help Related To Inline Usage.",
|
||||
input_message_content=InputTextMessageContent("Click A Button To Get Started."),
|
||||
input_message_content=InputTextMessageContent(
|
||||
"Click A Button To Get Started."
|
||||
),
|
||||
thumb_url="https://hamker.me/cy00x5x.png",
|
||||
reply_markup=buttons,
|
||||
),
|
||||
InlineQueryResultArticle(
|
||||
title="Github Repo",
|
||||
description="Github Repo of This Bot.",
|
||||
input_message_content=InputTextMessageContent(f"<b>Github Repo @{BOT_USERNAME}</b>\n\nhttps://github.com/yasirarism/MissKatyPyro"),
|
||||
input_message_content=InputTextMessageContent(
|
||||
f"<b>Github Repo @{BOT_USERNAME}</b>\n\nhttps://github.com/yasirarism/MissKatyPyro"
|
||||
),
|
||||
thumb_url="https://hamker.me/gjc9fo3.png",
|
||||
),
|
||||
InlineQueryResultArticle(
|
||||
title="Alive",
|
||||
description="Check Bot's Stats",
|
||||
thumb_url="https://yt3.ggpht.com/ytc/AMLnZu-zbtIsllERaGYY8Aecww3uWUASPMjLUUEt7ecu=s900-c-k-c0x00ffffff-no-rj",
|
||||
input_message_content=InputTextMessageContent(msg, disable_web_page_preview=True),
|
||||
input_message_content=InputTextMessageContent(
|
||||
msg, disable_web_page_preview=True
|
||||
),
|
||||
reply_markup=btn,
|
||||
),
|
||||
]
|
||||
|
|
@ -87,8 +105,13 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
switch_pm_parameter="inline",
|
||||
)
|
||||
judul = inline_query.query.split(None, 1)[1].strip()
|
||||
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/61.0.3163.100 Safari/537.36"}
|
||||
search_results = await http.get(f"https://www.google.com/search?q={judul}&num=20", headers=headers)
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
||||
"Chrome/61.0.3163.100 Safari/537.36"
|
||||
}
|
||||
search_results = await http.get(
|
||||
f"https://www.google.com/search?q={judul}&num=20", headers=headers
|
||||
)
|
||||
soup = BeautifulSoup(search_results.text, "lxml")
|
||||
data = []
|
||||
for result in soup.select(".tF2Cxc"):
|
||||
|
|
@ -111,7 +134,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
url=link,
|
||||
description=snippet,
|
||||
thumb_url="https://te.legra.ph/file/ed8ea62ae636793000bb4.jpg",
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Open Website", url=link)]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton(text="Open Website", url=link)]]
|
||||
),
|
||||
)
|
||||
)
|
||||
await inline_query.answer(
|
||||
|
|
@ -135,7 +160,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
except Exception: # pylint: disable=broad-except
|
||||
inline_query.stop_propagation()
|
||||
return
|
||||
namanya = f"{diaa.first_name} {diaa.last_name}" if diaa.last_name else diaa.first_name
|
||||
namanya = (
|
||||
f"{diaa.first_name} {diaa.last_name}" if diaa.last_name else diaa.first_name
|
||||
)
|
||||
msg = f"<b>🏷 Name:</b> {namanya}\n<b>🆔 ID:</b> <code>{diaa.id}</code>\n"
|
||||
if diaa.username:
|
||||
msg += f"<b>🌐 Username:</b> <code>@{diaa.username}</code>\n"
|
||||
|
|
@ -183,7 +210,11 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
)
|
||||
prvte_msg = InlineKeyboardMarkup(
|
||||
[
|
||||
[InlineKeyboardButton("Show Message 🔐", callback_data=f"prvtmsg({inline_query.id})")],
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
"Show Message 🔐", callback_data=f"prvtmsg({inline_query.id})"
|
||||
)
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
"Destroy☠️ this msg",
|
||||
|
|
@ -192,8 +223,14 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
],
|
||||
]
|
||||
)
|
||||
mention = f"<a href='tg://user?id={penerima.id}'>{penerima.first_name}</a>" if not penerima.username else f"@{penerima.username}"
|
||||
msg_c = f"🔒 A <b>private message</b> to {mention} [<code>{penerima.id}</code>], "
|
||||
mention = (
|
||||
f"<a href='tg://user?id={penerima.id}'>{penerima.first_name}</a>"
|
||||
if not penerima.username
|
||||
else f"@{penerima.username}"
|
||||
)
|
||||
msg_c = (
|
||||
f"🔒 A <b>private message</b> to {mention} [<code>{penerima.id}</code>], "
|
||||
)
|
||||
msg_c += "Only he/she can open it."
|
||||
results = [
|
||||
InlineQueryResultArticle(
|
||||
|
|
@ -213,7 +250,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
switch_pm_parameter="inline",
|
||||
)
|
||||
query = inline_query.query.split(None, 1)[1].strip()
|
||||
search_results = await http.get(f"https://api.github.com/search/repositories?q={query}")
|
||||
search_results = await http.get(
|
||||
f"https://api.github.com/search/repositories?q={query}"
|
||||
)
|
||||
srch_results = json.loads(search_results.text)
|
||||
item = srch_results.get("items")
|
||||
data = []
|
||||
|
|
@ -236,7 +275,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
url=link,
|
||||
description=deskripsi,
|
||||
thumb_url="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Open Github Link", url=link)]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton(text="Open Github Link", url=link)]]
|
||||
),
|
||||
)
|
||||
)
|
||||
await inline_query.answer(
|
||||
|
|
@ -255,7 +296,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
switch_pm_parameter="inline",
|
||||
)
|
||||
query = inline_query.query.split(None, 1)[1].strip()
|
||||
search_results = await http.get(f"https://api.hayo.my.id/api/pypi?package={query}")
|
||||
search_results = await http.get(
|
||||
f"https://api.hayo.my.id/api/pypi?package={query}"
|
||||
)
|
||||
srch_results = json.loads(search_results.text)
|
||||
data = []
|
||||
for sraeo in srch_results:
|
||||
|
|
@ -276,7 +319,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
url=link,
|
||||
description=deskripsi,
|
||||
thumb_url="https://raw.githubusercontent.com/github/explore/666de02829613e0244e9441b114edb85781e972c/topics/pip/pip.png",
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Open Link", url=link)]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton(text="Open Link", url=link)]]
|
||||
),
|
||||
)
|
||||
)
|
||||
await inline_query.answer(
|
||||
|
|
@ -295,7 +340,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
switch_pm_parameter="inline",
|
||||
)
|
||||
judul = inline_query.query.split(None, 1)[1].strip()
|
||||
search_results = await http.get(f"https://api.abir-hasan.tk/youtube?query={judul}")
|
||||
search_results = await http.get(
|
||||
f"https://api.abir-hasan.tk/youtube?query={judul}"
|
||||
)
|
||||
srch_results = json.loads(search_results.text)
|
||||
asroe = srch_results.get("results")
|
||||
oorse = []
|
||||
|
|
@ -307,7 +354,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
durasi = sraeo.get("accessibility").get("duration")
|
||||
publishTime = sraeo.get("publishedTime")
|
||||
try:
|
||||
deskripsi = "".join(f"{i['text']} " for i in sraeo.get("descriptionSnippet"))
|
||||
deskripsi = "".join(
|
||||
f"{i['text']} " for i in sraeo.get("descriptionSnippet")
|
||||
)
|
||||
except:
|
||||
deskripsi = "-"
|
||||
message_text = f"<a href='{link}'>{title}</a>\n"
|
||||
|
|
@ -326,7 +375,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
url=link,
|
||||
description=deskripsi,
|
||||
thumb_url=thumb,
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="Watch Video 📹", url=link)]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton(text="Watch Video 📹", url=link)]]
|
||||
),
|
||||
)
|
||||
)
|
||||
await inline_query.answer(
|
||||
|
|
@ -345,7 +396,9 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
switch_pm_parameter="inline",
|
||||
)
|
||||
movie_name = inline_query.query.split(None, 1)[1].strip()
|
||||
search_results = await http.get(f"https://yasirapi.eu.org/imdb-search?q={movie_name}")
|
||||
search_results = await http.get(
|
||||
f"https://yasirapi.eu.org/imdb-search?q={movie_name}"
|
||||
)
|
||||
res = json.loads(search_results.text).get("result")
|
||||
oorse = []
|
||||
for midb in res:
|
||||
|
|
@ -354,7 +407,11 @@ async def inline_menu(_, inline_query: InlineQuery):
|
|||
stars = midb.get("s", "")
|
||||
imdb_url = f"https://imdb.com/title/{midb.get('id')}"
|
||||
year = f"({midb.get('y')})" if midb.get("y") else ""
|
||||
image_url = midb.get("i").get("imageUrl").replace(".jpg", "._V1_UX360.jpg") if midb.get("i") else "https://te.legra.ph/file/e263d10ff4f4426a7c664.jpg"
|
||||
image_url = (
|
||||
midb.get("i").get("imageUrl").replace(".jpg", "._V1_UX360.jpg")
|
||||
if midb.get("i")
|
||||
else "https://te.legra.ph/file/e263d10ff4f4426a7c664.jpg"
|
||||
)
|
||||
caption = f"<a href='{image_url}'>🎬</a>"
|
||||
caption += f"<a href='{imdb_url}'>{title} {year}</a>"
|
||||
oorse.append(
|
||||
|
|
@ -429,29 +486,53 @@ async def imdb_inl(_, query):
|
|||
url = f"https://www.imdb.com/title/{movie}/"
|
||||
resp = await get_content(url)
|
||||
sop = BeautifulSoup(resp, "lxml")
|
||||
r_json = json.loads(sop.find("script", attrs={"type": "application/ld+json"}).contents[0])
|
||||
r_json = json.loads(
|
||||
sop.find("script", attrs={"type": "application/ld+json"}).contents[0]
|
||||
)
|
||||
res_str = ""
|
||||
type = f"<code>{r_json['@type']}</code>" if r_json.get("@type") else ""
|
||||
if r_json.get("name"):
|
||||
try:
|
||||
tahun = sop.select('ul[data-testid="hero-title-block__metadata"]')[0].find(class_="sc-8c396aa2-2 itZqyK").text
|
||||
tahun = (
|
||||
sop.select('ul[data-testid="hero-title-block__metadata"]')[0]
|
||||
.find(class_="sc-8c396aa2-2 itZqyK")
|
||||
.text
|
||||
)
|
||||
except:
|
||||
tahun = "-"
|
||||
res_str += f"<b>📹 Judul:</b> <a href='{url}'>{r_json['name']} [{tahun}]</a> (<code>{type}</code>)\n"
|
||||
if r_json.get("alternateName"):
|
||||
res_str += f"<b>📢 AKA:</b> <code>{r_json.get('alternateName')}</code>\n\n"
|
||||
res_str += (
|
||||
f"<b>📢 AKA:</b> <code>{r_json.get('alternateName')}</code>\n\n"
|
||||
)
|
||||
else:
|
||||
res_str += "\n"
|
||||
if sop.select('li[data-testid="title-techspec_runtime"]'):
|
||||
durasi = sop.select('li[data-testid="title-techspec_runtime"]')[0].find(class_="ipc-metadata-list-item__content-container").text
|
||||
durasi = (
|
||||
sop.select('li[data-testid="title-techspec_runtime"]')[0]
|
||||
.find(class_="ipc-metadata-list-item__content-container")
|
||||
.text
|
||||
)
|
||||
res_str += f"<b>Durasi:</b> <code>{GoogleTranslator('auto', 'id').translate(durasi)}</code>\n"
|
||||
if r_json.get("contentRating"):
|
||||
res_str += f"<b>Kategori:</b> <code>{r_json['contentRating']}</code> \n"
|
||||
if r_json.get("aggregateRating"):
|
||||
res_str += f"<b>Peringkat:</b> <code>{r_json['aggregateRating']['ratingValue']}⭐️ dari {r_json['aggregateRating']['ratingCount']} pengguna</code> \n"
|
||||
if sop.select('li[data-testid="title-details-releasedate"]'):
|
||||
rilis = sop.select('li[data-testid="title-details-releasedate"]')[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link").text
|
||||
rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[0].find(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")["href"]
|
||||
rilis = (
|
||||
sop.select('li[data-testid="title-details-releasedate"]')[0]
|
||||
.find(
|
||||
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
|
||||
)
|
||||
.text
|
||||
)
|
||||
rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[
|
||||
0
|
||||
].find(
|
||||
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
|
||||
)[
|
||||
"href"
|
||||
]
|
||||
res_str += f"<b>Rilis:</b> <a href='https://www.imdb.com{rilis_url}'>{rilis}</a>\n"
|
||||
if r_json.get("genre"):
|
||||
genre = ""
|
||||
|
|
@ -465,14 +546,22 @@ async def imdb_inl(_, query):
|
|||
if sop.select('li[data-testid="title-details-origin"]'):
|
||||
country = "".join(
|
||||
f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, "
|
||||
for country in sop.select('li[data-testid="title-details-origin"]')[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")
|
||||
for country in sop.select('li[data-testid="title-details-origin"]')[
|
||||
0
|
||||
].findAll(
|
||||
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
|
||||
)
|
||||
)
|
||||
country = country[:-2]
|
||||
res_str += f"<b>Negara:</b> {country}\n"
|
||||
if sop.select('li[data-testid="title-details-languages"]'):
|
||||
language = "".join(
|
||||
f"#{lang.text.replace(' ', '_').replace('-', '_')}, "
|
||||
for lang in sop.select('li[data-testid="title-details-languages"]')[0].findAll(class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link")
|
||||
for lang in sop.select('li[data-testid="title-details-languages"]')[
|
||||
0
|
||||
].findAll(
|
||||
class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
|
||||
)
|
||||
)
|
||||
language = language[:-2]
|
||||
res_str += f"<b>Bahasa:</b> {language}\n"
|
||||
|
|
@ -503,7 +592,9 @@ async def imdb_inl(_, query):
|
|||
actors = actors[:-2]
|
||||
res_str += f"<b>Pemeran:</b> {actors}\n\n"
|
||||
if r_json.get("description"):
|
||||
summary = GoogleTranslator("auto", "id").translate(r_json.get("description"))
|
||||
summary = GoogleTranslator("auto", "id").translate(
|
||||
r_json.get("description")
|
||||
)
|
||||
res_str += f"<b>📜 Plot: </b> <code>{summary}</code>\n\n"
|
||||
if r_json.get("keywords"):
|
||||
keywords = r_json["keywords"].split(",")
|
||||
|
|
@ -514,7 +605,11 @@ async def imdb_inl(_, query):
|
|||
key_ = key_[:-2]
|
||||
res_str += f"<b>🔥 Kata Kunci:</b> {key_} \n"
|
||||
if sop.select('li[data-testid="award_information"]'):
|
||||
awards = sop.select('li[data-testid="award_information"]')[0].find(class_="ipc-metadata-list-item__list-content-item").text
|
||||
awards = (
|
||||
sop.select('li[data-testid="award_information"]')[0]
|
||||
.find(class_="ipc-metadata-list-item__list-content-item")
|
||||
.text
|
||||
)
|
||||
res_str += f"<b>🏆 Penghargaan:</b> <code>{GoogleTranslator('auto', 'id').translate(awards)}</code>\n\n"
|
||||
else:
|
||||
res_str += "\n"
|
||||
|
|
|
|||
|
|
@ -25,7 +25,16 @@ async def jsonify(_, message):
|
|||
try:
|
||||
await message.reply_text(
|
||||
f"<code>{the_real_message}</code>",
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="❌ Close", callback_data=f"close#{message.from_user.id}")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="❌ Close",
|
||||
callback_data=f"close#{message.from_user.id}",
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
except Exception as e:
|
||||
with open("json.text", "w+", encoding="utf8") as out_file:
|
||||
|
|
@ -35,6 +44,15 @@ async def jsonify(_, message):
|
|||
caption=f"<code>{str(e)}</code>",
|
||||
disable_notification=True,
|
||||
reply_to_message_id=reply_to_id,
|
||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text="❌ Close", callback_data=f"close#{message.from_user.id}")]]),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
text="❌ Close",
|
||||
callback_data=f"close#{message.from_user.id}",
|
||||
)
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
os.remove("json.text")
|
||||
|
|
|
|||
|
|
@ -2,7 +2,14 @@ import re
|
|||
|
||||
from pyrogram import filters
|
||||
|
||||
from database.karma_db import get_karma, get_karmas, is_karma_on, karma_off, karma_on, update_karma
|
||||
from database.karma_db import (
|
||||
get_karma,
|
||||
get_karmas,
|
||||
is_karma_on,
|
||||
karma_off,
|
||||
karma_on,
|
||||
update_karma,
|
||||
)
|
||||
from misskaty import app
|
||||
from misskaty.core.decorator.errors import capture_err
|
||||
from misskaty.core.decorator.permissions import adminsOnly
|
||||
|
|
@ -19,7 +26,9 @@ Give reputation to other people in group.
|
|||
karma_positive_group = 3
|
||||
karma_negative_group = 4
|
||||
|
||||
regex_upvote = r"^(\+|\+\+|\+1|thx|tnx|ty|thank you|thanx|thanks|pro|cool|good|makasih|👍|\+\+ .+)$"
|
||||
regex_upvote = (
|
||||
r"^(\+|\+\+|\+1|thx|tnx|ty|thank you|thanx|thanks|pro|cool|good|makasih|👍|\+\+ .+)$"
|
||||
)
|
||||
regex_downvote = r"^(-|--|-1|👎|-- .+)$"
|
||||
|
||||
n = "\n"
|
||||
|
|
@ -40,18 +49,30 @@ def section(
|
|||
text = (bold_ul(title) + n) if underline else bold(title) + n
|
||||
|
||||
for key, value in body.items():
|
||||
text += indent * w + bold(key) + ((value[0] + n) if isinstance(value, list) else mono(value))
|
||||
text += (
|
||||
indent * w
|
||||
+ bold(key)
|
||||
+ ((value[0] + n) if isinstance(value, list) else mono(value))
|
||||
)
|
||||
return text
|
||||
|
||||
|
||||
async def get_user_id_and_usernames(client) -> dict:
|
||||
with client.storage.lock, client.storage.conn:
|
||||
users = client.storage.conn.execute('SELECT * FROM peers WHERE type in ("user", "bot") AND username NOT null').fetchall()
|
||||
users = client.storage.conn.execute(
|
||||
'SELECT * FROM peers WHERE type in ("user", "bot") AND username NOT null'
|
||||
).fetchall()
|
||||
return {user[0]: user[3] for user in users}
|
||||
|
||||
|
||||
@app.on_message(
|
||||
filters.text & filters.group & filters.incoming & filters.reply & filters.regex(regex_upvote, re.IGNORECASE) & ~filters.via_bot & ~filters.bot,
|
||||
filters.text
|
||||
& filters.group
|
||||
& filters.incoming
|
||||
& filters.reply
|
||||
& filters.regex(regex_upvote, re.IGNORECASE)
|
||||
& ~filters.via_bot
|
||||
& ~filters.bot,
|
||||
group=karma_positive_group,
|
||||
)
|
||||
@capture_err
|
||||
|
|
@ -75,11 +96,19 @@ async def upvote(_, message):
|
|||
karma = 1
|
||||
new_karma = {"karma": karma}
|
||||
await update_karma(chat_id, await int_to_alpha(user_id), new_karma)
|
||||
await message.reply_text(f"Incremented Karma of {user_mention} By 1 \nTotal Points: {karma}")
|
||||
await message.reply_text(
|
||||
f"Incremented Karma of {user_mention} By 1 \nTotal Points: {karma}"
|
||||
)
|
||||
|
||||
|
||||
@app.on_message(
|
||||
filters.text & filters.group & filters.incoming & filters.reply & filters.regex(regex_downvote, re.IGNORECASE) & ~filters.via_bot & ~filters.bot,
|
||||
filters.text
|
||||
& filters.group
|
||||
& filters.incoming
|
||||
& filters.reply
|
||||
& filters.regex(regex_downvote, re.IGNORECASE)
|
||||
& ~filters.via_bot
|
||||
& ~filters.bot,
|
||||
group=karma_negative_group,
|
||||
)
|
||||
@capture_err
|
||||
|
|
@ -104,7 +133,9 @@ async def downvote(_, message):
|
|||
karma = 1
|
||||
new_karma = {"karma": karma}
|
||||
await update_karma(chat_id, await int_to_alpha(user_id), new_karma)
|
||||
await message.reply_text(f"Decremented Karma Of {user_mention} By 1 \nTotal Points: {karma}")
|
||||
await message.reply_text(
|
||||
f"Decremented Karma Of {user_mention} By 1 \nTotal Points: {karma}"
|
||||
)
|
||||
|
||||
|
||||
@app.on_message(filters.command("karma") & filters.group)
|
||||
|
|
|
|||
|
|
@ -25,7 +25,9 @@ from utils import get_file_id
|
|||
@app.on_message(filters.command(["mediainfo"], COMMAND_HANDLER))
|
||||
async def mediainfo(client, message):
|
||||
if message.reply_to_message and message.reply_to_message.media:
|
||||
process = await message.reply_text("`Sedang memproses, lama waktu tergantung ukuran file kamu...`", quote=True)
|
||||
process = await message.reply_text(
|
||||
"`Sedang memproses, lama waktu tergantung ukuran file kamu...`", quote=True
|
||||
)
|
||||
file_info = get_file_id(message.reply_to_message)
|
||||
if file_info is None:
|
||||
await process.edit_text("Balas ke format media yang valid")
|
||||
|
|
@ -67,9 +69,13 @@ async def mediainfo(client, message):
|
|||
link = message.text.split(" ", maxsplit=1)[1]
|
||||
process = await message.reply_text("`Mohon tunggu sejenak...`")
|
||||
try:
|
||||
output = subprocess.check_output(["mediainfo", f"{link}"]).decode("utf-8")
|
||||
output = subprocess.check_output(["mediainfo", f"{link}"]).decode(
|
||||
"utf-8"
|
||||
)
|
||||
except Exception:
|
||||
return await process.edit("Sepertinya link yang kamu kirim tidak valid, pastikan direct link dan bisa di download.")
|
||||
return await process.edit(
|
||||
"Sepertinya link yang kamu kirim tidak valid, pastikan direct link dan bisa di download."
|
||||
)
|
||||
title = "MissKaty Bot Mediainfo"
|
||||
body_text = f"""
|
||||
<img src='https://telegra.ph/file/72c99bbc89bbe4e178cc9.jpg' />
|
||||
|
|
@ -80,7 +86,9 @@ async def mediainfo(client, message):
|
|||
# response = await http.post(siteurl, data={"content": output, "extension": 'txt'} )
|
||||
# response = response.json()
|
||||
# spacebin = "https://spaceb.in/"+response['payload']['id']
|
||||
markup = InlineKeyboardMarkup([[InlineKeyboardButton(text="💬 Telegraph", url=tgraph)]])
|
||||
markup = InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton(text="💬 Telegraph", url=tgraph)]]
|
||||
)
|
||||
with io.BytesIO(str.encode(output)) as out_file:
|
||||
out_file.name = "MissKaty_Mediainfo.txt"
|
||||
await message.reply_document(
|
||||
|
|
@ -90,4 +98,6 @@ async def mediainfo(client, message):
|
|||
)
|
||||
await process.delete()
|
||||
except IndexError:
|
||||
return await message.reply_text("Gunakan command /mediainfo [link], atau reply telegram media dengan /mediainfo.")
|
||||
return await message.reply_text(
|
||||
"Gunakan command /mediainfo [link], atau reply telegram media dengan /mediainfo."
|
||||
)
|
||||
|
|
|
|||
|
|
@ -135,7 +135,9 @@ async def draw_meme_text(image_path, text):
|
|||
@app.on_message(filters.command(["mmf"], COMMAND_HANDLER))
|
||||
@capture_err
|
||||
async def memify(client, message):
|
||||
if message.reply_to_message and (message.reply_to_message.sticker or message.reply_to_message.photo):
|
||||
if message.reply_to_message and (
|
||||
message.reply_to_message.sticker or message.reply_to_message.photo
|
||||
):
|
||||
try:
|
||||
file = await message.reply_to_message.download()
|
||||
res = await draw_meme_text(file, message.text.split(None, 1)[1].strip())
|
||||
|
|
@ -145,6 +147,10 @@ async def memify(client, message):
|
|||
except:
|
||||
pass
|
||||
except:
|
||||
await message.reply("Gunakan command <b>/mmf <text></b> dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah.")
|
||||
await message.reply(
|
||||
"Gunakan command <b>/mmf <text></b> dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah."
|
||||
)
|
||||
else:
|
||||
await message.reply("Gunakan command <b>/mmf <text></b> dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah.")
|
||||
await message.reply(
|
||||
"Gunakan command <b>/mmf <text></b> dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah."
|
||||
)
|
||||
|
|
|
|||
|
|
@ -19,8 +19,7 @@ from deep_translator import GoogleTranslator
|
|||
from gtts import gTTS
|
||||
from pyrogram import Client, filters
|
||||
from pyrogram.errors import MessageTooLong, UserNotParticipant
|
||||
from pyrogram.types import (CallbackQuery, InlineKeyboardButton,
|
||||
InlineKeyboardMarkup)
|
||||
from pyrogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup
|
||||
|
||||
from misskaty import BOT_USERNAME, app
|
||||
from misskaty.core.decorator.errors import capture_err
|
||||
|
|
@ -54,13 +53,21 @@ def remove_html_tags(text):
|
|||
async def stackoverflow(client, message):
|
||||
if len(message.command) == 1:
|
||||
return await message.reply("Give a query to search in StackOverflow!")
|
||||
r = (await http.get(f"https://api.stackexchange.com/2.3/search/excerpts?order=asc&sort=relevance&q={message.command[1]}&accepted=True&migrated=False¬ice=False&wiki=False&site=stackoverflow")).json()
|
||||
r = (
|
||||
await http.get(
|
||||
f"https://api.stackexchange.com/2.3/search/excerpts?order=asc&sort=relevance&q={message.command[1]}&accepted=True&migrated=False¬ice=False&wiki=False&site=stackoverflow"
|
||||
)
|
||||
).json()
|
||||
msg = await message.reply("Getting data..")
|
||||
hasil = ""
|
||||
for count, data in enumerate(r["items"], start=1):
|
||||
question = data["question_id"]
|
||||
title = data["title"]
|
||||
snippet = remove_html_tags(data["excerpt"])[:80].replace("\n", "").replace(" ", "") if len(remove_html_tags(data["excerpt"])) > 80 else remove_html_tags(data["excerpt"]).replace("\n", "").replace(" ", "")
|
||||
snippet = (
|
||||
remove_html_tags(data["excerpt"])[:80].replace("\n", "").replace(" ", "")
|
||||
if len(remove_html_tags(data["excerpt"])) > 80
|
||||
else remove_html_tags(data["excerpt"]).replace("\n", "").replace(" ", "")
|
||||
)
|
||||
hasil += f"{count}. <a href='https://stackoverflow.com/questions/{question}'>{title}</a>\n<code>{snippet}</code>\n"
|
||||
try:
|
||||
await msg.edit(hasil)
|
||||
|
|
@ -79,7 +86,10 @@ async def gsearch(client, message):
|
|||
query = message.text.split(" ", maxsplit=1)[1]
|
||||
msg = await message.reply_text(f"**Googling** for `{query}` ...")
|
||||
try:
|
||||
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/61.0.3163.100 Safari/537.36"}
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
||||
"Chrome/61.0.3163.100 Safari/537.36"
|
||||
}
|
||||
html = await http.get(
|
||||
f"https://www.google.com/search?q={query}&gl=id&hl=id&num=17",
|
||||
headers=headers,
|
||||
|
|
@ -108,7 +118,9 @@ async def gsearch(client, message):
|
|||
arr = json.dumps(data, indent=2, ensure_ascii=False)
|
||||
parse = json.loads(arr)
|
||||
total = len(parse)
|
||||
res = "".join(f"<a href='{i['link']}'>{i['title']}</a>\n{i['snippet']}\n\n" for i in parse)
|
||||
res = "".join(
|
||||
f"<a href='{i['link']}'>{i['title']}</a>\n{i['snippet']}\n\n" for i in parse
|
||||
)
|
||||
except Exception:
|
||||
exc = traceback.format_exc()
|
||||
return await msg.edit(exc)
|
||||
|
|
@ -121,7 +133,9 @@ async def gsearch(client, message):
|
|||
@app.on_message(filters.command(["tr", "trans", "translate"], COMMAND_HANDLER))
|
||||
@capture_err
|
||||
async def translate(client, message):
|
||||
if message.reply_to_message and (message.reply_to_message.text or message.reply_to_message.caption):
|
||||
if message.reply_to_message and (
|
||||
message.reply_to_message.text or message.reply_to_message.caption
|
||||
):
|
||||
target_lang = "id" if len(message.command) == 1 else message.text.split()[1]
|
||||
text = message.reply_to_message.text or message.reply_to_message.caption
|
||||
else:
|
||||
|
|
@ -135,10 +149,14 @@ async def translate(client, message):
|
|||
try:
|
||||
my_translator = GoogleTranslator(source="auto", target=target_lang)
|
||||
result = my_translator.translate(text=text)
|
||||
await msg.edit(f"Translation using source = {my_translator.source} and target = {my_translator.target}\n\n-> {result}")
|
||||
await msg.edit(
|
||||
f"Translation using source = {my_translator.source} and target = {my_translator.target}\n\n-> {result}"
|
||||
)
|
||||
except MessageTooLong:
|
||||
url = await rentry(result)
|
||||
await msg.edit(f"Your translated text pasted to rentry because has long text:\n{url}")
|
||||
await msg.edit(
|
||||
f"Your translated text pasted to rentry because has long text:\n{url}"
|
||||
)
|
||||
except Exception as err:
|
||||
await msg.edit(f"Error: <code>{str(err)}</code>")
|
||||
|
||||
|
|
@ -146,7 +164,9 @@ async def translate(client, message):
|
|||
@app.on_message(filters.command(["tts"], COMMAND_HANDLER))
|
||||
@capture_err
|
||||
async def tts(_, message):
|
||||
if message.reply_to_message and (message.reply_to_message.text or message.reply_to_message.caption):
|
||||
if message.reply_to_message and (
|
||||
message.reply_to_message.text or message.reply_to_message.caption
|
||||
):
|
||||
if len(message.text.split()) == 1:
|
||||
target_lang = "id"
|
||||
else:
|
||||
|
|
@ -198,12 +218,16 @@ async def topho(client, message):
|
|||
if not message.reply_to_message or not message.reply_to_message.sticker:
|
||||
return await message.reply_text("Reply ke sticker untuk mengubah ke foto")
|
||||
if message.reply_to_message.sticker.is_animated:
|
||||
return await message.reply_text("Ini sticker animasi, command ini hanya untuk sticker biasa.")
|
||||
return await message.reply_text(
|
||||
"Ini sticker animasi, command ini hanya untuk sticker biasa."
|
||||
)
|
||||
photo = await client.download_media(
|
||||
message.reply_to_message.sticker.file_id,
|
||||
f"tostick_{message.from_user.id}.jpg",
|
||||
)
|
||||
await message.reply_photo(photo=photo, caption=f"Sticker -> Image\n@{client.me.username}")
|
||||
await message.reply_photo(
|
||||
photo=photo, caption=f"Sticker -> Image\n@{client.me.username}"
|
||||
)
|
||||
|
||||
os.remove(photo)
|
||||
except Exception as e:
|
||||
|
|
@ -236,10 +260,16 @@ async def showid(client, message):
|
|||
)
|
||||
file_info = get_file_id(message.reply_to_message)
|
||||
else:
|
||||
_id += "<b>➲ User ID</b>: " f"<code>{message.from_user.id if message.from_user else 'Anonymous'}</code>\n"
|
||||
_id += (
|
||||
"<b>➲ User ID</b>: "
|
||||
f"<code>{message.from_user.id if message.from_user else 'Anonymous'}</code>\n"
|
||||
)
|
||||
file_info = get_file_id(message)
|
||||
if file_info:
|
||||
_id += f"<b>{file_info.message_type}</b>: " f"<code>{file_info.file_id}</code>\n"
|
||||
_id += (
|
||||
f"<b>{file_info.message_type}</b>: "
|
||||
f"<code>{file_info.file_id}</code>\n"
|
||||
)
|
||||
await message.reply_text(_id, quote=True)
|
||||
|
||||
|
||||
|
|
@ -272,13 +302,23 @@ async def who_is(client, message):
|
|||
if message.chat.type in (("supergroup", "channel")):
|
||||
try:
|
||||
chat_member_p = await message.chat.get_member(from_user.id)
|
||||
joined_date = datetime.fromtimestamp(chat_member_p.joined_date or time.time()).strftime("%Y.%m.%d %H:%M:%S")
|
||||
message_out_str += "<b>➲Joined this Chat on:</b> <code>" f"{joined_date}" "</code>\n"
|
||||
joined_date = datetime.fromtimestamp(
|
||||
chat_member_p.joined_date or time.time()
|
||||
).strftime("%Y.%m.%d %H:%M:%S")
|
||||
message_out_str += (
|
||||
"<b>➲Joined this Chat on:</b> <code>" f"{joined_date}" "</code>\n"
|
||||
)
|
||||
except UserNotParticipant:
|
||||
pass
|
||||
if chat_photo := from_user.photo:
|
||||
local_user_photo = await client.download_media(message=chat_photo.big_file_id)
|
||||
buttons = [[InlineKeyboardButton("🔐 Close", callback_data=f"close#{message.from_user.id}")]]
|
||||
buttons = [
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
"🔐 Close", callback_data=f"close#{message.from_user.id}"
|
||||
)
|
||||
]
|
||||
]
|
||||
reply_markup = InlineKeyboardMarkup(buttons)
|
||||
await message.reply_photo(
|
||||
photo=local_user_photo,
|
||||
|
|
@ -289,7 +329,13 @@ async def who_is(client, message):
|
|||
)
|
||||
os.remove(local_user_photo)
|
||||
else:
|
||||
buttons = [[InlineKeyboardButton("🔐 Close", callback_data=f"close#{message.from_user.id}")]]
|
||||
buttons = [
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
"🔐 Close", callback_data=f"close#{message.from_user.id}"
|
||||
)
|
||||
]
|
||||
]
|
||||
reply_markup = InlineKeyboardMarkup(buttons)
|
||||
await message.reply_text(
|
||||
text=message_out_str,
|
||||
|
|
@ -308,7 +354,9 @@ async def close_callback(bot: Client, query: CallbackQuery):
|
|||
await query.message.delete()
|
||||
|
||||
|
||||
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10"}
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10"
|
||||
}
|
||||
|
||||
|
||||
async def get_content(url):
|
||||
|
|
@ -361,16 +409,22 @@ async def mdl_callback(bot: Client, query: CallbackQuery):
|
|||
try:
|
||||
res = (await http.get(f"https://kuryana.vercel.app/id/{slug}")).json()
|
||||
result += f"<b>Title:</b> <a href='{res['data']['link']}'>{res['data']['title']}</a>\n"
|
||||
result += f"<b>AKA:</b> <code>{res['data']['others']['also_known_as']}</code>\n\n"
|
||||
result += (
|
||||
f"<b>AKA:</b> <code>{res['data']['others']['also_known_as']}</code>\n\n"
|
||||
)
|
||||
result += f"<b>Rating:</b> <code>{res['data']['details']['score']}</code>\n"
|
||||
result += f"<b>Content Rating:</b> <code>{res['data']['details']['content_rating']}</code>\n"
|
||||
result += f"<b>Type:</b> <code>{res['data']['details']['type']}</code>\n"
|
||||
result += f"<b>Country:</b> <code>{res['data']['details']['country']}</code>\n"
|
||||
result += (
|
||||
f"<b>Country:</b> <code>{res['data']['details']['country']}</code>\n"
|
||||
)
|
||||
if res["data"]["details"]["type"] == "Movie":
|
||||
result += f"<b>Release Date:</b> <code>{res['data']['details']['release_date']}</code>\n"
|
||||
elif res["data"]["details"]["type"] == "Drama":
|
||||
result += f"<b>Episode:</b> {res['data']['details']['episodes']}\n"
|
||||
result += f"<b>Aired:</b> <code>{res['data']['details']['aired']}</code>\n"
|
||||
result += (
|
||||
f"<b>Aired:</b> <code>{res['data']['details']['aired']}</code>\n"
|
||||
)
|
||||
try:
|
||||
result += f"<b>Aired on:</b> <code>{res['data']['details']['aired_on']}</code>\n"
|
||||
except:
|
||||
|
|
@ -379,11 +433,17 @@ async def mdl_callback(bot: Client, query: CallbackQuery):
|
|||
result += f"<b>Original Network:</b> <code>{res['data']['details']['original_network']}</code>\n"
|
||||
except:
|
||||
pass
|
||||
result += f"<b>Duration:</b> <code>{res['data']['details']['duration']}</code>\n"
|
||||
result += f"<b>Genre:</b> <code>{res['data']['others']['genres']}</code>\n\n"
|
||||
result += (
|
||||
f"<b>Duration:</b> <code>{res['data']['details']['duration']}</code>\n"
|
||||
)
|
||||
result += (
|
||||
f"<b>Genre:</b> <code>{res['data']['others']['genres']}</code>\n\n"
|
||||
)
|
||||
result += f"<b>Synopsis:</b> <code>{res['data']['synopsis']}</code>\n"
|
||||
result += f"<b>Tags:</b> <code>{res['data']['others']['tags']}</code>\n"
|
||||
btn = InlineKeyboardMarkup([[InlineKeyboardButton("🎬 Open MyDramaList", url=res["data"]["link"])]])
|
||||
btn = InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton("🎬 Open MyDramaList", url=res["data"]["link"])]]
|
||||
)
|
||||
await query.message.edit_text(result, reply_markup=btn)
|
||||
except Exception as e:
|
||||
await query.message.edit_text(f"<b>ERROR:</b>\n<code>{e}</code>")
|
||||
|
|
|
|||
|
|
@ -5,7 +5,12 @@ from datetime import datetime
|
|||
import pytz
|
||||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||
from pyrogram import Client, __version__, filters
|
||||
from pyrogram.types import CallbackQuery, ChatPermissions, InlineKeyboardButton, InlineKeyboardMarkup
|
||||
from pyrogram.types import (
|
||||
CallbackQuery,
|
||||
ChatPermissions,
|
||||
InlineKeyboardButton,
|
||||
InlineKeyboardMarkup,
|
||||
)
|
||||
|
||||
from misskaty import BOT_USERNAME, app
|
||||
from misskaty.vars import LOG_CHANNEL, NIGHTMODE
|
||||
|
|
@ -48,7 +53,9 @@ async def job_close():
|
|||
jam = now.strftime("%H:%M")
|
||||
try:
|
||||
# version = check_output(["git log -1 --date=format:v%y.%m%d.%H%M --pretty=format:%cd"], shell=True).decode()
|
||||
reply_markup = InlineKeyboardMarkup([[InlineKeyboardButton(text="❤️", callback_data="nightmd")]])
|
||||
reply_markup = InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton(text="❤️", callback_data="nightmd")]]
|
||||
)
|
||||
await app.set_chat_permissions(
|
||||
-1001128045651,
|
||||
ChatPermissions(can_send_messages=False, can_invite_users=True),
|
||||
|
|
@ -86,7 +93,9 @@ async def job_close_ymoviez():
|
|||
jam = now.strftime("%H:%M")
|
||||
try:
|
||||
# version = check_output(["git log -1 --date=format:v%y.%m%d.%H%M --pretty=format:%cd"], shell=True).decode()
|
||||
reply_markup = InlineKeyboardMarkup([[InlineKeyboardButton(text="❤️", callback_data="nightmd")]])
|
||||
reply_markup = InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton(text="❤️", callback_data="nightmd")]]
|
||||
)
|
||||
await app.set_chat_permissions(
|
||||
-1001255283935,
|
||||
ChatPermissions(can_send_messages=False, can_invite_users=True),
|
||||
|
|
@ -123,7 +132,9 @@ async def job_open():
|
|||
jam = now.strftime("%H:%M")
|
||||
try:
|
||||
# version = check_output(["git log -1 --date=format:v%y.%m%d.%H%M --pretty=format:%cd"], shell=True).decode()
|
||||
reply_markup = InlineKeyboardMarkup([[InlineKeyboardButton(text="❤️", callback_data="nightmd")]])
|
||||
reply_markup = InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton(text="❤️", callback_data="nightmd")]]
|
||||
)
|
||||
await app.set_chat_permissions(
|
||||
-1001128045651,
|
||||
ChatPermissions(
|
||||
|
|
@ -167,7 +178,9 @@ async def job_open_ymoviez():
|
|||
jam = now.strftime("%H:%M")
|
||||
try:
|
||||
# version = check_output(["git log -1 --date=format:v%y.%m%d.%H%M --pretty=format:%cd"], shell=True).decode()
|
||||
reply_markup = InlineKeyboardMarkup([[InlineKeyboardButton(text="❤️", callback_data="nightmd")]])
|
||||
reply_markup = InlineKeyboardMarkup(
|
||||
[[InlineKeyboardButton(text="❤️", callback_data="nightmd")]]
|
||||
)
|
||||
await app.set_chat_permissions(
|
||||
-1001255283935,
|
||||
ChatPermissions(
|
||||
|
|
|
|||
|
|
@ -60,7 +60,9 @@ async def save_notee(_, message):
|
|||
_type = "text" if message.reply_to_message.text else "sticker"
|
||||
note = {
|
||||
"type": _type,
|
||||
"data": message.reply_to_message.text.markdown if _type == "text" else message.reply_to_message.sticker.file_id,
|
||||
"data": message.reply_to_message.text.markdown
|
||||
if _type == "text"
|
||||
else message.reply_to_message.sticker.file_id,
|
||||
}
|
||||
message.text.split()[0][0]
|
||||
chat_id = message.chat.id
|
||||
|
|
|
|||
|
|
@ -24,7 +24,9 @@ __HELP__ = "/ocr [reply to photo] - Read Text From Image"
|
|||
async def ocr(_, message):
|
||||
reply = message.reply_to_message
|
||||
if not reply or not reply.photo and not reply.sticker:
|
||||
return await message.reply_text(f"Reply photo with /{message.command[0]} command")
|
||||
return await message.reply_text(
|
||||
f"Reply photo with /{message.command[0]} command"
|
||||
)
|
||||
msg = await message.reply("Reading image...")
|
||||
try:
|
||||
file_path = await reply.download()
|
||||
|
|
|
|||
|
|
@ -66,14 +66,18 @@ async def create(_, message):
|
|||
reply = message.reply_to_message
|
||||
target = str(message.command[0]).split("@", maxsplit=1)[0]
|
||||
if not reply and len(message.command) < 2:
|
||||
return await message.reply_text(f"**Reply To A Message With /{target} or with command**")
|
||||
return await message.reply_text(
|
||||
f"**Reply To A Message With /{target} or with command**"
|
||||
)
|
||||
|
||||
msg = await message.reply_text("`Pasting to Rentry...`")
|
||||
data = ""
|
||||
limit = 1024 * 1024
|
||||
if reply and reply.document:
|
||||
if reply.document.file_size > limit:
|
||||
return await msg.edit(f"**You can only paste files smaller than {humanbytes(limit)}.**")
|
||||
return await msg.edit(
|
||||
f"**You can only paste files smaller than {humanbytes(limit)}.**"
|
||||
)
|
||||
if not pattern.search(reply.document.mime_type):
|
||||
return await msg.edit("**Only text files can be pasted.**")
|
||||
file = await reply.download()
|
||||
|
|
@ -96,7 +100,9 @@ async def create(_, message):
|
|||
if message.from_user.username:
|
||||
uname = f"@{message.from_user.username}"
|
||||
else:
|
||||
uname = f"[{message.from_user.first_name}](tg://user?id={message.from_user.id})"
|
||||
uname = (
|
||||
f"[{message.from_user.first_name}](tg://user?id={message.from_user.id})"
|
||||
)
|
||||
else:
|
||||
uname = message.sender_chat.title
|
||||
|
||||
|
|
@ -109,7 +115,13 @@ async def create(_, message):
|
|||
if not url:
|
||||
return await msg.edit("Text Too Short Or File Problems")
|
||||
button = [[InlineKeyboardButton("Open Link", url=url)]]
|
||||
button.append([InlineKeyboardButton("Share Link", url=f"https://telegram.me/share/url?url={url}")])
|
||||
button.append(
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
"Share Link", url=f"https://telegram.me/share/url?url={url}"
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
pasted = f"**Successfully pasted your data to Rentry<a href='{url}'>.</a>\n\nPaste by {uname}**"
|
||||
await msg.edit(pasted, reply_markup=InlineKeyboardMarkup(button))
|
||||
|
|
@ -120,14 +132,18 @@ async def create(_, message):
|
|||
reply = message.reply_to_message
|
||||
target = str(message.command[0]).split("@", maxsplit=1)[0]
|
||||
if not reply and len(message.command) < 2:
|
||||
return await message.reply_text(f"**Reply To A Message With /{target} or with command**")
|
||||
return await message.reply_text(
|
||||
f"**Reply To A Message With /{target} or with command**"
|
||||
)
|
||||
|
||||
msg = await message.reply_text("`Pasting to TempPaste...`")
|
||||
data = ""
|
||||
limit = 1024 * 1024
|
||||
if reply and reply.document:
|
||||
if reply.document.file_size > limit:
|
||||
return await msg.edit(f"**You can only paste files smaller than {humanbytes(limit)}.**")
|
||||
return await msg.edit(
|
||||
f"**You can only paste files smaller than {humanbytes(limit)}.**"
|
||||
)
|
||||
if not pattern.search(reply.document.mime_type):
|
||||
return await msg.edit("**Only text files can be pasted.**")
|
||||
file = await reply.download()
|
||||
|
|
@ -150,7 +166,9 @@ async def create(_, message):
|
|||
if message.from_user.username:
|
||||
uname = f"@{message.from_user.username}"
|
||||
else:
|
||||
uname = f"[{message.from_user.first_name}](tg://user?id={message.from_user.id})"
|
||||
uname = (
|
||||
f"[{message.from_user.first_name}](tg://user?id={message.from_user.id})"
|
||||
)
|
||||
else:
|
||||
uname = message.sender_chat.title
|
||||
|
||||
|
|
@ -174,7 +192,13 @@ async def create(_, message):
|
|||
if not url:
|
||||
return await msg.edit("Text Too Short Or File Problems")
|
||||
button = [[InlineKeyboardButton("Open Link", url=url)]]
|
||||
button.append([InlineKeyboardButton("Share Link", url=f"https://telegram.me/share/url?url={url}")])
|
||||
button.append(
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
"Share Link", url=f"https://telegram.me/share/url?url={url}"
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
pasted = f"**Successfully pasted your data to Tempaste<a href='{url}'>.</a>\n\nPaste by {uname}**"
|
||||
await msg.edit(pasted, reply_markup=InlineKeyboardMarkup(button))
|
||||
|
|
|
|||
|
|
@ -25,7 +25,9 @@ async def ping(_, message):
|
|||
end_t = time.time()
|
||||
time_taken_s = round(end_t - start_t, 3)
|
||||
try:
|
||||
await rm.edit(f"<b>🐈 MissKatyBot online.</b>\n\n<b>Ping:</b> <code>{time_taken_s} detik</code>\n<b>Uptime:</b> <code>{currentTime}</code>")
|
||||
await rm.edit(
|
||||
f"<b>🐈 MissKatyBot online.</b>\n\n<b>Ping:</b> <code>{time_taken_s} detik</code>\n<b>Uptime:</b> <code>{currentTime}</code>"
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
|
@ -51,7 +53,9 @@ async def ping_handler(_, message):
|
|||
check=True,
|
||||
capture_output=True,
|
||||
)
|
||||
resp_time = findall(r"time=.+m?s", shell.stdout, MULTILINE)[0].replace("time=", "")
|
||||
resp_time = findall(r"time=.+m?s", shell.stdout, MULTILINE)[0].replace(
|
||||
"time=", ""
|
||||
)
|
||||
|
||||
text += f" **{dc.upper()}:** {resp_time} ✅\n"
|
||||
except Exception:
|
||||
|
|
|
|||
|
|
@ -40,7 +40,11 @@ async def get_message_sender_name(m: Message):
|
|||
if m.forward_sender_name:
|
||||
return m.forward_sender_name
|
||||
elif m.forward_from:
|
||||
return f"{m.forward_from.first_name} {m.forward_from.last_name}" if m.forward_from.last_name else m.forward_from.first_name
|
||||
return (
|
||||
f"{m.forward_from.first_name} {m.forward_from.last_name}"
|
||||
if m.forward_from.last_name
|
||||
else m.forward_from.first_name
|
||||
)
|
||||
|
||||
elif m.forward_from_chat:
|
||||
return m.forward_from_chat.title
|
||||
|
|
@ -59,22 +63,42 @@ async def get_message_sender_name(m: Message):
|
|||
|
||||
async def get_custom_emoji(m: Message):
|
||||
if m.forward_date:
|
||||
return "" if m.forward_sender_name or not m.forward_from and m.forward_from_chat or not m.forward_from else m.forward_from.emoji_status.custom_emoji_id
|
||||
return (
|
||||
""
|
||||
if m.forward_sender_name
|
||||
or not m.forward_from
|
||||
and m.forward_from_chat
|
||||
or not m.forward_from
|
||||
else m.forward_from.emoji_status.custom_emoji_id
|
||||
)
|
||||
|
||||
return m.from_user.emoji_status.custom_emoji_id if m.from_user else ""
|
||||
|
||||
|
||||
async def get_message_sender_username(m: Message):
|
||||
if m.forward_date:
|
||||
if not m.forward_sender_name and not m.forward_from and m.forward_from_chat and m.forward_from_chat.username:
|
||||
if (
|
||||
not m.forward_sender_name
|
||||
and not m.forward_from
|
||||
and m.forward_from_chat
|
||||
and m.forward_from_chat.username
|
||||
):
|
||||
return m.forward_from_chat.username
|
||||
elif not m.forward_sender_name and not m.forward_from and m.forward_from_chat or m.forward_sender_name or not m.forward_from:
|
||||
elif (
|
||||
not m.forward_sender_name
|
||||
and not m.forward_from
|
||||
and m.forward_from_chat
|
||||
or m.forward_sender_name
|
||||
or not m.forward_from
|
||||
):
|
||||
return ""
|
||||
else:
|
||||
return m.forward_from.username or ""
|
||||
elif m.from_user and m.from_user.username:
|
||||
return m.from_user.username
|
||||
elif m.from_user or m.sender_chat and not m.sender_chat.username or not m.sender_chat:
|
||||
elif (
|
||||
m.from_user or m.sender_chat and not m.sender_chat.username or not m.sender_chat
|
||||
):
|
||||
return ""
|
||||
else:
|
||||
return m.sender_chat.username
|
||||
|
|
@ -82,14 +106,25 @@ async def get_message_sender_username(m: Message):
|
|||
|
||||
async def get_message_sender_photo(m: Message):
|
||||
if m.forward_date:
|
||||
if not m.forward_sender_name and not m.forward_from and m.forward_from_chat and m.forward_from_chat.photo:
|
||||
if (
|
||||
not m.forward_sender_name
|
||||
and not m.forward_from
|
||||
and m.forward_from_chat
|
||||
and m.forward_from_chat.photo
|
||||
):
|
||||
return {
|
||||
"small_file_id": m.forward_from_chat.photo.small_file_id,
|
||||
"small_photo_unique_id": m.forward_from_chat.photo.small_photo_unique_id,
|
||||
"big_file_id": m.forward_from_chat.photo.big_file_id,
|
||||
"big_photo_unique_id": m.forward_from_chat.photo.big_photo_unique_id,
|
||||
}
|
||||
elif not m.forward_sender_name and not m.forward_from and m.forward_from_chat or m.forward_sender_name or not m.forward_from:
|
||||
elif (
|
||||
not m.forward_sender_name
|
||||
and not m.forward_from
|
||||
and m.forward_from_chat
|
||||
or m.forward_sender_name
|
||||
or not m.forward_from
|
||||
):
|
||||
return ""
|
||||
else:
|
||||
return (
|
||||
|
|
@ -167,10 +202,16 @@ async def pyrogram_to_quotly(messages):
|
|||
the_message_dict_to_append["avatar"] = True
|
||||
the_message_dict_to_append["from"] = {}
|
||||
the_message_dict_to_append["from"]["id"] = await get_message_sender_id(message)
|
||||
the_message_dict_to_append["from"]["name"] = await get_message_sender_name(message)
|
||||
the_message_dict_to_append["from"]["username"] = await get_message_sender_username(message)
|
||||
the_message_dict_to_append["from"]["name"] = await get_message_sender_name(
|
||||
message
|
||||
)
|
||||
the_message_dict_to_append["from"][
|
||||
"username"
|
||||
] = await get_message_sender_username(message)
|
||||
the_message_dict_to_append["from"]["type"] = message.chat.type.name.lower()
|
||||
the_message_dict_to_append["from"]["photo"] = await get_message_sender_photo(message)
|
||||
the_message_dict_to_append["from"]["photo"] = await get_message_sender_photo(
|
||||
message
|
||||
)
|
||||
if message.reply_to_message:
|
||||
the_message_dict_to_append["replyMessage"] = {
|
||||
"name": await get_message_sender_name(message.reply_to_message),
|
||||
|
|
@ -226,7 +267,9 @@ async def msg_quotly_cmd(c: Client, m: Message):
|
|||
except Exception:
|
||||
return await m.reply_text("🤷🏻♂️")
|
||||
try:
|
||||
messages_one = await c.get_messages(chat_id=m.chat.id, message_ids=m.reply_to_message.id, replies=-1)
|
||||
messages_one = await c.get_messages(
|
||||
chat_id=m.chat.id, message_ids=m.reply_to_message.id, replies=-1
|
||||
)
|
||||
messages = [messages_one]
|
||||
except Exception:
|
||||
return await m.reply_text("🤷🏻♂️")
|
||||
|
|
|
|||
|
|
@ -34,7 +34,9 @@ __HELP__ = """
|
|||
|
||||
LOGGER = getLogger(__name__)
|
||||
|
||||
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"}
|
||||
headers = {
|
||||
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
|
||||
}
|
||||
|
||||
|
||||
@app.on_message(filters.command(["zonafilm"], COMMAND_HANDLER))
|
||||
|
|
@ -71,7 +73,11 @@ async def zonafilm(_, msg):
|
|||
await m.delete()
|
||||
for c, i in enumerate(data, start=1):
|
||||
msgs += f"<b>{c}. <a href='{i['link']}'>{i['judul']}</a></b>\n<b>Genre:</b> <code>{i['genre']}</code>\n"
|
||||
msgs += f"<b>Extract:</b> <code>/{msg.command[0]}_scrap {i['link']}</code>\n\n" if not "/tv/" in i["link"] else "\n"
|
||||
msgs += (
|
||||
f"<b>Extract:</b> <code>/{msg.command[0]}_scrap {i['link']}</code>\n\n"
|
||||
if not "/tv/" in i["link"]
|
||||
else "\n"
|
||||
)
|
||||
if len(head.encode("utf-8") + msgs.encode("utf-8")) >= 4000:
|
||||
await msg.reply(
|
||||
head + msgs,
|
||||
|
|
@ -588,7 +594,11 @@ async def pahe_scrap(_, msg):
|
|||
if not res["result"]:
|
||||
await m.delete()
|
||||
return await msg.reply("404 Result not FOUND!", True)
|
||||
head = f"<b>#Pahe Results For:</b> <code>{title}</code>\n\n" if title else f"<b>#Pahe Latest:</b>\n🌀 Use /{msg.command[0]} [title] to start search with title.\n\n"
|
||||
head = (
|
||||
f"<b>#Pahe Results For:</b> <code>{title}</code>\n\n"
|
||||
if title
|
||||
else f"<b>#Pahe Latest:</b>\n🌀 Use /{msg.command[0]} [title] to start search with title.\n\n"
|
||||
)
|
||||
await m.delete()
|
||||
msgs = ""
|
||||
for c, i in enumerate(res["result"], start=1):
|
||||
|
|
@ -649,7 +659,11 @@ async def terbit21_scrap(_, msg):
|
|||
msgs = ""
|
||||
for c, i in enumerate(res["result"], start=1):
|
||||
msgs += f"<b>{c}. <a href='{i['link']}'>{i['judul']}</a></b>\n<b>Category:</b> <code>{i['kategori']}</code>\n"
|
||||
msgs += f"💠 <b><a href='{i['dl']}'>Download</a></b>\n\n" if not re.search(r"Complete|Ongoing", i["kategori"]) else "\n"
|
||||
msgs += (
|
||||
f"💠 <b><a href='{i['dl']}'>Download</a></b>\n\n"
|
||||
if not re.search(r"Complete|Ongoing", i["kategori"])
|
||||
else "\n"
|
||||
)
|
||||
if len(head.encode("utf-8") + msgs.encode("utf-8")) >= 4000:
|
||||
await msg.reply(
|
||||
head + msgs,
|
||||
|
|
@ -701,7 +715,11 @@ async def terbit21_scrap(_, msg):
|
|||
msgs = ""
|
||||
for c, i in enumerate(res["result"], start=1):
|
||||
msgs += f"<b>{c}. <a href='{i['link']}'>{i['judul']}</a></b>\n<b>Category:</b> <code>{i['kategori']}</code>\n"
|
||||
msgs += f"💠 <b><a href='{i['dl']}'>Download</a></b>\n\n" if not re.search(r"Complete|Ongoing", i["kategori"]) else "\n"
|
||||
msgs += (
|
||||
f"💠 <b><a href='{i['dl']}'>Download</a></b>\n\n"
|
||||
if not re.search(r"Complete|Ongoing", i["kategori"])
|
||||
else "\n"
|
||||
)
|
||||
if len(head.encode("utf-8") + msgs.encode("utf-8")) >= 4000:
|
||||
await msg.reply(
|
||||
head + msgs,
|
||||
|
|
@ -761,7 +779,11 @@ async def lk21_scrap(_, msg):
|
|||
msgs = ""
|
||||
for c, i in enumerate(res["result"], start=1):
|
||||
msgs += f"<b>{c}. <a href='{i['link']}'>{i['judul']}</a></b>\n<b>Category:</b> <code>{i['kategori']}</code>\n"
|
||||
msgs += f"💠 <b><a href='{i['dl']}'>Download</a></b>\n\n" if not re.search(r"Complete|Ongoing", i["kategori"]) else "\n"
|
||||
msgs += (
|
||||
f"💠 <b><a href='{i['dl']}'>Download</a></b>\n\n"
|
||||
if not re.search(r"Complete|Ongoing", i["kategori"])
|
||||
else "\n"
|
||||
)
|
||||
if len(head.encode("utf-8") + msgs.encode("utf-8")) >= 4000:
|
||||
await msg.reply(
|
||||
head + msgs,
|
||||
|
|
@ -816,7 +838,11 @@ async def lk21_scrap(_, msg):
|
|||
msgs = ""
|
||||
for c, i in enumerate(res["result"], start=1):
|
||||
msgs += f"<b>{c}. <a href='{i['link']}'>{i['judul']}</a></b>\n<b>Category:</b> <code>{i['kategori']}</code>\n"
|
||||
msgs += f"💠 <b><a href='{i['dl']}'>Download</a></b>\n\n" if not re.search(r"Complete|Ongoing", i["kategori"]) else "\n"
|
||||
msgs += (
|
||||
f"💠 <b><a href='{i['dl']}'>Download</a></b>\n\n"
|
||||
if not re.search(r"Complete|Ongoing", i["kategori"])
|
||||
else "\n"
|
||||
)
|
||||
if len(head.encode("utf-8") + msgs.encode("utf-8")) >= 4000:
|
||||
await msg.reply(
|
||||
head + msgs,
|
||||
|
|
@ -891,7 +917,11 @@ async def gomov_scrap(_, msg):
|
|||
await m.delete()
|
||||
for c, i in enumerate(data, start=1):
|
||||
msgs += f"<b>{c}. <a href='{i['link']}'>{i['judul']}</a></b>\n<b>Genre:</b> <code>{i['genre']}</code>\n"
|
||||
msgs += f"<b>Extract:</b> <code>/{msg.command[0]}_scrap {i['link']}</code>\n\n" if not re.search(r"Series", i["genre"]) else "\n"
|
||||
msgs += (
|
||||
f"<b>Extract:</b> <code>/{msg.command[0]}_scrap {i['link']}</code>\n\n"
|
||||
if not re.search(r"Series", i["genre"])
|
||||
else "\n"
|
||||
)
|
||||
if len(head.encode("utf-8") + msgs.encode("utf-8")) >= 4000:
|
||||
await msg.reply(
|
||||
head + msgs,
|
||||
|
|
@ -937,7 +967,9 @@ async def gomov_scrap(_, msg):
|
|||
async def savefilm21_scrap(_, message):
|
||||
try:
|
||||
link = message.text.split(" ", maxsplit=1)[1]
|
||||
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"}
|
||||
headers = {
|
||||
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
|
||||
}
|
||||
|
||||
html = await http.get(link, headers=headers)
|
||||
soup = BeautifulSoup(html.text, "lxml")
|
||||
|
|
@ -958,7 +990,9 @@ async def savefilm21_scrap(_, message):
|
|||
),
|
||||
)
|
||||
except IndexError:
|
||||
return await message.reply(f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download")
|
||||
return await message.reply(
|
||||
f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download"
|
||||
)
|
||||
except Exception as e:
|
||||
await message.reply(f"ERROR: {str(e)}")
|
||||
|
||||
|
|
@ -968,14 +1002,18 @@ async def savefilm21_scrap(_, message):
|
|||
async def nodrakor_scrap(_, message):
|
||||
try:
|
||||
link = message.text.split(" ", maxsplit=1)[1]
|
||||
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"}
|
||||
headers = {
|
||||
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
|
||||
}
|
||||
|
||||
html = await http.get(link, headers=headers)
|
||||
soup = BeautifulSoup(html.text, "lxml")
|
||||
hasil = soup.find_all(class_="gmr-download-wrap clearfix")[0]
|
||||
await message.reply(f"<b>Hasil Scrap dari {link}</b>:\n{hasil}")
|
||||
except IndexError:
|
||||
return await message.reply(f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download")
|
||||
return await message.reply(
|
||||
f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download"
|
||||
)
|
||||
except Exception as e:
|
||||
await message.reply(f"ERROR: {str(e)}")
|
||||
|
||||
|
|
@ -986,7 +1024,9 @@ async def nodrakor_scrap(_, message):
|
|||
async def muviku_scrap(_, message):
|
||||
try:
|
||||
link = message.text.split(" ", maxsplit=1)[1]
|
||||
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"}
|
||||
headers = {
|
||||
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
|
||||
}
|
||||
|
||||
html = await http.get(link, headers=headers)
|
||||
soup = BeautifulSoup(html.text, "lxml")
|
||||
|
|
@ -1003,7 +1043,9 @@ async def muviku_scrap(_, message):
|
|||
res = "".join(f"<b>Host: {i['kualitas']}</b>\n{i['link']}\n\n" for i in data)
|
||||
await message.reply(res)
|
||||
except IndexError:
|
||||
return await message.reply(f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download")
|
||||
return await message.reply(
|
||||
f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download"
|
||||
)
|
||||
except Exception as e:
|
||||
await message.reply(f"ERROR: {str(e)}")
|
||||
|
||||
|
|
@ -1013,7 +1055,9 @@ async def muviku_scrap(_, message):
|
|||
async def melong_scrap(_, message):
|
||||
try:
|
||||
link = message.text.split(" ", maxsplit=1)[1]
|
||||
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"}
|
||||
headers = {
|
||||
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
|
||||
}
|
||||
|
||||
html = await http.get(link, headers=headers)
|
||||
soup = BeautifulSoup(html.text, "lxml")
|
||||
|
|
@ -1023,7 +1067,9 @@ async def melong_scrap(_, message):
|
|||
rep = f"{hardsub}\n{softsub}"
|
||||
await message.reply(rep)
|
||||
except IndexError:
|
||||
await message.reply(f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download")
|
||||
await message.reply(
|
||||
f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download"
|
||||
)
|
||||
|
||||
|
||||
@app.on_message(filters.command(["gomov_scrap", "zonafilm_scrap"], COMMAND_HANDLER))
|
||||
|
|
@ -1031,7 +1077,9 @@ async def melong_scrap(_, message):
|
|||
async def gomov_zonafilm_dl(_, message):
|
||||
try:
|
||||
link = message.text.split(" ", maxsplit=1)[1]
|
||||
headers = {"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"}
|
||||
headers = {
|
||||
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
|
||||
}
|
||||
|
||||
html = await http.get(link, headers=headers)
|
||||
soup = BeautifulSoup(html.text, "lxml")
|
||||
|
|
@ -1055,4 +1103,6 @@ async def gomov_zonafilm_dl(_, message):
|
|||
),
|
||||
)
|
||||
except IndexError:
|
||||
await message.reply(f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download")
|
||||
await message.reply(
|
||||
f"Gunakan command /{message.command[0]} <b>[link]</b> untuk scrap link download"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -2,10 +2,12 @@
|
|||
# Copyright (c) 2018-2022 Amano Team
|
||||
|
||||
import html
|
||||
|
||||
import regex
|
||||
from pyrogram import filters
|
||||
from pyrogram.errors import MessageEmpty
|
||||
from pyrogram.types import Message
|
||||
|
||||
from misskaty import app
|
||||
|
||||
|
||||
|
|
@ -32,7 +34,9 @@ async def sed(c: app, m: Message):
|
|||
return
|
||||
|
||||
try:
|
||||
res = regex.sub(pattern, replace_with, text, count=count, flags=rflags, timeout=1)
|
||||
res = regex.sub(
|
||||
pattern, replace_with, text, count=count, flags=rflags, timeout=1
|
||||
)
|
||||
except TimeoutError:
|
||||
return await m.reply_text("Oops, your regex pattern has run for too long.")
|
||||
except regex.error as e:
|
||||
|
|
|
|||
|
|
@ -9,8 +9,18 @@ from pyrogram import emoji, filters
|
|||
from pyrogram.errors import BadRequest, PeerIdInvalid, StickersetInvalid
|
||||
from pyrogram.file_id import FileId
|
||||
from pyrogram.raw.functions.messages import GetStickerSet, SendMedia
|
||||
from pyrogram.raw.functions.stickers import AddStickerToSet, CreateStickerSet, RemoveStickerFromSet
|
||||
from pyrogram.raw.types import DocumentAttributeFilename, InputDocument, InputMediaUploadedDocument, InputStickerSetItem, InputStickerSetShortName
|
||||
from pyrogram.raw.functions.stickers import (
|
||||
AddStickerToSet,
|
||||
CreateStickerSet,
|
||||
RemoveStickerFromSet,
|
||||
)
|
||||
from pyrogram.raw.types import (
|
||||
DocumentAttributeFilename,
|
||||
InputDocument,
|
||||
InputMediaUploadedDocument,
|
||||
InputStickerSetItem,
|
||||
InputStickerSetShortName,
|
||||
)
|
||||
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
||||
|
||||
from misskaty import BOT_USERNAME, app
|
||||
|
|
@ -27,7 +37,11 @@ __HELP__ = """
|
|||
|
||||
|
||||
def get_emoji_regex():
|
||||
e_list = [getattr(emoji, e).encode("unicode-escape").decode("ASCII") for e in dir(emoji) if not e.startswith("_")]
|
||||
e_list = [
|
||||
getattr(emoji, e).encode("unicode-escape").decode("ASCII")
|
||||
for e in dir(emoji)
|
||||
if not e.startswith("_")
|
||||
]
|
||||
# to avoid re.error excluding char that start with '*'
|
||||
e_sort = sorted([x for x in e_list if not x.startswith("*")], reverse=True)
|
||||
# Sort emojis by length to make sure multi-character emojis are
|
||||
|
|
@ -56,7 +70,11 @@ async def getsticker_(c, m):
|
|||
)
|
||||
await m.reply_to_message.reply_document(
|
||||
document=sticker_file,
|
||||
caption=(f"<b>Emoji:</b> {sticker.emoji}\n" f"<b>Sticker ID:</b> <code>{sticker.file_id}</code>\n\n" f"<b>Send by:</b> @{BOT_USERNAME}"),
|
||||
caption=(
|
||||
f"<b>Emoji:</b> {sticker.emoji}\n"
|
||||
f"<b>Sticker ID:</b> <code>{sticker.file_id}</code>\n\n"
|
||||
f"<b>Send by:</b> @{BOT_USERNAME}"
|
||||
),
|
||||
)
|
||||
shutil.rmtree(tempdir, ignore_errors=True)
|
||||
else:
|
||||
|
|
@ -66,7 +84,11 @@ async def getsticker_(c, m):
|
|||
@app.on_message(filters.command("stickerid", COMMAND_HANDLER) & filters.reply)
|
||||
async def getstickerid(c, m):
|
||||
if m.reply_to_message.sticker:
|
||||
await m.reply_text("The ID of this sticker is: <code>{stickerid}</code>".format(stickerid=m.reply_to_message.sticker.file_id))
|
||||
await m.reply_text(
|
||||
"The ID of this sticker is: <code>{stickerid}</code>".format(
|
||||
stickerid=m.reply_to_message.sticker.file_id
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@app.on_message(filters.command("unkang", COMMAND_HANDLER) & filters.reply)
|
||||
|
|
@ -85,7 +107,9 @@ async def getstickerid(c, m):
|
|||
except Exception as e:
|
||||
await pp.edit(f"Failed remove sticker from your pack.\n\nERR: {e}")
|
||||
else:
|
||||
await m.reply_text(f"Please reply sticker that created by {c.me.username} to remove sticker from your pack.")
|
||||
await m.reply_text(
|
||||
f"Please reply sticker that created by {c.me.username} to remove sticker from your pack."
|
||||
)
|
||||
|
||||
|
||||
@app.on_message(filters.command(["curi", "kang"], COMMAND_HANDLER))
|
||||
|
|
@ -116,7 +140,10 @@ async def kang_sticker(c, m):
|
|||
if "image" in reply.document.mime_type:
|
||||
# mime_type: image/webp
|
||||
resize = True
|
||||
elif MessageMediaType.VIDEO == reply.document.mime_type or MessageMediaType.ANIMATION == reply.document.mime_type:
|
||||
elif (
|
||||
MessageMediaType.VIDEO == reply.document.mime_type
|
||||
or MessageMediaType.ANIMATION == reply.document.mime_type
|
||||
):
|
||||
# mime_type: application/video
|
||||
videos = True
|
||||
convert = True
|
||||
|
|
@ -146,7 +173,10 @@ async def kang_sticker(c, m):
|
|||
packname = f"{pack_prefix}{packnum}_{m.from_user.id}_by_{c.me.username}"
|
||||
if len(m.command) > 1:
|
||||
# matches all valid emojis in input
|
||||
sticker_emoji = "".join(set(EMOJI_PATTERN.findall("".join(m.command[1:])))) or sticker_emoji
|
||||
sticker_emoji = (
|
||||
"".join(set(EMOJI_PATTERN.findall("".join(m.command[1:]))))
|
||||
or sticker_emoji
|
||||
)
|
||||
filename = await c.download_media(m.reply_to_message)
|
||||
if not filename:
|
||||
# Failed to download
|
||||
|
|
@ -157,7 +187,11 @@ async def kang_sticker(c, m):
|
|||
filename = "sticker.png"
|
||||
packname = f"c{m.from_user.id}_by_{c.me.username}"
|
||||
img_url = next(
|
||||
(m.text[y.offset : (y.offset + y.length)] for y in m.entities if y.type == "url"),
|
||||
(
|
||||
m.text[y.offset : (y.offset + y.length)]
|
||||
for y in m.entities
|
||||
if y.type == "url"
|
||||
),
|
||||
None,
|
||||
)
|
||||
|
||||
|
|
@ -177,10 +211,15 @@ async def kang_sticker(c, m):
|
|||
packnum = m.command.pop(2)
|
||||
packname = f"a{packnum}_{m.from_user.id}_by_{c.me.username}"
|
||||
if len(m.command) > 2:
|
||||
sticker_emoji = "".join(set(EMOJI_PATTERN.findall("".join(m.command[2:])))) or sticker_emoji
|
||||
sticker_emoji = (
|
||||
"".join(set(EMOJI_PATTERN.findall("".join(m.command[2:]))))
|
||||
or sticker_emoji
|
||||
)
|
||||
resize = True
|
||||
else:
|
||||
return await prog_msg.edit_text("Want me to guess the sticker? Please tag a sticker.")
|
||||
return await prog_msg.edit_text(
|
||||
"Want me to guess the sticker? Please tag a sticker."
|
||||
)
|
||||
try:
|
||||
if resize:
|
||||
filename = resize_image(filename)
|
||||
|
|
@ -199,7 +238,9 @@ async def kang_sticker(c, m):
|
|||
)
|
||||
if stickerset.set.count >= max_stickers:
|
||||
packnum += 1
|
||||
packname = f"{pack_prefix}_{packnum}_{m.from_user.id}_by_{c.me.username}"
|
||||
packname = (
|
||||
f"{pack_prefix}_{packnum}_{m.from_user.id}_by_{c.me.username}"
|
||||
)
|
||||
else:
|
||||
packname_found = True
|
||||
except StickersetInvalid:
|
||||
|
|
@ -279,7 +320,9 @@ async def kang_sticker(c, m):
|
|||
)
|
||||
|
||||
except BadRequest:
|
||||
return await prog_msg.edit_text("Your Sticker Pack is full if your pack is not in v1 Type /kang 1, if it is not in v2 Type /kang 2 and so on.")
|
||||
return await prog_msg.edit_text(
|
||||
"Your Sticker Pack is full if your pack is not in v1 Type /kang 1, if it is not in v2 Type /kang 2 and so on."
|
||||
)
|
||||
except Exception as all_e:
|
||||
await prog_msg.edit_text(f"{all_e.__class__.__name__} : {all_e}")
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -64,12 +64,18 @@ def get_subname(lang, url, format):
|
|||
async def ceksub(_, m):
|
||||
cmd = m.text.split(" ", 1)
|
||||
if len(cmd) == 1:
|
||||
return await m.reply(f"Gunakan command /{m.command[0]} [link] untuk mengecek subtitle dan audio didalam video.")
|
||||
return await m.reply(
|
||||
f"Gunakan command /{m.command[0]} [link] untuk mengecek subtitle dan audio didalam video."
|
||||
)
|
||||
link = cmd[1]
|
||||
start_time = perf_counter()
|
||||
pesan = await m.reply("Sedang memproses perintah..", quote=True)
|
||||
try:
|
||||
res = (await shell_exec(f"ffprobe -loglevel 0 -print_format json -show_format -show_streams {link}"))[0]
|
||||
res = (
|
||||
await shell_exec(
|
||||
f"ffprobe -loglevel 0 -print_format json -show_format -show_streams {link}"
|
||||
)
|
||||
)[0]
|
||||
details = json.loads(res)
|
||||
buttons = []
|
||||
for stream in details["streams"]:
|
||||
|
|
@ -102,19 +108,32 @@ async def ceksub(_, m):
|
|||
)
|
||||
except Exception:
|
||||
traceback.format_exc()
|
||||
await pesan.edit(f"Failed extract media, make sure your link is not protected by WAF or maybe inaccessible for bot.")
|
||||
await pesan.edit(
|
||||
f"Failed extract media, make sure your link is not protected by WAF or maybe inaccessible for bot."
|
||||
)
|
||||
|
||||
|
||||
@app.on_message(filters.command(["converttosrt"], COMMAND_HANDLER))
|
||||
@capture_err
|
||||
async def convertsrt(c, m):
|
||||
reply = m.reply_to_message
|
||||
if not reply and reply.document and (reply.document.file_name.endswith(".vtt") or reply.document.file_name.endswith(".ass")):
|
||||
return await m.reply(f"Use command /{m.command[0]} by reply to .ass or .vtt file, to convert subtitle from .ass or .vtt to srt.")
|
||||
if (
|
||||
not reply
|
||||
and reply.document
|
||||
and (
|
||||
reply.document.file_name.endswith(".vtt")
|
||||
or reply.document.file_name.endswith(".ass")
|
||||
)
|
||||
):
|
||||
return await m.reply(
|
||||
f"Use command /{m.command[0]} by reply to .ass or .vtt file, to convert subtitle from .ass or .vtt to srt."
|
||||
)
|
||||
msg = await m.reply("⏳ Converting...")
|
||||
dl = await reply.download()
|
||||
filename = dl.split("/", 3)[3]
|
||||
LOGGER.info(f"ConvertSub: {filename} by {m.from_user.first_name} [{m.from_user.id}]")
|
||||
LOGGER.info(
|
||||
f"ConvertSub: {filename} by {m.from_user.first_name} [{m.from_user.id}]"
|
||||
)
|
||||
(await shell_exec(f"mediaextract -i '{dl}' '{filename}.srt'"))[0]
|
||||
c_time = time()
|
||||
await m.reply_document(
|
||||
|
|
@ -154,8 +173,12 @@ async def stream_extract(bot, update):
|
|||
format = "srt"
|
||||
start_time = perf_counter()
|
||||
namafile = get_subname(lang, link, format)
|
||||
LOGGER.info(f"ExtractSub: {namafile} by {update.from_user.first_name} [{update.from_user.id}]")
|
||||
extract = (await shell_exec(f"mediaextract -i {link} -map {map} '{namafile}'"))[0]
|
||||
LOGGER.info(
|
||||
f"ExtractSub: {namafile} by {update.from_user.first_name} [{update.from_user.id}]"
|
||||
)
|
||||
extract = (await shell_exec(f"mediaextract -i {link} -map {map} '{namafile}'"))[
|
||||
0
|
||||
]
|
||||
end_time = perf_counter()
|
||||
timelog = "{:.2f}".format(end_time - start_time) + " second"
|
||||
c_time = time()
|
||||
|
|
@ -172,4 +195,6 @@ async def stream_extract(bot, update):
|
|||
except:
|
||||
pass
|
||||
except Exception as e:
|
||||
await update.message.edit(f"Failed extract sub, Maybe unsupported format..\n\nLink: {link}\nERR: {e}")
|
||||
await update.message.edit(
|
||||
f"Failed extract sub, Maybe unsupported format..\n\nLink: {link}\nERR: {e}"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -11,7 +11,12 @@ from datetime import datetime
|
|||
|
||||
from pyrogram import enums, filters
|
||||
from pyrogram.raw import functions
|
||||
from pyrogram.types import ChatEventFilter, InlineKeyboardButton, InlineKeyboardMarkup, Message
|
||||
from pyrogram.types import (
|
||||
ChatEventFilter,
|
||||
InlineKeyboardButton,
|
||||
InlineKeyboardMarkup,
|
||||
Message,
|
||||
)
|
||||
|
||||
from misskaty import app, user
|
||||
|
||||
|
|
@ -36,12 +41,22 @@ async def add_keep(_, message: Message):
|
|||
|
||||
# @user.on_deleted_messages(filters.chat([-1001455886928, -1001255283935]))
|
||||
async def del_msg(client, message):
|
||||
async for a in user.get_chat_event_log(message[0].chat.id, limit=1, filters=ChatEventFilter(deleted_messages=True)):
|
||||
async for a in user.get_chat_event_log(
|
||||
message[0].chat.id, limit=1, filters=ChatEventFilter(deleted_messages=True)
|
||||
):
|
||||
try:
|
||||
ustat = (await user.get_chat_member(message[0].chat.id, a.deleted_message.from_user.id)).status
|
||||
ustat = (
|
||||
await user.get_chat_member(
|
||||
message[0].chat.id, a.deleted_message.from_user.id
|
||||
)
|
||||
).status
|
||||
except:
|
||||
ustat = enums.ChatMemberStatus.MEMBER
|
||||
if ustat in [enums.ChatMemberStatus.ADMINISTRATOR, enums.ChatMemberStatus.OWNER] or a.deleted_message.from_user.is_bot:
|
||||
if (
|
||||
ustat
|
||||
in [enums.ChatMemberStatus.ADMINISTRATOR, enums.ChatMemberStatus.OWNER]
|
||||
or a.deleted_message.from_user.is_bot
|
||||
):
|
||||
return
|
||||
if a.user.id == a.deleted_message.from_user.id:
|
||||
if a.deleted_message.text:
|
||||
|
|
@ -59,7 +74,9 @@ async def del_msg(client, message):
|
|||
# @user.on_edited_message(filters.text & filters.chat(-1001455886928))
|
||||
async def edit_msg(client, message):
|
||||
try:
|
||||
ustat = (await user.get_chat_member(message.chat.id, message.from_user.id)).status
|
||||
ustat = (
|
||||
await user.get_chat_member(message.chat.id, message.from_user.id)
|
||||
).status
|
||||
except:
|
||||
ustat = enums.ChatMemberStatus.MEMBER
|
||||
if message.from_user.is_bot or ustat in [
|
||||
|
|
@ -67,8 +84,12 @@ async def edit_msg(client, message):
|
|||
enums.ChatMemberStatus.OWNER,
|
||||
]:
|
||||
return
|
||||
async for a in user.get_chat_event_log(message.chat.id, limit=1, filters=ChatEventFilter(edited_messages=True)):
|
||||
if a.old_message.text.startswith(("/mirror", "/leech", "/unzipmirror", "/unzipleech")):
|
||||
async for a in user.get_chat_event_log(
|
||||
message.chat.id, limit=1, filters=ChatEventFilter(edited_messages=True)
|
||||
):
|
||||
if a.old_message.text.startswith(
|
||||
("/mirror", "/leech", "/unzipmirror", "/unzipleech")
|
||||
):
|
||||
await app.send_message(
|
||||
message.chat.id,
|
||||
f"#EDITED_MESSAGE\n\n<a href='tg://user?id={a.user.id}'>{a.user.first_name}</a> mengedit pesannya 🧐.\n<b>Pesan:</b> {a.old_message.text}",
|
||||
|
|
@ -120,7 +141,10 @@ async def join_date(app, message: Message):
|
|||
with open("joined_date.txt", "w", encoding="utf8") as f:
|
||||
f.write("Join Date First Name\n")
|
||||
for member in members:
|
||||
f.write(str(datetime.fromtimestamp(member[1]).strftime("%y-%m-%d %H:%M")) + f" {member[0]}\n")
|
||||
f.write(
|
||||
str(datetime.fromtimestamp(member[1]).strftime("%y-%m-%d %H:%M"))
|
||||
+ f" {member[0]}\n"
|
||||
)
|
||||
|
||||
await user.send_document(message.chat.id, "joined_date.txt")
|
||||
os.remove("joined_date.txt")
|
||||
|
|
@ -147,7 +171,9 @@ async def recent_act(client, message):
|
|||
limit=0,
|
||||
)
|
||||
)
|
||||
with open(f"recent_actions_{message.chat.id}.txt", "w", encoding="utf8") as log_file:
|
||||
with open(
|
||||
f"recent_actions_{message.chat.id}.txt", "w", encoding="utf8"
|
||||
) as log_file:
|
||||
log_file.write(str(full_log))
|
||||
await message.reply_document(f"recent_actions_{message.chat.id}.txt")
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,11 @@ __HELP__ = """
|
|||
async def take_ss(_, message):
|
||||
if len(message.command) == 1:
|
||||
return await message.reply("Give A Url To Fetch Screenshot.")
|
||||
url = message.command[1] if message.command[1].startswith("http") else f"https://{message.command[1]}"
|
||||
url = (
|
||||
message.command[1]
|
||||
if message.command[1].startswith("http")
|
||||
else f"https://{message.command[1]}"
|
||||
)
|
||||
filename = f"imageToSave_{message.from_user.id}.png"
|
||||
m = await message.reply("Capturing screenshot...")
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -4,7 +4,12 @@ from uuid import uuid4
|
|||
|
||||
from iytdl import iYTDL, main
|
||||
from pyrogram import filters
|
||||
from pyrogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup, InputMediaPhoto
|
||||
from pyrogram.types import (
|
||||
CallbackQuery,
|
||||
InlineKeyboardButton,
|
||||
InlineKeyboardMarkup,
|
||||
InputMediaPhoto,
|
||||
)
|
||||
|
||||
from misskaty import app
|
||||
from misskaty.core.decorator.errors import capture_err
|
||||
|
|
@ -12,7 +17,9 @@ from misskaty.helper.http import http
|
|||
from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL
|
||||
|
||||
LOGGER = getLogger(__name__)
|
||||
regex = recompile(r"(https?://)?(www\.)?(youtube|youtu|youtube-nocookie)\.(com|be)/(watch\?v=|embed/|v/|.+\?v=)?(?P<id>[A-Za-z0-9\-=_]{11})")
|
||||
regex = recompile(
|
||||
r"(https?://)?(www\.)?(youtube|youtu|youtube-nocookie)\.(com|be)/(watch\?v=|embed/|v/|.+\?v=)?(?P<id>[A-Za-z0-9\-=_]{11})"
|
||||
)
|
||||
YT_DB = {}
|
||||
|
||||
|
||||
|
|
@ -60,7 +67,9 @@ async def ytdownv2(_, message):
|
|||
if len(message.command) == 1:
|
||||
return await message.reply("Please input a valid YT-DLP Supported URL")
|
||||
url = message.text.split(" ", maxsplit=1)[1]
|
||||
async with iYTDL(log_group_id=0, cache_path="cache", ffmpeg_location="/usr/bin/mediaextract") as ytdl:
|
||||
async with iYTDL(
|
||||
log_group_id=0, cache_path="cache", ffmpeg_location="/usr/bin/mediaextract"
|
||||
) as ytdl:
|
||||
x = await ytdl.parse(url)
|
||||
if x is None:
|
||||
return await message.reply("Failed parse URL, check logs..")
|
||||
|
|
@ -75,9 +84,13 @@ async def ytdl_listall_callback(_, cq: CallbackQuery):
|
|||
if cq.from_user.id != cq.message.reply_to_message.from_user.id:
|
||||
return await cq.answer("Not your task", True)
|
||||
callback = cq.data.split("|")
|
||||
async with iYTDL(log_group_id=0, cache_path="cache", ffmpeg_location="/usr/bin/mediaextract") as ytdl:
|
||||
async with iYTDL(
|
||||
log_group_id=0, cache_path="cache", ffmpeg_location="/usr/bin/mediaextract"
|
||||
) as ytdl:
|
||||
media, buttons = await ytdl.listview(callback[1])
|
||||
await cq.edit_message_media(media=media, reply_markup=buttons.add(cq.from_user.id))
|
||||
await cq.edit_message_media(
|
||||
media=media, reply_markup=buttons.add(cq.from_user.id)
|
||||
)
|
||||
|
||||
|
||||
@app.on_callback_query(filters.regex(r"^yt_extract_info"))
|
||||
|
|
@ -86,7 +99,9 @@ async def ytdl_extractinfo_callback(_, cq: CallbackQuery):
|
|||
return await cq.answer("Not your task", True)
|
||||
await cq.answer("Please Wait...")
|
||||
callback = cq.data.split("|")
|
||||
async with iYTDL(log_group_id=0, cache_path="cache", ffmpeg_location="/usr/bin/mediaextract") as ytdl:
|
||||
async with iYTDL(
|
||||
log_group_id=0, cache_path="cache", ffmpeg_location="/usr/bin/mediaextract"
|
||||
) as ytdl:
|
||||
if data := await ytdl.extract_info_from_key(callback[1]):
|
||||
if len(key) == 11:
|
||||
await cq.edit_message_text(
|
||||
|
|
@ -112,7 +127,10 @@ async def ytdl_gendl_callback(_, cq: CallbackQuery):
|
|||
callback = cq.data.split("|")
|
||||
key = callback[1]
|
||||
if callback[0] == "yt_gen":
|
||||
if match := regex.match(cq.message.reply_to_message.command[1]) or len(callback) == 2:
|
||||
if (
|
||||
match := regex.match(cq.message.reply_to_message.command[1])
|
||||
or len(callback) == 2
|
||||
):
|
||||
x = await main.Extractor().get_download_button(key)
|
||||
await cq.edit_message_caption(caption=x.caption, reply_markup=x.buttons)
|
||||
else:
|
||||
|
|
@ -128,7 +146,9 @@ async def ytdl_gendl_callback(_, cq: CallbackQuery):
|
|||
ffmpeg_location="/usr/bin/mediaextract",
|
||||
delete_media=True,
|
||||
) as ytdl:
|
||||
upload_key = await ytdl.download(cq.message.reply_to_message.command[1], uid, format_, cq, True, 3)
|
||||
upload_key = await ytdl.download(
|
||||
cq.message.reply_to_message.command[1], uid, format_, cq, True, 3
|
||||
)
|
||||
await ytdl.upload(app, upload_key, format_, cq, True)
|
||||
else:
|
||||
uid = callback[2]
|
||||
|
|
@ -143,7 +163,9 @@ async def ytdl_gendl_callback(_, cq: CallbackQuery):
|
|||
ffmpeg_location="/usr/bin/mediaextract",
|
||||
delete_media=True,
|
||||
) as ytdl:
|
||||
upload_key = await ytdl.download("https://www.youtube.com/watch?v=" + key, uid, format_, cq, True, 3)
|
||||
upload_key = await ytdl.download(
|
||||
"https://www.youtube.com/watch?v=" + key, uid, format_, cq, True, 3
|
||||
)
|
||||
await ytdl.upload(app, upload_key, format_, cq, True)
|
||||
|
||||
|
||||
|
|
@ -164,7 +186,9 @@ async def ytdl_scroll_callback(_, cq: CallbackQuery):
|
|||
out += f"\n<b>❯ Uploader:</b> <a href={i['channel']['link']}>{i['channel']['name']}</a>\n\n"
|
||||
scroll_btn = [
|
||||
[
|
||||
InlineKeyboardButton(f"Back", callback_data=f"ytdl_scroll|{search_key}|{page-1}"),
|
||||
InlineKeyboardButton(
|
||||
f"Back", callback_data=f"ytdl_scroll|{search_key}|{page-1}"
|
||||
),
|
||||
InlineKeyboardButton(
|
||||
f"{page+1}/{len(search['result'])}",
|
||||
callback_data=f"ytdl_scroll|{search_key}|{page+1}",
|
||||
|
|
@ -179,7 +203,9 @@ async def ytdl_scroll_callback(_, cq: CallbackQuery):
|
|||
scroll_btn = [[scroll_btn.pop().pop(0)]]
|
||||
btn = [[InlineKeyboardButton("Download", callback_data=f"yt_gen|{i['id']}")]]
|
||||
btn = InlineKeyboardMarkup(scroll_btn + btn)
|
||||
await cq.edit_message_media(InputMediaPhoto(await get_ytthumb(i["id"]), caption=out), reply_markup=btn)
|
||||
await cq.edit_message_media(
|
||||
InputMediaPhoto(await get_ytthumb(i["id"]), caption=out), reply_markup=btn
|
||||
)
|
||||
|
||||
|
||||
async def get_ytthumb(videoid: str):
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from logging import getLogger
|
||||
from os import environ
|
||||
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv("config.env", override=True)
|
||||
|
|
@ -52,9 +53,13 @@ FORWARD_FROM_CHAT_ID = list(
|
|||
}
|
||||
)
|
||||
# Forward To Chat ID
|
||||
FORWARD_TO_CHAT_ID = list({int(x) for x in environ.get("FORWARD_TO_CHAT_ID", "-1001210537567").split()})
|
||||
FORWARD_TO_CHAT_ID = list(
|
||||
{int(x) for x in environ.get("FORWARD_TO_CHAT_ID", "-1001210537567").split()}
|
||||
)
|
||||
FORWARD_FILTERS = list(set(environ.get("FORWARD_FILTERS", "video document").split()))
|
||||
BLOCK_FILES_WITHOUT_EXTENSIONS = bool(environ.get("BLOCK_FILES_WITHOUT_EXTENSIONS", True))
|
||||
BLOCK_FILES_WITHOUT_EXTENSIONS = bool(
|
||||
environ.get("BLOCK_FILES_WITHOUT_EXTENSIONS", True)
|
||||
)
|
||||
BLOCKED_EXTENSIONS = list(
|
||||
set(
|
||||
environ.get(
|
||||
|
|
|
|||
16
utils.py
16
utils.py
|
|
@ -1,18 +1,20 @@
|
|||
import asyncio
|
||||
import os
|
||||
from datetime import datetime, timedelta
|
||||
from logging import getLogger
|
||||
from typing import Union
|
||||
|
||||
import emoji
|
||||
from pyrogram.errors import (
|
||||
FloodWait,
|
||||
InputUserDeactivated,
|
||||
PeerIdInvalid,
|
||||
UserIsBlocked,
|
||||
)
|
||||
import asyncio
|
||||
from logging import getLogger
|
||||
from pyrogram.types import Message
|
||||
from typing import Union
|
||||
import os
|
||||
import emoji
|
||||
from datetime import datetime, timedelta
|
||||
from database.users_chats_db import db
|
||||
|
||||
from database.afk_db import is_cleanmode_on
|
||||
from database.users_chats_db import db
|
||||
from misskaty import app, cleanmode
|
||||
|
||||
LOGGER = getLogger(__name__)
|
||||
|
|
|
|||
Loading…
Reference in a new issue