From 25b03aa1050f91f6cee248785a6a17a70d48c5f8 Mon Sep 17 00:00:00 2001 From: Alfie King Date: Sun, 18 Jan 2026 23:21:44 +0000 Subject: [PATCH] major update :O --- .gitignore | 5 +- app.log | 382 ++++++++++++++++++ src/routes/dynamic_routes.py | 41 ++ src/routes/error_handlers.py | 11 +- src/routes/generic.py | 65 --- src/routes/snake.py | 153 ------- src/utils/cap.py | 42 -- src/utils/database.py | 23 -- src/wsgi.py | 62 +-- static/content/buttons/hijpixel.gif | Bin 0 -> 25411 bytes static/content/buttons/lensdeer.gif | Bin 0 -> 13831 bytes .../non_link_buttons.txt} | 1 - static/css/404.css | 155 ------- static/css/{ => bases}/base.css | 8 + static/css/{ => bases}/directory.css | 0 static/css/cap.css | 20 - static/css/{ => errors}/400.css | 0 static/css/{ => errors}/500.css | 0 static/css/gallery.css | 22 +- static/js/base.js | 2 +- static/js/snake.js | 174 -------- templates/bases/base.html | 11 +- templates/bases/directory.html | 2 +- templates/errors/400.html | 2 +- templates/errors/404.html | 71 +--- templates/errors/500.html | 2 +- templates/index.html | 11 +- templates/pages/events/crittersmk.html | 14 +- 28 files changed, 514 insertions(+), 765 deletions(-) create mode 100644 app.log create mode 100644 src/routes/dynamic_routes.py delete mode 100644 src/routes/generic.py delete mode 100644 src/routes/snake.py delete mode 100644 src/utils/cap.py delete mode 100644 src/utils/database.py create mode 100644 static/content/buttons/hijpixel.gif create mode 100644 static/content/buttons/lensdeer.gif rename static/content/{other/buttons.txt => buttons/non_link_buttons.txt} (95%) delete mode 100644 static/css/404.css rename static/css/{ => bases}/base.css (97%) rename static/css/{ => bases}/directory.css (100%) delete mode 100644 static/css/cap.css rename static/css/{ => errors}/400.css (100%) rename static/css/{ => errors}/500.css (100%) delete mode 100644 static/js/snake.js diff --git a/.gitignore b/.gitignore index 5a0bc45..2e50f32 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ .venv .env -db.sqlite flask_session __pycache__ -app.log -.vscode \ No newline at end of file +.vscode +db \ No newline at end of file diff --git a/app.log b/app.log new file mode 100644 index 0000000..3a91c70 --- /dev/null +++ b/app.log @@ -0,0 +1,382 @@ +2026-01-18 22:25:14,613 - root - INFO - Logging initialized +2026-01-18 22:25:14,634 - werkzeug - WARNING - * Debugger is active! +2026-01-18 22:25:14,636 - werkzeug - INFO - * Debugger PIN: 133-323-371 +2026-01-18 22:25:31,678 - werkzeug - INFO - * Detected change in '/home/alfie/Documents/programming-projects/websites/alfieking.dev/src/wsgi.py', reloading +2026-01-18 22:25:31,918 - root - INFO - Logging initialized +2026-01-18 22:25:31,942 - werkzeug - WARNING - * Debugger is active! +2026-01-18 22:25:31,944 - werkzeug - INFO - * Debugger PIN: 133-323-371 +2026-01-18 22:25:44,977 - werkzeug - INFO - * Detected change in '/home/alfie/Documents/programming-projects/websites/alfieking.dev/src/wsgi.py', reloading +2026-01-18 22:25:45,205 - root - INFO - Logging initialized +2026-01-18 22:25:45,233 - werkzeug - WARNING - * Debugger is active! +2026-01-18 22:25:45,236 - werkzeug - INFO - * Debugger PIN: 133-323-371 +2026-01-18 22:25:46,245 - werkzeug - INFO - * Detected change in '/home/alfie/Documents/programming-projects/websites/alfieking.dev/src/wsgi.py', reloading +2026-01-18 22:25:46,445 - root - INFO - Logging initialized +2026-01-18 22:25:46,466 - werkzeug - WARNING - * Debugger is active! +2026-01-18 22:25:46,469 - werkzeug - INFO - * Debugger PIN: 133-323-371 +2026-01-18 22:25:47,478 - werkzeug - INFO - * Detected change in '/home/alfie/Documents/programming-projects/websites/alfieking.dev/src/wsgi.py', reloading +2026-01-18 22:25:47,700 - root - INFO - Logging initialized +2026-01-18 22:25:47,719 - werkzeug - WARNING - * Debugger is active! +2026-01-18 22:25:47,721 - werkzeug - INFO - * Debugger PIN: 133-323-371 +2026-01-18 22:25:51,738 - werkzeug - INFO - * Detected change in '/home/alfie/Documents/programming-projects/websites/alfieking.dev/src/routes/error_handlers.py', reloading +2026-01-18 22:25:51,952 - root - INFO - Logging initialized +2026-01-18 22:25:51,973 - werkzeug - WARNING - * Debugger is active! +2026-01-18 22:25:51,976 - werkzeug - INFO - * Debugger PIN: 133-323-371 +2026-01-18 22:25:52,986 - werkzeug - INFO - * Detected change in '/home/alfie/Documents/programming-projects/websites/alfieking.dev/src/routes/error_handlers.py', reloading +2026-01-18 22:25:53,233 - root - INFO - Logging initialized +2026-01-18 22:25:53,255 - werkzeug - WARNING - * Debugger is active! +2026-01-18 22:25:53,258 - werkzeug - INFO - * Debugger PIN: 133-323-371 +2026-01-18 22:25:56,271 - werkzeug - INFO - * Detected change in '/home/alfie/Documents/programming-projects/websites/alfieking.dev/src/routes/error_handlers.py', reloading +2026-01-18 22:25:56,458 - root - INFO - Logging initialized +2026-01-18 22:25:56,480 - werkzeug - WARNING - * Debugger is active! +2026-01-18 22:25:56,482 - werkzeug - INFO - * Debugger PIN: 133-323-371 +2026-01-18 22:26:01,503 - werkzeug - INFO - * Detected change in '/home/alfie/Documents/programming-projects/websites/alfieking.dev/src/routes/dynamic_routes.py', reloading +2026-01-18 22:26:01,709 - root - INFO - Logging initialized +2026-01-18 22:26:01,732 - werkzeug - WARNING - * Debugger is active! +2026-01-18 22:26:01,735 - werkzeug - INFO - * Debugger PIN: 133-323-371 +2026-01-18 22:29:26,972 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:26] "GET /toaster HTTP/1.1" 200 - +2026-01-18 22:29:27,165 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:29:27,170 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/css/toaster.css HTTP/1.1" 304 - +2026-01-18 22:29:27,175 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:29:27,177 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:29:27,179 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:29:27,177 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:29:27,182 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:29:27,187 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:29:27,189 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:29:27,192 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:29:27,193 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/toaster/Toaster_v1.0_Dark.png HTTP/1.1" 304 - +2026-01-18 22:29:27,194 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg HTTP/1.1" 304 - +2026-01-18 22:29:27,195 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg HTTP/1.1" 304 - +2026-01-18 22:29:27,198 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg HTTP/1.1" 304 - +2026-01-18 22:29:27,199 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg HTTP/1.1" 304 - +2026-01-18 22:29:27,201 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg HTTP/1.1" 304 - +2026-01-18 22:29:27,201 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg HTTP/1.1" 304 - +2026-01-18 22:29:27,204 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg HTTP/1.1" 304 - +2026-01-18 22:29:27,205 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg HTTP/1.1" 304 - +2026-01-18 22:29:27,207 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:29:27,208 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:29:27,208 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:29:27,211 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:29:27,212 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:29:27,213 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:27] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:29:36,379 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:29:36] "GET /favicon.ico HTTP/1.1" 200 - +2026-01-18 22:30:27,601 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET / HTTP/1.1" 200 - +2026-01-18 22:30:27,788 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:30:27,790 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:30:27,790 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:30:27,799 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:30:27,802 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:30:27,803 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:30:27,804 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:30:27,805 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:30:27,803 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:30:27,806 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:30:27,808 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:30:27,808 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:30:27,810 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:30:27,811 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:30:27,812 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:30:27,813 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:30:27,834 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:30:27] "GET /static/content/other/buttons.txt HTTP/1.1" 304 - +2026-01-18 22:34:02,552 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET / HTTP/1.1" 200 - +2026-01-18 22:34:02,721 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:34:02,723 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:34:02,723 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:34:02,735 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:34:02,737 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:34:02,738 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:34:02,740 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:34:02,740 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:34:02,741 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:34:02,742 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:34:02,744 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:34:02,747 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:34:02,748 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:34:02,750 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:34:02,751 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:34:02,752 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:34:02,763 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:02] "GET /static/content/other/buttons.txt HTTP/1.1" 304 - +2026-01-18 22:34:12,375 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET / HTTP/1.1" 200 - +2026-01-18 22:34:12,515 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:34:12,517 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:34:12,517 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:34:12,520 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:34:12,523 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:34:12,525 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:34:12,527 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:34:12,528 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:34:12,531 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:34:12,531 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:34:12,534 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:34:12,535 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:34:12,536 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:34:12,538 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:34:12,541 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:34:12,543 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:34:12,586 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:12] "GET /static/content/other/buttons.txt HTTP/1.1" 304 - +2026-01-18 22:34:17,701 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET / HTTP/1.1" 200 - +2026-01-18 22:34:17,811 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:34:17,812 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:34:17,812 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:34:17,818 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:34:17,819 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:34:17,820 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:34:17,821 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:34:17,822 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:34:17,825 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:34:17,825 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:34:17,827 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:34:17,829 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:34:17,831 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:34:17,830 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:34:17,833 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:34:17,832 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:34:17,857 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:34:17] "GET /static/content/other/buttons.txt HTTP/1.1" 304 - +2026-01-18 22:40:44,310 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET / HTTP/1.1" 200 - +2026-01-18 22:40:44,451 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:40:44,451 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:40:44,453 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:40:44,464 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:40:44,465 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:40:44,466 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:40:44,467 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:40:44,468 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:40:44,468 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:40:44,469 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:40:44,471 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:40:44,473 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:40:44,474 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:40:44,475 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:40:44,554 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:40:44,555 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:40:44,555 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:44] "GET /static/content/other/buttons.txt HTTP/1.1" 304 - +2026-01-18 22:40:59,771 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /toaster HTTP/1.1" 200 - +2026-01-18 22:40:59,918 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:40:59,918 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:40:59,919 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/css/toaster.css HTTP/1.1" 304 - +2026-01-18 22:40:59,924 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:40:59,925 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:40:59,926 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:40:59,928 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:40:59,929 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:40:59,929 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:40:59,930 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:40:59,932 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:40:59,933 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:40:59,934 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:40:59,935 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:40:59,948 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:40:59,949 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:40:59,950 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/toaster/Toaster_v1.0_Dark.png HTTP/1.1" 304 - +2026-01-18 22:40:59,952 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg HTTP/1.1" 304 - +2026-01-18 22:40:59,954 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg HTTP/1.1" 304 - +2026-01-18 22:40:59,953 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg HTTP/1.1" 304 - +2026-01-18 22:40:59,955 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg HTTP/1.1" 304 - +2026-01-18 22:40:59,956 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg HTTP/1.1" 304 - +2026-01-18 22:40:59,958 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg HTTP/1.1" 304 - +2026-01-18 22:40:59,958 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg HTTP/1.1" 304 - +2026-01-18 22:40:59,960 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:40:59] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg HTTP/1.1" 304 - +2026-01-18 22:41:12,308 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /toaster HTTP/1.1" 200 - +2026-01-18 22:41:12,502 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:41:12,503 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/css/toaster.css HTTP/1.1" 304 - +2026-01-18 22:41:12,503 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:41:12,517 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:41:12,519 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:41:12,520 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:41:12,521 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:41:12,522 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:41:12,523 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:41:12,524 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:41:12,525 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:41:12,526 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:41:12,528 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:41:12,529 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:41:12,564 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:41:12,566 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg HTTP/1.1" 304 - +2026-01-18 22:41:12,568 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:41:12,569 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg HTTP/1.1" 304 - +2026-01-18 22:41:12,568 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/toaster/Toaster_v1.0_Dark.png HTTP/1.1" 304 - +2026-01-18 22:41:12,572 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg HTTP/1.1" 304 - +2026-01-18 22:41:12,573 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg HTTP/1.1" 304 - +2026-01-18 22:41:12,576 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg HTTP/1.1" 304 - +2026-01-18 22:41:12,577 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg HTTP/1.1" 304 - +2026-01-18 22:41:12,578 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg HTTP/1.1" 304 - +2026-01-18 22:41:12,579 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:12] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg HTTP/1.1" 304 - +2026-01-18 22:41:55,101 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET / HTTP/1.1" 200 - +2026-01-18 22:41:55,212 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:41:55,212 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:41:55,214 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:41:55,222 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:41:55,226 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:41:55,226 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:41:55,227 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:41:55,228 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:41:55,229 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:41:55,230 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:41:55,232 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:41:55,233 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:41:55,232 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:41:55,234 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:41:55,272 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:41:55,272 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:41:55,273 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:41:55] "GET /static/content/other/buttons.txt HTTP/1.1" 304 - +2026-01-18 22:42:08,053 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET / HTTP/1.1" 200 - +2026-01-18 22:42:08,145 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:42:08,145 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:42:08,146 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:42:08,149 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:42:08,149 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:42:08,151 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:42:08,152 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:42:08,153 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:42:08,154 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:42:08,155 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:42:08,153 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:42:08,156 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:42:08,159 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:42:08,160 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:42:08,171 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:42:08,171 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:42:08,182 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:42:08] "GET /static/content/other/buttons.txt HTTP/1.1" 304 - +2026-01-18 22:46:31,733 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET / HTTP/1.1" 200 - +2026-01-18 22:46:31,838 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:46:31,839 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:46:31,840 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:46:31,863 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:46:31,864 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:46:31,864 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:46:31,866 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:46:31,867 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:46:31,868 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:46:31,870 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:46:31,871 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:46:31,872 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:46:31,873 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:46:31,873 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:46:31,893 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:46:31,894 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/other/buttons.txt HTTP/1.1" 304 - +2026-01-18 22:46:31,893 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:31] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:46:47,977 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:47] "GET / HTTP/1.1" 200 - +2026-01-18 22:46:48,077 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:46:48,078 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:46:48,079 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:46:48,083 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:46:48,084 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:46:48,085 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:46:48,086 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:46:48,088 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:46:48,088 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:46:48,087 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:46:48,088 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:46:48,091 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:46:48,092 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:46:48,092 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:46:48,101 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:46:48,102 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:46:48,106 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:46:48] "GET /static/content/other/buttons.txt HTTP/1.1" 304 - +2026-01-18 22:49:58,019 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET / HTTP/1.1" 200 - +2026-01-18 22:49:58,211 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:49:58,211 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:49:58,220 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/js/base.js HTTP/1.1" 200 - +2026-01-18 22:49:58,261 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:49:58,263 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:49:58,265 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:49:58,264 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:49:58,264 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:49:58,266 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:49:58,267 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:49:58,269 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:49:58,270 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:49:58,270 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:49:58,271 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:49:58,322 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:49:58,324 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:49:58,356 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:49:58] "GET /static/content/buttons/non_link_buttons.txt HTTP/1.1" 200 - +2026-01-18 22:54:40,587 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET / HTTP/1.1" 200 - +2026-01-18 22:54:40,771 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:54:40,771 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 22:54:40,774 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:54:40,784 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/hijpixel.gif HTTP/1.1" 200 - +2026-01-18 22:54:40,786 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/lensdeer.gif HTTP/1.1" 200 - +2026-01-18 22:54:40,791 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:54:40,793 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:54:40,793 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:54:40,795 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:54:40,796 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:54:40,799 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:54:40,800 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:54:40,801 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:54:40,802 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:54:40,803 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:54:40,803 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:54:40,826 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:54:40,828 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:54:40,838 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:54:40] "GET /static/content/buttons/non_link_buttons.txt HTTP/1.1" 200 - +2026-01-18 22:55:37,951 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:37] "GET /toaster HTTP/1.1" 200 - +2026-01-18 22:55:38,101 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 22:55:38,101 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/css/toaster.css HTTP/1.1" 304 - +2026-01-18 22:55:38,102 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 22:55:38,107 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/hijpixel.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,108 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/lensdeer.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,110 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,111 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 22:55:38,112 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 22:55:38,112 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,114 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,116 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,116 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,117 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,119 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,119 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 22:55:38,121 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,143 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 22:55:38,144 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 22:55:38,145 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/toaster/Toaster_v1.0_Dark.png HTTP/1.1" 304 - +2026-01-18 22:55:38,147 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg HTTP/1.1" 304 - +2026-01-18 22:55:38,147 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg HTTP/1.1" 304 - +2026-01-18 22:55:38,148 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg HTTP/1.1" 304 - +2026-01-18 22:55:38,150 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg HTTP/1.1" 304 - +2026-01-18 22:55:38,150 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg HTTP/1.1" 304 - +2026-01-18 22:55:38,151 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg HTTP/1.1" 304 - +2026-01-18 22:55:38,151 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg HTTP/1.1" 304 - +2026-01-18 22:55:38,152 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 22:55:38] "GET /static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg HTTP/1.1" 304 - +2026-01-18 23:19:45,287 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET / HTTP/1.1" 200 - +2026-01-18 23:19:45,445 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 23:19:45,446 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 23:19:45,447 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 23:19:45,479 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/hijpixel.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,479 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/lensdeer.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,481 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,482 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 23:19:45,484 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,485 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 23:19:45,485 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,487 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,488 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,489 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,491 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 23:19:45,491 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,492 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,535 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 23:19:45,536 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 23:19:45,537 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:19:45] "GET /static/content/buttons/non_link_buttons.txt HTTP/1.1" 304 - +2026-01-18 23:21:27,084 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET / HTTP/1.1" 200 - +2026-01-18 23:21:27,215 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/css/bases/base.css HTTP/1.1" 304 - +2026-01-18 23:21:27,216 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/css/index.css HTTP/1.1" 304 - +2026-01-18 23:21:27,217 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/js/base.js HTTP/1.1" 304 - +2026-01-18 23:21:27,226 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/hijpixel.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,227 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/lensdeer.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,228 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/emmixis.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,229 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/ne0nbandit.png HTTP/1.1" 304 - +2026-01-18 23:21:27,231 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/nekoweb.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,232 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/thnlqd.png HTTP/1.1" 304 - +2026-01-18 23:21:27,231 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/s1nez.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,234 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/beeps.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,235 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/insia.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,238 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/blinkiescafe.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,236 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/8831.png HTTP/1.1" 304 - +2026-01-18 23:21:27,237 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/neocities.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,240 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/tuxedodragon.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,275 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/general_images/haj.gif HTTP/1.1" 304 - +2026-01-18 23:21:27,276 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/general_images/icon.webp HTTP/1.1" 304 - +2026-01-18 23:21:27,277 - werkzeug - INFO - 127.0.0.1 - - [18/Jan/2026 23:21:27] "GET /static/content/buttons/non_link_buttons.txt HTTP/1.1" 304 - diff --git a/src/routes/dynamic_routes.py b/src/routes/dynamic_routes.py new file mode 100644 index 0000000..da4dfda --- /dev/null +++ b/src/routes/dynamic_routes.py @@ -0,0 +1,41 @@ +# Imports +from flask import Blueprint, render_template, request, abort +from os import getenv as env +import logging, os, re + +# Create blueprint +bp = Blueprint( + 'dynamic_routes', + __name__, + template_folder=env('TEMPLATE_FOLDER', default='../templates'), + static_folder=env('STATIC_FOLDER', default='../static') +) + +# Create logger +log = logging.getLogger(__name__) + +# Get all files in folder +def ListFiles(path): + files = [] + for root, dirs, files_in_dir in os.walk(path): + for file in files_in_dir: + files.append(os.path.relpath(os.path.join(root, file), path)) + for dir in dirs: + files.append(os.path.relpath(os.path.join(root, dir), path) + '/') + return files + +# Catch-all route for generic pages +@bp.route('/') +def catch_all(filename): + try: + return render_template(f'pages/{filename if re.match(r'^.+\.[a-zA-Z0-9]+$', filename) else filename + '.html'}') + + except Exception as e: + os_path = os.path.join(bp.template_folder, 'pages', filename)[3:] + print(os_path) + if os.path.isdir(os_path): + if not filename.endswith('/'): filename += '/' + return render_template('bases/directory.html', directory=filename, pages=ListFiles(os_path)) + + # If it is a file, return a 404 error + abort(404, f"Template '{filename}' not found: {e}") \ No newline at end of file diff --git a/src/routes/error_handlers.py b/src/routes/error_handlers.py index 34e055e..22e19f2 100644 --- a/src/routes/error_handlers.py +++ b/src/routes/error_handlers.py @@ -3,9 +3,6 @@ from flask import Blueprint, render_template from os import getenv as env import logging -import src.routes.snake as snake - - # Create blueprint bp = Blueprint( 'error_handlers', @@ -14,11 +11,9 @@ bp = Blueprint( static_folder=env('STATIC_FOLDER', default='../static') ) - # Create logger log = logging.getLogger(__name__) - # Route for 500 error @bp.route('/500') @bp.app_errorhandler(500) @@ -27,17 +22,13 @@ def internal_server_error(error=None): log.error("Internal server error: %s", error) return render_template('errors/500.html'), 500 - # Route for 404 error @bp.route('/404') @bp.app_errorhandler(404) def not_found(error=None): if error is not None: log.warning("Page not found: %s", error) - scores = snake.get_leaderboard() - token = snake.generate_start_token() - return render_template('errors/404.html', scores=scores, token=token, cap_key=env('CAP_KEY', default='')), 404 if error is not None else 200 - + return render_template('errors/404.html'), 404 if error is not None else 200 # Route for 400 error @bp.route('/400') diff --git a/src/routes/generic.py b/src/routes/generic.py deleted file mode 100644 index cf350dd..0000000 --- a/src/routes/generic.py +++ /dev/null @@ -1,65 +0,0 @@ -# Imports -from flask import Blueprint, render_template, request, abort, send_file -from os import getenv as env -import logging, os - - -# Create blueprint -bp = Blueprint( - 'generic', - __name__, - template_folder=env('TEMPLATE_FOLDER', default='../templates'), - static_folder=env('STATIC_FOLDER', default='../static') -) - - -# Create logger -log = logging.getLogger(__name__) - - -# Route for index page -@bp.route('/') -def index(): - return render_template('index.html') - - -# Route for favicon -@bp.route('/favicon.ico') -def favicon(): - return send_file('../static/content/other/favicon.ico') - - -# Route for robots.txt -@bp.route('/robots.txt') -def robots(): - return send_file('../static/content/other/robots.txt') - - -# Route for sitemap.xml -@bp.route('/sitemap.xml') -def sitemap(): - return send_file('../static/content/other/sitemap.xml') - - -# Catch-all route for generic pages -@bp.route('/') -def catch_all(filename): - try: return render_template(f'pages/{filename if filename.endswith(".html") else filename + ".html"}') - except Exception as e: - # If the template is not found, check if it is a directory - os_path = os.path.join(bp.template_folder, 'pages', filename)[3:] - if os.path.isdir(os_path): - # walk through the directory and find all files - pages = [] - for root, dirs, files_in_dir in os.walk(os_path): - for file in files_in_dir: - pages.append(os.path.relpath(os.path.join(root, file), os_path)) - for dir in dirs: - pages.append(os.path.relpath(os.path.join(root, dir), os_path) + '/') - - # If it is a directory, render a directory page - if not filename.endswith('/'): filename += '/' - return render_template('bases/directory.html', directory=filename, pages=pages) - - # If it is a file, return a 404 error - abort(404, f"Template '{filename}' not found: {e}") \ No newline at end of file diff --git a/src/routes/snake.py b/src/routes/snake.py deleted file mode 100644 index c8a4a7b..0000000 --- a/src/routes/snake.py +++ /dev/null @@ -1,153 +0,0 @@ -# Imports -from flask import Blueprint, abort, request, redirect -from os import urandom, getenv as env -import src.utils.database as database -import src.utils.cap as cap -import logging, datetime, threading, time - - -# Create blueprint -bp = Blueprint( - 'snake', - __name__, - template_folder=env('TEMPLATE_FOLDER', default='../templates'), - static_folder=env('STATIC_FOLDER', default='../static') -) - - -# Create logger -log = logging.getLogger(__name__) - - -# Create database instance -db = database.Database( - host=env('DB_HOST', default='localhost'), - port=env('DB_PORT', default=5432), - user=env('DB_USER', default='user'), - password=env('DB_PASSWORD', default='password'), - db_name=env('DB_NAME', default='db_name') -) - -db.execute('CREATE TABLE IF NOT EXISTS snake_scores (id SERIAL PRIMARY KEY, name TEXT, score INTEGER)') -db.execute('''CREATE TABLE IF NOT EXISTS snake_tokens ( - id SERIAL PRIMARY KEY, - token TEXT UNIQUE NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - ip TEXT UNIQUE NOT NULL -)''') - -# Input validation function -def valid_length(value, min_length=1, max_length=100): - if not isinstance(value, str): - return False - return min_length <= len(value) <= max_length - - -def valid_score(score, game_token): - start_time = db.execute('SELECT created_at FROM snake_tokens WHERE token = %s', (game_token,)).fetchone() - if not start_time: - log.error("Game token not found.") - return False - - start_time = datetime.datetime.fromisoformat(start_time[0]) - current_time = datetime.datetime.now() - elapsed_time = (current_time - start_time).total_seconds() - - if elapsed_time < score / 10 * 3 + 10: # assuming that each point takes 3 seconds to achieve and 10 seconds to start the game and do captcha - log.error("Score is too high for the elapsed time.") - return False - - if score <= 0 or score > 10000: # Arbitrary upper limit for scores - log.error("Score is out of valid range.") - return False - - if score % 10 != 0: - log.error("Score is not a multiple of 10.") - return False - - # delete the token after score validation - db.execute('DELETE FROM snake_tokens WHERE token = %s', (game_token,)) - log.info(f"Score {score} validated successfully for token {game_token}.") - - return True - - -# Route for score submission -@bp.route('/snake/submit', methods=['POST']) -def submit_score(): - name = request.form.get('name') - score = request.form.get('score') - captcha_token = request.form.get('cap-token') - game_token = request.form.get('game_token') - - if not cap.verify_captcha(captcha_token): - log.error("Captcha verification failed.") - abort(400, "Captcha verification failed") - - if not name or not score or not captcha_token or not game_token: - log.error("Name, score, captcha token, or game token is missing.") - abort(400, "Missing required fields") - - if not valid_length(name, min_length=3, max_length=15): - log.error("Invalid name length.") - abort(400, "Name must be between 3 and 15 characters long.") - - if not valid_score(int(score), game_token): - log.error("Invalid score.") - abort(400, "Score not vilid, so either you are trying to cheat the leaderboard or something is seriously wrong.") - - try: - db.execute('INSERT INTO snake_scores (name, score) VALUES (%s, %s)', (name, int(score))) - db.execute('DELETE FROM snake_tokens WHERE token = %s', (game_token,)) - log.info(f"Score submitted: {name} - {score}") - return redirect('/404') - - except Exception as e: - log.error(f"Database error: {e}") - abort(500, "Internal server error while submitting score.") - - -# Generate a unique game token -def generate_start_token(): - """Generate a unique start token for the game.""" - token = urandom(16).hex() - ip = request.headers.get('X-Forwarded-For', request.remote_addr) - - ip_token = db.execute('SELECT token FROM snake_tokens WHERE ip = %s', (ip,)).fetchone() - if ip_token: - log.info(f"Token already exists for IP: {ip}, reusing token.") - return ip_token[0] - - log.info(f"Generated start token: {token}") - db.execute('INSERT INTO snake_tokens (token, ip) VALUES (%s, %s)', (token, ip)) - return token - - -# Get leaderboard scores -def get_leaderboard(): - """Fetch scores from the leaderboard.""" - try: - scores = db.execute('SELECT name, score FROM snake_scores ORDER BY score DESC').fetchall() - leaderboard = [{'position': i + 1, 'name': score[0], 'score': score[1]} for i, score in enumerate(scores)] - log.info("Leaderboard fetched successfully.") - return leaderboard - except Exception as e: - log.error(f"Error fetching leaderboard: {e}") - return [] - - -# Clear all tokens older than 1 hour -def clear_old_tokens(): - while True: - try: - one_hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1) - db.execute('DELETE FROM snake_tokens WHERE created_at < %s', (one_hour_ago,)) - log.info("Old tokens cleared.") - except Exception as e: - log.error(f"Error clearing old tokens: {e}") - time.sleep(3600) # Run every hour - - -# Start the token clearing thread -token_thread = threading.Thread(target=clear_old_tokens, daemon=True) -token_thread.start() \ No newline at end of file diff --git a/src/utils/cap.py b/src/utils/cap.py deleted file mode 100644 index 456e7c5..0000000 --- a/src/utils/cap.py +++ /dev/null @@ -1,42 +0,0 @@ -# Imports -from os import getenv as env -import requests, logging - - -# Create logger -log = logging.getLogger(__name__) - - -# Function to verify CAPTCHA response -def verify_captcha(token: str) -> bool: - """ - Verify the CAP response token with the CAP server. - - Args: - token (str): The CAP response token to verify. - - Returns: - bool: True if the token is valid, False otherwise. - """ - if not token: - return False - - try: - response = requests.post( - f"https://cap.alfieking.dev/{env('CAP_KEY', default='')}/siteverify", - json={ - 'secret': env('CAP_SECRET', default=''), - 'response': token, - }, - timeout=10 - ) - - response.raise_for_status() - if response.status_code != 200: - log.error("CAPTCHA verification failed with status code: %s", response.status_code) - return False - return response.json().get('success', False) - - except Exception as e: - log.error("Error verifying CAPTCHA: %s", e) - return False \ No newline at end of file diff --git a/src/utils/database.py b/src/utils/database.py deleted file mode 100644 index 8cc5d94..0000000 --- a/src/utils/database.py +++ /dev/null @@ -1,23 +0,0 @@ -# Imports -import psycopg2 - -class Database: - def __init__(self, host, port, user, password, db_name): - self.connection = psycopg2.connect( - host=host, - port=port, - user=user, - password=password, - database=db_name - ) - self.cursor = self.connection.cursor() - - def execute(self, query, params=None): - if params is None: - params = [] - self.cursor.execute(query, params) - self.connection.commit() - return self.cursor - - def close(self): - self.connection.close() \ No newline at end of file diff --git a/src/wsgi.py b/src/wsgi.py index 47d4970..c5c45b4 100644 --- a/src/wsgi.py +++ b/src/wsgi.py @@ -1,34 +1,33 @@ # Imports -from flask import Flask +from flask import Flask, render_template, send_file from flask_session import Session from dotenv import load_dotenv -from os import getenv as env, listdir -import logging, importlib +from os import getenv as env +import logging +import src.routes.error_handlers +import src.routes.dynamic_routes # Load env load_dotenv() +# Create logger +stream_handler = logging.StreamHandler() +stream_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) +stream_handler.setLevel(logging.INFO) -# Create console log handler -console_log = logging.StreamHandler() -console_log.setFormatter(logging.Formatter("\033[1;32m%(asctime)s\033[0m - \033[1;34m%(levelname)s\033[0m - \033[1;31m%(name)s\033[0m - %(message)s")) -console_log.setLevel(logging.INFO) - -# Create file log handler -file_log = logging.FileHandler(env('LOG_FILE', default='app.log'), mode=env('LOG_MODE', default='a')) -file_log.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")) -file_log.setLevel(logging.DEBUG) +file_handler = logging.FileHandler(filename='app.log') +file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) +file_handler.setLevel(logging.DEBUG) # Add handlers to the logger log = logging.getLogger() log.setLevel(logging.DEBUG) -log.addHandler(console_log) -log.addHandler(file_log) +log.addHandler(stream_handler) +log.addHandler(file_handler) log.info("Logging initialized") - # Create flask app app = Flask( __name__, @@ -41,18 +40,25 @@ app.config["SESSION_PERMANENT"] = True app.config["SESSION_TYPE"] = "filesystem" Session(app) - # Load routes -routes_dir = env('ROUTES_DIR', default='src/routes') -for filename in listdir(routes_dir): - if not filename.endswith('.py') and filename.startswith('__'): - continue +app.register_blueprint(src.routes.error_handlers.bp, url_prefix='/error') +app.register_blueprint(src.routes.dynamic_routes.bp, url_prefix='/') - module_name = f"{routes_dir.replace('/', '.')}.{filename[:-3]}" - try: - module = importlib.import_module(module_name) - if hasattr(module, 'bp'): - app.register_blueprint(module.bp) - log.info(f"Registered blueprint: {module_name}") - except Exception as e: - log.error(f"Failed to register blueprint {module_name}: {e}") \ No newline at end of file +# Generic routes +@app.route('/') +def index(): + return render_template('index.html') + +@app.route('/favicon.ico') +def favicon(): + return send_file('../static/content/other/favicon.ico') + +@app.route('/robots.txt') +def robots(): + return send_file('../static/content/other/robots.txt') + + +# Route for sitemap.xml +@app.route('/sitemap.xml') +def sitemap(): + return send_file('../static/content/other/sitemap.xml') \ No newline at end of file diff --git a/static/content/buttons/hijpixel.gif b/static/content/buttons/hijpixel.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7b2b0c7deb349b35760dc6bcae3becdac1c9f88 GIT binary patch literal 25411 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 z%0A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 SiT;VNS@54VqJJOpF8l|!fi$uJ literal 0 HcmV?d00001 diff --git a/static/content/other/buttons.txt b/static/content/buttons/non_link_buttons.txt similarity index 95% rename from static/content/other/buttons.txt rename to static/content/buttons/non_link_buttons.txt index 15132bf..e6ad151 100644 --- a/static/content/other/buttons.txt +++ b/static/content/buttons/non_link_buttons.txt @@ -3,7 +3,6 @@ https://cyber.dabamos.de/88x31/anythingbut.gif https://cyber.dabamos.de/88x31/bestdesktop.gif https://kopawz.neocities.org/buttonhoard/buttonsfldr2/diagnosedwithGAY.gif https://kopawz.neocities.org/indexgraphics/buttondecor/ilikecomputer.png -https://identity-crisis.carrd.co/assets/images/gallery04/ad4f8d52.jpg?v=4e55d939 https://anlucas.neocities.org/best_viewed_with_eyes.gif https://anlucas.neocities.org/html_learn_it_today.gif https://highway.eightyeightthirty.one/badge/5d58a8f32b007d4897db6f862a895a81674fb35f5cc3947fc66595817ca174db diff --git a/static/css/404.css b/static/css/404.css deleted file mode 100644 index 0816d0a..0000000 --- a/static/css/404.css +++ /dev/null @@ -1,155 +0,0 @@ -#snakeContainer { - padding: 15px; -} - -canvas#snakeCanvas { - box-sizing: border-box; - border: 2px solid var(--secondary-background-color); - border-radius: 10px; - width: 100%; -} - -form { - display: flex; - flex-direction: column; - width: min-content; - gap: 1rem; - padding: 15px; -} - -form input[type="text"] { - padding: 10px; - box-sizing: border-box; - border: 1px solid var(--secondary-background-color); - border-radius: 6px; - background-color: var(--secondary-background-color-but-slightly-transparent); - color: var(--text-color); -} - -form button[type="submit"] { - padding: 10px; - box-sizing: border-box; - border: 1px solid var(--secondary-background-color); - border-radius: 6px; - background-color: var(--secondary-background-color-but-slightly-transparent); - color: var(--text-color); - font-weight: bold; - cursor: pointer; -} - -.flex-row { - display: flex; - flex-direction: row; - gap: 1rem; -} - -.min-width { - width: min-content; -} - -.max-width { - width: 100%; -} - -#snakeLeaderboardSection { - display: flex; - flex-direction: column; - align-items: center; - padding: 0; - max-height: 272px ; -} - -#snakeLeaderboard { - display: flex; - flex-direction: column; - list-style: none; - padding: 0; - margin: 0; - width: 100%; - overflow-y: scroll; -} - -#snakeLeaderboard li { - padding: 5px 20px; - background-color: var(--secondary-background-color-but-slightly-transparent); - color: var(--text-color); - font-size: 1rem; - display: flex; - justify-content: space-between; - align-items: center; -} - -#snakeLeaderboard li:nth-child(even) { - background-color: var(--secondary-background-color); -} - -dialog { - width: 90%; - max-width: 500px; - padding: 20px; - background-color: var(--background-color); - color: var(--text-color); - border: 2px solid var(--secondary-background-color); - border-radius: 8px; -} - -dialog button { - padding: 10px; - width: 100%; - box-sizing: border-box; - border: 2px solid var(--secondary-background-color); - border-radius: 6px; - background-color: var(--secondary-background-color-but-slightly-transparent); - color: var(--text-color); - font-weight: bold; - cursor: pointer; - margin-top: 10px; -} - -dialog h2 { - margin: 0; - font-size: 1.5rem; -} - -dialog p { - margin: 0; - font-size: 1rem; -} - -@media screen and (max-width: 850px) { - .flex-row { - flex-direction: column; - } - - form { - align-items: center; - width: 100%; - } - - .min-width { - width: 100%; - display: flex; - flex-direction: column; - align-items: center; - } -} - -@media screen and (max-width: 650px) { - .mobileOnly { - display: flex; - } - - .pcOnly { - display: none; - } -} - -@media screen and (min-width: 651px) { - .mobileOnly { - display: none !important; - } - - .pcOnly { - display: flex; - } -} \ No newline at end of file diff --git a/static/css/base.css b/static/css/bases/base.css similarity index 97% rename from static/css/base.css rename to static/css/bases/base.css index f731444..a37b763 100644 --- a/static/css/base.css +++ b/static/css/bases/base.css @@ -308,6 +308,14 @@ a { text-decoration: none; } +code { + background-color: var(--secondary-background-color-but-slightly-transparent); + padding: 4px 6px; + border-radius: 4px; + font-size: 0.9rem; + color: var(--primary-color); +} + @media screen and (max-width: 1000px) { body { background-color: var(--background-color); diff --git a/static/css/directory.css b/static/css/bases/directory.css similarity index 100% rename from static/css/directory.css rename to static/css/bases/directory.css diff --git a/static/css/cap.css b/static/css/cap.css deleted file mode 100644 index eb614a2..0000000 --- a/static/css/cap.css +++ /dev/null @@ -1,20 +0,0 @@ -cap-widget { - --cap-background: var(--secondary-background-color-but-slightly-transparent); - --cap-border-color: var(--secondary-background-color); - --cap-border-radius: 14px; - --cap-widget-width: 230px; - --cap-widget-padding: 14px; - --cap-gap: 15px; - --cap-color: var(--text-color); - --cap-checkbox-size: 25px; - --cap-checkbox-border: 1px solid var(--secondary-background-color); - --cap-checkbox-border-radius: 6px; - --cap-checkbox-background: none; - --cap-checkbox-margin: 2px; - --cap-font: "Space Mono", "serif"; - --cap-spinner-color: var(--primary-color); - --cap-spinner-background-color: var(--secondary-background-color-but-slightly-transparent); - --cap-spinner-thickness: 5px; - --cap-credits-font-size: 12px; - --cap-opacity-hover: 0.8; -} \ No newline at end of file diff --git a/static/css/400.css b/static/css/errors/400.css similarity index 100% rename from static/css/400.css rename to static/css/errors/400.css diff --git a/static/css/500.css b/static/css/errors/500.css similarity index 100% rename from static/css/500.css rename to static/css/errors/500.css diff --git a/static/css/gallery.css b/static/css/gallery.css index 5faafc5..29a29c4 100644 --- a/static/css/gallery.css +++ b/static/css/gallery.css @@ -1,17 +1,23 @@ .gallery { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - gap: 1rem; + width: 100%; } -.gallery img { +.gallery .gallery-images { + display: flex; + flex-direction: row; + justify-content: space-between; + gap: 1rem; + overflow: hidden; +} + +.gallery .gallery-images img { max-width: 100%; height: auto; border-radius: 10px; } -.gallery-date { - margin: 1rem 0 .25rem 0; - font-size: 2rem; +.gallery h2.gallery-date { + position: relative; + top: 0; + left: 0; } \ No newline at end of file diff --git a/static/js/base.js b/static/js/base.js index 0945281..b6774d4 100644 --- a/static/js/base.js +++ b/static/js/base.js @@ -118,7 +118,7 @@ if (document.getElementById('spotify')) { // load buttons function loadButtons() { - fetch('/static/content/other/buttons.txt').then(response => { + fetch('/static/content/buttons/non_link_buttons.txt').then(response => { return response.text(); }).then(data => { container = document.getElementById('button-collection'); diff --git a/static/js/snake.js b/static/js/snake.js deleted file mode 100644 index cdd682b..0000000 --- a/static/js/snake.js +++ /dev/null @@ -1,174 +0,0 @@ -const canvas = document.getElementById('snakeCanvas'); -const ctx = canvas.getContext('2d'); - -const gridSize = 20; -const tileSize = 100; -const snakeSize = 60; -const foodSize = 80; -canvas.width = gridSize * tileSize; -canvas.height = gridSize * tileSize; - -let snake = [{ x: 10, y: 10 }, { x: 10, y: 11 }, { x: 10, y: 12 }]; -let direction = { x: 0, y: 0 }; -let food = { x: Math.floor(Math.random() * gridSize), y: Math.floor(Math.random() * gridSize) }; -let score = 0; -let gameOver = false; - -function draw() { - ctx.clearRect(0, 0, canvas.width, canvas.height); - - // draw grid of checkerboard pattern - for (let x = 0; x < gridSize; x++) { - for (let y = 0; y < gridSize; y++) { - ctx.fillStyle = (x + y) % 2 === 0 ? - getComputedStyle(document.documentElement).getPropertyValue('--background-color') : - getComputedStyle(document.documentElement).getPropertyValue('--secondary-background-color'); - ctx.fillRect(x * tileSize, y * tileSize, tileSize, tileSize); - } - } - - // Draw snake - snake.forEach(segment => { - let nextVec = { x: 0, y: 0 }; - // if there is a segment after the current segment - if (snake.indexOf(segment) < snake.length - 1) { - const nextSegment = snake[snake.indexOf(segment) + 1]; - nextVec.x = nextSegment.x - segment.x; - nextVec.y = nextSegment.y - segment.y; - } - - ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--primary-color'); - if (nextVec.x === 0 && nextVec.y === 0) { - ctx.fillRect( - segment.x * tileSize + (tileSize - snakeSize) / 2, - segment.y * tileSize + (tileSize - snakeSize) / 2, - snakeSize, - snakeSize - ); - } else if (nextVec.x > 0 || nextVec.y > 0) { - ctx.fillRect( - segment.x * tileSize + (tileSize - snakeSize) / 2, - segment.y * tileSize + (tileSize - snakeSize) / 2, - snakeSize + nextVec.x * (tileSize - snakeSize), - snakeSize + nextVec.y * (tileSize - snakeSize) - ); - } else { - ctx.fillRect( - segment.x * tileSize + (tileSize - snakeSize) / 2 + nextVec.x * (tileSize - snakeSize), - segment.y * tileSize + (tileSize - snakeSize) / 2 + nextVec.y * (tileSize - snakeSize), - snakeSize + Math.abs(nextVec.x) * (tileSize - snakeSize), - snakeSize + Math.abs(nextVec.y) * (tileSize - snakeSize) - ); - } - - }); - - // Draw food - ctx.fillStyle = '#ff4d4d'; - ctx.fillRect( - food.x * tileSize + (tileSize - foodSize) / 2, - food.y * tileSize + (tileSize - foodSize) / 2, - foodSize, - foodSize - ); -} - -function update() { - if (gameOver) return; - - // Move snake - const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y }; - - // Add new head - snake.unshift(head); - - // Check for food collision - if (head.x === food.x && head.y === food.y) { - score += 10; // Increase score - placeFood(); - } else { - snake.pop(); // Remove tail if no food eaten - } - - // Check for wall collision - if (head.x < 0 || head.x >= gridSize || head.y < 0 || head.y >= gridSize) { - gameOver = true; - return; - } - - // Check for self collision - for (let i = 1; i < snake.length; i++) { - if (head.x === snake[i].x && head.y === snake[i].y) { - gameOver = true; - return; - } - } -} - -function placeFood() { - do { - food.x = Math.floor(Math.random() * gridSize); - food.y = Math.floor(Math.random() * gridSize); - } while (snake.some(segment => segment.x === food.x && segment.y === food.y)); -} - -function changeDirection(event) { - switch (event.key) { - case 'w': - if (direction.y === 0) direction = { x: 0, y: -1 }; - break; - case 's': - if (direction.y === 0) direction = { x: 0, y: 1 }; - break; - case 'a': - if (direction.x === 0) direction = { x: -1, y: 0 }; - break; - case 'd': - if (direction.x === 0) direction = { x: 1, y: 0 }; - break; - } -} - -// Menu to start the game -function menu() { - ctx.clearRect(0, 0, canvas.width, canvas.height); - - ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--background-color'); - ctx.fillRect(0, 0, canvas.width, canvas.height); - - ctx.textAlign = 'center'; - ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--text-color'); - ctx.font = '200px Arial'; - ctx.fillText('Snake Game', canvas.width / 2, canvas.height / 2); - ctx.font = '100px Arial'; - ctx.fillText('Press W/A/S/D to move', canvas.width / 2, canvas.height / 2 + 100); - ctx.fillText('Click to start', canvas.width / 2, canvas.height / 2 + 200); - - canvas.addEventListener('click', startGame); -} - -function gameLoop() { - if (!gameOver) { - update(); - draw(); - setTimeout(gameLoop, 100); - } else { - document.removeEventListener('keydown', changeDirection); - document.getElementById('score').value = score; - alert(`Game Over! Your score: ${score}`); - menu(); - } -} - -function startGame() { - snake = [{ x: 10, y: 10 }, { x: 10, y: 11 }, { x: 10, y: 12 }]; - direction = { x: 1, y: 0 }; - food = { x: Math.floor(Math.random() * gridSize), y: Math.floor(Math.random() * gridSize) }; - score = 0; - gameOver = false; - canvas.removeEventListener('click', startGame); - document.addEventListener('keydown', changeDirection); - gameLoop(); -} - -menu(); \ No newline at end of file diff --git a/templates/bases/base.html b/templates/bases/base.html index bc971f1..4d578b7 100644 --- a/templates/bases/base.html +++ b/templates/bases/base.html @@ -5,7 +5,7 @@ {% block title %}Alfie's basement{% endblock %} - + @@ -37,7 +37,6 @@
  • YouTube
  • Tumblr
  • Reddit
  • -
  • 404 >:3
  • @@ -47,6 +46,8 @@

    BUTTONS

      +
    • hijpixel
    • +
    • lensdeer
    • emmixis
    • dimden
    • ne0nbandit
    • @@ -61,6 +62,12 @@
    • tuxedodragon
    +
    +
    + + +
    +
          |\      _,,,---,,_
    ZZZzz /,`.-'`' -. ;-;;,_
    |,4- ) )-,_. ,\ ( `'-'
    '---''(_/--' `-'\_)
    diff --git a/templates/bases/directory.html b/templates/bases/directory.html index 714ebec..d30688e 100644 --- a/templates/bases/directory.html +++ b/templates/bases/directory.html @@ -4,7 +4,7 @@ {% block description %}server backend survivor{% endblock %} {% block head %} - + {% endblock %} {% block scripts %} diff --git a/templates/errors/400.html b/templates/errors/400.html index 2ebb911..16b471c 100644 --- a/templates/errors/400.html +++ b/templates/errors/400.html @@ -4,7 +4,7 @@ {% block description %}Bad request. The server could not understand the request due to invalid syntax.{% endblock %} {% block head %} - + {% endblock %} {% block content %} diff --git a/templates/errors/404.html b/templates/errors/404.html index 0413b88..0215a8d 100644 --- a/templates/errors/404.html +++ b/templates/errors/404.html @@ -3,80 +3,11 @@ {% block title %}404 - Not Found{% endblock %} {% block description %}The page you are looking for does not exist.{% endblock %} -{% block head %} - - -{% endblock %} - {% block content %}

    404

    - It seems like the thing you are looking for is not here :[ -

    - - while you're here, why not play some snake? - - - You can't play snake on mobile, sorry :( - + It seems like the thing you are looking for does not exist or rm -rf itself out of exsistance.

    -
    - -
    -
    -
    -

    Submit score

    -
    - - - - - -
    -
    -
    -

    Leaderboard

    -
      - {% for score in scores %} -
    • - {{ score.position }} - {{ score.name }} - {{ score.score }} -
    • - {% endfor %} -
    -
    -
    -
    -

    Leaderboard

    -
      - {% for score in scores %} -
    • - {{ score.position }} - {{ score.name }} - {{ score.score }} -
    • - {% endfor %} -
    -
    -{% if error %} - -

    Error

    -

    {{ error }}

    - -
    - -{% endif %} -{% endblock %} - -{% block scripts %} - - {% endblock %} \ No newline at end of file diff --git a/templates/errors/500.html b/templates/errors/500.html index ff54c62..eec13f3 100644 --- a/templates/errors/500.html +++ b/templates/errors/500.html @@ -4,7 +4,7 @@ {% block description %}An unexpected error occurred on the server.{% endblock %} {% block head %} - + {% endblock %} {% block content %} diff --git a/templates/index.html b/templates/index.html index eae876b..52a30b1 100644 --- a/templates/index.html +++ b/templates/index.html @@ -11,7 +11,7 @@

    A lil bit abt me

    - Im not good with writing so dont expect much here. I am a student who is learning c++ and python. I've Done a few projects that i think + Im not good with writing so dont expect much here. I was a student learning c++ and python. I've Done a few projects that i think are decent enough to show off, so I have put them on this website. I like to mess around with linux and have a few servers that I run. I've been running a server for a few years now, and I have learned a lot from it. I have also switched to linux on my main computer, which has been slightly annoying at times (mainly because one of my most played games' anticheat doesn't support on linux atm. Also, the lack of photoshop is @@ -104,6 +104,15 @@

    Some News

    (dont expect this to be updated often tho :P)
      +
    • +

      18-01-2026

      +

      + :O an update! thats unheard of on this site (aleast its more often than tf2 gets updates). finding motivation to work on things has been painful + recently, but im wokring on my mental state a bit so hopefully there will be more updates. I am writing this before i make any major changes but + i hope to add a blog or something, or maybe a daily thoughts thing that pings my phone to get me to write something. I also need to rewrite most + of the home page as well since its kinda out of date :P +

      +
    • 28-06-2025

      diff --git a/templates/pages/events/crittersmk.html b/templates/pages/events/crittersmk.html index 04f6e61..6201446 100644 --- a/templates/pages/events/crittersmk.html +++ b/templates/pages/events/crittersmk.html @@ -34,18 +34,20 @@ protogen v1.0, toaster v1.0

      Here are some photos from the meets I have attended. I will add more as I attend more meets.

      -
    {% endblock %} \ No newline at end of file