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:
2026-06-21 22:01:51 +02:00
parent 4355f451d4
commit 8a1da13383
31 changed files with 163 additions and 145 deletions
+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
+13 -13
View File
@@ -140,20 +140,20 @@ async def autofwd_main(client: Client, message: Message):
target_chats = db.get('custom.autofwd', 'chatto') 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: 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: try:
await message.copy(chat) await client.send_message(
except Exception as e: 'me',
try: f'Auto Forwarding Failed for Chat with id: <code>{chat_id}</code> to <code>{chat}</code>\n\n{e}',
await client.send_message( )
'me', except MessageTooLong:
f'Auto Forwarding Failed for Chat with id: <code>{chat_id}</code> to <code>{chat}</code>\n\n{e}', await client.send_message(
) 'me',
except MessageTooLong: 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>, Please check logs!',
)
modules_help['autofwd'] = { modules_help['autofwd'] = {
+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
+14 -13
View File
@@ -119,22 +119,23 @@ 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
files = { with open(input_file_name, 'rb') as f:
'image_file': (input_file_name, open(input_file_name, 'rb')), files = {
} 'image_file': (input_file_name, f),
r = requests.post( }
'https://api.remove.bg/v1.0/removebg', r = requests.post(
headers={'X-Api-Key': rmbg_key}, 'https://api.remove.bg/v1.0/removebg',
files=files, headers={'X-Api-Key': rmbg_key},
allow_redirects=True, files=files,
stream=True, allow_redirects=True,
timeout=10, stream=True,
) timeout=10,
)
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:
+7 -5
View File
@@ -48,8 +48,9 @@ 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:
response = requests.post(url, files=files, params=params, timeout=10) files = {'file': (downloaded_file_name, f)}
response = requests.post(url, files=files, params=params, timeout=10)
try: try:
r_json = response.json() r_json = response.json()
md5 = r_json['md5'] md5 = r_json['md5']
@@ -104,9 +105,10 @@ 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:
headers = {'accept': 'application/json', 'x-apikey': vak} files = {'file': (downloaded_file_name, f)}
response = requests.post(url, files=files, headers=headers, timeout=10) headers = {'accept': 'application/json', 'x-apikey': vak}
response = requests.post(url, files=files, headers=headers, timeout=10)
r_json = response.json() r_json = response.json()
analysis_url = r_json['data']['links']['self'] analysis_url = r_json['data']['links']['self']
+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)}')