Compare commits
	
		
			8 commits
		
	
	
		
			
				429314efba
			
			...
			
				db05b1d4e7
			
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| db05b1d4e7 | |||
| 166fab652d | |||
| 310142efc3 | |||
| 3c05fe4248 | |||
| 81b43f3dca | |||
| 05288f04aa | |||
| a4edd396f0 | |||
| 57bb0e03a3 | 
							
								
								
									
										15
									
								
								app/Helpers/LegacyHelper.php
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,15 @@ | |||
| <?php | ||||
| 
 | ||||
| if (!function_exists('isLegacy')) { | ||||
|     /** | ||||
|      * Checks if the current hostname should return the legacy site | ||||
|      * @return bool | ||||
|      */ | ||||
|     function isLegacy(): bool { | ||||
|         return ( | ||||
|             request()->getHost() === "legacy.wah.moe" ||        // Accessed via legacy.wah.moe domain
 | ||||
|             str_starts_with(request()->getHost(), "192.168") || // Accessed via local IP address
 | ||||
|             !request()->hasHeader("Host")                  // Browser does not send Host header (e.g. NCSA MOSAIC)
 | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | @ -8,7 +8,11 @@ | |||
| class RoscoLekoController extends Controller { | ||||
|     public function getImages(): array { | ||||
|         $images = []; | ||||
|         foreach (File::glob(public_path('images/pandamonium').'/*') as $path) { | ||||
|         $path = 'images/pandamonium'; | ||||
|         if (isLegacy()) { | ||||
|             $path = 'images/pandamonium-legacy'; | ||||
|         } | ||||
|         foreach (File::glob(public_path($path).'/*') as $path) { | ||||
|             $image_data = []; | ||||
|             try { | ||||
|                 $exif = exif_read_data($path); | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ public static function insertGuestbookEntry(Request $request) { | |||
|         $newEntry->message = $request->get('message'); | ||||
|         $newEntry->ip = $request->ip(); | ||||
|         $newEntry->agent = $request->userAgent(); | ||||
|         $newEntry->admin = auth()->check(); | ||||
|         $newEntry->legacy_flagged = isLegacy(); | ||||
|         $newEntry->save(); | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,11 +8,22 @@ | |||
| 
 | ||||
| class LastFMCurrent extends Component { | ||||
|     public $track; | ||||
|     public $artUrl; | ||||
|     /** | ||||
|      * Create a new component instance. | ||||
|      */ | ||||
|     public function __construct($track) { | ||||
|         $this->track = $track; | ||||
|         if (isLegacy()) { | ||||
|             $path = parse_url($track["image"], PHP_URL_PATH); | ||||
|             if ($track["image"] === "") { | ||||
|                 $this->artUrl = null; | ||||
|                 return; | ||||
|             } | ||||
|             $this->artUrl = "//".request()->getHttpHost()."/proxy/lastfm/".basename($path); | ||||
|         } else { | ||||
|             $this->artUrl = $track["image"]; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  |  | |||
|  | @ -17,9 +17,15 @@ public function __construct() {} | |||
|      * Get the view / contents that represent the component. | ||||
|      */ | ||||
|     public function render(): View|Closure|string { | ||||
|         return view('components.layout', [ | ||||
|             'isChristmas' => $this->isItChristmas() | ||||
|         ]); | ||||
|         if (isLegacy()) { | ||||
|             return view('components.layout-legacy', [ | ||||
|                 'isChristmas' => $this->isItChristmas() | ||||
|             ]); | ||||
|         } else { | ||||
|             return view('components.layout', [ | ||||
|                 'isChristmas' => $this->isItChristmas() | ||||
|             ]); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public function isItChristmas() : bool { | ||||
|  |  | |||
|  | @ -17,6 +17,17 @@ public function __construct() {} | |||
| 
 | ||||
| 
 | ||||
|     public function getWah(): string { | ||||
|         if (isLegacy()) { | ||||
|             try { | ||||
|                 $response = Http::get('https://api.tinyfox.dev/img.json?animal=wah'); | ||||
|                 $data = $response->json(); | ||||
|                 if ($data == null) return ""; | ||||
|                 $path = parse_url("https://api.tinyfox.dev" . $data["loc"], PHP_URL_PATH); | ||||
|                 return "//".request()->getHttpHost()."/proxy/wah/".basename($path); | ||||
|             } catch (Exception $ex) { | ||||
|                 return ""; | ||||
|             } | ||||
|         } | ||||
|         try { | ||||
|             $response = Http::get('https://api.tinyfox.dev/img.json?animal=wah'); | ||||
|             $data = $response->json(); | ||||
|  | @ -26,7 +37,6 @@ public function getWah(): string { | |||
|         } catch (Exception $ex) { | ||||
|             return ""; | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  |  | |||
|  | @ -6,6 +6,8 @@ | |||
|     "license": "MIT", | ||||
|     "require": { | ||||
|         "php": "^8.1", | ||||
|         "ext-exif": "*", | ||||
|         "browner12/helpers": "^3.7", | ||||
|         "guzzlehttp/guzzle": "^7.2", | ||||
|         "intervention/image": "^3.9", | ||||
|         "laravel/framework": "^10.10", | ||||
|  | @ -13,8 +15,7 @@ | |||
|         "scrivo/highlight.php": "v9.18.1.10", | ||||
|         "spatie/laravel-honeypot": "^4.3", | ||||
|         "spatie/laravel-html": "^3.4", | ||||
|         "ua-parser/uap-php": "^3.9.14", | ||||
|         "ext-exif": "*" | ||||
|         "ua-parser/uap-php": "^3.9.14" | ||||
|     }, | ||||
|     "require-dev": { | ||||
|         "fakerphp/faker": "^1.9.1", | ||||
|  |  | |||
							
								
								
									
										1100
									
								
								composer.lock
									
										
									
										generated
									
									
									
								
							
							
						
						|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| return [ | ||||
|     'name' => env('APP_NAME', 'wah.moe'), | ||||
|     'version' => '2025.06.12', | ||||
|     'version' => '2025.08-30', | ||||
|     'env' => env('APP_ENV', 'production'), | ||||
|     'debug' => (bool) env('APP_DEBUG', false), | ||||
|     'url' => env('APP_URL', 'http://localhost'), | ||||
|  | @ -25,6 +25,7 @@ | |||
|         App\Providers\AuthServiceProvider::class, | ||||
|         App\Providers\EventServiceProvider::class, | ||||
|         App\Providers\RouteServiceProvider::class, | ||||
|         browner12\helpers\HelperServiceProvider::class | ||||
|     ])->toArray(), | ||||
|     'aliases' => Facade::defaultAliases()->merge([ | ||||
|     ])->toArray(), | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| body { | ||||
|   background-color: #f2efbd; | ||||
|   color: #2a271c; | ||||
|   color: #2f2f42; | ||||
|   margin: 20px; | ||||
|   background: #80c9fa url("/images/peek.png") no-repeat bottom right 10px fixed; | ||||
| } | ||||
| 
 | ||||
| img { | ||||
|  | @ -9,12 +9,12 @@ img { | |||
| } | ||||
| 
 | ||||
| a { | ||||
|   color: hsl(183, 93%, 27%); | ||||
|   color: #2f2f42; | ||||
|   text-decoration: underline dotted; | ||||
| } | ||||
| 
 | ||||
| a:hover { | ||||
|   color: hsl(183, 93%, 15%); | ||||
|   color: #2f2f42; | ||||
|   text-decoration: underline solid; | ||||
| } | ||||
| 
 | ||||
|  | @ -47,3 +47,8 @@ .description { | |||
|   font-size: 90%; | ||||
| } | ||||
| 
 | ||||
| hr { | ||||
|     border: none; | ||||
|     border-bottom: 2px solid #2f2f42; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,14 +1,14 @@ | |||
| :root { | ||||
|     --background: #f2efbd; | ||||
|     --foreground: #2a271c; | ||||
|     --border-color: #f27405; | ||||
|     --background: hsl(214, 67%, 85%); | ||||
|     --foreground: hsl(214, 20%, 14%); | ||||
|     --border-color: hsl(214, 96%, 48%); | ||||
|     --border: var(--border-color) 2px solid; | ||||
|     --shadow-color: hsla(11, 96%, 43%, 0.4); | ||||
|     --shadow-color: hsla(214, 96%, 43%, 0.4); | ||||
|     --shadow: drop-shadow(8px 8px var(--shadow-color)); | ||||
|     --shadow-small: drop-shadow(3px 3px var(--shadow-color)); | ||||
|     --links: hsl(92, 27%, 22%); | ||||
|     --links-hover: hsl(92, 27%, 15%) | ||||
|     --table-header: hsla(11, 96%, 43%, 0.2); | ||||
|     --links: hsl(214, 27%, 22%); | ||||
|     --links-hover: hsl(214, 27%, 15%); | ||||
|     --table-header: hsla(214, 96%, 43%, 0.2); | ||||
| } | ||||
| 
 | ||||
| /* ───────────────────────────────────── Fonts ────────────────────────────────────── */ | ||||
|  | @ -74,7 +74,7 @@ #prideflag { | |||
|     top: 0; | ||||
|     right: 0; | ||||
|     width: 120px; | ||||
|     transform-origin: 100% 0%; | ||||
|     transform-origin: 100% 0; | ||||
|     transition: transform .5s cubic-bezier(.32,1.63,.41,1.01); | ||||
|     z-index: 8008135; | ||||
| } | ||||
|  | @ -98,24 +98,13 @@ html { | |||
| body { | ||||
|     color: var(--foreground); | ||||
|     min-height: 100%; | ||||
|     background-color: hsla(0, 0%, 0%, 0); | ||||
|     padding: 10px; | ||||
|     font-family: "PT Serif"; | ||||
|     background: url('/images/roscoe_tile.jpg'); | ||||
|     padding: 5px; | ||||
|     font-family: "PT Serif", serif; | ||||
| } | ||||
| 
 | ||||
| body::before { | ||||
|     content: ""; | ||||
|     position: fixed; | ||||
|     top: 0; | ||||
|     left: 0; | ||||
|     background-image: url("/images/background.jpg"); | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     z-index: -1; | ||||
|     opacity: 0.8; | ||||
|     background-size: cover; | ||||
|     background-attachment: fixed; | ||||
|     overflow: hidden; | ||||
| img.logo_paw { | ||||
|     filter: grayscale(100%) sepia(100%) hue-rotate(180deg) saturate(300%); | ||||
| } | ||||
| 
 | ||||
| h1, | ||||
|  | @ -170,7 +159,7 @@ div.page-container > div:last-child { | |||
| 
 | ||||
| header { | ||||
|     display: grid; | ||||
|     grid-template-columns: 66px 1fr; | ||||
|     grid-template-columns: 64px 1fr; | ||||
|     grid-template-rows: 1fr; | ||||
|     grid-column-gap: 15px; | ||||
|     grid-row-gap: 0; | ||||
|  | @ -178,8 +167,6 @@ header { | |||
| } | ||||
| 
 | ||||
| header img { | ||||
|     filter: drop-shadow(2px 2px hsl(0, 0%, 66%)); | ||||
|     margin-right: 10px; | ||||
|     image-rendering: pixelated; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
| Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 4 KiB | 
| Before Width: | Height: | Size: 562 B After Width: | Height: | Size: 735 B | 
| Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.5 KiB | 
| Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/logo-v2.gif
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 746 B | 
							
								
								
									
										
											BIN
										
									
								
								public/images/logo-v2.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 833 B | 
							
								
								
									
										
											BIN
										
									
								
								public/images/pandamonium-legacy/filters.jpg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 38 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/pandamonium-legacy/frontrowseat.jpg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 42 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/pandamonium-legacy/gel-drawer.jpg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 43 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/pandamonium-legacy/lxdesk.jpg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 31 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/pandamonium-legacy/pa_meister.jpg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 28 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/pandamonium-legacy/projectionist.jpg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 25 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/pandamonium-legacy/technician.jpg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 42 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/pandamonium-legacy/three-of-them.jpg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 30 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/pandamonium-legacy/two-of-them.jpg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 35 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/peek.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 12 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/roscoe_tile.jpg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 53 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/images/separator.gif
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 145 B | 
							
								
								
									
										
											BIN
										
									
								
								public/images/wah-paw-v2.gif
									
										
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 746 B | 
|  | @ -16,7 +16,7 @@ | |||
|             <hr> | ||||
|             <ul> | ||||
|             @foreach($sites as $site) | ||||
|                     <li><a href="{{ $site->url }}">{{ $site->name }}</a> - {{ $site->description }}</li> | ||||
|                     <li><a href="{{ $site->url }}"><font color="#000000">{{ $site->name }}</font></a> - {{ $site->description }}</li> | ||||
|             @endforeach | ||||
|             </ul> | ||||
|         </div> | ||||
|  |  | |||
|  | @ -1,10 +1,25 @@ | |||
| @if (isLegacy()) | ||||
|     <table border="0" cellpadding="0" cellspacing="0"><tr> | ||||
|             @if ($artUrl !== null) | ||||
|                 <td><img src="{{ $artUrl }}" alt="Album cover for {{ $track["title"] }} by {{ $track["artist"] }}"></td> | ||||
|             @endif | ||||
|             <td width="10px"> </td> | ||||
|             <td> | ||||
|                 <h2>{{ $track["header"] }}:</h2> | ||||
|                 <a href="{{ $track["url"] }}"><font color="#000000">{{ $track["title"] }}</font></a><br> | ||||
|                 by {{ $track["artist"] }}<br> | ||||
|             </td> | ||||
|         </tr></table> | ||||
|     <br> | ||||
| @else | ||||
| <div class="current-track"> | ||||
|     <div> | ||||
|         <img src="{{ $track["image"] }}" alt="Album cover for {{ $track["title"] }} by {{ $track["artist"] }}"> | ||||
|         <img src="{{ $artUrl }}" alt="Album cover for {{ $track["title"] }} by {{ $track["artist"] }}"> | ||||
|     </div> | ||||
|     <div> | ||||
|         <h2>{{ $track["header"] }}:</h2> | ||||
|         <a href="{{ $track["url"] }}">{{ $track["title"] }}</a><br> | ||||
|         <a href="{{ $track["url"] }}"><font color="#000000">{{ $track["title"] }}</font></a><br> | ||||
|         by {{ $track["artist"] }}<br> | ||||
|     </div> | ||||
| </div> | ||||
| @endif | ||||
|  |  | |||
|  | @ -1,7 +1,12 @@ | |||
| @if (isLegacy()) | ||||
| <table border="1" cellspacing="0" cellpadding="5"> | ||||
|     <font size="+2"><b>Top 10 Tracks (Last 30 days):</b></font> | ||||
| @else | ||||
| <table class="music-top10"> | ||||
|     <caption> | ||||
|         <h2 style="margin-bottom: 5px">Top 10 Tracks (Last 30 days):</h2> | ||||
|     </caption> | ||||
| @endif | ||||
|     <tr> | ||||
|         <th><b>#</b></th>
 | ||||
|         <th><b>Track</b></th> | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <tr> | ||||
|     <td>{{ $count }}</td> | ||||
|     <td><a href="{{ $track["url"] }}">{{ $track["title"] }}</a></td> | ||||
|     <td><a href="{{ $track["url"] }}"><font color="#000000">{{ $track["title"] }}</font></a></td> | ||||
|     <td>{{ $track["artist"] }}</td> | ||||
|     <td>{{ $track["plays"] }}</td> | ||||
| </tr> | ||||
|  |  | |||
							
								
								
									
										102
									
								
								resources/views/components/layout-legacy.blade.php
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,102 @@ | |||
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> | ||||
| <!--suppress ALL --> | ||||
| <html> | ||||
| <head> | ||||
|     <meta charset="utf-8"> | ||||
|     <title>wah! (dot moe) - {{ $title }}</title> | ||||
| </head> | ||||
| 
 | ||||
| <body background="/images/roscoe_tile.jpg" bgcolor="#6595fb" text="#000000" link="#FFFFFF" alink="#999999" vlink="#FFFFFF"> | ||||
| <table bgcolor="#6595fb" width="850px" cellpadding="0" cellspacing="0" border="0"> | ||||
|     <!-- HEADER --> | ||||
|     <tr> | ||||
|         <td> | ||||
|             <table border="0" cellpadding="0" cellspacing="0" class="nopad"> | ||||
|                 <tr> | ||||
|                     <td width="90px"> | ||||
|                         <img src="/images/logo-v2.gif"> | ||||
|                     </td> | ||||
|                     <td valign="middle"><font color="#FFFFFF" face="sans-serif"> | ||||
|                             <font size="+10"><b><i>wah! (dot moe)</i></b></font><br> | ||||
|                             <i>"i mean it looks alright, but then you realise its all tables" ~ <a href="https://nve.wtf/~alice/">alice</a></i> | ||||
|                         </font></td> | ||||
|                 </tr> | ||||
|             </table> | ||||
|         </td> | ||||
|     </tr> | ||||
|     <!-- HEADER END --> | ||||
| 
 | ||||
|     <!-- TOP NAV --> | ||||
|     <tr><td height="5px" bgcolor="#3366FF"><font size="-2"> </font></td></tr> | ||||
|     <tr> | ||||
|         <td> | ||||
|             <table bgcolor="#3366FF" border="0" class="nopad" cellpadding="0" cellspacing="0"> | ||||
|                 <tr> | ||||
|                     <td width="10px" bgcolor="#3366FF"> </td> | ||||
|                     <td bgcolor="#3366FF" width="100%"><font face="sans-serif" color="#FFFFFF"> | ||||
|                             <x-navigation></x-navigation> | ||||
|                         </font></td> | ||||
|                     <td width="5px" bgcolor="#3366FF" > </td> | ||||
|                 </tr> | ||||
|             </table> | ||||
|         </td> | ||||
|     </tr> | ||||
|     <tr><td height="5px" bgcolor="#3366FF"><font size="-2"> </font></td></tr> | ||||
|     <!-- TOP NAV END --> | ||||
| 
 | ||||
|     <!-- CONTENT --> | ||||
|     <tr><td height="5px" bgcolor="#FFFFFF"><font size="-2"> </font></td></tr> | ||||
|     <tr> | ||||
|         <td> | ||||
|             <table bgcolor="#FFFFFF" border="0" class="nopad" cellpadding="0" cellspacing="0"> | ||||
|                 <tr> | ||||
|                     <td width="10px" bgcolor="#FFFFFF"> </td> | ||||
|                     <td bgcolor="#ffffff" width="100%"><font face="sans-serif"> | ||||
|                             {{ $slot }} | ||||
|                         </font></td> | ||||
|                     <td width="5px" bgcolor="#FFFFFF" > </td> | ||||
|                 </tr> | ||||
|             </table> | ||||
|         </td> | ||||
|     </tr> | ||||
|     <tr><td height="5px" bgcolor="#FFFFFF"><font size="-2"> </font></td></tr> | ||||
|     <!-- CONTENT END --> | ||||
| 
 | ||||
|     <!-- BOTTOM NAV --> | ||||
|     <tr><td height="5px" bgcolor="#3366FF"><font size="-2"> </font></td></tr> | ||||
|     <tr> | ||||
|         <td> | ||||
|             <table bgcolor="#3366FF" border="0" class="nopad" cellpadding="0" cellspacing="0"> | ||||
|                 <tr> | ||||
|                     <td width="10px" bgcolor="#3366FF"> </td> | ||||
|                     <td bgcolor="#3366FF" width="100%"><font face="sans-serif" color="#FFFFFF"> | ||||
|                             <x-navigation></x-navigation> | ||||
|                         </font></td> | ||||
|                     <td width="5px" bgcolor="#3366FF" > </td> | ||||
|                 </tr> | ||||
|             </table> | ||||
|         </td> | ||||
|     </tr> | ||||
|     <tr><td height="5px" bgcolor="#3366FF"><font size="-2"> </font></td></tr> | ||||
|     <!-- BOTTOM NAV END --> | ||||
| 
 | ||||
|     <!-- FOOTER --> | ||||
|     <tr><td height="5px"><font size="-2"> </font></td></tr> | ||||
|     <tr> | ||||
|         <td> | ||||
|             <table border="0" class="nopad" cellpadding="0" cellspacing="0"> | ||||
|                 <tr> | ||||
|                     <td width="10px"> </td> | ||||
|                     <td width="100%"><font face="sans-serif" color="#FFFFFF"> | ||||
|                             © RoscoeDaWah 2021-2025 | ||||
|                         </font></td> | ||||
|                     <td width="5px"> </td> | ||||
|                 </tr> | ||||
|             </table> | ||||
|         </td> | ||||
|     </tr> | ||||
|     <tr><td height="5px"><font size="-2"> </font></td></tr> | ||||
|     <!-- FOOTER END --> | ||||
| </table> | ||||
| </body> | ||||
| </html> | ||||
|  | @ -27,7 +27,7 @@ | |||
|         <div id="header"> | ||||
|             <header> | ||||
|                 <div> | ||||
|                     <img src="{{ asset('/images/logo.png') }}" width="65" alt="A pixel art depiction of a paw, in three alternating shades of orange."> | ||||
|                     <img class="logo_paw" src="{{ asset('/images/logo-v2.png') }}" width="65" alt="A pixel art depiction of a paw, in three alternating shades of blue."> | ||||
|                 </div> | ||||
|                 <div> | ||||
|                     <h1>wah!</h1> | ||||
|  | @ -41,6 +41,7 @@ | |||
|         <div id="content"> | ||||
|             <main> | ||||
|                 {{ $slot }} | ||||
|                 <div class="clear"></div> | ||||
|             </main> | ||||
|         </div> | ||||
|         <div> | ||||
|  |  | |||
|  | @ -1,9 +1,12 @@ | |||
| <nav> | ||||
|     <strong>Pages:</strong> | ||||
|     <a href="/">home</a> | | ||||
|     @if(!isLegacy()) | ||||
|     <a href="//wiki.wah.moe">wah-ki</a> | | ||||
|     @endif | ||||
|     <a href="//git.wah.moe">git</a> | | ||||
|     <a href="/pub">files</a> | | ||||
|     <a href="gopher://wah.moe">gopher</a> | | ||||
|     <a href="/bookmarks">bookmarks</a> | | ||||
|     <a href="/guestbook">guestbook</a> | | ||||
|     <a href="/music">music</a> | | ||||
|  |  | |||
|  | @ -1,3 +1,4 @@ | |||
| @if(!isLegacy()) | ||||
| <div class="wah"> | ||||
|     <h3>Random Wah!</h3> | ||||
|     @if ($wah !== "") | ||||
|  | @ -8,3 +9,4 @@ | |||
|         <p>Unable to retrieve image</p> | ||||
|     @endif | ||||
| </div> | ||||
| @endif | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
|             <td> | ||||
|                 <form method="POST" action="/guestbook"> | ||||
|                     @csrf | ||||
|                     <x-honeypot/> | ||||
|                     @if(!isLegacy())<x-honeypot/>@endif | ||||
|                     <table class="form" role="presentation"> | ||||
|                         <tr> | ||||
|                             <td> | ||||
|  | @ -32,7 +32,16 @@ | |||
|                         <tr> | ||||
|                             <td></td> | ||||
|                             <td> | ||||
|                                 @if(isLegacy()) | ||||
|                                 <input type="submit" name="Submit" VALUE="Submit"> | ||||
|                                 @else | ||||
|                                 <button type="submit">Submit</button> | ||||
|                                 @endif | ||||
|                             </td> | ||||
|                         </tr> | ||||
|                         <tr> | ||||
|                             <td></td> | ||||
|                             <td> | ||||
|                             </td> | ||||
|                         </tr> | ||||
|                     </table> | ||||
|  | @ -44,12 +53,52 @@ | |||
|                     <li>You can submit an entry <u>once every hour</u>.</li> | ||||
|                     <li>Your IP address is logged but <u>not</u> publicly displayed.</li> | ||||
|                     <li>Any entries that appear to be spam <u>will</u> be removed.</li> | ||||
|                     @if (isLegacy()) | ||||
|                         <li>This form is broken in super-old browsers.</li> | ||||
|                         <li>Entries submitted on this site are flagged for manual review.</li> | ||||
|                     @endif | ||||
|                 </ul> | ||||
|             </td> | ||||
|         </tr> | ||||
|     </table> | ||||
| 
 | ||||
|     @if (isLegacy()) | ||||
|     <font size="+2"><b>Entries ({{ count($entries) }} total)</b></font> | ||||
|     <table cellspacing="10" cellpadding="0" border="0"> | ||||
|         @foreach ($entries as $entry) | ||||
|             {{-- Skip entries flagged as legacy --}} | ||||
|             @if($entry->legacy_flagged) @php continue @endphp @endif | ||||
|             @php | ||||
|                 $user_agent = $parser->parse($entry->agent); | ||||
|             @endphp | ||||
|         <tr> | ||||
|             <td> | ||||
|                 <table cellspacing="2" cellpadding="5" border="1" width="100%"> | ||||
|                     <tr><td> | ||||
|                             Submitted by <b>{{ $entry->name }}</b> | ||||
|                             on <b>{{ $entry->created_at->format('Y-m-d') }}</b> | ||||
|                             at <b>{{ $entry->created_at->format('h:i:s A (e)') }}</b> | ||||
|                         </td></tr> | ||||
|                     <tr><td>{{ $entry->message }}</td></tr> | ||||
|                     <tr><td> | ||||
|                             @if($entry->agent === "Agent Unavailable") | ||||
|                                 <i>Agent unavailable</i> | ||||
|                             @else | ||||
|                                 @if ($user_agent->ua->toString() == "Other" || $user_agent->os->toString() == "Other") | ||||
|                                     <i>Posted using <b>{{ $entry->agent }}</b></i> | ||||
|                                 @else | ||||
|                                 <i>Posted using <b>{{ $user_agent->ua->toString() }}</b> | ||||
|                                     on <b>{{ $user_agent->os->toString() }}</b></i> | ||||
|                                 @endif | ||||
|                             @endif | ||||
|                         </td></tr> | ||||
|                 </table> | ||||
|             </td> | ||||
|         </tr> | ||||
|         @endforeach | ||||
| 
 | ||||
|     </table> | ||||
|     @else | ||||
|     <hr> | ||||
|     <h2>Entries <small>({{ count($entries) }} total)</small></h2> | ||||
|     @foreach ($entries as $entry) | ||||
|  | @ -66,10 +115,15 @@ | |||
|             @if($entry->agent === "Agent Unavailable") | ||||
|                 <address>Agent unavailable</address> | ||||
|             @else | ||||
|                 <address>Posted using <strong>{{ $user_agent->ua->toString() }}</strong> | ||||
|                     on <strong>{{ $user_agent->os->toString() }}</strong></address> | ||||
|                 @if ($user_agent->ua->toString() == "Other" || $user_agent->os->toString() == "Other") | ||||
|                     <address>Posted using <strong>{{ $entry->agent }}</strong></address> | ||||
|                 @else | ||||
|                     <address>Posted using <strong>{{ $user_agent->ua->toString() }}</strong> | ||||
|                         on <strong>{{ $user_agent->os->toString() }}</strong></address> | ||||
|                 @endif | ||||
|             @endif | ||||
|         </div> | ||||
|         <br> | ||||
|     @endforeach | ||||
|     @endif | ||||
| </x-layout> | ||||
|  |  | |||
|  | @ -5,25 +5,29 @@ | |||
|     <p>Hi! This is my personal homepage on the <strong>W</strong>orld <strong>W</strong>ide | ||||
|         <strong>W</strong>eb. | ||||
|     </p> | ||||
|     <br> | ||||
|     @if(!isLegacy()) | ||||
|         <br> | ||||
|     @endif | ||||
|     <p>Some quick facts about me:</p> | ||||
|     <ul> | ||||
|         <li>{{ $age }} y/o, he/him, British</li> | ||||
|         <li>Theatre Technician and "Web Developer"</li> | ||||
|         <li>Loves ETC desks, prefers Generics to LEDs for some reason</li> | ||||
|         <li>Spends way too much time on his computer</li> | ||||
|         <li>Favorite games: <a href="https://steamcommunity.com/id/RoscoeDaWah/recommended/420530/">OneShot</a>, | ||||
|         <li>Favorite games: <a href="https://steamcommunity.com/id/RoscoeDaWah/recommended/420530/"><font color="#000000">OneShot</font></a>, | ||||
|             Minecraft, Stardew Valley, N++ and Starbound</li> | ||||
|         <li><a href="http://wxqa.com/">CWOP</a> member</li> | ||||
|         <li><a href="http://wxqa.com/"><font color="#000000">CWOP</font></a> member</li> | ||||
|     </ul> | ||||
|     <br> | ||||
|     @if(!isLegacy()) | ||||
|         <br> | ||||
|     @endif | ||||
|     <p>Interests:</p> | ||||
|     <ul> | ||||
|         <li><strong>Tech Theatre</strong> - Lighting, Stage Management, etc.</li> | ||||
|         <li><strong>Programming</strong> - HTML, CSS, JavaScript, C#, Java, PHP, Ruby, Python (<a
 | ||||
|                 href="https://github.com/RoscoeDaWah">GitHub</a>)</li> | ||||
|         <li><strong>Photography</strong> - <a href="https://www.flickr.com/photos/roscoedawah/">Flickr</a></li> | ||||
|         <li><strong>Gaming</strong> - <a href="https://steamcommunity.com/id/RoscoeDaWah/">Steam Profile</a> | ||||
|                 href="https://github.com/RoscoeDaWah"><font color="#000000">GitHub</font></a>)</li> | ||||
|         <li><strong>Photography</strong> - <a href="https://www.flickr.com/photos/roscoedawah/"><font color="#000000">Flickr</font></a></li> | ||||
|         <li><strong>Gaming</strong> - <a href="https://steamcommunity.com/id/RoscoeDaWah/"><font color="#000000">Steam Profile</font></a> | ||||
|         </li> | ||||
|     </ul> | ||||
| </x-layout> | ||||
|  |  | |||
|  | @ -2,7 +2,16 @@ | |||
|     <x-slot:title>Absolute Pandamonium!</x-slot:title> | ||||
|     <x-slot:cardImage>{{ asset('/images/embeds/pandamonium.png') }}</x-slot:cardImage> | ||||
|     <x-slot:cardDescription>Follow the adventures of Rosco, Leko, Viz and AJ!</x-slot:cardDescription> | ||||
|     <div class="rosco-leko-gallery"> | ||||
|     @if (isLegacy()) | ||||
|         <p><i>Click images for full-size version (56k no!)</i></p> | ||||
|         @foreach($images as $image) | ||||
|                 <a href="{{ str_replace('-legacy', '', $image["path"]) }}"><img src="{{ $image["path"] }}" @if(isset($image["description"])) alt="{{ $image["description"] }}" @endif></a> | ||||
|                 @if(isset($image["description"])) | ||||
|                     <p>{{$image["description"]}}</p> | ||||
|                 @endif | ||||
|         @endforeach | ||||
|     @else | ||||
|         <div class="rosco-leko-gallery"> | ||||
|         @foreach($images as $image) | ||||
|             <div> | ||||
|                 <img src="{{ $image["path"] }}" @if(isset($image["description"])) alt="{{ $image["description"] }}" @endif> | ||||
|  | @ -11,5 +20,6 @@ | |||
|                 @endif | ||||
|             </div> | ||||
|         @endforeach | ||||
|     </div> | ||||
|         </div> | ||||
|     @endif | ||||
| </x-layout> | ||||
|  |  | |||
|  | @ -26,3 +26,19 @@ | |||
| Route::post('/guestbook', [GuestbookController::class, 'addEntry']) | ||||
|     ->middleware('validator') | ||||
|     ->middleware('rate_limit'); | ||||
| 
 | ||||
| Route::get('/proxy/wah/{image}', function (string $image) { | ||||
|     $client = new \GuzzleHttp\Client(); | ||||
|     $response = $client->request('GET', 'https://api.tinyfox.dev/hourly/wahs/'.$image); | ||||
| 
 | ||||
|     return response($response->getBody()) | ||||
|         ->header('Content-Type', $response->getHeader('Content-Type')); | ||||
| }); | ||||
| 
 | ||||
| Route::get('/proxy/lastfm/{image}', function (string $image) { | ||||
|     $client = new \GuzzleHttp\Client(); | ||||
|     $response = $client->request('GET', 'https://lastfm.freetls.fastly.net/i/u/174s/'.$image); | ||||
| 
 | ||||
|     return response($response->getBody()) | ||||
|         ->header('Content-Type', $response->getHeader('Content-Type')); | ||||
| }); | ||||
|  |  | |||