Compare commits
48
Commits
5440da0bdf
..
docker
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d25e5aac60 | ||
|
|
c88695f1e7 | ||
|
|
8413a89a47 | ||
|
|
6bb11a206b | ||
|
|
4e94468315 | ||
|
|
ae55f36a0a | ||
|
|
e6937617a1 | ||
|
|
1824c9fe59 | ||
|
|
0bc06358e8 | ||
|
|
77db374418 | ||
|
|
e9d2bef2ae | ||
|
|
f514a577c8 | ||
|
|
3e03fd7e8c | ||
|
|
0fc3ad49ea | ||
|
|
0e3117e408 | ||
|
|
88dcb8a475 | ||
|
|
7bbb46398e | ||
|
|
2fc7e773e0 | ||
|
|
784517e886 | ||
|
|
ca99cd3853 | ||
|
|
a62b936920 | ||
|
|
4e808c3be9 | ||
|
|
80250035e5 | ||
|
|
fb908e00b7 | ||
|
|
9804b6d673 | ||
|
|
4dfe50db93 | ||
|
|
1c43e5ba06 | ||
|
|
a85e06a19b | ||
|
|
12f03e8bc9 | ||
|
|
912ad15c28 | ||
|
|
3b8a01160d | ||
|
|
0f60a31ef8 | ||
|
|
f0e1d79e92 | ||
|
|
9a106d366b | ||
|
|
ae459d2171 | ||
|
|
bef441db88 | ||
|
|
72bac66682 | ||
|
|
60b687305e | ||
|
|
43e19b200d | ||
|
|
7f5210ab57 | ||
|
|
3683a6ffc1 | ||
|
|
aa2dc74ff7 | ||
|
|
9b5d04183d | ||
|
|
83769ce7db | ||
|
|
46dda6166a | ||
|
|
d9e64cf212 | ||
|
|
0c41ac2f84 | ||
|
|
7cd8fe6541 |
No files matched your search
+37
-36
@@ -1,36 +1,37 @@
|
||||
logs/
|
||||
.env
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.vscode/
|
||||
.idea/
|
||||
.DS_Store
|
||||
*.db
|
||||
*.sqlite3
|
||||
*.log
|
||||
bin/build/
|
||||
.zip
|
||||
snippet.py
|
||||
doc/square-src/square-python-sdk-43.0.2.20250820/
|
||||
|
||||
doc/square-src/
|
||||
|
||||
doc/pw-inventory/pw-inventory.zip
|
||||
|
||||
doc/pw-inventory/SQUARE_inventory_forautomation_2025-06-18-0139.csv
|
||||
|
||||
doc/pw-inventory/square_inventory_export_2025-06-18-0137.xlsx
|
||||
|
||||
square-src.code-workspace
|
||||
|
||||
doc/pw-inventory/
|
||||
|
||||
studspider.db-journal
|
||||
.venv
|
||||
*.db
|
||||
*.py[cod]
|
||||
.web
|
||||
.states
|
||||
assets/external/
|
||||
__pycache__/
|
||||
win/
|
||||
logs/
|
||||
.env
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.vscode/
|
||||
.idea/
|
||||
.DS_Store
|
||||
*.db
|
||||
*.sqlite3
|
||||
*.log
|
||||
bin/build/
|
||||
.zip
|
||||
snippet.py
|
||||
doc/square-src/square-python-sdk-43.0.2.20250820/
|
||||
|
||||
doc/square-src/
|
||||
|
||||
doc/pw-inventory/pw-inventory.zip
|
||||
|
||||
doc/pw-inventory/SQUARE_inventory_forautomation_2025-06-18-0139.csv
|
||||
|
||||
doc/pw-inventory/square_inventory_export_2025-06-18-0137.xlsx
|
||||
|
||||
square-src.code-workspace
|
||||
|
||||
doc/pw-inventory/
|
||||
|
||||
studspider.db-journal
|
||||
.venv
|
||||
*.db
|
||||
*.py[cod]
|
||||
.web
|
||||
.states
|
||||
assets/external/
|
||||
__pycache__/
|
||||
win/
|
||||
.github/
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
FROM python:3.13-alpine
|
||||
|
||||
# Install uv
|
||||
RUN pip install uv
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Copy project files
|
||||
COPY pyproject.toml ./
|
||||
COPY README.md ./
|
||||
|
||||
# Install dependencies using uv without venv
|
||||
RUN uv pip compile pyproject.toml -o requirements.txt && \
|
||||
uv pip install --system -r requirements.txt
|
||||
|
||||
# Copy the rest of the application
|
||||
COPY . .
|
||||
|
||||
# Default command
|
||||
CMD ["python", "tests/test.py"]
|
||||
+1
-1
@@ -48,7 +48,7 @@ def get_set(set_number: int) -> dict:
|
||||
}
|
||||
# add PW 10% b4 tax
|
||||
our_set.update(
|
||||
{"set_adjustredprice": our_set + ((10 / 100) * our_set["set_retailprice"])}
|
||||
{"set_adjustredprice": our_set["set_retailprice"] + ((10 / 100) * our_set["set_retailprice"])}
|
||||
)
|
||||
our_set["pw_name"] = (
|
||||
f"{our_set['set_num']} - {our_set["set_theme"].upper()} {our_set['set_name']}"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
import json
|
||||
|
||||
import get_sq_env
|
||||
from . import get_sq_env
|
||||
|
||||
SQUARE_TOKEN = get_sq_env.SQUARE_TOKEN
|
||||
LEGO_CAT_ID = get_sq_env.LEGO_CAT_ID
|
||||
|
||||
+97
-2
@@ -1,3 +1,4 @@
|
||||
import argparse
|
||||
import asyncio
|
||||
import json
|
||||
from aiohttp import web
|
||||
@@ -7,6 +8,7 @@ import uuid
|
||||
|
||||
import dotenv
|
||||
import os
|
||||
|
||||
import re
|
||||
import logging
|
||||
from logging.handlers import RotatingFileHandler
|
||||
@@ -82,6 +84,47 @@ def valid_uuid(val):
|
||||
return False
|
||||
|
||||
|
||||
async def hook_handler(request: web.Request) -> web.Response:
|
||||
"""Handle incoming JSON webhook POSTs on /hook endpoint"""
|
||||
try:
|
||||
# Verify request method
|
||||
if request.method != "POST":
|
||||
logger.error(
|
||||
f"{time}\tInvalid request method to /hook from %s", request.remote
|
||||
)
|
||||
return web.Response(status=405, text="Method not allowed. Use POST.")
|
||||
|
||||
# Get JSON data from request
|
||||
try:
|
||||
data = await request.json()
|
||||
except json.JSONDecodeError:
|
||||
logger.error("Invalid JSON to /hook from %s", request.remote)
|
||||
return web.Response(status=400, text="Invalid JSON in request body")
|
||||
|
||||
# Log the received webhook
|
||||
print(f"[@DEBUG] Webhook received at {time} from {request.remote}")
|
||||
logger.info(
|
||||
f"{time}\tWebhook received from {request.remote}: {json.dumps(data)}"
|
||||
)
|
||||
|
||||
# Process the webhook data here
|
||||
# TODO: Add your webhook processing logic
|
||||
|
||||
response_data = {
|
||||
"status": "success",
|
||||
"message": "Webhook received",
|
||||
"timestamp": time,
|
||||
"data_received": data,
|
||||
}
|
||||
|
||||
return web.json_response(response_data)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Webhook handler error: {str(e)}")
|
||||
print(f"Webhook handler error: {str(e)}")
|
||||
return web.Response(status=500, text="Internal server error")
|
||||
|
||||
|
||||
async def request_handler(request: web.Request) -> web.Response:
|
||||
"""Handle incoming POST requests with command processing"""
|
||||
try:
|
||||
@@ -142,9 +185,61 @@ async def request_handler(request: web.Request) -> web.Response:
|
||||
print("Starting web server...")
|
||||
os.system("cls" if os.name == "nt" else "clear")
|
||||
app = web.Application()
|
||||
app.router.add_post("/", request_handler)
|
||||
app.router.add_post("/api", request_handler)
|
||||
app.router.add_post("/hook", hook_handler)
|
||||
|
||||
parser = argparse.ArgumentParser(description="studspider")
|
||||
parser.add_argument(
|
||||
"--host",
|
||||
type=str,
|
||||
default="localhost",
|
||||
help="IP address to listen on. default: localhost",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--port", type=int, default=7432, help="Port to listen on. default: 7432"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--hook-port",
|
||||
type=int,
|
||||
default=8080,
|
||||
help="Optional separate port for webhook endpoint. default: 8080",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(banner.generate("studspider v0.1"))
|
||||
print("Built for PLAY-WELL TEKNOLOGIES by contact@traps.moe\n\n")
|
||||
web.run_app(app, host="localhost", port=7432)
|
||||
|
||||
# If hook-port is specified, run a separate server for webhooks
|
||||
if args.hook_port:
|
||||
print(f"Starting main server on {args.host}:{args.port}")
|
||||
print(f"Starting webhook server on {args.host}:{args.hook_port}")
|
||||
|
||||
# Create separate app for webhook
|
||||
hook_app = web.Application()
|
||||
hook_app.router.add_post("/hook", hook_handler)
|
||||
|
||||
# Run both servers concurrently
|
||||
async def run_servers():
|
||||
runner1 = web.AppRunner(app)
|
||||
await runner1.setup()
|
||||
site1 = web.TCPSite(runner1, args.host, args.port)
|
||||
|
||||
runner2 = web.AppRunner(hook_app)
|
||||
await runner2.setup()
|
||||
site2 = web.TCPSite(runner2, args.host, args.hook_port)
|
||||
|
||||
await site1.start()
|
||||
await site2.start()
|
||||
|
||||
print(f"Main server running on http://{args.host}:{args.port}")
|
||||
print(f"Webhook server running on http://{args.host}:{args.hook_port}/hook")
|
||||
|
||||
# Keep running
|
||||
await asyncio.Event().wait()
|
||||
|
||||
asyncio.run(run_servers())
|
||||
else:
|
||||
print(f"Server running on {args.host}:{args.port}")
|
||||
print(f"Webhook endpoint: http://{args.host}:{args.port}/hook")
|
||||
web.run_app(app, host=args.host, port=args.port)
|
||||
+26
-1
@@ -1,6 +1,31 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from pprint import pprint
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
import socket
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
|
||||
import src.libsquare as sq
|
||||
import src.bricksetapi as lego
|
||||
|
||||
print("=" * 80)
|
||||
result = sock.connect_ex(('127.0.0.1', 7432))
|
||||
if result == 0:
|
||||
print("PORT 7432 IS IN USE")
|
||||
else:
|
||||
print("PORT 7432 IS AVAILABLE")
|
||||
sock.close()
|
||||
|
||||
print("=" * 80)
|
||||
print("SQUARE OBJECT FOR SET 71417:")
|
||||
print("=" * 80)
|
||||
oursq = sq.get_itm("71417")
|
||||
pprint(oursq, width=120, depth=None)
|
||||
|
||||
print("\n" + "=" * 80)
|
||||
print("LEGO SET INFORMATION FOR SET 71417:")
|
||||
print("=" * 80)
|
||||
ourlego = lego.get_set(71417)
|
||||
print(f"{oursq}\n\n{ourlego}\n\n")
|
||||
print("=" * 80)
|
||||
pprint(ourlego, width=120, depth=None)
|
||||
Reference in new issue
Block a user