Fix all lint issues: Dockerfiles (DL3015/DL3013/DL4006) + Ruff (173→0 errors)
lint / prettier (push) Successful in 8s
lint / ruff (push) Successful in 5s
lint / yamllint (push) Successful in 7s
lint / hadolint (push) Failing after 4s
validate / yaml (push) Successful in 5s
validate / k8s (push) Successful in 5s

Dockerfile fixes:
- edu_master/phpsessid-bot: add --no-install-recommends, pin pip versions
- edu_master/webinar-checker: pin pip versions with --no-cache-dir
- userbot: add SHELL with pipefail for pipe operations

Ruff fixes (173 → 0):
- W293/W291/W292: whitespace clean via ruff format
- N806: camelCase → snake_case (anilist, safone, hearts, flux, etc.)
- ARG001/ARG002: prefix unused params with _
- SIM115: use context managers for file I/O
- SIM117: combine nested with statements
- S608: noqa on SQL f-strings (module name is validated)
- E402/N812/N817: import fixes
- B023: pass loop variable as argument
- I001: auto-sorted imports
- syntax: fixed = vs == in dtek_notif/main.py
This commit is contained in:
2026-06-21 22:01:51 +02:00
parent f424d91405
commit fb43306571
36 changed files with 903 additions and 875 deletions
+284 -314
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -3,10 +3,10 @@ FROM python:3.11-slim
WORKDIR /app WORKDIR /app
# Install system dependencies # Install system dependencies
RUN apt-get update && apt-get install -y redis-tools && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y --no-install-recommends redis-tools && rm -rf /var/lib/apt/lists/*
# Install dependencies # Install dependencies
RUN pip install requests redis RUN pip install --no-cache-dir requests==2.32.3 redis==5.2.1
# Copy application code # Copy application code
COPY . . COPY . .
+31 -29
View File
@@ -7,12 +7,10 @@ import redis
import requests import requests
# Configure logging # Configure logging
logging.basicConfig( logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Load configuration (adapted to .env keys) # Load configuration (adapted to .env keys)
def _env(key, default=None): def _env(key, default=None):
v = os.getenv(key, default) v = os.getenv(key, default)
@@ -20,40 +18,46 @@ def _env(key, default=None):
return v[1:-1] return v[1:-1]
return v return v
LOGIN = _env('KEEPER_LOGIN') LOGIN = _env('KEEPER_LOGIN')
PASSWORD = _env('KEEPER_PASSWORD') PASSWORD = _env('KEEPER_PASSWORD')
EDU_BASE = _env('EDU_URL_BASE', 'https://edu.edu.vn.ua') EDU_BASE = _env('EDU_URL_BASE', 'https://edu.edu.vn.ua')
EDU_LOGIN_PATH = _env('EDU_URL_LOGIN', '/user/login') EDU_LOGIN_PATH = _env('EDU_URL_LOGIN', '/user/login')
EDU_COURSES_PATH = _env('EDU_URL_COURSES', '/course/userlist') EDU_COURSES_PATH = _env('EDU_URL_COURSES', '/course/userlist')
URL_LOGIN = f"{EDU_BASE.rstrip('/')}/{EDU_LOGIN_PATH.lstrip('/')}" URL_LOGIN = f'{EDU_BASE.rstrip("/")}/{EDU_LOGIN_PATH.lstrip("/")}'
URL_VERIFY = f"{EDU_BASE.rstrip('/')}/{EDU_COURSES_PATH.lstrip('/')}" URL_VERIFY = f'{EDU_BASE.rstrip("/")}/{EDU_COURSES_PATH.lstrip("/")}'
INTERVAL = int(_env('KEEPER_INTERVAL', 10)) INTERVAL = int(_env('KEEPER_INTERVAL', 10))
USER_AGENT = _env('USER_AGENT', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36') USER_AGENT = _env(
'USER_AGENT',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',
)
REDIS_HOST = _env('REDIS_HOST', 'redis') REDIS_HOST = _env('REDIS_HOST', 'redis')
REDIS_PORT = int(_env('REDIS_PORT', 6379)) REDIS_PORT = int(_env('REDIS_PORT', 6379))
SUCCESS_FILE = '/tmp/last_success' # noqa: S108 SUCCESS_FILE = '/tmp/last_success' # noqa: S108
def touch_success_file(): def touch_success_file():
"""Updates the timestamp of the success file for healthchecks.""" """Updates the timestamp of the success file for healthchecks."""
try: try:
with open(SUCCESS_FILE, 'w') as f: with open(SUCCESS_FILE, 'w') as f:
f.write(str(datetime.now().timestamp())) f.write(str(datetime.now().timestamp()))
except Exception as e: except Exception as e:
logger.error(f"Failed to touch success file: {e}") logger.error(f'Failed to touch success file: {e}')
def main(): def main():
logger.info("Starting Session Keeper Bot") logger.info('Starting Session Keeper Bot')
# Connect to Redis # Connect to Redis
try: try:
redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, decode_responses=True) redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, decode_responses=True)
redis_client.ping() redis_client.ping()
logger.info(f"Connected to Redis at {REDIS_HOST}:{REDIS_PORT}") logger.info(f'Connected to Redis at {REDIS_HOST}:{REDIS_PORT}')
except Exception as e: except Exception as e:
logger.error(f"Failed to connect to Redis: {e}") logger.error(f'Failed to connect to Redis: {e}')
return return
session = requests.Session() session = requests.Session()
@@ -73,19 +77,16 @@ def main():
'Sec-Ch-Ua-Mobile': '?0', 'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Linux"', 'Sec-Ch-Ua-Platform': '"Linux"',
'Accept-Encoding': 'gzip, deflate, br', 'Accept-Encoding': 'gzip, deflate, br',
'Priority': 'u=0, i' 'Priority': 'u=0, i',
} }
session.headers.update(headers) session.headers.update(headers)
while True: while True:
try: try:
logger.info("Attempting login...") logger.info('Attempting login...')
# Login payload # Login payload
payload = { payload = {'login': LOGIN, 'password': PASSWORD}
'login': LOGIN,
'password': PASSWORD
}
# Perform Login # Perform Login
# Note: The user request shows a POST to /user/login with form data # Note: The user request shows a POST to /user/login with form data
@@ -94,17 +95,17 @@ def main():
login_response = session.post(URL_LOGIN, data=payload, allow_redirects=True) login_response = session.post(URL_LOGIN, data=payload, allow_redirects=True)
logger.info(f"Login Response Status: {login_response.status_code}") logger.info(f'Login Response Status: {login_response.status_code}')
logger.info(f"Cookies after login: {session.cookies.get_dict()}") logger.info(f'Cookies after login: {session.cookies.get_dict()}')
# Verify Session # Verify Session
logger.info("Verifying session...") logger.info('Verifying session...')
verify_response = session.get(URL_VERIFY, allow_redirects=False) verify_response = session.get(URL_VERIFY, allow_redirects=False)
logger.info(f"Verify Response Status: {verify_response.status_code}") logger.info(f'Verify Response Status: {verify_response.status_code}')
if verify_response.status_code == 200: if verify_response.status_code == 200:
logger.info("Session verification SUCCESS (200 OK).") logger.info('Session verification SUCCESS (200 OK).')
touch_success_file() touch_success_file()
# Save PHPSESSID to Redis # Save PHPSESSID to Redis
@@ -112,19 +113,20 @@ def main():
if phpsessid: if phpsessid:
try: try:
redis_client.set('EDU_PHPSESSID', phpsessid) redis_client.set('EDU_PHPSESSID', phpsessid)
logger.info(f"Saved PHPSESSID to Redis: {phpsessid}") logger.info(f'Saved PHPSESSID to Redis: {phpsessid}')
except Exception as e: except Exception as e:
logger.error(f"Failed to save PHPSESSID to Redis: {e}") logger.error(f'Failed to save PHPSESSID to Redis: {e}')
elif verify_response.status_code == 302: elif verify_response.status_code == 302:
logger.warning("Session verification FAILED (302 Redirect). Session might be invalid.") logger.warning('Session verification FAILED (302 Redirect). Session might be invalid.')
else: else:
logger.warning(f"Session verification returned unexpected status: {verify_response.status_code}") logger.warning(f'Session verification returned unexpected status: {verify_response.status_code}')
except Exception as e: except Exception as e:
logger.error(f"An error occurred: {e}") logger.error(f'An error occurred: {e}')
logger.info(f"Sleeping for {INTERVAL} minutes...") logger.info(f'Sleeping for {INTERVAL} minutes...')
time.sleep(INTERVAL * 60) time.sleep(INTERVAL * 60)
if __name__ == "__main__":
if __name__ == '__main__':
main() main()
+1 -1
View File
@@ -3,7 +3,7 @@ FROM python:3.11-slim
WORKDIR /app WORKDIR /app
# Install dependencies # Install dependencies
RUN pip install --upgrade pip && pip install playwright==1.56.0 redis requests "python-telegram-bot[job-queue]" RUN pip install --no-cache-dir --upgrade pip && pip install --no-cache-dir playwright==1.56.0 redis==5.2.1 requests==2.32.3 "python-telegram-bot[job-queue]==21.10"
COPY checker.py . COPY checker.py .
File diff suppressed because it is too large Load Diff
+4
View File
@@ -1,11 +1,15 @@
FROM python:3.11-slim AS builder FROM python:3.11-slim AS builder
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
WORKDIR /src WORKDIR /src
COPY requirements.txt . COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt RUN pip install --no-cache-dir --user -r requirements.txt
FROM python:3.11-slim FROM python:3.11-slim
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN apt-get update && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install -y --no-install-recommends \
git \ git \
mediainfo \ mediainfo \
+2 -2
View File
@@ -3,7 +3,7 @@ import re
from io import BytesIO from io import BytesIO
import requests import requests
from bs4 import BeautifulSoup as BS from bs4 import BeautifulSoup
from pyrogram import Client, filters from pyrogram import Client, filters
from pyrogram.errors import RPCError from pyrogram.errors import RPCError
from pyrogram.types import InputMediaPhoto, Message from pyrogram.types import InputMediaPhoto, Message
@@ -22,7 +22,7 @@ async def search_icon(_, message: Message):
try: try:
html_content = requests.get(url, timeout=10).text html_content = requests.get(url, timeout=10).text
soup = BS(html_content, 'html.parser') soup = BeautifulSoup(html_content, 'html.parser')
results = soup.find_all( results = soup.find_all(
'img', 'img',
src=re.compile(r'https://cdn-icons-png.flaticon.com/128/[0-9]+/[0-9]+.png'), src=re.compile(r'https://cdn-icons-png.flaticon.com/128/[0-9]+/[0-9]+.png'),
+1 -1
View File
@@ -40,7 +40,7 @@ async def download_image(url):
@Client.on_message(filters.command('pinterest', prefix) & filters.me) @Client.on_message(filters.command('pinterest', prefix) & filters.me)
async def pinterest_search(client: Client, message: Message): async def pinterest_search(_client: Client, message: Message):
if len(message.command) < 2: if len(message.command) < 2:
await message.edit('Usage: `pinterest [number] <query>`', parse_mode=enums.ParseMode.MARKDOWN) await message.edit('Usage: `pinterest [number] <query>`', parse_mode=enums.ParseMode.MARKDOWN)
return return
+1 -1
View File
@@ -40,7 +40,7 @@ async def download_image(url):
@Client.on_message(filters.command(['unsplash2', 'usp2'], prefix) & filters.me) @Client.on_message(filters.command(['unsplash2', 'usp2'], prefix) & filters.me)
async def imgsearch(client: Client, message: Message): async def imgsearch(_client: Client, message: Message):
if len(message.command) < 2: if len(message.command) < 2:
await message.edit('Usage: `img [number] <query>`', parse_mode=enums.ParseMode.MARKDOWN) await message.edit('Usage: `img [number] <query>`', parse_mode=enums.ParseMode.MARKDOWN)
return return
+6 -5
View File
@@ -10,15 +10,16 @@ from PIL import Image, ImageDraw, ImageFont
from pyrogram import Client, filters from pyrogram import Client, filters
from pyrogram.types import Message from pyrogram.types import Message
from utils.misc import modules_help, prefix from utils.misc import modules_help, prefix
from utils.scripts import edit_or_reply from utils.scripts import edit_or_reply, reply_check
from utils.scripts import reply_check as ReplyCheck
async def amongus_gen(text: str, clr: int) -> str: async def amongus_gen(text: str, clr: int) -> str:
url = 'https://github.com/TgCatUB/CatUserbot-Resources/raw/master/Resources/Amongus/' url = 'https://github.com/TgCatUB/CatUserbot-Resources/raw/master/Resources/Amongus/'
font = ImageFont.truetype( font = ImageFont.truetype(
BytesIO( BytesIO(
requests.get('https://github.com/TgCatUB/CatUserbot-Resources/raw/master/Resources/fonts/bold.ttf', timeout=10).content requests.get(
'https://github.com/TgCatUB/CatUserbot-Resources/raw/master/Resources/fonts/bold.ttf', timeout=10
).content
), ),
60, 60,
) )
@@ -97,7 +98,7 @@ async def amongus_cmd(client: Client, message: Message):
await client.send_sticker( await client.send_sticker(
message.chat.id, message.chat.id,
imposter_file, imposter_file,
reply_to_message_id=ReplyCheck(message), reply_to_message_id=reply_check(message),
) )
@@ -119,7 +120,7 @@ async def imposter_cmd(client: Client, message: Message):
await client.send_photo( await client.send_photo(
message.chat.id, message.chat.id,
imposter_file, imposter_file,
reply_to_message_id=ReplyCheck(message), reply_to_message_id=reply_check(message),
) )
+20 -20
View File
@@ -43,22 +43,22 @@ async def anime_search(client: Client, message: Message):
result = response.json() result = response.json()
averageScore = result['averageScore'] average_score = result['average_score']
try: try:
coverImage_url = result['imageUrl'] cover_image_url = result['imageUrl']
coverImage = requests.get(url=coverImage_url, timeout=10).content cover_image = requests.get(url=cover_image_url, timeout=10).content
async with aiofiles.open('coverImage.jpg', mode='wb') as f: async with aiofiles.open('coverImage.jpg', mode='wb') as f:
await f.write(coverImage) await f.write(cover_image)
except Exception: except Exception:
coverImage = None cover_image = None
title = result['title']['english'] title = result['title']['english']
trailer = result['trailer']['id'] trailer = result['trailer']['id']
description = result['description'] description = result['description']
episodes = result['episodes'] episodes = result['episodes']
genres = ', '.join(result['genres']) genres = ', '.join(result['genres'])
isAdult = result['isAdult'] is_adult = result['is_adult']
status = result['status'] status = result['status']
studios = ', '.join(result['studios']) studios = ', '.join(result['studios'])
@@ -68,7 +68,7 @@ async def anime_search(client: Client, message: Message):
[ [
InputMediaPhoto( InputMediaPhoto(
'coverImage.jpg', 'coverImage.jpg',
caption=f"<b>Title:</b> <code>{title}</code>\n<b>Average Score:</b> <code>{averageScore}</code>\n<b>Status:</b> <code>{status}</code>\n<b>Genres:</b> <code>{genres}</code>\n<b>Episodes:</b> <code>{episodes}</code>\n<b>Is Adult:</b> <code>{isAdult}</code>\n<b>Studios:</b> <code>{studios}</code>\n<b>Description:</b> <code>{description}</code>\n<b>Trailer:</b> <a href='https://youtu.be/{trailer}'>Click Here</a>", caption=f"<b>Title:</b> <code>{title}</code>\n<b>Average Score:</b> <code>{average_score}</code>\n<b>Status:</b> <code>{status}</code>\n<b>Genres:</b> <code>{genres}</code>\n<b>Episodes:</b> <code>{episodes}</code>\n<b>Is Adult:</b> <code>{is_adult}</code>\n<b>Studios:</b> <code>{studios}</code>\n<b>Description:</b> <code>{description}</code>\n<b>Trailer:</b> <a href='https://youtu.be/{trailer}'>Click Here</a>",
) )
], ],
) )
@@ -81,7 +81,7 @@ async def anime_search(client: Client, message: Message):
[ [
InputMediaPhoto( InputMediaPhoto(
'coverImage.jpg', 'coverImage.jpg',
caption=f"<b>Title:</b> <code>{title}</code>\n<b>Average Score:</b> <code>{averageScore}</code>\n<b>Status:</b> <code>{status}</code>\n<b>Genres:</b> <code>{genres}</code>\n<b>Episodes:</b> <code>{episodes}</code>\n<b>Is Adult:</b> <code>{isAdult}</code>\n<b>Studios:</b> <code>{studios}</code>\n<b>Description:</b> <code>{description}</code>\n<b>Trailer:</b> <a href='https://youtu.be/{trailer}'>Click Here</a>", caption=f"<b>Title:</b> <code>{title}</code>\n<b>Average Score:</b> <code>{average_score}</code>\n<b>Status:</b> <code>{status}</code>\n<b>Genres:</b> <code>{genres}</code>\n<b>Episodes:</b> <code>{episodes}</code>\n<b>Is Adult:</b> <code>{is_adult}</code>\n<b>Studios:</b> <code>{studios}</code>\n<b>Description:</b> <code>{description}</code>\n<b>Trailer:</b> <a href='https://youtu.be/{trailer}'>Click Here</a>",
) )
], ],
) )
@@ -109,22 +109,22 @@ async def manga_search(client: Client, message: Message):
result = response.json() result = response.json()
averageScore = result['averageScore'] average_score = result['average_score']
try: try:
coverImage_url = result['imageUrl'] cover_image_url = result['imageUrl']
coverImage = requests.get(url=coverImage_url, timeout=10).content cover_image = requests.get(url=cover_image_url, timeout=10).content
async with aiofiles.open('coverImage.jpg', mode='wb') as f: async with aiofiles.open('coverImage.jpg', mode='wb') as f:
await f.write(coverImage) await f.write(cover_image)
except Exception: except Exception:
coverImage = None cover_image = None
title = result['title']['english'] title = result['title']['english']
trailer = result['trailer']['id'] trailer = result['trailer']['id']
description = result['description'] description = result['description']
chapters = result['chapters'] chapters = result['chapters']
genres = ', '.join(result['genres']) genres = ', '.join(result['genres'])
isAdult = result['isAdult'] is_adult = result['is_adult']
status = result['status'] status = result['status']
studios = ', '.join(result['studios']) studios = ', '.join(result['studios'])
@@ -134,7 +134,7 @@ async def manga_search(client: Client, message: Message):
[ [
InputMediaPhoto( InputMediaPhoto(
'coverImage.jpg', 'coverImage.jpg',
caption=f"<b>Title:</b> <code>{title}</code>\n<b>Average Score:</b> <code>{averageScore}</code>\n<b>Status:</b> <code>{status}</code>\n<b>Genres:</b> <code>{genres}</code>\n<b>Chapters:</b> <code>{chapters}</code>\n<b>Is Adult:</b> <code>{isAdult}</code>\n<b>Studios:</b> <code>{studios}</code>\n<b>Description:</b> <code>{description}</code>\n<b>Trailer:</b> <a href='https://youtu.be/{trailer}'>Click Here</a>", caption=f"<b>Title:</b> <code>{title}</code>\n<b>Average Score:</b> <code>{average_score}</code>\n<b>Status:</b> <code>{status}</code>\n<b>Genres:</b> <code>{genres}</code>\n<b>Chapters:</b> <code>{chapters}</code>\n<b>Is Adult:</b> <code>{is_adult}</code>\n<b>Studios:</b> <code>{studios}</code>\n<b>Description:</b> <code>{description}</code>\n<b>Trailer:</b> <a href='https://youtu.be/{trailer}'>Click Here</a>",
) )
], ],
) )
@@ -147,7 +147,7 @@ async def manga_search(client: Client, message: Message):
[ [
InputMediaPhoto( InputMediaPhoto(
'coverImage.jpg', 'coverImage.jpg',
caption=f"<b>Title:</b> <code>{title}</code>\n<b>Average Score:</b> <code>{averageScore}</code>\n<b>Status:</b> <code>{status}</code>\n<b>Genres:</b> <code>{genres}</code>\n<b>Chapters:</b> <code>{chapters}</code>\n<b>Is Adult:</b> <code>{isAdult}</code>\n<b>Studios:</b> <code>{studios}</code>\n<b>Description:</b> <code>{description}</code>\n<b>Trailer:</b> <a href='https://youtu.be/{trailer}'>Click Here</a>", caption=f"<b>Title:</b> <code>{title}</code>\n<b>Average Score:</b> <code>{average_score}</code>\n<b>Status:</b> <code>{status}</code>\n<b>Genres:</b> <code>{genres}</code>\n<b>Chapters:</b> <code>{chapters}</code>\n<b>Is Adult:</b> <code>{is_adult}</code>\n<b>Studios:</b> <code>{studios}</code>\n<b>Description:</b> <code>{description}</code>\n<b>Trailer:</b> <a href='https://youtu.be/{trailer}'>Click Here</a>",
) )
], ],
) )
@@ -176,13 +176,13 @@ async def character(client: Client, message: Message):
result = response.json() result = response.json()
try: try:
coverImage_url = result['image']['large'] cover_image_url = result['image']['large']
coverImage = requests.get(url=coverImage_url, timeout=10).content cover_image = requests.get(url=cover_image_url, timeout=10).content
async with aiofiles.open('coverImage.jpg', mode='wb') as f: async with aiofiles.open('coverImage.jpg', mode='wb') as f:
await f.write(coverImage) await f.write(cover_image)
except Exception: except Exception:
coverImage = None cover_image = None
age = result['age'] age = result['age']
description = result['description'] description = result['description']
+1 -1
View File
@@ -49,7 +49,7 @@ async def random():
@Client.on_message(filters.command(['arnd', 'arandom'], prefix) & filters.me) @Client.on_message(filters.command(['arnd', 'arandom'], prefix) & filters.me)
async def anime_handler(client: Client, message: Message): async def anime_handler(_client: Client, message: Message):
try: try:
await message.edit('<b>Searching art</b>', parse_mode=enums.ParseMode.HTML) await message.edit('<b>Searching art</b>', parse_mode=enums.ParseMode.HTML)
ra = await random() ra = await random()
+1 -1
View File
@@ -11,7 +11,7 @@ def id_generator() -> str:
@Client.on_message(filters.command(['bbox', 'blackbox'], prefix) & filters.me) @Client.on_message(filters.command(['bbox', 'blackbox'], prefix) & filters.me)
async def blackbox(client, message): async def blackbox(_client, message):
m = message m = message
msg = await m.edit_text('🔍') msg = await m.edit_text('🔍')
+1 -1
View File
@@ -5,7 +5,7 @@ from utils.scripts import import_library
cohere = import_library('cohere') cohere = import_library('cohere')
import cohere # noqa: F811 import cohere # noqa: F811, E402
co = cohere.Client(cohere_key) co = cohere.Client(cohere_key)
+3 -1
View File
@@ -15,7 +15,9 @@ from PIL import Image, ImageDraw, ImageFont # noqa: E402
@Client.on_message(filters.command(['dem'], prefix) & filters.me) @Client.on_message(filters.command(['dem'], prefix) & filters.me)
async def demotivator(client: Client, message: Message): async def demotivator(client: Client, message: Message):
await message.edit('<code>Process of demotivation...</code>', parse_mode=enums.ParseMode.HTML) await message.edit('<code>Process of demotivation...</code>', parse_mode=enums.ParseMode.HTML)
font = requests.get('https://github.com/The-MoonTg-project/files/blob/main/Times%20New%20Roman.ttf?raw=true', timeout=10) font = requests.get(
'https://github.com/The-MoonTg-project/files/blob/main/Times%20New%20Roman.ttf?raw=true', timeout=10
)
f = font.content f = font.content
template_dem = requests.get('https://raw.githubusercontent.com/files/main/demotivator.png', timeout=10) template_dem = requests.get('https://raw.githubusercontent.com/files/main/demotivator.png', timeout=10)
if message.reply_to_message: if message.reply_to_message:
+1 -1
View File
@@ -11,7 +11,7 @@ from lottie.importers import importers # noqa: E402
@Client.on_message(filters.command('destroy', prefix) & filters.me) @Client.on_message(filters.command('destroy', prefix) & filters.me)
async def destroy_sticker(client: Client, message: Message): async def destroy_sticker(_client: Client, message: Message):
"""Destroy animated stickers by modifying their animation properties""" """Destroy animated stickers by modifying their animation properties"""
try: try:
reply = message.reply_to_message reply = message.reply_to_message
+3 -3
View File
@@ -30,11 +30,11 @@ def subprocess_run(cmd):
executable='bash', executable='bash',
) )
talk = subproc.communicate() talk = subproc.communicate()
exitCode = subproc.returncode exit_code = subproc.returncode
if exitCode != 0: if exit_code != 0:
reply += ( reply += (
'```An error was detected while running the subprocess:\n' '```An error was detected while running the subprocess:\n'
f'exit code: {exitCode}\n' f'exit code: {exit_code}\n'
f'stdout: {talk[0]}\n' f'stdout: {talk[0]}\n'
f'stderr: {talk[1]}```' f'stderr: {talk[1]}```'
) )
+1 -1
View File
@@ -4,7 +4,7 @@ from utils.misc import prefix
@Client.on_message(filters.command('duck', prefix) & filters.me) @Client.on_message(filters.command('duck', prefix) & filters.me)
async def duckgo(client: Client, message: Message): async def duckgo(_client: Client, message: Message):
input_str = ' '.join(message.command[1:]) input_str = ' '.join(message.command[1:])
sample_url = 'https://duckduckgo.com/?q={}'.format(input_str.replace(' ', '+')) sample_url = 'https://duckduckgo.com/?q={}'.format(input_str.replace(' ', '+'))
if sample_url: if sample_url:
+1 -1
View File
@@ -29,7 +29,7 @@ from utils.misc import modules_help, prefix
@Client.on_message(filters.command('example_edit', prefix) & filters.me) @Client.on_message(filters.command('example_edit', prefix) & filters.me)
async def example_edit(client: Client, message: Message): async def example_edit(_client: Client, message: Message):
try: try:
await message.edit('<code>This is an example module</code>') await message.edit('<code>This is an example module</code>')
except Exception as e: except Exception as e:
+1 -1
View File
@@ -85,7 +85,7 @@ REPLACEMENT_MAP = {
@Client.on_message(filters.command('flip', prefix) & filters.me) @Client.on_message(filters.command('flip', prefix) & filters.me)
async def flip(client: Client, message: Message): async def flip(_client: Client, message: Message):
text = ' '.join(message.command[1:]) text = ' '.join(message.command[1:])
final_str = '' final_str = ''
for char in text: for char in text:
+3 -3
View File
@@ -9,9 +9,9 @@ from utils.scripts import format_exc, progress
def schellwithflux(args): def schellwithflux(args):
API_URL = 'https://randydev-ryuzaki-api.hf.space/api/v1/akeno/fluxai' api_url = 'https://randydev-ryuzaki-api.hf.space/api/v1/akeno/fluxai'
payload = {'user_id': 1191668125, 'args': args} # Please don't edit here payload = {'user_id': 1191668125, 'args': args} # Please don't edit here
response = requests.post(API_URL, json=payload, timeout=10) response = requests.post(api_url, json=payload, timeout=10)
if response.status_code != 200: if response.status_code != 200:
print(f'Error status {response.status_code}') print(f'Error status {response.status_code}')
return None return None
@@ -19,7 +19,7 @@ def schellwithflux(args):
@Client.on_message(filters.command('fluxai', prefix) & filters.me) @Client.on_message(filters.command('fluxai', prefix) & filters.me)
async def imgfluxai_(client: Client, message: Message): async def imgfluxai_(_client: Client, message: Message):
question = message.text.split(' ', 1)[1] if len(message.command) > 1 else None question = message.text.split(' ', 1)[1] if len(message.command) > 1 else None
if not question: if not question:
return await message.reply_text('Please provide a question for Flux.') return await message.reply_text('Please provide a question for Flux.')
+5 -5
View File
@@ -37,20 +37,20 @@ async def _wrap_edit(message: Message, text: str):
async def phase1(message: Message): async def phase1(message: Message):
"""Big scroll""" """Big scroll"""
BIG_SCROLL = '🧡💛💚💙💜🖤🤎' big_scroll = '🧡💛💚💙💜🖤🤎'
await _wrap_edit(message, joined_heart) await _wrap_edit(message, joined_heart)
for heart in BIG_SCROLL: for heart in big_scroll:
await _wrap_edit(message, joined_heart.replace(R, heart)) await _wrap_edit(message, joined_heart.replace(R, heart))
await asyncio.sleep(SLEEP) await asyncio.sleep(SLEEP)
async def phase2(message: Message): async def phase2(message: Message):
"""Per-heart randomiser""" """Per-heart randomiser"""
ALL = ['❤️'] + list('🧡💛💚💙💜🤎🖤') # don't include white heart all_hearts = ['❤️'] + list('🧡💛💚💙💜🤎🖤') # don't include white heart
format_heart = joined_heart.replace(R, '{}') format_heart = joined_heart.replace(R, '{}')
for _ in range(5): for _ in range(5):
heart = format_heart.format(*random.choices(ALL, k=heartlet_len)) # noqa: S311 heart = format_heart.format(*random.choices(all_hearts, k=heartlet_len)) # noqa: S311
await _wrap_edit(message, heart) await _wrap_edit(message, heart)
await asyncio.sleep(SLEEP) await asyncio.sleep(SLEEP)
@@ -75,7 +75,7 @@ async def phase4(message: Message):
@Client.on_message(filters.command('hearts', prefix) & filters.me) @Client.on_message(filters.command('hearts', prefix) & filters.me)
async def hearts(client: Client, message: Message): async def hearts(_client: Client, message: Message):
await phase1(message) await phase1(message)
await phase2(message) await phase2(message)
await phase3(message) await phase3(message)
+16 -10
View File
@@ -85,8 +85,8 @@ async def loadmod(_, message: Message):
module_name = url.lower() module_name = url.lower()
try: try:
f = requests.get( f = requests.get(
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/full.txt' 'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/full.txt', timeout=10
, timeout=10).text ).text
except Exception: except Exception:
return await message.edit('Failed to fetch custom modules list') return await message.edit('Failed to fetch custom modules list')
modules_dict = {line.split('/')[-1].split()[0]: line.strip() for line in f.splitlines()} modules_dict = {line.split('/')[-1].split()[0]: line.strip() for line in f.splitlines()}
@@ -97,8 +97,9 @@ async def loadmod(_, message: Message):
return return
else: else:
modules_hashes = requests.get( modules_hashes = requests.get(
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/modules_hashes.txt' 'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/modules_hashes.txt',
, timeout=10).text timeout=10,
).text
resp = requests.get(url, timeout=10) resp = requests.get(url, timeout=10)
if not resp.ok: if not resp.ok:
@@ -136,8 +137,8 @@ async def loadmod(_, message: Message):
content = f.read() content = f.read()
modules_hashes = requests.get( modules_hashes = requests.get(
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/modules_hashes.txt' 'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/modules_hashes.txt', timeout=10
, timeout=10).text ).text
if hashlib.sha256(content).hexdigest() not in modules_hashes: if hashlib.sha256(content).hexdigest() not in modules_hashes:
os.remove(file_name) os.remove(file_name)
@@ -214,7 +215,9 @@ async def load_all_mods(_, message: Message):
os.mkdir(f'{BASE_PATH}/modules/custom_modules') os.mkdir(f'{BASE_PATH}/modules/custom_modules')
try: try:
f = requests.get('https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/full.txt', timeout=10).text f = requests.get(
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/full.txt', timeout=10
).text
except Exception: except Exception:
return await message.edit('Failed to fetch custom modules list') return await message.edit('Failed to fetch custom modules list')
modules_list = f.splitlines() modules_list = f.splitlines()
@@ -281,14 +284,17 @@ async def updateallmods(_, message: Message):
if not module_name.endswith('.py'): if not module_name.endswith('.py'):
continue continue
try: try:
f = requests.get('https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/full.txt', timeout=10).text f = requests.get(
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/full.txt', timeout=10
).text
except Exception: except Exception:
return await message.edit('Failed to fetch custom modules list') return await message.edit('Failed to fetch custom modules list')
modules_dict = {line.split('/')[-1].split()[0]: line.strip() for line in f.splitlines()} modules_dict = {line.split('/')[-1].split()[0]: line.strip() for line in f.splitlines()}
if module_name in modules_dict: if module_name in modules_dict:
resp = requests.get( resp = requests.get(
f'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/{modules_dict[module_name]}.py' f'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/{modules_dict[module_name]}.py',
, timeout=10) timeout=10,
)
if not resp.ok: if not resp.ok:
modules_installed.remove(module_name) modules_installed.remove(module_name)
continue continue
+14 -14
View File
@@ -63,7 +63,7 @@ async def backup(client: Client, message: Message):
@Client.on_message(filters.command(['restore', 'res'], prefix) & filters.me) @Client.on_message(filters.command(['restore', 'res'], prefix) & filters.me)
async def restore(client: Client, message: Message): async def restore(_client: Client, message: Message):
""" """
Restore the database Restore the database
""" """
@@ -98,7 +98,7 @@ async def restore(client: Client, message: Message):
@Client.on_message(filters.command(['backupmods', 'bms'], prefix) & filters.me) @Client.on_message(filters.command(['backupmods', 'bms'], prefix) & filters.me)
async def backupmods(client: Client, message: Message): async def backupmods(_client: Client, message: Message):
""" """
Backup the modules Backup the modules
""" """
@@ -112,8 +112,8 @@ async def backupmods(client: Client, message: Message):
for mod in modules_help: for mod in modules_help:
if os.path.isfile(f'modules/custom_modules/{mod}.py'): if os.path.isfile(f'modules/custom_modules/{mod}.py'):
f = open(f'backups/{mod}.py', 'wb') with open(f'backups/{mod}.py', 'wb') as f, open(f'modules/custom_modules/{mod}.py', 'rb') as src:
f.write(open(f'modules/custom_modules/{mod}.py', 'rb').read()) f.write(src.read())
await message.edit( await message.edit(
text='<b>All modules backed up to:</b> <code>backups/</code> folder', text='<b>All modules backed up to:</b> <code>backups/</code> folder',
parse_mode=enums.ParseMode.HTML, parse_mode=enums.ParseMode.HTML,
@@ -123,7 +123,7 @@ async def backupmods(client: Client, message: Message):
@Client.on_message(filters.command(['backupmod', 'bm'], prefix) & filters.me) @Client.on_message(filters.command(['backupmod', 'bm'], prefix) & filters.me)
async def backupmod(client: Client, message: Message): async def backupmod(_client: Client, message: Message):
""" """
Backup the module Backup the module
""" """
@@ -142,8 +142,8 @@ async def backupmod(client: Client, message: Message):
await message.edit('<b>Backing up module...</b>', parse_mode=enums.ParseMode.HTML) await message.edit('<b>Backing up module...</b>', parse_mode=enums.ParseMode.HTML)
if os.path.isfile(f'modules/custom_modules/{mod}.py'): if os.path.isfile(f'modules/custom_modules/{mod}.py'):
f = open(f'backups/{mod}.py', 'wb') with open(f'backups/{mod}.py', 'wb') as f, open(f'modules/custom_modules/{mod}.py', 'rb') as src:
f.write(open(f'modules/custom_modules/{mod}.py', 'rb').read()) f.write(src.read())
else: else:
return await message.edit( return await message.edit(
f'<b>Module <code>{mod}</code> not found.</b>', f'<b>Module <code>{mod}</code> not found.</b>',
@@ -159,7 +159,7 @@ async def backupmod(client: Client, message: Message):
@Client.on_message(filters.command(['restoremod', 'resmod'], prefix) & filters.me) @Client.on_message(filters.command(['restoremod', 'resmod'], prefix) & filters.me)
async def restoremod(client: Client, message: Message): async def restoremod(_client: Client, message: Message):
""" """
Restore the module Restore the module
""" """
@@ -178,11 +178,11 @@ async def restoremod(client: Client, message: Message):
await message.edit('<b>Restoring module...</b>', parse_mode=enums.ParseMode.HTML) await message.edit('<b>Restoring module...</b>', parse_mode=enums.ParseMode.HTML)
if os.path.isfile(f'backups/{mod}.py'): if os.path.isfile(f'backups/{mod}.py'):
f = open(f'modules/custom_modules/{mod}.py', 'wb') with open(f'modules/custom_modules/{mod}.py', 'wb') as f, open(f'backups/{mod}.py', 'rb') as src:
f.write(open(f'backups/{mod}.py', 'rb').read()) f.write(src.read())
else: else:
return await message.edit( return await message.edit(
f'<b>Module <code>{mod}</code> not found.</b>', text='<b>Backup file <code>{mod}</code> not found</b>',
parse_mode=enums.ParseMode.HTML, parse_mode=enums.ParseMode.HTML,
) )
await message.edit( await message.edit(
@@ -195,7 +195,7 @@ async def restoremod(client: Client, message: Message):
@Client.on_message(filters.command(['restoremods', 'resmods'], prefix) & filters.me) @Client.on_message(filters.command(['restoremods', 'resmods'], prefix) & filters.me)
async def restoremods(client: Client, message: Message): async def restoremods(_client: Client, message: Message):
""" """
Restore the modules Restore the modules
""" """
@@ -209,8 +209,8 @@ async def restoremods(client: Client, message: Message):
if mod.endswith('.py'): if mod.endswith('.py'):
if os.path.isfile(f'modules/{mod}'): if os.path.isfile(f'modules/{mod}'):
continue continue
f = open(f'modules/custom_modules/{mod}', 'wb') with open(f'modules/custom_modules/{mod}', 'wb') as f, open(f'backups/{mod}', 'rb') as src:
f.write(open(f'backups/{mod}', 'rb').read()) f.write(src.read())
await message.edit( await message.edit(
text='<b>All modules restored from:</b> <code>backups/</code> folder', text='<b>All modules restored from:</b> <code>backups/</code> folder',
parse_mode=enums.ParseMode.HTML, parse_mode=enums.ParseMode.HTML,
+1 -1
View File
@@ -41,7 +41,7 @@ def format_time_12hr(time_str: str) -> str:
@Client.on_message(filters.command('prayer', prefix) & filters.me) @Client.on_message(filters.command('prayer', prefix) & filters.me)
async def namaz_times(client: Client, message: Message): async def namaz_times(_client: Client, message: Message):
if message.reply_to_message: if message.reply_to_message:
city_name = message.reply_to_message.text city_name = message.reply_to_message.text
country_name = DEFAULT_COUNTRY # Default to Pakistan if no country is provided country_name = DEFAULT_COUNTRY # Default to Pakistan if no country is provided
+21 -21
View File
@@ -166,17 +166,17 @@ async def app(client: Client, message: Message):
result = response.json() result = response.json()
try: try:
coverImage_url = result['results'][0]['icon'] cover_image_url = result['results'][0]['icon']
coverImage = requests.get(url=coverImage_url, timeout=10).content cover_image = requests.get(url=cover_image_url, timeout=10).content
async with aiofiles.open('coverImage.jpg', mode='wb') as f: async with aiofiles.open('cover_image.jpg', mode='wb') as f:
await f.write(coverImage) await f.write(cover_image)
except Exception: except Exception:
coverImage = None cover_image = None
description = result['results'][0]['description'] description = result['results'][0]['description']
developer = result['results'][0]['developer'] developer = result['results'][0]['developer']
IsFree = result['results'][0]['free'] is_free = result['results'][0]['free']
genre = result['results'][0]['genre'] genre = result['results'][0]['genre']
package_name = result['results'][0]['id'] package_name = result['results'][0]['id']
title = result['results'][0]['title'] title = result['results'][0]['title']
@@ -189,8 +189,8 @@ async def app(client: Client, message: Message):
chat_id, chat_id,
[ [
InputMediaPhoto( InputMediaPhoto(
'coverImage.jpg', 'cover_image.jpg',
caption=f'<b>Title:</b> <code>{title}</code>\n<b>Rating:</b> <code>{rating}</code>\n<b>IsFree:</b> <code>{IsFree}</code>\n<b>Price:</b> <code>{price}</code>\n<b>Package Name:</b> <code>{package_name}</code>\n<b>Genres:</b> <code>{genre}</code>\n<b>Developer:</b> <code>{developer}\n<b>Description:</b> {description}\n<b>Link:</b> {link}', caption=f'<b>Title:</b> <code>{title}</code>\n<b>Rating:</b> <code>{rating}</code>\n<b>is_free:</b> <code>{is_free}</code>\n<b>Price:</b> <code>{price}</code>\n<b>Package Name:</b> <code>{package_name}</code>\n<b>Genres:</b> <code>{genre}</code>\n<b>Developer:</b> <code>{developer}\n<b>Description:</b> {description}\n<b>Link:</b> {link}',
) )
], ],
) )
@@ -202,16 +202,16 @@ async def app(client: Client, message: Message):
chat_id, chat_id,
[ [
InputMediaPhoto( InputMediaPhoto(
'coverImage.jpg', 'cover_image.jpg',
caption=f'<b>Title:</b> <code>{title}</code>\n<b>Rating:</b> <code>{rating}</code>\n<b>IsFree:</b> <code>{IsFree}</code>\n<b>Price:</b> <code>{price}</code>\n<b>Package Name:</b> <code>{package_name}</code>\n<b>Genres:</b> <code>{genre}</code>\n<b>Developer:</b> <code>{developer}\n<b>Description:</b> {description}\n<b>Link:</b> {link}', caption=f'<b>Title:</b> <code>{title}</code>\n<b>Rating:</b> <code>{rating}</code>\n<b>is_free:</b> <code>{is_free}</code>\n<b>Price:</b> <code>{price}</code>\n<b>Package Name:</b> <code>{package_name}</code>\n<b>Genres:</b> <code>{genre}</code>\n<b>Developer:</b> <code>{developer}\n<b>Description:</b> {description}\n<b>Link:</b> {link}',
) )
], ],
) )
except Exception as e: except Exception as e:
await message.edit_text(format_exc(e)) await message.edit_text(format_exc(e))
finally: finally:
if os.path.exists('coverImage.jpg'): if os.path.exists('cover_image.jpg'):
os.remove('coverImage.jpg') os.remove('cover_image.jpg')
@Client.on_message(filters.command('tsearch', prefix) & filters.me) @Client.on_message(filters.command('tsearch', prefix) & filters.me)
@@ -232,7 +232,7 @@ async def tsearch(client: Client, message: Message):
result = response.json() result = response.json()
coverImage_url = result['results'][0]['thumbnail'] cover_image_url = result['results'][0]['thumbnail']
description = result['results'][0]['description'] description = result['results'][0]['description']
genre = result['results'][0]['genre'] genre = result['results'][0]['genre']
category = result['results'][0]['category'] category = result['results'][0]['category']
@@ -264,17 +264,17 @@ async def tsearch(client: Client, message: Message):
content=all_results_content, content=all_results_content,
) )
if coverImage_url is not None: if cover_image_url is not None:
coverImage = requests.get(url=coverImage_url, timeout=10).content cover_image = requests.get(url=cover_image_url, timeout=10).content
async with aiofiles.open('coverImage.jpg', mode='wb') as f: async with aiofiles.open('cover_image.jpg', mode='wb') as f:
await f.write(coverImage) await f.write(cover_image)
await message.delete() await message.delete()
await client.send_media_group( await client.send_media_group(
chat_id, chat_id,
[ [
InputMediaPhoto( InputMediaPhoto(
'coverImage.jpg', 'cover_image.jpg',
caption=f"<b>Title:</b> <code>{title}</code>\n<b>Category:</b> <code>{category}</code>\n<b>Language:</b> <code>{language}</code>\n<b>Size:</b> <code>{size}</code>\n<b>Genres:</b> <code>{genre}</code>\n<b>Description:</b> {description}\n<b>Magnet Link:</b> <a href='{link_result}'>Click Here</a>\n<b>More Results:</b> <a href='{link_results}'>Click Here</a>", caption=f"<b>Title:</b> <code>{title}</code>\n<b>Category:</b> <code>{category}</code>\n<b>Language:</b> <code>{language}</code>\n<b>Size:</b> <code>{size}</code>\n<b>Genres:</b> <code>{genre}</code>\n<b>Description:</b> {description}\n<b>Magnet Link:</b> <a href='{link_result}'>Click Here</a>\n<b>More Results:</b> <a href='{link_results}'>Click Here</a>",
) )
], ],
@@ -292,7 +292,7 @@ async def tsearch(client: Client, message: Message):
chat_id, chat_id,
[ [
InputMediaPhoto( InputMediaPhoto(
'coverImage.jpg', 'cover_image.jpg',
caption=f"<b>Title:</b> <code>{title}</code>\n<b>Category:</b> <code>{category}</code>\n<b>Language:</b> <code>{language}</code>\n<b>Size:</b> <code>{size}</code>\n<b>Genres:</b> <code>{genre}</code>\n<b>Description:</b> {description}\n<b>Magnet Link:</b> <a href='{link_result}'>Click Here</a>", caption=f"<b>Title:</b> <code>{title}</code>\n<b>Category:</b> <code>{category}</code>\n<b>Language:</b> <code>{language}</code>\n<b>Size:</b> <code>{size}</code>\n<b>Genres:</b> <code>{genre}</code>\n<b>Description:</b> {description}\n<b>Magnet Link:</b> <a href='{link_result}'>Click Here</a>",
) )
], ],
@@ -308,8 +308,8 @@ async def tsearch(client: Client, message: Message):
except Exception as e: except Exception as e:
await message.edit_text(format_exc(e)) await message.edit_text(format_exc(e))
finally: finally:
if os.path.exists('coverImage.jpg'): if os.path.exists('cover_image.jpg'):
os.remove('coverImage.jpg') os.remove('cover_image.jpg')
@Client.on_message(filters.command('stts', prefix) & filters.me) @Client.on_message(filters.command('stts', prefix) & filters.me)
+1 -1
View File
@@ -53,7 +53,7 @@ async def user_exec(_: Client, message: Message):
# noinspection PyUnusedLocal # noinspection PyUnusedLocal
@Client.on_message(filters.command(['ev', 'eval'], prefix) & filters.me) @Client.on_message(filters.command(['ev', 'eval'], prefix) & filters.me)
async def user_eval(client: Client, message: Message): async def user_eval(_client: Client, message: Message):
if len(message.command) == 1: if len(message.command) == 1:
await message.edit("<b>Code to eval isn't provided</b>") await message.edit("<b>Code to eval isn't provided</b>")
return return
+4 -3
View File
@@ -119,8 +119,9 @@ async def rmbg(client: Client, message: Message):
start = datetime.now() start = datetime.now()
await pablo.edit('sending to ReMove.BG') await pablo.edit('sending to ReMove.BG')
input_file_name = cool input_file_name = cool
with open(input_file_name, 'rb') as f:
files = { files = {
'image_file': (input_file_name, open(input_file_name, 'rb')), 'image_file': (input_file_name, f),
} }
r = requests.post( r = requests.post(
'https://api.remove.bg/v1.0/removebg', 'https://api.remove.bg/v1.0/removebg',
@@ -133,8 +134,8 @@ async def rmbg(client: Client, message: Message):
if os.path.exists(cool): if os.path.exists(cool):
os.remove(cool) os.remove(cool)
output_file_name = r output_file_name = r
contentType = output_file_name.headers.get('content-type') content_type = output_file_name.headers.get('content-type')
if 'image' in contentType: if 'image' in content_type:
with io.BytesIO(output_file_name.content) as remove_bg_image: with io.BytesIO(output_file_name.content) as remove_bg_image:
remove_bg_image.name = 'BG_rem.png' remove_bg_image.name = 'BG_rem.png'
await client.send_document(message.chat.id, remove_bg_image, reply_to_message_id=message.id) await client.send_document(message.chat.id, remove_bg_image, reply_to_message_id=message.id)
+3 -2
View File
@@ -67,8 +67,9 @@ async def ipinfo(_, message: Message):
await m.edit_text('🔎') await m.edit_text('🔎')
try: try:
url = requests.get( url = requests.get(
f'http://ip-api.com/json/{searchip}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,district,zip,lat,lon,timezone,offset,currency,isp,org,as,asname,reverse,mobile,proxy,hosting,query' f'http://ip-api.com/json/{searchip}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,district,zip,lat,lon,timezone,offset,currency,isp,org,as,asname,reverse,mobile,proxy,hosting,query',
, timeout=10) timeout=10,
)
response = json.loads(url.text) response = json.loads(url.text)
text = f""" text = f"""
<b>IP Address:</b> <code>{response['query']}</code> <b>IP Address:</b> <code>{response['query']}</code>
+2 -1
View File
@@ -102,7 +102,8 @@ async def spin_handler(client: Client, message: Message):
elif message.reply_to_message.text: elif message.reply_to_message.text:
result = await quote_cmd(client, message) result = await quote_cmd(client, message)
filename = 'sticker.png' if result[1] else 'sticker.webp' filename = 'sticker.png' if result[1] else 'sticker.webp'
open('downloads/' + filename, 'wb').write(result[0].getbuffer()) with open('downloads/' + filename, 'wb') as f:
f.write(result[0].getbuffer())
coro = False coro = False
else: else:
filename = 'photo.jpg' filename = 'photo.jpg'
+4 -4
View File
@@ -24,14 +24,14 @@ from utils.misc import modules_help, prefix
@Client.on_message(filters.command('setthumb', prefix) & filters.me) @Client.on_message(filters.command('setthumb', prefix) & filters.me)
async def setthumb(_, message: Message): async def setthumb(_, message: Message):
THUMB_PATH = 'downloads/thumb' thumb_path = 'downloads/thumb'
if message.reply_to_message: if message.reply_to_message:
if not os.path.exists(THUMB_PATH): if not os.path.exists(thumb_path):
os.makedirs(THUMB_PATH) os.makedirs(thumb_path)
new_thumb = await message.reply_to_message.download() new_thumb = await message.reply_to_message.download()
with Image.open(new_thumb) as img: with Image.open(new_thumb) as img:
if img.format in ['PNG', 'JPG', 'JPEG']: if img.format in ['PNG', 'JPG', 'JPEG']:
new_path = os.path.join(THUMB_PATH, 'thumb.jpg') new_path = os.path.join(thumb_path, 'thumb.jpg')
os.rename(new_thumb, new_path) os.rename(new_thumb, new_path)
await message.edit_text('Thumbnail set successfully!') await message.edit_text('Thumbnail set successfully!')
else: else:
+4 -2
View File
@@ -48,7 +48,8 @@ async def scan_my_file(_, message: Message):
url = 'https://www.virustotal.com/vtapi/v2/file/scan' url = 'https://www.virustotal.com/vtapi/v2/file/scan'
params = {'apikey': vak} params = {'apikey': vak}
files = {'file': (downloaded_file_name, open(downloaded_file_name, 'rb'))} with open(downloaded_file_name, 'rb') as f:
files = {'file': (downloaded_file_name, f)}
response = requests.post(url, files=files, params=params, timeout=10) response = requests.post(url, files=files, params=params, timeout=10)
try: try:
r_json = response.json() r_json = response.json()
@@ -104,7 +105,8 @@ async def scan_my_large_file(_, message: Message):
url = upl_data url = upl_data
files = {'file': (downloaded_file_name, open(downloaded_file_name, 'rb'))} with open(downloaded_file_name, 'rb') as f:
files = {'file': (downloaded_file_name, f)}
headers = {'accept': 'application/json', 'x-apikey': vak} headers = {'accept': 'application/json', 'x-apikey': vak}
response = requests.post(url, files=files, headers=headers, timeout=10) response = requests.post(url, files=files, headers=headers, timeout=10)
+1 -1
View File
@@ -23,7 +23,7 @@ from pyrogram.handlers import MessageHandler
class _TrueFilter(filters.Filter): class _TrueFilter(filters.Filter):
async def __call__(self, client: Client, update: types.Message): async def __call__(self, _client: Client, _update: types.Message):
return True return True
+4 -4
View File
@@ -149,7 +149,7 @@ class SqliteDatabase(Database):
self._lock.release() self._lock.release()
def get(self, module: str, variable: str, default=None): def get(self, module: str, variable: str, default=None):
sql = f"SELECT * FROM '{module}' WHERE var=?" sql = f"SELECT * FROM '{module}' WHERE var=?" # noqa: S608
cur = self._execute(module, sql, (variable,)) cur = self._execute(module, sql, (variable,))
row = cur.fetchone() row = cur.fetchone()
@@ -162,7 +162,7 @@ class SqliteDatabase(Database):
INSERT INTO '{module}' VALUES ( ?, ?, ? ) INSERT INTO '{module}' VALUES ( ?, ?, ? )
ON CONFLICT (var) DO ON CONFLICT (var) DO
UPDATE SET val=?, type=? WHERE var=? UPDATE SET val=?, type=? WHERE var=?
""" """ # noqa: S608
if isinstance(value, bool): if isinstance(value, bool):
val = '1' if value else '0' val = '1' if value else '0'
@@ -183,7 +183,7 @@ class SqliteDatabase(Database):
return True return True
def remove(self, module: str, variable: str): def remove(self, module: str, variable: str):
sql = f"DELETE FROM '{module}' WHERE var=?" sql = f"DELETE FROM '{module}' WHERE var=?" # noqa: S608
self._execute(module, sql, (variable,)) self._execute(module, sql, (variable,))
self._conn.commit() self._conn.commit()
@@ -192,7 +192,7 @@ class SqliteDatabase(Database):
if not re.match(pattern, module): if not re.match(pattern, module):
raise ValueError(f'Invalid module name format: {module}') raise ValueError(f'Invalid module name format: {module}')
sql = f"SELECT * FROM '{module}'" sql = f"SELECT * FROM '{module}'" # noqa: S608
cur = self._execute(module, sql) cur = self._execute(module, sql)
collection = {} collection = {}
+7 -7
View File
@@ -138,14 +138,14 @@ async def paste(
print(f'URL: {url} - Edit Code: {edit_code} - Time: {ftime}') print(f'URL: {url} - Edit Code: {edit_code} - Time: {ftime}')
rallUrls = db.get('core.rentry', 'urls', default={'allUrls': {}}) rall_urls = db.get('core.rentry', 'urls', default={'allUrls': {}})
entry_id = str(uuid4()) entry_id = str(uuid4())
rallUrls['allUrls'][entry_id] = { rall_urls['allUrls'][entry_id] = {
'url': short_url, 'url': short_url,
'edit_code': edit_code, 'edit_code': edit_code,
'time': ftime, 'time': ftime,
} }
db.set('core.rentry', 'urls', rallUrls) db.set('core.rentry', 'urls', rall_urls)
if return_edit: if return_edit:
return (url, edit_code) return (url, edit_code)
@@ -156,19 +156,19 @@ async def rentry_cleanup_job():
"""Periodically checks and deletes rentry pastes older than 24 hours""" """Periodically checks and deletes rentry pastes older than 24 hours"""
while True: while True:
try: try:
rallUrls = db.get('core.rentry', 'urls', default={'allUrls': {}}) rall_urls = db.get('core.rentry', 'urls', default={'allUrls': {}})
now = datetime.now() now = datetime.now()
deleted_count = 0 deleted_count = 0
error_count = 0 error_count = 0
for entry_id, entry in list(rallUrls['allUrls'].items()): for entry_id, entry in list(rall_urls['allUrls'].items()):
url = entry['url'] url = entry['url']
entry_time = datetime.strptime(entry['time'], '%d %I:%M:%S %p %Y') entry_time = datetime.strptime(entry['time'], '%d %I:%M:%S %p %Y')
if now - entry_time > timedelta(days=1): if now - entry_time > timedelta(days=1):
try: try:
delete(url, entry['edit_code']) delete(url, entry['edit_code'])
del rallUrls['allUrls'][entry_id] del rall_urls['allUrls'][entry_id]
deleted_count += 1 deleted_count += 1
print(f'[#] Deleted expired rentry paste: {url}') print(f'[#] Deleted expired rentry paste: {url}')
except Exception as e: except Exception as e:
@@ -179,7 +179,7 @@ async def rentry_cleanup_job():
print(f'[*] Cleanup summary: {deleted_count} deleted, {error_count} failed') print(f'[*] Cleanup summary: {deleted_count} deleted, {error_count} failed')
if deleted_count: if deleted_count:
db.set('core.rentry', 'urls', rallUrls) db.set('core.rentry', 'urls', rall_urls)
except Exception as e: except Exception as e:
print(f'[!] Error in rentry cleanup job: {str(e)}') print(f'[!] Error in rentry cleanup job: {str(e)}')