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