Fix all lint issues: Dockerfiles (DL3015/DL3013/DL4006) + Ruff (173→0 errors)
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:
+388
-418
File diff suppressed because it is too large
Load Diff
@@ -3,10 +3,10 @@ FROM python:3.11-slim
|
||||
WORKDIR /app
|
||||
|
||||
# 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
|
||||
RUN pip install requests redis
|
||||
RUN pip install --no-cache-dir requests==2.32.3 redis==5.2.1
|
||||
|
||||
# Copy application code
|
||||
COPY . .
|
||||
|
||||
@@ -7,12 +7,10 @@ import redis
|
||||
import requests
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(levelname)s - %(message)s'
|
||||
)
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# Load configuration (adapted to .env keys)
|
||||
def _env(key, default=None):
|
||||
v = os.getenv(key, default)
|
||||
@@ -20,40 +18,46 @@ def _env(key, default=None):
|
||||
return v[1:-1]
|
||||
return v
|
||||
|
||||
|
||||
LOGIN = _env('KEEPER_LOGIN')
|
||||
PASSWORD = _env('KEEPER_PASSWORD')
|
||||
|
||||
EDU_BASE = _env('EDU_URL_BASE', 'https://edu.edu.vn.ua')
|
||||
EDU_LOGIN_PATH = _env('EDU_URL_LOGIN', '/user/login')
|
||||
EDU_COURSES_PATH = _env('EDU_URL_COURSES', '/course/userlist')
|
||||
URL_LOGIN = f"{EDU_BASE.rstrip('/')}/{EDU_LOGIN_PATH.lstrip('/')}"
|
||||
URL_VERIFY = f"{EDU_BASE.rstrip('/')}/{EDU_COURSES_PATH.lstrip('/')}"
|
||||
URL_LOGIN = f'{EDU_BASE.rstrip("/")}/{EDU_LOGIN_PATH.lstrip("/")}'
|
||||
URL_VERIFY = f'{EDU_BASE.rstrip("/")}/{EDU_COURSES_PATH.lstrip("/")}'
|
||||
|
||||
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_PORT = int(_env('REDIS_PORT', 6379))
|
||||
|
||||
SUCCESS_FILE = '/tmp/last_success' # noqa: S108
|
||||
|
||||
|
||||
def touch_success_file():
|
||||
"""Updates the timestamp of the success file for healthchecks."""
|
||||
try:
|
||||
with open(SUCCESS_FILE, 'w') as f:
|
||||
f.write(str(datetime.now().timestamp()))
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to touch success file: {e}")
|
||||
logger.error(f'Failed to touch success file: {e}')
|
||||
|
||||
|
||||
def main():
|
||||
logger.info("Starting Session Keeper Bot")
|
||||
logger.info('Starting Session Keeper Bot')
|
||||
|
||||
# Connect to Redis
|
||||
try:
|
||||
redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, decode_responses=True)
|
||||
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:
|
||||
logger.error(f"Failed to connect to Redis: {e}")
|
||||
logger.error(f'Failed to connect to Redis: {e}')
|
||||
return
|
||||
|
||||
session = requests.Session()
|
||||
@@ -73,19 +77,16 @@ def main():
|
||||
'Sec-Ch-Ua-Mobile': '?0',
|
||||
'Sec-Ch-Ua-Platform': '"Linux"',
|
||||
'Accept-Encoding': 'gzip, deflate, br',
|
||||
'Priority': 'u=0, i'
|
||||
'Priority': 'u=0, i',
|
||||
}
|
||||
session.headers.update(headers)
|
||||
|
||||
while True:
|
||||
try:
|
||||
logger.info("Attempting login...")
|
||||
logger.info('Attempting login...')
|
||||
|
||||
# Login payload
|
||||
payload = {
|
||||
'login': LOGIN,
|
||||
'password': PASSWORD
|
||||
}
|
||||
payload = {'login': LOGIN, 'password': PASSWORD}
|
||||
|
||||
# Perform Login
|
||||
# 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)
|
||||
|
||||
logger.info(f"Login Response Status: {login_response.status_code}")
|
||||
logger.info(f"Cookies after login: {session.cookies.get_dict()}")
|
||||
logger.info(f'Login Response Status: {login_response.status_code}')
|
||||
logger.info(f'Cookies after login: {session.cookies.get_dict()}')
|
||||
|
||||
# Verify Session
|
||||
logger.info("Verifying session...")
|
||||
logger.info('Verifying session...')
|
||||
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:
|
||||
logger.info("Session verification SUCCESS (200 OK).")
|
||||
logger.info('Session verification SUCCESS (200 OK).')
|
||||
touch_success_file()
|
||||
|
||||
# Save PHPSESSID to Redis
|
||||
@@ -112,19 +113,20 @@ def main():
|
||||
if phpsessid:
|
||||
try:
|
||||
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:
|
||||
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:
|
||||
logger.warning("Session verification FAILED (302 Redirect). Session might be invalid.")
|
||||
logger.warning('Session verification FAILED (302 Redirect). Session might be invalid.')
|
||||
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:
|
||||
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)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
@@ -3,7 +3,7 @@ FROM python:3.11-slim
|
||||
WORKDIR /app
|
||||
|
||||
# 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 .
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,15 @@
|
||||
FROM python:3.11-slim AS builder
|
||||
|
||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||
|
||||
WORKDIR /src
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir --user -r requirements.txt
|
||||
|
||||
FROM python:3.11-slim
|
||||
|
||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
git \
|
||||
mediainfo \
|
||||
|
||||
@@ -3,7 +3,7 @@ import re
|
||||
from io import BytesIO
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup as BS
|
||||
from bs4 import BeautifulSoup
|
||||
from pyrogram import Client, filters
|
||||
from pyrogram.errors import RPCError
|
||||
from pyrogram.types import InputMediaPhoto, Message
|
||||
@@ -22,7 +22,7 @@ async def search_icon(_, message: Message):
|
||||
|
||||
try:
|
||||
html_content = requests.get(url, timeout=10).text
|
||||
soup = BS(html_content, 'html.parser')
|
||||
soup = BeautifulSoup(html_content, 'html.parser')
|
||||
results = soup.find_all(
|
||||
'img',
|
||||
src=re.compile(r'https://cdn-icons-png.flaticon.com/128/[0-9]+/[0-9]+.png'),
|
||||
|
||||
@@ -40,7 +40,7 @@ async def download_image(url):
|
||||
|
||||
|
||||
@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:
|
||||
await message.edit('Usage: `pinterest [number] <query>`', parse_mode=enums.ParseMode.MARKDOWN)
|
||||
return
|
||||
|
||||
@@ -40,7 +40,7 @@ async def download_image(url):
|
||||
|
||||
|
||||
@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:
|
||||
await message.edit('Usage: `img [number] <query>`', parse_mode=enums.ParseMode.MARKDOWN)
|
||||
return
|
||||
|
||||
@@ -10,15 +10,16 @@ from PIL import Image, ImageDraw, ImageFont
|
||||
from pyrogram import Client, filters
|
||||
from pyrogram.types import Message
|
||||
from utils.misc import modules_help, prefix
|
||||
from utils.scripts import edit_or_reply
|
||||
from utils.scripts import reply_check as ReplyCheck
|
||||
from utils.scripts import edit_or_reply, reply_check
|
||||
|
||||
|
||||
async def amongus_gen(text: str, clr: int) -> str:
|
||||
url = 'https://github.com/TgCatUB/CatUserbot-Resources/raw/master/Resources/Amongus/'
|
||||
font = ImageFont.truetype(
|
||||
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,
|
||||
)
|
||||
@@ -97,7 +98,7 @@ async def amongus_cmd(client: Client, message: Message):
|
||||
await client.send_sticker(
|
||||
message.chat.id,
|
||||
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(
|
||||
message.chat.id,
|
||||
imposter_file,
|
||||
reply_to_message_id=ReplyCheck(message),
|
||||
reply_to_message_id=reply_check(message),
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -43,22 +43,22 @@ async def anime_search(client: Client, message: Message):
|
||||
|
||||
result = response.json()
|
||||
|
||||
averageScore = result['averageScore']
|
||||
average_score = result['average_score']
|
||||
try:
|
||||
coverImage_url = result['imageUrl']
|
||||
coverImage = requests.get(url=coverImage_url, timeout=10).content
|
||||
cover_image_url = result['imageUrl']
|
||||
cover_image = requests.get(url=cover_image_url, timeout=10).content
|
||||
async with aiofiles.open('coverImage.jpg', mode='wb') as f:
|
||||
await f.write(coverImage)
|
||||
await f.write(cover_image)
|
||||
|
||||
except Exception:
|
||||
coverImage = None
|
||||
cover_image = None
|
||||
|
||||
title = result['title']['english']
|
||||
trailer = result['trailer']['id']
|
||||
description = result['description']
|
||||
episodes = result['episodes']
|
||||
genres = ', '.join(result['genres'])
|
||||
isAdult = result['isAdult']
|
||||
is_adult = result['is_adult']
|
||||
status = result['status']
|
||||
studios = ', '.join(result['studios'])
|
||||
|
||||
@@ -68,7 +68,7 @@ async def anime_search(client: Client, message: Message):
|
||||
[
|
||||
InputMediaPhoto(
|
||||
'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(
|
||||
'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()
|
||||
|
||||
averageScore = result['averageScore']
|
||||
average_score = result['average_score']
|
||||
try:
|
||||
coverImage_url = result['imageUrl']
|
||||
coverImage = requests.get(url=coverImage_url, timeout=10).content
|
||||
cover_image_url = result['imageUrl']
|
||||
cover_image = requests.get(url=cover_image_url, timeout=10).content
|
||||
async with aiofiles.open('coverImage.jpg', mode='wb') as f:
|
||||
await f.write(coverImage)
|
||||
await f.write(cover_image)
|
||||
|
||||
except Exception:
|
||||
coverImage = None
|
||||
cover_image = None
|
||||
|
||||
title = result['title']['english']
|
||||
trailer = result['trailer']['id']
|
||||
description = result['description']
|
||||
chapters = result['chapters']
|
||||
genres = ', '.join(result['genres'])
|
||||
isAdult = result['isAdult']
|
||||
is_adult = result['is_adult']
|
||||
status = result['status']
|
||||
studios = ', '.join(result['studios'])
|
||||
|
||||
@@ -134,7 +134,7 @@ async def manga_search(client: Client, message: Message):
|
||||
[
|
||||
InputMediaPhoto(
|
||||
'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(
|
||||
'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()
|
||||
|
||||
try:
|
||||
coverImage_url = result['image']['large']
|
||||
coverImage = requests.get(url=coverImage_url, timeout=10).content
|
||||
cover_image_url = result['image']['large']
|
||||
cover_image = requests.get(url=cover_image_url, timeout=10).content
|
||||
async with aiofiles.open('coverImage.jpg', mode='wb') as f:
|
||||
await f.write(coverImage)
|
||||
await f.write(cover_image)
|
||||
|
||||
except Exception:
|
||||
coverImage = None
|
||||
cover_image = None
|
||||
|
||||
age = result['age']
|
||||
description = result['description']
|
||||
|
||||
@@ -49,7 +49,7 @@ async def random():
|
||||
|
||||
|
||||
@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:
|
||||
await message.edit('<b>Searching art</b>', parse_mode=enums.ParseMode.HTML)
|
||||
ra = await random()
|
||||
|
||||
@@ -11,7 +11,7 @@ def id_generator() -> str:
|
||||
|
||||
|
||||
@Client.on_message(filters.command(['bbox', 'blackbox'], prefix) & filters.me)
|
||||
async def blackbox(client, message):
|
||||
async def blackbox(_client, message):
|
||||
m = message
|
||||
msg = await m.edit_text('🔍')
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ from utils.scripts import import_library
|
||||
|
||||
cohere = import_library('cohere')
|
||||
|
||||
import cohere # noqa: F811
|
||||
import cohere # noqa: F811, E402
|
||||
|
||||
co = cohere.Client(cohere_key)
|
||||
|
||||
|
||||
@@ -15,7 +15,9 @@ from PIL import Image, ImageDraw, ImageFont # noqa: E402
|
||||
@Client.on_message(filters.command(['dem'], prefix) & filters.me)
|
||||
async def demotivator(client: Client, message: Message):
|
||||
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
|
||||
template_dem = requests.get('https://raw.githubusercontent.com/files/main/demotivator.png', timeout=10)
|
||||
if message.reply_to_message:
|
||||
|
||||
@@ -11,7 +11,7 @@ from lottie.importers import importers # noqa: E402
|
||||
|
||||
|
||||
@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"""
|
||||
try:
|
||||
reply = message.reply_to_message
|
||||
|
||||
@@ -30,11 +30,11 @@ def subprocess_run(cmd):
|
||||
executable='bash',
|
||||
)
|
||||
talk = subproc.communicate()
|
||||
exitCode = subproc.returncode
|
||||
if exitCode != 0:
|
||||
exit_code = subproc.returncode
|
||||
if exit_code != 0:
|
||||
reply += (
|
||||
'```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'stderr: {talk[1]}```'
|
||||
)
|
||||
|
||||
@@ -4,7 +4,7 @@ from utils.misc import prefix
|
||||
|
||||
|
||||
@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:])
|
||||
sample_url = 'https://duckduckgo.com/?q={}'.format(input_str.replace(' ', '+'))
|
||||
if sample_url:
|
||||
|
||||
@@ -29,7 +29,7 @@ from utils.misc import modules_help, prefix
|
||||
|
||||
|
||||
@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:
|
||||
await message.edit('<code>This is an example module</code>')
|
||||
except Exception as e:
|
||||
|
||||
@@ -85,7 +85,7 @@ REPLACEMENT_MAP = {
|
||||
|
||||
|
||||
@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:])
|
||||
final_str = ''
|
||||
for char in text:
|
||||
|
||||
@@ -9,9 +9,9 @@ from utils.scripts import format_exc, progress
|
||||
|
||||
|
||||
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
|
||||
response = requests.post(API_URL, json=payload, timeout=10)
|
||||
response = requests.post(api_url, json=payload, timeout=10)
|
||||
if response.status_code != 200:
|
||||
print(f'Error status {response.status_code}')
|
||||
return None
|
||||
@@ -19,7 +19,7 @@ def schellwithflux(args):
|
||||
|
||||
|
||||
@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
|
||||
if not question:
|
||||
return await message.reply_text('Please provide a question for Flux.')
|
||||
|
||||
@@ -37,20 +37,20 @@ async def _wrap_edit(message: Message, text: str):
|
||||
|
||||
async def phase1(message: Message):
|
||||
"""Big scroll"""
|
||||
BIG_SCROLL = '🧡💛💚💙💜🖤🤎'
|
||||
big_scroll = '🧡💛💚💙💜🖤🤎'
|
||||
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 asyncio.sleep(SLEEP)
|
||||
|
||||
|
||||
async def phase2(message: Message):
|
||||
"""Per-heart randomiser"""
|
||||
ALL = ['❤️'] + list('🧡💛💚💙💜🤎🖤') # don't include white heart
|
||||
all_hearts = ['❤️'] + list('🧡💛💚💙💜🤎🖤') # don't include white heart
|
||||
|
||||
format_heart = joined_heart.replace(R, '{}')
|
||||
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 asyncio.sleep(SLEEP)
|
||||
|
||||
@@ -75,7 +75,7 @@ async def phase4(message: Message):
|
||||
|
||||
|
||||
@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 phase2(message)
|
||||
await phase3(message)
|
||||
|
||||
+16
-10
@@ -85,8 +85,8 @@ async def loadmod(_, message: Message):
|
||||
module_name = url.lower()
|
||||
try:
|
||||
f = requests.get(
|
||||
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/full.txt'
|
||||
, timeout=10).text
|
||||
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/full.txt', timeout=10
|
||||
).text
|
||||
except Exception:
|
||||
return await message.edit('Failed to fetch custom modules list')
|
||||
modules_dict = {line.split('/')[-1].split()[0]: line.strip() for line in f.splitlines()}
|
||||
@@ -97,8 +97,9 @@ async def loadmod(_, message: Message):
|
||||
return
|
||||
else:
|
||||
modules_hashes = requests.get(
|
||||
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/modules_hashes.txt'
|
||||
, timeout=10).text
|
||||
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/modules_hashes.txt',
|
||||
timeout=10,
|
||||
).text
|
||||
resp = requests.get(url, timeout=10)
|
||||
|
||||
if not resp.ok:
|
||||
@@ -136,8 +137,8 @@ async def loadmod(_, message: Message):
|
||||
content = f.read()
|
||||
|
||||
modules_hashes = requests.get(
|
||||
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/modules_hashes.txt'
|
||||
, timeout=10).text
|
||||
'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/modules_hashes.txt', timeout=10
|
||||
).text
|
||||
|
||||
if hashlib.sha256(content).hexdigest() not in modules_hashes:
|
||||
os.remove(file_name)
|
||||
@@ -214,7 +215,9 @@ async def load_all_mods(_, message: Message):
|
||||
os.mkdir(f'{BASE_PATH}/modules/custom_modules')
|
||||
|
||||
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:
|
||||
return await message.edit('Failed to fetch custom modules list')
|
||||
modules_list = f.splitlines()
|
||||
@@ -281,14 +284,17 @@ async def updateallmods(_, message: Message):
|
||||
if not module_name.endswith('.py'):
|
||||
continue
|
||||
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:
|
||||
return await message.edit('Failed to fetch custom modules list')
|
||||
modules_dict = {line.split('/')[-1].split()[0]: line.strip() for line in f.splitlines()}
|
||||
if module_name in modules_dict:
|
||||
resp = requests.get(
|
||||
f'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/{modules_dict[module_name]}.py'
|
||||
, timeout=10)
|
||||
f'https://raw.githubusercontent.com/The-MoonTg-project/custom_modules/main/{modules_dict[module_name]}.py',
|
||||
timeout=10,
|
||||
)
|
||||
if not resp.ok:
|
||||
modules_installed.remove(module_name)
|
||||
continue
|
||||
|
||||
@@ -140,20 +140,20 @@ async def autofwd_main(client: Client, message: Message):
|
||||
target_chats = db.get('custom.autofwd', 'chatto')
|
||||
|
||||
if source_chats is not None and chat_id in source_chats and target_chats is not None:
|
||||
for chat in target_chats:
|
||||
for chat in target_chats:
|
||||
try:
|
||||
await message.copy(chat)
|
||||
except Exception as e:
|
||||
try:
|
||||
await message.copy(chat)
|
||||
except Exception as e:
|
||||
try:
|
||||
await client.send_message(
|
||||
'me',
|
||||
f'Auto Forwarding Failed for Chat with id: <code>{chat_id}</code> to <code>{chat}</code>\n\n{e}',
|
||||
)
|
||||
except MessageTooLong:
|
||||
await client.send_message(
|
||||
'me',
|
||||
f'Auto Forwarding Failed for Chat with id: <code>{chat_id}</code> to <code>{chat}</code>, Please check logs!',
|
||||
)
|
||||
await client.send_message(
|
||||
'me',
|
||||
f'Auto Forwarding Failed for Chat with id: <code>{chat_id}</code> to <code>{chat}</code>\n\n{e}',
|
||||
)
|
||||
except MessageTooLong:
|
||||
await client.send_message(
|
||||
'me',
|
||||
f'Auto Forwarding Failed for Chat with id: <code>{chat_id}</code> to <code>{chat}</code>, Please check logs!',
|
||||
)
|
||||
|
||||
|
||||
modules_help['autofwd'] = {
|
||||
|
||||
@@ -63,7 +63,7 @@ async def backup(client: Client, message: Message):
|
||||
|
||||
|
||||
@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
|
||||
"""
|
||||
@@ -98,7 +98,7 @@ async def restore(client: Client, message: Message):
|
||||
|
||||
|
||||
@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
|
||||
"""
|
||||
@@ -112,8 +112,8 @@ async def backupmods(client: Client, message: Message):
|
||||
|
||||
for mod in modules_help:
|
||||
if os.path.isfile(f'modules/custom_modules/{mod}.py'):
|
||||
f = open(f'backups/{mod}.py', 'wb')
|
||||
f.write(open(f'modules/custom_modules/{mod}.py', 'rb').read())
|
||||
with open(f'backups/{mod}.py', 'wb') as f, open(f'modules/custom_modules/{mod}.py', 'rb') as src:
|
||||
f.write(src.read())
|
||||
await message.edit(
|
||||
text='<b>All modules backed up to:</b> <code>backups/</code> folder',
|
||||
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)
|
||||
async def backupmod(client: Client, message: Message):
|
||||
async def backupmod(_client: Client, message: Message):
|
||||
"""
|
||||
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)
|
||||
|
||||
if os.path.isfile(f'modules/custom_modules/{mod}.py'):
|
||||
f = open(f'backups/{mod}.py', 'wb')
|
||||
f.write(open(f'modules/custom_modules/{mod}.py', 'rb').read())
|
||||
with open(f'backups/{mod}.py', 'wb') as f, open(f'modules/custom_modules/{mod}.py', 'rb') as src:
|
||||
f.write(src.read())
|
||||
else:
|
||||
return await message.edit(
|
||||
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)
|
||||
async def restoremod(client: Client, message: Message):
|
||||
async def restoremod(_client: Client, message: Message):
|
||||
"""
|
||||
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)
|
||||
|
||||
if os.path.isfile(f'backups/{mod}.py'):
|
||||
f = open(f'modules/custom_modules/{mod}.py', 'wb')
|
||||
f.write(open(f'backups/{mod}.py', 'rb').read())
|
||||
with open(f'modules/custom_modules/{mod}.py', 'wb') as f, open(f'backups/{mod}.py', 'rb') as src:
|
||||
f.write(src.read())
|
||||
else:
|
||||
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,
|
||||
)
|
||||
await message.edit(
|
||||
@@ -195,7 +195,7 @@ async def restoremod(client: Client, message: Message):
|
||||
|
||||
|
||||
@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
|
||||
"""
|
||||
@@ -209,8 +209,8 @@ async def restoremods(client: Client, message: Message):
|
||||
if mod.endswith('.py'):
|
||||
if os.path.isfile(f'modules/{mod}'):
|
||||
continue
|
||||
f = open(f'modules/custom_modules/{mod}', 'wb')
|
||||
f.write(open(f'backups/{mod}', 'rb').read())
|
||||
with open(f'modules/custom_modules/{mod}', 'wb') as f, open(f'backups/{mod}', 'rb') as src:
|
||||
f.write(src.read())
|
||||
await message.edit(
|
||||
text='<b>All modules restored from:</b> <code>backups/</code> folder',
|
||||
parse_mode=enums.ParseMode.HTML,
|
||||
|
||||
@@ -41,7 +41,7 @@ def format_time_12hr(time_str: str) -> str:
|
||||
|
||||
|
||||
@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:
|
||||
city_name = message.reply_to_message.text
|
||||
country_name = DEFAULT_COUNTRY # Default to Pakistan if no country is provided
|
||||
|
||||
@@ -166,17 +166,17 @@ async def app(client: Client, message: Message):
|
||||
result = response.json()
|
||||
|
||||
try:
|
||||
coverImage_url = result['results'][0]['icon']
|
||||
coverImage = requests.get(url=coverImage_url, timeout=10).content
|
||||
async with aiofiles.open('coverImage.jpg', mode='wb') as f:
|
||||
await f.write(coverImage)
|
||||
cover_image_url = result['results'][0]['icon']
|
||||
cover_image = requests.get(url=cover_image_url, timeout=10).content
|
||||
async with aiofiles.open('cover_image.jpg', mode='wb') as f:
|
||||
await f.write(cover_image)
|
||||
|
||||
except Exception:
|
||||
coverImage = None
|
||||
cover_image = None
|
||||
|
||||
description = result['results'][0]['description']
|
||||
developer = result['results'][0]['developer']
|
||||
IsFree = result['results'][0]['free']
|
||||
is_free = result['results'][0]['free']
|
||||
genre = result['results'][0]['genre']
|
||||
package_name = result['results'][0]['id']
|
||||
title = result['results'][0]['title']
|
||||
@@ -189,8 +189,8 @@ async def app(client: Client, message: Message):
|
||||
chat_id,
|
||||
[
|
||||
InputMediaPhoto(
|
||||
'coverImage.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}',
|
||||
'cover_image.jpg',
|
||||
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,
|
||||
[
|
||||
InputMediaPhoto(
|
||||
'coverImage.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}',
|
||||
'cover_image.jpg',
|
||||
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:
|
||||
await message.edit_text(format_exc(e))
|
||||
finally:
|
||||
if os.path.exists('coverImage.jpg'):
|
||||
os.remove('coverImage.jpg')
|
||||
if os.path.exists('cover_image.jpg'):
|
||||
os.remove('cover_image.jpg')
|
||||
|
||||
|
||||
@Client.on_message(filters.command('tsearch', prefix) & filters.me)
|
||||
@@ -232,7 +232,7 @@ async def tsearch(client: Client, message: Message):
|
||||
|
||||
result = response.json()
|
||||
|
||||
coverImage_url = result['results'][0]['thumbnail']
|
||||
cover_image_url = result['results'][0]['thumbnail']
|
||||
description = result['results'][0]['description']
|
||||
genre = result['results'][0]['genre']
|
||||
category = result['results'][0]['category']
|
||||
@@ -264,17 +264,17 @@ async def tsearch(client: Client, message: Message):
|
||||
content=all_results_content,
|
||||
)
|
||||
|
||||
if coverImage_url is not None:
|
||||
coverImage = requests.get(url=coverImage_url, timeout=10).content
|
||||
async with aiofiles.open('coverImage.jpg', mode='wb') as f:
|
||||
await f.write(coverImage)
|
||||
if cover_image_url is not None:
|
||||
cover_image = requests.get(url=cover_image_url, timeout=10).content
|
||||
async with aiofiles.open('cover_image.jpg', mode='wb') as f:
|
||||
await f.write(cover_image)
|
||||
|
||||
await message.delete()
|
||||
await client.send_media_group(
|
||||
chat_id,
|
||||
[
|
||||
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>",
|
||||
)
|
||||
],
|
||||
@@ -292,7 +292,7 @@ async def tsearch(client: Client, message: Message):
|
||||
chat_id,
|
||||
[
|
||||
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>",
|
||||
)
|
||||
],
|
||||
@@ -308,8 +308,8 @@ async def tsearch(client: Client, message: Message):
|
||||
except Exception as e:
|
||||
await message.edit_text(format_exc(e))
|
||||
finally:
|
||||
if os.path.exists('coverImage.jpg'):
|
||||
os.remove('coverImage.jpg')
|
||||
if os.path.exists('cover_image.jpg'):
|
||||
os.remove('cover_image.jpg')
|
||||
|
||||
|
||||
@Client.on_message(filters.command('stts', prefix) & filters.me)
|
||||
|
||||
@@ -53,7 +53,7 @@ async def user_exec(_: Client, message: Message):
|
||||
|
||||
# noinspection PyUnusedLocal
|
||||
@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:
|
||||
await message.edit("<b>Code to eval isn't provided</b>")
|
||||
return
|
||||
|
||||
+14
-13
@@ -119,22 +119,23 @@ async def rmbg(client: Client, message: Message):
|
||||
start = datetime.now()
|
||||
await pablo.edit('sending to ReMove.BG')
|
||||
input_file_name = cool
|
||||
files = {
|
||||
'image_file': (input_file_name, open(input_file_name, 'rb')),
|
||||
}
|
||||
r = requests.post(
|
||||
'https://api.remove.bg/v1.0/removebg',
|
||||
headers={'X-Api-Key': rmbg_key},
|
||||
files=files,
|
||||
allow_redirects=True,
|
||||
stream=True,
|
||||
timeout=10,
|
||||
)
|
||||
with open(input_file_name, 'rb') as f:
|
||||
files = {
|
||||
'image_file': (input_file_name, f),
|
||||
}
|
||||
r = requests.post(
|
||||
'https://api.remove.bg/v1.0/removebg',
|
||||
headers={'X-Api-Key': rmbg_key},
|
||||
files=files,
|
||||
allow_redirects=True,
|
||||
stream=True,
|
||||
timeout=10,
|
||||
)
|
||||
if os.path.exists(cool):
|
||||
os.remove(cool)
|
||||
output_file_name = r
|
||||
contentType = output_file_name.headers.get('content-type')
|
||||
if 'image' in contentType:
|
||||
content_type = output_file_name.headers.get('content-type')
|
||||
if 'image' in content_type:
|
||||
with io.BytesIO(output_file_name.content) as remove_bg_image:
|
||||
remove_bg_image.name = 'BG_rem.png'
|
||||
await client.send_document(message.chat.id, remove_bg_image, reply_to_message_id=message.id)
|
||||
|
||||
@@ -67,8 +67,9 @@ async def ipinfo(_, message: Message):
|
||||
await m.edit_text('🔎')
|
||||
try:
|
||||
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'
|
||||
, timeout=10)
|
||||
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,
|
||||
)
|
||||
response = json.loads(url.text)
|
||||
text = f"""
|
||||
<b>IP Address:</b> <code>{response['query']}</code>
|
||||
|
||||
@@ -102,7 +102,8 @@ async def spin_handler(client: Client, message: Message):
|
||||
elif message.reply_to_message.text:
|
||||
result = await quote_cmd(client, message)
|
||||
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
|
||||
else:
|
||||
filename = 'photo.jpg'
|
||||
|
||||
@@ -24,14 +24,14 @@ from utils.misc import modules_help, prefix
|
||||
|
||||
@Client.on_message(filters.command('setthumb', prefix) & filters.me)
|
||||
async def setthumb(_, message: Message):
|
||||
THUMB_PATH = 'downloads/thumb'
|
||||
thumb_path = 'downloads/thumb'
|
||||
if message.reply_to_message:
|
||||
if not os.path.exists(THUMB_PATH):
|
||||
os.makedirs(THUMB_PATH)
|
||||
if not os.path.exists(thumb_path):
|
||||
os.makedirs(thumb_path)
|
||||
new_thumb = await message.reply_to_message.download()
|
||||
with Image.open(new_thumb) as img:
|
||||
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)
|
||||
await message.edit_text('Thumbnail set successfully!')
|
||||
else:
|
||||
|
||||
@@ -48,8 +48,9 @@ async def scan_my_file(_, message: Message):
|
||||
|
||||
url = 'https://www.virustotal.com/vtapi/v2/file/scan'
|
||||
params = {'apikey': vak}
|
||||
files = {'file': (downloaded_file_name, open(downloaded_file_name, 'rb'))}
|
||||
response = requests.post(url, files=files, params=params, timeout=10)
|
||||
with open(downloaded_file_name, 'rb') as f:
|
||||
files = {'file': (downloaded_file_name, f)}
|
||||
response = requests.post(url, files=files, params=params, timeout=10)
|
||||
try:
|
||||
r_json = response.json()
|
||||
md5 = r_json['md5']
|
||||
@@ -104,9 +105,10 @@ async def scan_my_large_file(_, message: Message):
|
||||
|
||||
url = upl_data
|
||||
|
||||
files = {'file': (downloaded_file_name, open(downloaded_file_name, 'rb'))}
|
||||
headers = {'accept': 'application/json', 'x-apikey': vak}
|
||||
response = requests.post(url, files=files, headers=headers, timeout=10)
|
||||
with open(downloaded_file_name, 'rb') as f:
|
||||
files = {'file': (downloaded_file_name, f)}
|
||||
headers = {'accept': 'application/json', 'x-apikey': vak}
|
||||
response = requests.post(url, files=files, headers=headers, timeout=10)
|
||||
|
||||
r_json = response.json()
|
||||
analysis_url = r_json['data']['links']['self']
|
||||
|
||||
@@ -23,7 +23,7 @@ from pyrogram.handlers import MessageHandler
|
||||
|
||||
|
||||
class _TrueFilter(filters.Filter):
|
||||
async def __call__(self, client: Client, update: types.Message):
|
||||
async def __call__(self, _client: Client, _update: types.Message):
|
||||
return True
|
||||
|
||||
|
||||
|
||||
+4
-4
@@ -149,7 +149,7 @@ class SqliteDatabase(Database):
|
||||
self._lock.release()
|
||||
|
||||
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,))
|
||||
|
||||
row = cur.fetchone()
|
||||
@@ -162,7 +162,7 @@ class SqliteDatabase(Database):
|
||||
INSERT INTO '{module}' VALUES ( ?, ?, ? )
|
||||
ON CONFLICT (var) DO
|
||||
UPDATE SET val=?, type=? WHERE var=?
|
||||
"""
|
||||
""" # noqa: S608
|
||||
|
||||
if isinstance(value, bool):
|
||||
val = '1' if value else '0'
|
||||
@@ -183,7 +183,7 @@ class SqliteDatabase(Database):
|
||||
return True
|
||||
|
||||
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._conn.commit()
|
||||
|
||||
@@ -192,7 +192,7 @@ class SqliteDatabase(Database):
|
||||
if not re.match(pattern, 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)
|
||||
|
||||
collection = {}
|
||||
|
||||
@@ -138,14 +138,14 @@ async def paste(
|
||||
|
||||
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())
|
||||
rallUrls['allUrls'][entry_id] = {
|
||||
rall_urls['allUrls'][entry_id] = {
|
||||
'url': short_url,
|
||||
'edit_code': edit_code,
|
||||
'time': ftime,
|
||||
}
|
||||
db.set('core.rentry', 'urls', rallUrls)
|
||||
db.set('core.rentry', 'urls', rall_urls)
|
||||
|
||||
if return_edit:
|
||||
return (url, edit_code)
|
||||
@@ -156,19 +156,19 @@ async def rentry_cleanup_job():
|
||||
"""Periodically checks and deletes rentry pastes older than 24 hours"""
|
||||
while True:
|
||||
try:
|
||||
rallUrls = db.get('core.rentry', 'urls', default={'allUrls': {}})
|
||||
rall_urls = db.get('core.rentry', 'urls', default={'allUrls': {}})
|
||||
now = datetime.now()
|
||||
deleted_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']
|
||||
entry_time = datetime.strptime(entry['time'], '%d %I:%M:%S %p %Y')
|
||||
|
||||
if now - entry_time > timedelta(days=1):
|
||||
try:
|
||||
delete(url, entry['edit_code'])
|
||||
del rallUrls['allUrls'][entry_id]
|
||||
del rall_urls['allUrls'][entry_id]
|
||||
deleted_count += 1
|
||||
print(f'[#] Deleted expired rentry paste: {url}')
|
||||
except Exception as e:
|
||||
@@ -179,7 +179,7 @@ async def rentry_cleanup_job():
|
||||
print(f'[*] Cleanup summary: {deleted_count} deleted, {error_count} failed')
|
||||
|
||||
if deleted_count:
|
||||
db.set('core.rentry', 'urls', rallUrls)
|
||||
db.set('core.rentry', 'urls', rall_urls)
|
||||
|
||||
except Exception as e:
|
||||
print(f'[!] Error in rentry cleanup job: {str(e)}')
|
||||
|
||||
Reference in New Issue
Block a user