Add files via upload

dev
Ruslan-Isaev 2025-01-04 23:01:58 +03:00 committed by GitHub
parent 84a43deb3a
commit babab4dffe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 109 additions and 0 deletions

109
gitrepo.py 100644
View File

@ -0,0 +1,109 @@
# meta developer: @qShad0_bio
import os
import tempfile
import zipfile
import aiohttp
import asyncio
from .. import loader, utils
async def run_subprocess(command):
process = await asyncio.create_subprocess_exec(
*command,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE
)
stdout, stderr = await process.communicate()
return process.returncode, stdout.decode(), stderr.decode()
async def clonerepo(url: str, dir: str):
command = ['git', 'clone', url, dir]
returncode, stdout, stderr = await run_subprocess(command)
return returncode, stderr
class GitRepoMod(loader.Module):
"""Клонирует git репозиторий и отправляет его в виде zip-архива"""
strings = {'name': 'GitRepo'}
@loader.command()
async def git(self, message):
"""Клонирует git репозиторий и отправляет его в виде zip-архива"""
if message.reply_to_msg_id:
replied_message = await message.get_reply_message()
url = replied_message.message.strip()
else:
args = utils.get_args_raw(message)
if not args:
await utils.answer(message, "<b>Укажите URL git репозитория.</b>")
return
url = args.strip()
await utils.answer(message, "<b>Начинаю загрузку....</b>")
try:
with tempfile.TemporaryDirectory() as temp_dir:
repo_dir = os.path.join(temp_dir, "repo")
try:
repocode, stderr = await clonerepo(url, repo_dir)
if repocode != 0:
await utils.answer(message, f"<b>Ошибка при клонировании репозитория: {str(stderr)}</b>")
return
repo_name = os.path.basename(url.split("/").pop().rstrip(".git"))
except Exception as e:
await utils.answer(message, f"<b>Ошибка при клонировании репозитория: {str(e)}</b>")
return
zip_file = os.path.join(temp_dir, f"{repo_name}.zip")
try:
with zipfile.ZipFile(zip_file, 'w', zipfile.ZIP_DEFLATED) as zipf:
for root, _, files in os.walk(repo_dir):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, repo_dir)
zipf.write(file_path, arcname)
except Exception as e:
await utils.answer(message, f"<b>Ошибка при архивации репозитория: {str(e)}</b>")
return
await utils.answer_file(message, zip_file, f"<b>Репозиторий {repo_name} в виде zip-архива.</b>")
await message.delete()
except Exception as e:
await utils.answer(message, f"<b>Произошла ошибка: {str(e)}</b>")
@loader.command()
async def wget(self, message):
"""Сохраняет файл из интернета"""
if message.reply_to_msg_id:
replied_message = await message.get_reply_message()
url = replied_message.message.strip()
else:
args = utils.get_args_raw(message)
if not args:
await utils.answer(message, "<b>Укажите URL с файлом</b>")
return
url = args.strip()
await utils.answer(message, "<b>Начинаю загрузку....</b>")
try:
with tempfile.TemporaryDirectory() as temp_dir:
downloaded_file_path = os.path.join(temp_dir, os.path.basename(url))
# Скачивание файла
try:
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
if resp.status == 200:
with open(downloaded_file_path, 'wb') as f:
f.write(await resp.read())
else:
await utils.answer(message, "<b>Ошибка при скачивании файла.</b>")
return
except Exception as e:
await utils.answer(message, f"<b>Ошибка сохранения: {str(e)}</b>")
return
await utils.answer_file(message, downloaded_file_path, f"<b>Файл {url} успешно сохранен</b>")
await message.delete()
except Exception as e:
await utils.answer(message, f"<b>Произошла ошибка: {str(e)}</b>")