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}"