ulduldp commited on
Commit
8279cb7
Β·
verified Β·
1 Parent(s): e6d6bdc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +95 -143
app.py CHANGED
@@ -1,9 +1,7 @@
1
  import os
2
  import threading
3
  import time
4
- import hashlib
5
  import random
6
- import string
7
  from datetime import datetime
8
 
9
  from flask_srvr import run_flask
@@ -20,7 +18,7 @@ def start_flask():
20
  t.daemon = True
21
  t.start()
22
 
23
- #start_flask()
24
 
25
  # =========================
26
  # βš™οΈ CONFIG
@@ -28,7 +26,6 @@ def start_flask():
28
  BOT_TOKEN = os.getenv("tgtkn")
29
  GROUP_ID = -1003799294466
30
  MAX_STORAGE = 15 * 1024 * 1024 * 1024
31
- HARDCODE_ADMIN = 83939584939485
32
 
33
  # =========================
34
  # 🧠 STATE
@@ -46,7 +43,6 @@ def get_data(uid):
46
  "index": {},
47
  "folders": {
48
  "root": {
49
- "name": "root",
50
  "files": [],
51
  "folders": []
52
  }
@@ -57,29 +53,13 @@ def get_data(uid):
57
  def save_data(uid, data):
58
  mdb.set(f"user_{uid}", "json", data)
59
 
60
- def get_admins():
61
- return mdb.get("admins", "json") or []
62
-
63
- def is_admin(uid):
64
- return uid == HARDCODE_ADMIN or uid in get_admins()
65
-
66
  # =========================
67
  # πŸ“Š STORAGE BAR
68
  # =========================
69
- def storage_bar(used, total, length=10):
70
  ratio = used / total if total else 0
71
- filled = int(ratio * length)
72
- return "β–ˆ" * filled + "β–‘" * (length - filled)
73
-
74
- # =========================
75
- # 🧾 ICON
76
- # =========================
77
- def get_icon(name):
78
- ext = name.lower().split('.')[-1]
79
- if ext == "pdf": return "πŸ“„"
80
- if ext in ["mp4","mkv"]: return "πŸŽ₯"
81
- if ext in ["jpg","png","jpeg"]: return "πŸ–Ό"
82
- return "πŸ“¦"
83
 
84
  # =========================
85
  # 🏠 MENU
@@ -88,20 +68,16 @@ def main_menu(uid):
88
  data = get_data(uid)
89
  used = sum(f["file_size"] for f in data["files"])
90
 
91
- bar = storage_bar(used, MAX_STORAGE)
92
-
93
  return f"""☁️ Cloud Bot
94
 
95
- πŸ“Š Storage:
96
- {bar}
97
  {round(used/1024/1024,2)} MB / 15360 MB
98
  """
99
 
100
  def main_kb():
101
  return InlineKeyboardMarkup([
102
  [InlineKeyboardButton("πŸ“€ Upload", callback_data="upload_root")],
103
- [InlineKeyboardButton("πŸ“‚ My Files", callback_data="open_root")],
104
- [InlineKeyboardButton("πŸ” Search", callback_data="search")]
105
  ])
106
 
107
  # =========================
@@ -112,7 +88,7 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
112
  await update.message.reply_text(main_menu(uid), reply_markup=main_kb())
113
 
114
  # =========================
115
- # πŸ“ FOLDER VIEW
116
  # =========================
117
  def build_folder(data, folder):
118
  f = data["folders"][folder]
@@ -125,26 +101,13 @@ def build_folder(data, folder):
125
  for fid in f["files"]:
126
  file = data["index"][fid]
127
  kb.append([InlineKeyboardButton(
128
- f"{get_icon(file['original_name'])} {file['original_name']}",
129
  callback_data=f"file_{fid}"
130
  )])
131
 
132
- kb.append([
133
- InlineKeyboardButton("βž• Folder", callback_data=f"newfolder_{folder}"),
134
- InlineKeyboardButton("✏️ Rename", callback_data=f"renamefolder_{folder}")
135
- ])
136
-
137
- kb.append([
138
- InlineKeyboardButton("πŸ—‘ Delete", callback_data=f"delfolder_{folder}")
139
- ])
140
-
141
- kb.append([
142
- InlineKeyboardButton("πŸ“€ Upload", callback_data=f"upload_{folder}")
143
- ])
144
-
145
- kb.append([
146
- InlineKeyboardButton("πŸ”™ Back", callback_data="cancel")
147
- ])
148
 
149
  return f"πŸ“ {folder}", InlineKeyboardMarkup(kb)
150
 
@@ -152,135 +115,124 @@ def build_folder(data, folder):
152
  # πŸ”˜ BUTTONS
153
  # =========================
154
  async def buttons(update: Update, context: ContextTypes.DEFAULT_TYPE):
155
- q = update.callback_query
156
- await q.answer()
 
157
 
158
- uid = q.from_user.id
159
- data = get_data(uid)
160
 
161
- # BACK
162
- if q.data == "cancel":
163
- user_state.pop(uid, None)
164
- return await q.message.edit_text(main_menu(uid), reply_markup=main_kb())
165
 
166
- # OPEN FOLDER
167
- if q.data.startswith("open_"):
168
- folder = q.data.split("_",1)[1]
169
- text, kb = build_folder(data, folder)
170
- return await q.message.edit_text(text, reply_markup=kb)
171
 
172
- # NEW FOLDER
173
- if q.data.startswith("newfolder_"):
174
- parent = q.data.split("_",1)[1]
175
- user_state[uid] = {"mode":"new_folder","parent":parent}
176
- return await q.message.edit_text("πŸ“ Send folder name")
177
 
178
- # RENAME FOLDER
179
- if q.data.startswith("renamefolder_"):
180
- folder = q.data.split("_",1)[1]
181
- user_state[uid] = {"mode":"rename_folder","folder":folder}
182
- return await q.message.edit_text("✏️ Send new folder name")
183
 
184
- # DELETE FOLDER
185
- if q.data.startswith("delfolder_"):
186
- folder = q.data.split("_",1)[1]
187
 
188
- code = str(random.randint(100000,999999))
189
- user_state[uid] = {"mode":"delete_folder","folder":folder,"code":code}
190
 
191
- return await q.message.edit_text(f"Type code to delete:\n{code}")
 
192
 
193
  # =========================
194
- # πŸ“€ UPLOAD
195
  # =========================
196
  async def handle_file(update: Update, context: ContextTypes.DEFAULT_TYPE):
197
- uid = update.effective_user.id
 
198
 
199
- if uid not in user_state:
200
- return
201
 
202
- state = user_state[uid]
203
- if state["mode"] != "upload":
204
- return
205
 
206
- folder = state.get("folder","root")
207
- data = get_data(uid)
208
 
209
- doc = update.message.document
210
- used = sum(f["file_size"] for f in data["files"])
 
211
 
212
- if not is_admin(uid) and used + doc.file_size > MAX_STORAGE:
213
- return await update.message.reply_text("❌ Storage Full")
214
 
215
- sent = await context.bot.send_document(GROUP_ID, doc.file_id)
 
 
 
 
 
 
 
 
216
 
217
- name = f"{uid}_{int(time.time())}"
 
 
218
 
219
- entry = {
220
- "file_name": name,
221
- "original_name": doc.file_name,
222
- "file_id": sent.document.file_id,
223
- "file_size": doc.file_size,
224
- "upload_date": str(datetime.now())
225
- }
226
 
227
- data["files"].append(entry)
228
- data["index"][name] = entry
229
- data["folders"][folder]["files"].append(name)
230
 
231
- save_data(uid, data)
232
 
233
- user_state.pop(uid)
234
- await update.message.reply_text("βœ… Uploaded", reply_markup=main_kb())
235
 
236
  # =========================
237
- # πŸ“ TEXT HANDLER
238
  # =========================
239
  async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
240
- uid = update.effective_user.id
241
-
242
- if uid not in user_state:
243
- return
244
-
245
- state = user_state[uid]
246
- data = get_data(uid)
247
-
248
- # CREATE FOLDER
249
- if state["mode"] == "new_folder":
250
- name = update.message.text
251
- parent = state["parent"]
252
-
253
- data["folders"][name] = {"name":name,"files":[],"folders":[]}
254
- data["folders"][parent]["folders"].append(name)
255
 
256
- save_data(uid, data)
257
- user_state.pop(uid)
258
 
259
- return await update.message.reply_text("βœ… Folder Created", reply_markup=main_kb())
 
260
 
261
- # RENAME FOLDER
262
- if state["mode"] == "rename_folder":
263
- new = update.message.text
264
- old = state["folder"]
265
 
266
- data["folders"][new] = data["folders"].pop(old)
 
267
 
268
- save_data(uid, data)
269
- user_state.pop(uid)
270
-
271
- return await update.message.reply_text("βœ… Renamed", reply_markup=main_kb())
272
 
273
- # DELETE FOLDER CONFIRM
274
- if state["mode"] == "delete_folder":
275
- if update.message.text == state["code"]:
276
- folder = state["folder"]
277
 
278
- if data["folders"][folder]["files"] or data["folders"][folder]["folders"]:
279
- return await update.message.reply_text("❌ Folder not empty")
280
 
281
- del data["folders"][folder]
 
 
 
282
 
283
- save_data(uid, data)
284
- user_state.pop(uid)
 
 
285
 
286
- return await update.message.reply_text("πŸ—‘ Deleted", reply_markup=main_kb())
 
 
1
  import os
2
  import threading
3
  import time
 
4
  import random
 
5
  from datetime import datetime
6
 
7
  from flask_srvr import run_flask
 
18
  t.daemon = True
19
  t.start()
20
 
21
+ start_flask()
22
 
23
  # =========================
24
  # βš™οΈ CONFIG
 
26
  BOT_TOKEN = os.getenv("tgtkn")
27
  GROUP_ID = -1003799294466
28
  MAX_STORAGE = 15 * 1024 * 1024 * 1024
 
29
 
30
  # =========================
31
  # 🧠 STATE
 
43
  "index": {},
44
  "folders": {
45
  "root": {
 
46
  "files": [],
47
  "folders": []
48
  }
 
53
  def save_data(uid, data):
54
  mdb.set(f"user_{uid}", "json", data)
55
 
 
 
 
 
 
 
56
  # =========================
57
  # πŸ“Š STORAGE BAR
58
  # =========================
59
+ def storage_bar(used, total):
60
  ratio = used / total if total else 0
61
+ filled = int(ratio * 10)
62
+ return "β–ˆ"*filled + "β–‘"*(10-filled)
 
 
 
 
 
 
 
 
 
 
63
 
64
  # =========================
65
  # 🏠 MENU
 
68
  data = get_data(uid)
69
  used = sum(f["file_size"] for f in data["files"])
70
 
 
 
71
  return f"""☁️ Cloud Bot
72
 
73
+ {storage_bar(used, MAX_STORAGE)}
 
74
  {round(used/1024/1024,2)} MB / 15360 MB
75
  """
76
 
77
  def main_kb():
78
  return InlineKeyboardMarkup([
79
  [InlineKeyboardButton("πŸ“€ Upload", callback_data="upload_root")],
80
+ [InlineKeyboardButton("πŸ“‚ Files", callback_data="open_root")]
 
81
  ])
82
 
83
  # =========================
 
88
  await update.message.reply_text(main_menu(uid), reply_markup=main_kb())
89
 
90
  # =========================
91
+ # πŸ“ FOLDER UI
92
  # =========================
93
  def build_folder(data, folder):
94
  f = data["folders"][folder]
 
101
  for fid in f["files"]:
102
  file = data["index"][fid]
103
  kb.append([InlineKeyboardButton(
104
+ file["original_name"],
105
  callback_data=f"file_{fid}"
106
  )])
107
 
108
+ kb.append([InlineKeyboardButton("βž• Folder", callback_data=f"newfolder_{folder}")])
109
+ kb.append([InlineKeyboardButton("πŸ“€ Upload", callback_data=f"upload_{folder}")])
110
+ kb.append([InlineKeyboardButton("πŸ”™ Back", callback_data="cancel")])
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
  return f"πŸ“ {folder}", InlineKeyboardMarkup(kb)
113
 
 
115
  # πŸ”˜ BUTTONS
116
  # =========================
117
  async def buttons(update: Update, context: ContextTypes.DEFAULT_TYPE):
118
+ try:
119
+ q = update.callback_query
120
+ await q.answer()
121
 
122
+ uid = q.from_user.id
123
+ data = get_data(uid)
124
 
125
+ # BACK
126
+ if q.data == "cancel":
127
+ user_state.pop(uid, None)
128
+ return await q.message.edit_text(main_menu(uid), reply_markup=main_kb())
129
 
130
+ # OPEN FOLDER
131
+ if q.data.startswith("open_"):
132
+ folder = q.data.split("_",1)[1]
133
+ text, kb = build_folder(data, folder)
134
+ return await q.message.edit_text(text, reply_markup=kb)
135
 
136
+ # UPLOAD
137
+ if q.data.startswith("upload_"):
138
+ folder = q.data.split("_",1)[1]
 
 
139
 
140
+ user_state[uid] = {"mode":"upload","folder":folder}
141
+ return await q.message.edit_text(f"πŸ“€ Upload to {folder}")
 
 
 
142
 
143
+ # NEW FOLDER
144
+ if q.data.startswith("newfolder_"):
145
+ parent = q.data.split("_",1)[1]
146
 
147
+ user_state[uid] = {"mode":"new_folder","parent":parent}
148
+ return await q.message.edit_text("πŸ“ Send folder name")
149
 
150
+ except Exception as e:
151
+ print("ERROR:", e)
152
 
153
  # =========================
154
+ # πŸ“€ FILE UPLOAD
155
  # =========================
156
  async def handle_file(update: Update, context: ContextTypes.DEFAULT_TYPE):
157
+ try:
158
+ uid = update.effective_user.id
159
 
160
+ if uid not in user_state:
161
+ return
162
 
163
+ state = user_state[uid]
164
+ if state["mode"] != "upload":
165
+ return
166
 
167
+ folder = state["folder"]
168
+ data = get_data(uid)
169
 
170
+ doc = update.message.document
171
+ if not doc:
172
+ return
173
 
174
+ sent = await context.bot.send_document(GROUP_ID, doc.file_id)
 
175
 
176
+ name = f"{uid}_{int(time.time())}"
177
+
178
+ entry = {
179
+ "file_name": name,
180
+ "original_name": doc.file_name,
181
+ "file_id": sent.document.file_id,
182
+ "file_size": doc.file_size,
183
+ "upload_date": str(datetime.now())
184
+ }
185
 
186
+ data["files"].append(entry)
187
+ data["index"][name] = entry
188
+ data["folders"][folder]["files"].append(name)
189
 
190
+ save_data(uid, data)
 
 
 
 
 
 
191
 
192
+ user_state.pop(uid)
 
 
193
 
194
+ await update.message.reply_text("βœ… Uploaded", reply_markup=main_kb())
195
 
196
+ except Exception as e:
197
+ print("UPLOAD ERROR:", e)
198
 
199
  # =========================
200
+ # πŸ“ TEXT
201
  # =========================
202
  async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
203
+ try:
204
+ uid = update.effective_user.id
 
 
 
 
 
 
 
 
 
 
 
 
 
205
 
206
+ if uid not in user_state:
207
+ return
208
 
209
+ state = user_state[uid]
210
+ data = get_data(uid)
211
 
212
+ if state["mode"] == "new_folder":
213
+ name = update.message.text
214
+ parent = state["parent"]
 
215
 
216
+ data["folders"][name] = {"files": [], "folders": []}
217
+ data["folders"][parent]["folders"].append(name)
218
 
219
+ save_data(uid, data)
 
 
 
220
 
221
+ user_state.pop(uid)
222
+ await update.message.reply_text("βœ… Folder created", reply_markup=main_kb())
 
 
223
 
224
+ except Exception as e:
225
+ print("TEXT ERROR:", e)
226
 
227
+ # =========================
228
+ # πŸš€ RUN
229
+ # =========================
230
+ app = ApplicationBuilder().token(BOT_TOKEN).build()
231
 
232
+ app.add_handler(CommandHandler("start", start))
233
+ app.add_handler(CallbackQueryHandler(buttons))
234
+ app.add_handler(MessageHandler(filters.Document.ALL, handle_file))
235
+ app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text))
236
 
237
+ print("πŸ”₯ BOT RUNNING")
238
+ app.run_polling()