From d7712ea17d79702bb37addc748c9c8248f2bff2c Mon Sep 17 00:00:00 2001 From: Space-Banane <64922620+Space-Banane@users.noreply.github.com> Date: Fri, 16 Jan 2026 22:30:37 +0100 Subject: [PATCH] first commit --- __pycache__/main.cpython-39.pyc | Bin 0 -> 3743 bytes index.html | 465 ++++++++++++++++++++++++++++++++ main.py | 223 +++++++++++++++ requirements.txt | 1 + 4 files changed, 689 insertions(+) create mode 100644 __pycache__/main.cpython-39.pyc create mode 100644 index.html create mode 100644 main.py create mode 100644 requirements.txt diff --git a/__pycache__/main.cpython-39.pyc b/__pycache__/main.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81d1a721844b88b33b5a2c3ab3dd8417729b0944 GIT binary patch literal 3743 zcmb_f-EUk+6`z^=u^--DufOdyO}1?kx=`=>GjWXTh9s>T9wO8PrM+@lUGI$To2>7> zp1JGTt65%LL5hUfN_|0u%GX(dL2?iId5qNKp(c3?`DCVJ#ndwm3DzDE{-?&*BZ~rm&EELIWYd)9q1{GJ>mEeU zgy+D(U~3kMM>E3L0*~jKRbO&^!#Qq;KYT6hz3ZRjrgAtMT0roJ> zKQ`_m8|G4wf7`y(t!K~-YFYmG0MF0^(!#tZ32+^zBW-e+1RM$7AMN*(G67nXGTFl7 zMes332kCgnKG>X)i65aKlV&PP9U_@(<7Qf>Wl~#yQ)8Z#2|D$dC_JE_qGw?KGrjqM z1Obw>TL14~2+4;U$uIsZlC(kssQ&<3&w{^mJ%505K&E7}O}Y_1few(I2PA~ANuw7N zh)1GD#PeN$g`Oq)T$lNPW0E%=Tu2m*>HY!LJ|j z?MD5De$;bXcA?)N)cuR9-^}awrM_%PA>_Z5Il%dwF3vCYyge1?U;YzkM52t$9$@<7 z1UkU)qDM&P#Uh^!WeI*x)~Xgj$C9RhRMf=P)+JpFy((*--9j9z}r8G)H9iCVG3dIVwl#OH;sJ zuhAzEgHigz3W7+C(hE@Mp}q+95Y(4e5S?s}VAL{qmRiQnCvv1^irZa3vwc4*>rTgO zj!yP8AX@X_&*I}xjaC9;`2jFC#m~MVV^gU7e+uL8q76(J=;Av`#rpuV^(m`*66Ix$ z@+T)yCR&!b-o^BJ`@<5oQMCBoTO@Hp)T>n{gf`~A zr>u4d6O zYi^ygwQbk)OW}T;Ua7&tRD|P1d=J+mkQWX{2$P4_&;2Y{NIf7Lj zij7Sc#c5A?zKC4E%3?!AJT~u(z>i^TyA%$AAY^`Qs;w2LUfrv*P#KFYQ1n8cf?&jU zcgGn5tQj>>x8ZDJK8-C}-wwe>z3x%RQsqK%DmGodDL8ymBc4!&`r8oW4ftr+=NQu` zfIdtd{iR-c!1kR1l?RMg)LG)B^sdn3=}uEY<|^AiYa2RApFON7#n{q2NvF78NhjS| zR%MG{g!ztL_bRa7I_r5sS$qzP*i?x+2rW@idmd-tA^0q|aT;fgB((GR5+P9AnEW$o z=WxkL!&shVa2{G|lE%Yi^k|Hvl?2{l7|ReF+DglYwn@|skiyf^IVLmmhVr7Hf7nT7 zRa^K>eV9i~oWwbJJCCV-&LOSe3As9LIxQXdovBj UqAt{-+GPT~dU1g0e`=@x4WJFvo&W#< literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..134e1e4 --- /dev/null +++ b/index.html @@ -0,0 +1,465 @@ + + + + + + 🎄 Christmas Wishlist + + + + +
+ + +
+
+
+

🎄 Christmas Wishlist

+

Made with ❤️ by Claude Sonnet 4.5

+

Prompted by SpaceONE SHOT try

+
+ +
+ + + +
+ + +
+ + +
+
+
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..7a8cf2c --- /dev/null +++ b/main.py @@ -0,0 +1,223 @@ +import redis +import json +import os +import uuid + +r = redis.Redis( + host="185.14.92.202", + port=12003, + decode_responses=True, + username="default", + password=os.getenv("REDID"), + db=5, +) + +def main(args): + route = args.get("route", "default") + body = args.get("body", {}) + try: + body = json.loads(body) if isinstance(body, str) else body + except: + body = {} + queries = args.get("queries", {}) + + # Serve HTML for default route + if route == "default": + try: + with open("/app/index.html", "r", encoding="utf-8") as f: + html = f.read() + return { + "_shsf": "v2", + "_code": 200, + "_headers": {"Content-Type": "text/html"}, + "_res": html + } + except Exception as e: + return {"_shsf": "v2", "_code": 500, "_res": {"error": str(e)}} + + # Login endpoint + elif route == "login": + username = body.get("username", "").strip() + password = body.get("password", "").strip() + + if not username or not password: + return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and password required"}} + + # Get stored user + user_key = f"storage1:user:{username}" + stored_pass = r.get(user_key) + + if stored_pass == password: + return {"_shsf": "v2", "_code": 200, "_res": {"success": True, "username": username}} + else: + return {"_shsf": "v2", "_code": 401, "_res": {"error": "Invalid credentials"}} + + # Register endpoint + elif route == "register": + username = body.get("username", "").strip() + password = body.get("password", "").strip() + + if not username or not password: + return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and password required"}} + + user_key = f"storage1:user:{username}" + + if r.exists(user_key): + return {"_shsf": "v2", "_code": 409, "_res": {"error": "Username already exists"}} + + r.set(user_key, password) + return {"_shsf": "v2", "_code": 200, "_res": {"success": True, "username": username}} + + # Get wishlist items + elif route == "items": + username = queries.get("username", "") + + if not username: + return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username required"}} + + items_key = f"storage1:items:{username}" + items_json = r.get(items_key) + + if items_json: + items = json.loads(items_json) + else: + items = [] + + return {"_shsf": "v2", "_code": 200, "_res": {"items": items}} + + # Add wishlist item + elif route == "add": + username = body.get("username", "") + name = body.get("name", "").strip() + link = body.get("link", "").strip() + price = body.get("price", "") + image = body.get("image", "").strip() + + if not username or not name: + return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and name required"}} + + items_key = f"storage1:items:{username}" + items_json = r.get(items_key) + + if items_json: + items = json.loads(items_json) + else: + items = [] + + # Generate ID + item_id = str(len(items) + 1) + + new_item = { + "id": item_id, + "name": name, + "link": link, + "price": price, + "image": image + } + + items.append(new_item) + r.set(items_key, json.dumps(items)) + + return {"_shsf": "v2", "_code": 200, "_res": {"success": True, "item": new_item}} + + # Update wishlist item + elif route == "update": + username = body.get("username", "") + item_id = body.get("id", "") + name = body.get("name", "").strip() + link = body.get("link", "").strip() + price = body.get("price", "") + image = body.get("image", "").strip() + + if not username or not item_id: + return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and item ID required"}} + + items_key = f"storage1:items:{username}" + items_json = r.get(items_key) + + if not items_json: + return {"_shsf": "v2", "_code": 404, "_res": {"error": "No items found"}} + + items = json.loads(items_json) + + found = False + for item in items: + if item["id"] == item_id: + item["name"] = name + item["link"] = link + item["price"] = price + item["image"] = image + found = True + break + + if not found: + return {"_shsf": "v2", "_code": 404, "_res": {"error": "Item not found"}} + + r.set(items_key, json.dumps(items)) + + return {"_shsf": "v2", "_code": 200, "_res": {"success": True}} + + # Delete wishlist item + elif route == "delete": + username = body.get("username", "") + item_id = body.get("id", "") + + if not username or not item_id: + return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and item ID required"}} + + items_key = f"storage1:items:{username}" + items_json = r.get(items_key) + + if not items_json: + return {"_shsf": "v2", "_code": 404, "_res": {"error": "No items found"}} + + items = json.loads(items_json) + items = [item for item in items if item["id"] != item_id] + + r.set(items_key, json.dumps(items)) + + return {"_shsf": "v2", "_code": 200, "_res": {"success": True}} + + # Share wishlist (create public copy and return link) + elif route == "share": + username = body.get("username", "") + if not username: + return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username required"}} + items_key = f"storage1:items:{username}" + items_json = r.get(items_key) + if not items_json: + return {"_shsf": "v2", "_code": 404, "_res": {"error": "No items found"}} + # Generate unique share ID + share_id = str(uuid.uuid4()) + public_key = f"storage1:public:{share_id}" + r.set(public_key, items_json) + share_url = f"https://shsf-api.reversed.dev/api/exec/4/57aca15b-665e-4015-b7e3-526a87b39b33/public?share_id={share_id}" + return {"_shsf": "v2", "_code": 200, "_res": {"share_id": share_id, "share_url": share_url}} + + # Get public wishlist by share_id + elif route == "public": + share_id = queries.get("share_id", "") + if not share_id: + return {"_shsf": "v2", "_code": 400, "_res": {"error": "Share ID required"}} + public_key = f"storage1:public:{share_id}" + items_json = r.get(public_key) + if not items_json: + return {"_shsf": "v2", "_code": 404, "_res": {"error": "Shared wishlist not found"}} + items = json.loads(items_json) + return {"_shsf": "v2", "_code": 200, "_res": {"items": items}} + + # Redirect to UI with share_id for public viewing + elif route == "redirect_share": + share_id = queries.get("share_id", "") + if not share_id: + return {"_shsf": "v2", "_code": 400, "_res": {"error": "Share ID required"}} + # Change this URL if your UI is hosted elsewhere + ui_url = f"https://shsf-api.reversed.dev/api/exec/4/57aca15b-665e-4015-b7e3-526a87b39b33/?share_id={share_id}" + return { + "_shsf": "v2", + "_code": 302, + "_location": ui_url + } + + else: + return {"_shsf": "v2", "_code": 404, "_res": {"error": "Route not found"}} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b4b536e --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +redis==5.0.1 \ No newline at end of file