|
from .. import DATABASE |
|
import logging |
|
import traceback |
|
from .methods import * |
|
import httpx |
|
from ..others import * |
|
|
|
db = DATABASE['user_nelskk'] |
|
|
|
class user(Methods): |
|
def __init__(self): |
|
self.db = db |
|
self.cb = DATABASE['cb'] |
|
self.gen_token = gen_token |
|
self.lf = "\n[ElevenHost]" |
|
async def find(self, user_id, project=False, check=False): |
|
try: |
|
if project: |
|
return await db.find_one({"_id": str(user_id)}) |
|
elif check: |
|
if await db.find_one({"_id": int(user_id)}) and await self.cb.find_one({"_id": user_id}): |
|
return True |
|
return False |
|
user = await db.find_one({"_id": int(user_id)}) |
|
return user |
|
except Exception as w: |
|
e = traceback.format_exc() |
|
logging.error(e) |
|
return f"Error: {w}" |
|
async def create(self, name: str, user_id: int): |
|
try: |
|
if await self.find(user_id): return "exists" |
|
if not await self.cb.find_one({"_id": user_id}): return "Not connected" |
|
url = "https://api.github.com/installation/repositories" |
|
installation_id = await self.cb.find_one({"_id": user_id}) |
|
if installation_id and installation_id.get('installation_id'): |
|
token = await self.gen_token(installation_id.get('installation_id')) |
|
if not token: return "Not connected" |
|
else: return "Not connected" |
|
|
|
headers = { |
|
"Authorization": f"Bearer {token}", |
|
"Accept": "application/vnd.github+json" |
|
} |
|
|
|
async with httpx.AsyncClient() as client: |
|
response = await client.get(url, headers=headers) |
|
if response.status_code == 200: |
|
data = response.json() |
|
if data["repositories"]: |
|
owner = data["repositories"][0]["owner"] |
|
owner = owner["login"] |
|
else: owner = 'CannotFound' |
|
else: |
|
logging.warn(f"GitHub doesn't give 200 status code: {response.text}") |
|
return "Not connected" |
|
|
|
await db.update_one({"_id": 1}, {"$addToSet": {"users": user_id}}, upsert=True) |
|
await db.update_one( |
|
{"_id": user_id}, |
|
{"$set": {"name": name, "coins": 0, "projects": [], 'latest_project': 0, 'git': owner}}, |
|
upsert=True |
|
) |
|
|
|
return 'ok' |
|
|
|
except Exception as w: |
|
e = traceback.format_exc() |
|
logging.error(e) |
|
return f"Error: {w}" |
|
|
|
async def get_projects(self, user_id: int): |
|
try: |
|
if not await self.find(user_id): return "not exists" |
|
user = await self.find(user_id) |
|
if user.get('projects'): |
|
return user.get('projects') |
|
return 'projects not found' |
|
except Exception as oh: |
|
e = traceback.format_exc() |
|
logging.error(e) |
|
return f"Error: {oh}" |
|
|
|
async def create_project(self, name: str, user_id: int, plan: str): |
|
try: |
|
user = await self.find(user_id) |
|
if not user: return "not exists" |
|
elif name and len(name) < 4: |
|
return 'Name too short' |
|
|
|
name, latest_project = name[:15], int(user.get('latest_project', 0)) + 1 |
|
coins = user.get('coins', 0) |
|
|
|
if any(proj.get('name') == name for proj in user.get('projects', [])): |
|
return "Name already used" |
|
|
|
if plan == 'free': |
|
plan_price = 0 |
|
elif plan == 'basic': |
|
plan_price = 99 |
|
elif plan == 'advance': |
|
plan_price = 199 |
|
elif plan == 'pro': |
|
plan_price = 269 |
|
else: return 'Plan not found' |
|
if coins < plan_price: |
|
return 'insufficient coins' |
|
|
|
if plan_price != 0: await db.update_one({"_id": user_id}, {"$set": {'coins': coins-plan_price}}) |
|
|
|
await db.update_one( |
|
{"_id": f'p{user_id}{latest_project}'}, |
|
{"$set": { |
|
"name": name, |
|
"id": latest_project, |
|
"plan": plan, |
|
"ram": 10000, |
|
"rom": 100000000, |
|
"repo": 0, |
|
"repo_name": 'Not set', |
|
"apt-allowed": False, |
|
"language": 'None', |
|
"logs": f"[ElevenHost]: Project successfully created!" |
|
}}, |
|
upsert=True |
|
) |
|
await db.update_one( |
|
{"_id": user_id}, |
|
{"$addToSet": { |
|
"projects": { |
|
'name': name, |
|
'project_id': latest_project |
|
} |
|
}} |
|
) |
|
await db.update_one({"_id": user_id}, {"$set": {"latest_project": latest_project}}) |
|
return 'ok' |
|
except Exception as e: |
|
logging.error(traceback.format_exc()) |
|
return f'Error: {e}' |
|
|
|
async def delete_project(self, user_id: int, project_id: int): |
|
try: |
|
user = await self.find(user_id) |
|
if not user: |
|
return "not exists" |
|
if not user.get('projects'): |
|
return "Project not found" |
|
if not any(proj.get('project_id') == project_id for proj in user.get('projects', [])): |
|
return "Project not found" |
|
await db.delete_one({"_id": f"p{user_id}{project_id}"}) |
|
await db.update_one( |
|
{"_id": user_id}, |
|
{"$pull": {"projects": {"project_id": project_id}}} |
|
) |
|
return "ok" |
|
except Exception as e: |
|
logging.error(traceback.format_exc()) |
|
return f"Error: {e}" |
|
|