commit d7712ea17d79702bb37addc748c9c8248f2bff2c Author: Space-Banane <64922620+Space-Banane@users.noreply.github.com> Date: Fri Jan 16 22:30:37 2026 +0100 first commit diff --git a/__pycache__/main.cpython-39.pyc b/__pycache__/main.cpython-39.pyc new file mode 100644 index 0000000..81d1a72 Binary files /dev/null and b/__pycache__/main.cpython-39.pyc differ 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