File size: 5,413 Bytes
d384b52 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
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}"
|