# -*- coding: utf-8 -*-
from .. import loader, utils
import logging
import base64
import os
import requests
import json
from requests.exceptions import MissingSchema, ChunkedEncodingError
logger = logging.getLogger(__name__)
def register(cb):
cb(GitaddMod())
@loader.tds
class GitaddMod(loader.Module):
"""Загружает файлы на репозиторий GitHub"""
strings = {"name": "GitUploader",
"reply_to_file": "Ответьте на файл",
"error_file": "Формат не поддерживается",
"connection_error": "Ошибка соединения",
"repo_error": "Ошибка репозитория",
"token_error": "Ошибка токена",
"exist_422": "Не удалось загрузить файл. Возможная причина: файл с таким названием уже существует в репозитории.",
"cfg_token": "Токен GitHub",
"token_not_found": "Токен не найден",
"username_not_found": "Имя пользователя GitHub не указано",
"repo_not_found": "Репозиторий не указан",
"cfg_gh_user": "Имя пользователя на GitHub",
"cfg_gh_repo": "Репозиторий, куда нужно загружать модули"}
def __init__(self):
self.config = loader.ModuleConfig("GH_TOKEN", "TOKEN", lambda m: self.strings("cfg_token", m),
"GH_USERNAME", "USERNAME", lambda m: self.strings("cfg_gh_user", m),
"GH_REPO", "REPOSITORY", lambda m: self.strings("cfg_gh_repo", m))
async def client_ready(self, client, db):
self.client = client
@loader.owner
async def gitaddcmd(self, message):
if self.config["GH_TOKEN"] == "TOKEN":
await utils.answer(message, self.strings("token_not_found", message))
return
if self.config["GH_USERNAME"] == "USERNAME":
await utils.answer(message, self.strings("username_not_found", message))
return
if self.config["GH_REPO"] == "REPOSITORY":
await utils.answer(message, self.strings("repo_not_found", message))
return
reply = await message.get_reply_message()
if not reply:
await utils.answer(message, self.strings("reply_to_file", message))
return
media = reply.media
if not media:
await utils.answer(message, self.strings("reply_to_file", message))
return
try:
fname=(reply.media.document.attributes[0]).file_name
except AttributeError:
await utils.answer(message, self.strings("error_file", message))
return
try:
file = await message.client.download_file(media)
encoded_string = base64.b64encode(file)
stout = encoded_string.decode("utf-8")
TOKEN = self.config["GH_TOKEN"]
USERNAME = self.config["GH_USERNAME"]
REPO = self.config["GH_REPO"]
#url = f'{self.config["GH_REPO"]}{fname}'
url = f'https://api.github.com/repos/{USERNAME}/{REPO}/contents/{fname}'
head = {"Authorization": f"token {TOKEN}", "Accept": "application/vnd.github.v3+json"}
git_data = '{"message": "Upload file", "content":' + '"' + stout + '"' + '}'
r = requests.put(url, headers=head, data=git_data)
if int(r.status_code) == 201:
uploaded_to = f'https://github.com/{USERNAME}/{REPO}'
uploaded_to_raw = '/'.join(r.json()["content"].get("download_url").split('/')[:-1]+[fname.replace(' ', '%20')])
await utils.answer(message, f"Файл {fname} успешно загружен на репозиторий!\n\nПрямая ссылка: {uploaded_to_raw}")
return
elif int(r.status_code) == 422:
await utils.answer(message, self.strings("exist_422", message))
return
else:
json_resp = json.loads(r.text)
git_resp = json_resp["message"]
await utils.answer(message, f"Произошла неизвестная ошибка! Ответ сервера:\n {git_resp}")
return
except ConnectionError:
await utils.answer(message, self.strings("connection_error", message))
return
except MissingSchema:
await utils.answer(message, self.strings("repo_error", message))
return
except ChunkedEncodingError:
await utils.answer(message, self.strings("token_error", message))
return