From 0cbd691cc7a4c6e2ee47920400b31ee08df9cf38 Mon Sep 17 00:00:00 2001 From: Docker VM Date: Sat, 27 Jul 2024 15:40:35 -0400 Subject: [PATCH] WIP --- .editorconfig | 0 .env.example | 0 .gitattributes | 0 .gitignore | 0 README.md | 4 + app/Helpers/TwitchHelper | 32 --- app/Helpers/TwitchHelper.php | 29 +++ .../Auth/AuthenticatedSessionController.php | 0 .../Auth/ConfirmablePasswordController.php | 0 ...mailVerificationNotificationController.php | 0 .../EmailVerificationPromptController.php | 0 .../Auth/NewPasswordController.php | 0 .../Controllers/Auth/PasswordController.php | 0 .../Auth/PasswordResetLinkController.php | 0 .../Auth/RegisteredUserController.php | 0 .../Auth/VerifyEmailController.php | 0 app/Http/Controllers/Controller.php | 0 .../Controllers/GameSessionController.php | 36 +++ app/Http/Controllers/PaletteController.php | 68 ++++++ app/Http/Controllers/ProfileController.php | 0 app/Http/Controllers/TwitchController.php | 78 +++++- app/Http/Requests/Auth/LoginRequest.php | 0 app/Http/Requests/ProfileUpdateRequest.php | 0 app/Models/CommandHistory.php | 15 ++ app/Models/CurrentState.php | 15 ++ app/Models/GameSession.php | 15 ++ app/Models/Palette.php | 18 ++ app/Models/PaletteColor.php | 18 ++ app/Models/SourceImage.php | 13 + app/Models/TwitchUser.php | 13 + app/Models/User.php | 0 app/Providers/AppServiceProvider.php | 0 app/View/Components/AppLayout.php | 0 app/View/Components/GuestLayout.php | 0 bootstrap/app.php | 0 bootstrap/cache/.gitignore | 0 bootstrap/providers.php | 0 composer.json | 0 composer.lock | 0 config/app.php | 0 config/auth.php | 0 config/cache.php | 0 config/database.php | 0 config/filesystems.php | 0 config/logging.php | 0 config/mail.php | 0 config/queue.php | 0 config/services.php | 0 config/session.php | 0 database/.gitignore | 0 database/factories/UserFactory.php | 0 .../0001_01_01_000000_create_users_table.php | 0 .../0001_01_01_000001_create_cache_table.php | 0 .../0001_01_01_000002_create_jobs_table.php | 0 ...07_20_201600_create_twitch_users_table.php | 22 ++ ...7_20_201601_create_game_sessions_table.php | 22 ++ ...7_20_201602_create_current_state_table.php | 35 +++ ...20_201603_create_command_history_table.php | 37 +++ ...7_20_201604_create_source_images_table.php | 24 ++ ...28_add_ended_at_to_game_sessions_table.php | 36 +++ ...024_07_21_033036_create_palettes_table.php | 78 ++++++ database/seeders/DatabaseSeeder.php | 0 package-lock.json | 0 package.json | 0 phpunit.xml | 0 postcss.config.js | 0 public/.htaccess | 0 public/favicon.ico | 0 public/index.php | 0 public/robots.txt | 0 resources/css/app.css | 0 resources/css/grid.css | 35 +++ resources/css/palette-editor.css | 6 + resources/js/app.js | 0 resources/js/bootstrap.js | 0 resources/js/client.js | 19 +- resources/js/grid.js | 93 +++++++ resources/js/palette-editor.js | 195 +++++++++++++++ resources/js/twitch.js | 130 ++++++++++ .../views/auth/confirm-password.blade.php | 0 .../views/auth/forgot-password.blade.php | 0 resources/views/auth/login.blade.php | 0 resources/views/auth/register.blade.php | 0 resources/views/auth/reset-password.blade.php | 0 resources/views/auth/verify-email.blade.php | 0 .../components/application-logo.blade.php | 0 .../components/auth-session-status.blade.php | 0 .../views/components/danger-button.blade.php | 0 .../views/components/dropdown-link.blade.php | 0 resources/views/components/dropdown.blade.php | 0 .../views/components/input-error.blade.php | 0 .../views/components/input-label.blade.php | 0 resources/views/components/modal.blade.php | 0 resources/views/components/nav-link.blade.php | 0 .../views/components/primary-button.blade.php | 0 .../components/responsive-nav-link.blade.php | 0 .../components/secondary-button.blade.php | 0 .../views/components/text-input.blade.php | 0 resources/views/dashboard.blade.php | 56 +---- resources/views/layouts/app.blade.php | 3 +- resources/views/layouts/guest.blade.php | 0 resources/views/layouts/navigation.blade.php | 0 .../views/layouts/palette-layout.blade.php | 28 +++ resources/views/old_dashboard.blade.php | 63 +++++ resources/views/palette-editor.blade.php | 41 ++++ resources/views/profile/edit.blade.php | 0 .../partials/delete-user-form.blade.php | 0 .../partials/update-password-form.blade.php | 0 .../update-profile-information-form.blade.php | 0 resources/views/prototype.blade.php | 98 +------- resources/views/testing.blade.php | 0 resources/views/welcome.blade.php | 227 +++++------------- routes/auth.php | 0 routes/console.php | 0 routes/web.php | 21 +- storage/app/.gitignore | 0 storage/app/public/.gitignore | 0 storage/framework/.gitignore | 0 storage/framework/cache/.gitignore | 0 storage/framework/cache/data/.gitignore | 0 storage/framework/sessions/.gitignore | 0 storage/framework/testing/.gitignore | 0 storage/framework/views/.gitignore | 0 storage/logs/.gitignore | 0 tailwind.config.js | 0 tests/Feature/Auth/AuthenticationTest.php | 0 tests/Feature/Auth/EmailVerificationTest.php | 0 .../Feature/Auth/PasswordConfirmationTest.php | 0 tests/Feature/Auth/PasswordResetTest.php | 0 tests/Feature/Auth/PasswordUpdateTest.php | 0 tests/Feature/Auth/RegistrationTest.php | 0 tests/Feature/ExampleTest.php | 0 tests/Feature/ProfileTest.php | 0 tests/TestCase.php | 0 tests/Unit/ExampleTest.php | 0 vite.config.js | 2 +- 136 files changed, 1267 insertions(+), 358 deletions(-) mode change 100644 => 100755 .editorconfig mode change 100644 => 100755 .env.example mode change 100644 => 100755 .gitattributes mode change 100644 => 100755 .gitignore mode change 100644 => 100755 README.md delete mode 100644 app/Helpers/TwitchHelper create mode 100755 app/Helpers/TwitchHelper.php mode change 100644 => 100755 app/Http/Controllers/Auth/AuthenticatedSessionController.php mode change 100644 => 100755 app/Http/Controllers/Auth/ConfirmablePasswordController.php mode change 100644 => 100755 app/Http/Controllers/Auth/EmailVerificationNotificationController.php mode change 100644 => 100755 app/Http/Controllers/Auth/EmailVerificationPromptController.php mode change 100644 => 100755 app/Http/Controllers/Auth/NewPasswordController.php mode change 100644 => 100755 app/Http/Controllers/Auth/PasswordController.php mode change 100644 => 100755 app/Http/Controllers/Auth/PasswordResetLinkController.php mode change 100644 => 100755 app/Http/Controllers/Auth/RegisteredUserController.php mode change 100644 => 100755 app/Http/Controllers/Auth/VerifyEmailController.php mode change 100644 => 100755 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/GameSessionController.php create mode 100644 app/Http/Controllers/PaletteController.php mode change 100644 => 100755 app/Http/Controllers/ProfileController.php mode change 100644 => 100755 app/Http/Controllers/TwitchController.php mode change 100644 => 100755 app/Http/Requests/Auth/LoginRequest.php mode change 100644 => 100755 app/Http/Requests/ProfileUpdateRequest.php create mode 100755 app/Models/CommandHistory.php create mode 100755 app/Models/CurrentState.php create mode 100755 app/Models/GameSession.php create mode 100644 app/Models/Palette.php create mode 100644 app/Models/PaletteColor.php create mode 100755 app/Models/SourceImage.php create mode 100755 app/Models/TwitchUser.php mode change 100644 => 100755 app/Models/User.php mode change 100644 => 100755 app/Providers/AppServiceProvider.php mode change 100644 => 100755 app/View/Components/AppLayout.php mode change 100644 => 100755 app/View/Components/GuestLayout.php mode change 100644 => 100755 bootstrap/app.php mode change 100644 => 100755 bootstrap/cache/.gitignore mode change 100644 => 100755 bootstrap/providers.php mode change 100644 => 100755 composer.json mode change 100644 => 100755 composer.lock mode change 100644 => 100755 config/app.php mode change 100644 => 100755 config/auth.php mode change 100644 => 100755 config/cache.php mode change 100644 => 100755 config/database.php mode change 100644 => 100755 config/filesystems.php mode change 100644 => 100755 config/logging.php mode change 100644 => 100755 config/mail.php mode change 100644 => 100755 config/queue.php mode change 100644 => 100755 config/services.php mode change 100644 => 100755 config/session.php mode change 100644 => 100755 database/.gitignore mode change 100644 => 100755 database/factories/UserFactory.php mode change 100644 => 100755 database/migrations/0001_01_01_000000_create_users_table.php mode change 100644 => 100755 database/migrations/0001_01_01_000001_create_cache_table.php mode change 100644 => 100755 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100755 database/migrations/2024_07_20_201600_create_twitch_users_table.php create mode 100755 database/migrations/2024_07_20_201601_create_game_sessions_table.php create mode 100755 database/migrations/2024_07_20_201602_create_current_state_table.php create mode 100755 database/migrations/2024_07_20_201603_create_command_history_table.php create mode 100755 database/migrations/2024_07_20_201604_create_source_images_table.php create mode 100644 database/migrations/2024_07_20_214228_add_ended_at_to_game_sessions_table.php create mode 100644 database/migrations/2024_07_21_033036_create_palettes_table.php mode change 100644 => 100755 database/seeders/DatabaseSeeder.php mode change 100644 => 100755 package-lock.json mode change 100644 => 100755 package.json mode change 100644 => 100755 phpunit.xml mode change 100644 => 100755 postcss.config.js mode change 100644 => 100755 public/.htaccess mode change 100644 => 100755 public/favicon.ico mode change 100644 => 100755 public/index.php mode change 100644 => 100755 public/robots.txt mode change 100644 => 100755 resources/css/app.css create mode 100755 resources/css/grid.css create mode 100644 resources/css/palette-editor.css mode change 100644 => 100755 resources/js/app.js mode change 100644 => 100755 resources/js/bootstrap.js create mode 100755 resources/js/grid.js create mode 100644 resources/js/palette-editor.js create mode 100644 resources/js/twitch.js mode change 100644 => 100755 resources/views/auth/confirm-password.blade.php mode change 100644 => 100755 resources/views/auth/forgot-password.blade.php mode change 100644 => 100755 resources/views/auth/login.blade.php mode change 100644 => 100755 resources/views/auth/register.blade.php mode change 100644 => 100755 resources/views/auth/reset-password.blade.php mode change 100644 => 100755 resources/views/auth/verify-email.blade.php mode change 100644 => 100755 resources/views/components/application-logo.blade.php mode change 100644 => 100755 resources/views/components/auth-session-status.blade.php mode change 100644 => 100755 resources/views/components/danger-button.blade.php mode change 100644 => 100755 resources/views/components/dropdown-link.blade.php mode change 100644 => 100755 resources/views/components/dropdown.blade.php mode change 100644 => 100755 resources/views/components/input-error.blade.php mode change 100644 => 100755 resources/views/components/input-label.blade.php mode change 100644 => 100755 resources/views/components/modal.blade.php mode change 100644 => 100755 resources/views/components/nav-link.blade.php mode change 100644 => 100755 resources/views/components/primary-button.blade.php mode change 100644 => 100755 resources/views/components/responsive-nav-link.blade.php mode change 100644 => 100755 resources/views/components/secondary-button.blade.php mode change 100644 => 100755 resources/views/components/text-input.blade.php mode change 100644 => 100755 resources/views/dashboard.blade.php mode change 100644 => 100755 resources/views/layouts/app.blade.php mode change 100644 => 100755 resources/views/layouts/guest.blade.php mode change 100644 => 100755 resources/views/layouts/navigation.blade.php create mode 100644 resources/views/layouts/palette-layout.blade.php create mode 100755 resources/views/old_dashboard.blade.php create mode 100644 resources/views/palette-editor.blade.php mode change 100644 => 100755 resources/views/profile/edit.blade.php mode change 100644 => 100755 resources/views/profile/partials/delete-user-form.blade.php mode change 100644 => 100755 resources/views/profile/partials/update-password-form.blade.php mode change 100644 => 100755 resources/views/profile/partials/update-profile-information-form.blade.php mode change 100644 => 100755 resources/views/testing.blade.php mode change 100644 => 100755 resources/views/welcome.blade.php mode change 100644 => 100755 routes/auth.php mode change 100644 => 100755 routes/console.php mode change 100644 => 100755 routes/web.php mode change 100644 => 100755 storage/app/.gitignore mode change 100644 => 100755 storage/app/public/.gitignore mode change 100644 => 100755 storage/framework/.gitignore mode change 100644 => 100755 storage/framework/cache/.gitignore mode change 100644 => 100755 storage/framework/cache/data/.gitignore mode change 100644 => 100755 storage/framework/sessions/.gitignore mode change 100644 => 100755 storage/framework/testing/.gitignore mode change 100644 => 100755 storage/framework/views/.gitignore mode change 100644 => 100755 storage/logs/.gitignore mode change 100644 => 100755 tailwind.config.js mode change 100644 => 100755 tests/Feature/Auth/AuthenticationTest.php mode change 100644 => 100755 tests/Feature/Auth/EmailVerificationTest.php mode change 100644 => 100755 tests/Feature/Auth/PasswordConfirmationTest.php mode change 100644 => 100755 tests/Feature/Auth/PasswordResetTest.php mode change 100644 => 100755 tests/Feature/Auth/PasswordUpdateTest.php mode change 100644 => 100755 tests/Feature/Auth/RegistrationTest.php mode change 100644 => 100755 tests/Feature/ExampleTest.php mode change 100644 => 100755 tests/Feature/ProfileTest.php mode change 100644 => 100755 tests/TestCase.php mode change 100644 => 100755 tests/Unit/ExampleTest.php mode change 100644 => 100755 vite.config.js diff --git a/.editorconfig b/.editorconfig old mode 100644 new mode 100755 diff --git a/.env.example b/.env.example old mode 100644 new mode 100755 diff --git a/.gitattributes b/.gitattributes old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 08542eb..3de40c8 --- a/README.md +++ b/README.md @@ -119,3 +119,7 @@ ## Contributing ## License This project is licensed under the [MIT License](LICENSE). + +## TODO +Explain setting up oauth +https://twitchapps.com/tmi/ \ No newline at end of file diff --git a/app/Helpers/TwitchHelper b/app/Helpers/TwitchHelper deleted file mode 100644 index b179a12..0000000 --- a/app/Helpers/TwitchHelper +++ /dev/null @@ -1,32 +0,0 @@ - 'place', - 'x' => $matches[1], - 'y' => $matches[2], - 'color' => $matches[3] - ]; - } - - if (preg_match($shortCommandPattern, $message, $matches)) { - return [ - 'command' => 'place', - 'x' => $matches[1], - 'y' => $matches[2], - 'color' => $matches[3] - ]; - } - - return null; - } -} diff --git a/app/Helpers/TwitchHelper.php b/app/Helpers/TwitchHelper.php new file mode 100755 index 0000000..3b4ba30 --- /dev/null +++ b/app/Helpers/TwitchHelper.php @@ -0,0 +1,29 @@ + $message]); + + // Match commands like !place A 1 red, !p A 1 red, !paint A 1 red + $commandPattern = '/^(?:!place|!p|!paint)\s([A-P])\s(\d{1,2})\s(\w+)$/i'; + + if (preg_match($commandPattern, $message, $matches)) { + Log::debug('TwitchHelper::parseMessage - Command matched', ['matches' => $matches]); + return [ + 'command' => 'place', + 'x' => $matches[1], + 'y' => $matches[2], + 'color' => $matches[3] + ]; + } + + Log::debug('TwitchHelper::parseMessage - No match found'); + return null; + } +} diff --git a/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/app/Http/Controllers/Auth/AuthenticatedSessionController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Auth/ConfirmablePasswordController.php b/app/Http/Controllers/Auth/ConfirmablePasswordController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Auth/EmailVerificationPromptController.php b/app/Http/Controllers/Auth/EmailVerificationPromptController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Auth/NewPasswordController.php b/app/Http/Controllers/Auth/NewPasswordController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Auth/PasswordResetLinkController.php b/app/Http/Controllers/Auth/PasswordResetLinkController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/GameSessionController.php b/app/Http/Controllers/GameSessionController.php new file mode 100644 index 0000000..535a3c2 --- /dev/null +++ b/app/Http/Controllers/GameSessionController.php @@ -0,0 +1,36 @@ +input('session_name'); + $session = GameSession::create(['session_name' => $sessionName]); + + return response()->json($session); + } + + public function end(Request $request) + { + $sessionId = $request->input('session_id'); + $session = GameSession::find($sessionId); + + if ($session) { + $session->update(['ended_at' => now()]); + return response()->json($session); + } + + return response()->json(['error' => 'Session not found'], 404); + } + + public function current() + { + $session = GameSession::whereNull('ended_at')->latest()->first(); + return response()->json($session); + } +} diff --git a/app/Http/Controllers/PaletteController.php b/app/Http/Controllers/PaletteController.php new file mode 100644 index 0000000..2a023e2 --- /dev/null +++ b/app/Http/Controllers/PaletteController.php @@ -0,0 +1,68 @@ +validate([ + 'name' => 'required|unique:palettes,name', + ]); + + $palette = Palette::create(['name' => $request->name]); + return response()->json($palette); + } + + public function addColor(Request $request, Palette $palette) + { + $request->validate([ + 'name' => 'required|regex:/^[a-z-]+$/', + 'hex_value' => 'required|regex:/^#[a-fA-F0-9]{6}$/' + ]); + + $color = PaletteColor::create([ + 'palette_id' => $palette->id, + 'name' => $request->name, + 'hex_value' => $request->hex_value + ]); + + return response()->json($color); + } + + public function updateColor(Request $request, Palette $palette, PaletteColor $color) + { + $request->validate([ + 'name' => 'required|regex:/^[a-z-]+$/', + 'hex_value' => 'required|regex:/^#[a-fA-F0-9]{6}$/' + ]); + + $color->update([ + 'name' => $request->name, + 'hex_value' => $request->hex_value + ]); + + return response()->json($color); + } + + public function deleteColor(Palette $palette, PaletteColor $color) + { + $color->delete(); + return response()->json(['message' => 'Color deleted']); + } + + public function getColors(Palette $palette) + { + return response()->json($palette->colors); + } +} diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/TwitchController.php b/app/Http/Controllers/TwitchController.php old mode 100644 new mode 100755 index 650096b..d0cbc60 --- a/app/Http/Controllers/TwitchController.php +++ b/app/Http/Controllers/TwitchController.php @@ -4,23 +4,97 @@ use Illuminate\Http\Request; use App\Helpers\TwitchHelper; +use App\Models\TwitchUser; +use App\Models\CommandHistory; +use App\Models\CurrentState; +use App\Models\GameSession; +use Illuminate\Support\Facades\Log; class TwitchController extends Controller { public function parseChatMessage(Request $request) { + Log::info("Entered parseChatMessage"); $message = $request->input('message'); + $username = $request->input('username'); + $gameSession = $this->getCurrentGameSession(); - if (!$message) { - return response()->json(['error' => 'No message provided'], 400); + Log::debug('TwitchController::parseChatMessage', [ + 'message' => $message, + 'username' => $username, + 'gameSessionId' => $gameSession->id + ]); + + if (!$message || !$username || !$gameSession) { + Log::debug('TwitchController::parseChatMessage - Missing input or invalid game session', [ + 'message' => $message, + 'username' => $username, + 'gameSession' => $gameSession + ]); + return response()->json(['error' => 'No message, username, or valid game session provided'], 400); } + $user = TwitchUser::firstOrCreate(['twitch_username' => $username]); + $parsedCommand = TwitchHelper::parseMessage($message); + Log::debug('TwitchController::parseChatMessage - Parsed Command', ['parsedCommand' => $parsedCommand]); if ($parsedCommand) { + CommandHistory::create([ + 'user_id' => $user->id, + 'command' => $parsedCommand['command'], + 'x' => $parsedCommand['x'] ?? null, + 'y' => $parsedCommand['y'] ?? null, + 'color' => $parsedCommand['color'] ?? null, + 'game_session_id' => $gameSession->id, + ]); + + switch ($parsedCommand['command']) { + case 'place': + $this->handlePlaceCommand($parsedCommand, $user->id); + break; + // Add cases for other commands like 'row', 'column', 'fill' + } + return response()->json($parsedCommand); } + Log::debug('TwitchController::parseChatMessage - Invalid command', ['message' => $message]); return response()->json(['error' => 'Invalid command'], 400); } + + private function handlePlaceCommand($parsedCommand, $userId) + { + Log::debug('TwitchController::handlePlaceCommand', ['command' => $parsedCommand]); + + $x = $parsedCommand['x']; + $y = $parsedCommand['y']; + $color = $parsedCommand['color']; + + $currentState = CurrentState::where('x', $x)->where('y', $y)->first(); + Log::debug('TwitchController::handlePlaceCommand - Retrieved Current State', ['currentState' => $currentState]); + + if ($currentState) { + $currentState->update(['color' => $color, 'updated_by' => $userId]); + } else { + CurrentState::create(['x' => $x, 'y' => $y, 'color' => $color, 'updated_by' => $userId]); + } + } + + private function getCurrentGameSession() + { + $gameSession = GameSession::whereNull('ended_at')->latest()->first(); + + if (!$gameSession) { + $gameSession = GameSession::create(['session_name' => 'Session ' . now()]); + } + + return $gameSession; + } + + public function getCurrentState() + { + $currentState = CurrentState::all(); + return response()->json($currentState); + } } diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php old mode 100644 new mode 100755 diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php old mode 100644 new mode 100755 diff --git a/app/Models/CommandHistory.php b/app/Models/CommandHistory.php new file mode 100755 index 0000000..f8eeb58 --- /dev/null +++ b/app/Models/CommandHistory.php @@ -0,0 +1,15 @@ +hasMany(PaletteColor::class); + } +} diff --git a/app/Models/PaletteColor.php b/app/Models/PaletteColor.php new file mode 100644 index 0000000..893da95 --- /dev/null +++ b/app/Models/PaletteColor.php @@ -0,0 +1,18 @@ +belongsTo(Palette::class); + } +} diff --git a/app/Models/SourceImage.php b/app/Models/SourceImage.php new file mode 100755 index 0000000..27e23fd --- /dev/null +++ b/app/Models/SourceImage.php @@ -0,0 +1,13 @@ +id(); + $table->string('twitch_username')->unique(); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('twitch_users'); + } +} diff --git a/database/migrations/2024_07_20_201601_create_game_sessions_table.php b/database/migrations/2024_07_20_201601_create_game_sessions_table.php new file mode 100755 index 0000000..3956163 --- /dev/null +++ b/database/migrations/2024_07_20_201601_create_game_sessions_table.php @@ -0,0 +1,22 @@ +id(); + $table->string('session_name'); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('game_sessions'); + } +} diff --git a/database/migrations/2024_07_20_201602_create_current_state_table.php b/database/migrations/2024_07_20_201602_create_current_state_table.php new file mode 100755 index 0000000..60b438c --- /dev/null +++ b/database/migrations/2024_07_20_201602_create_current_state_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('x'); + $table->string('y'); + $table->string('color'); + $table->foreignId('updated_by')->constrained('twitch_users')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('current_state'); + } +} diff --git a/database/migrations/2024_07_20_201603_create_command_history_table.php b/database/migrations/2024_07_20_201603_create_command_history_table.php new file mode 100755 index 0000000..2bd5db7 --- /dev/null +++ b/database/migrations/2024_07_20_201603_create_command_history_table.php @@ -0,0 +1,37 @@ +id(); + $table->foreignId('user_id')->constrained('twitch_users')->onDelete('cascade'); + $table->string('command'); + $table->string('x')->nullable(); + $table->string('y')->nullable(); + $table->string('color')->nullable(); + $table->foreignId('game_session_id')->constrained('game_sessions')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('command_history'); + } +} diff --git a/database/migrations/2024_07_20_201604_create_source_images_table.php b/database/migrations/2024_07_20_201604_create_source_images_table.php new file mode 100755 index 0000000..ac562e3 --- /dev/null +++ b/database/migrations/2024_07_20_201604_create_source_images_table.php @@ -0,0 +1,24 @@ +id(); + $table->string('name'); + $table->json('pixel_state'); + $table->json('palette'); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('source_images'); + } +} diff --git a/database/migrations/2024_07_20_214228_add_ended_at_to_game_sessions_table.php b/database/migrations/2024_07_20_214228_add_ended_at_to_game_sessions_table.php new file mode 100644 index 0000000..9ebb6ef --- /dev/null +++ b/database/migrations/2024_07_20_214228_add_ended_at_to_game_sessions_table.php @@ -0,0 +1,36 @@ +timestamp('ended_at')->nullable(); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('game_sessions', function (Blueprint $table) { + if (Schema::hasColumn('game_sessions', 'ended_at')) { + $table->dropColumn('ended_at'); + } + }); + } +} diff --git a/database/migrations/2024_07_21_033036_create_palettes_table.php b/database/migrations/2024_07_21_033036_create_palettes_table.php new file mode 100644 index 0000000..93cf4c8 --- /dev/null +++ b/database/migrations/2024_07_21_033036_create_palettes_table.php @@ -0,0 +1,78 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + + Schema::create('palette_colors', function (Blueprint $table) { + $table->id(); + $table->foreignId('palette_id')->constrained()->onDelete('cascade'); + $table->string('name'); + $table->string('hex_value'); + $table->timestamps(); + }); + + // Insert default palette + DB::table('palettes')->insert([ + 'name' => 'default-colors', + 'created_at' => now(), + 'updated_at' => now(), + ]); + + $defaultColors = [ + ["white", "#FFFFFF"], + ["light-gray", "#E4E4E4"], + ["medium-gray", "#888888"], + ["dark-gray", "#222222"], + ["pink", "#FFA7D1"], + ["red", "#E50000"], + ["orange", "#E59500"], + ["brown", "#A06A42"], + ["yellow", "#E5D900"], + ["light-green", "#94E044"], + ["green", "#02BE01"], + ["cyan", "#00D3DD"], + ["blue", "#0083C7"], + ["dark-blue", "#0000EA"], + ["purple", "#CF6EE4"], + ["dark-purple", "#820080"], + ["black", "#000000"] + ]; + + foreach ($defaultColors as $color) { + DB::table('palette_colors')->insert([ + 'palette_id' => 1, + 'name' => $color[0], + 'hex_value' => $color[1], + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('palette_colors'); + Schema::dropIfExists('palettes'); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php old mode 100644 new mode 100755 diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 diff --git a/package.json b/package.json old mode 100644 new mode 100755 diff --git a/phpunit.xml b/phpunit.xml old mode 100644 new mode 100755 diff --git a/postcss.config.js b/postcss.config.js old mode 100644 new mode 100755 diff --git a/public/.htaccess b/public/.htaccess old mode 100644 new mode 100755 diff --git a/public/favicon.ico b/public/favicon.ico old mode 100644 new mode 100755 diff --git a/public/index.php b/public/index.php old mode 100644 new mode 100755 diff --git a/public/robots.txt b/public/robots.txt old mode 100644 new mode 100755 diff --git a/resources/css/app.css b/resources/css/app.css old mode 100644 new mode 100755 diff --git a/resources/css/grid.css b/resources/css/grid.css new file mode 100755 index 0000000..ea4983b --- /dev/null +++ b/resources/css/grid.css @@ -0,0 +1,35 @@ +body { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; + font-family: Arial, sans-serif; +} + +:root { + --grid-size: 16; /* Adjust this value for grid size (e.g., 3 for 3x3) */ +} + +.grid-container { + height: 100vh; + width: 100vh; /* Keep the grid square */ + max-width: 100vh; + display: grid; + grid-template-columns: repeat(calc(var(--grid-size) + 2), 1fr); + grid-template-rows: repeat(calc(var(--grid-size) + 2), 1fr); +} + +.label { + display: flex; + justify-content: center; + align-items: center; + background-color: #f5f5f5; + border: 1px solid #ddd; + font-size: calc(0.5vw + 0.5vh); /* Adjust font size for better visibility */ +} + +.cell { + background-color: #fff; + border: 1px solid #ddd; +} diff --git a/resources/css/palette-editor.css b/resources/css/palette-editor.css new file mode 100644 index 0000000..e4a8042 --- /dev/null +++ b/resources/css/palette-editor.css @@ -0,0 +1,6 @@ +.color-picker { + border: 1px solid black; + border-radius: 4px; + width: 100%; + height: 36px; +} diff --git a/resources/js/app.js b/resources/js/app.js old mode 100644 new mode 100755 diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js old mode 100644 new mode 100755 diff --git a/resources/js/client.js b/resources/js/client.js index 5745275..88c12a3 100644 --- a/resources/js/client.js +++ b/resources/js/client.js @@ -30,34 +30,26 @@ ws.onmessage = (event) => { if (parsedMessage && parsedMessage.command === 'PRIVMSG') { const chatMessage = parsedMessage.params.slice(1).join(' ').trim(); const username = parsedMessage.tags['display-name'] || parsedMessage.prefix.split('!')[0]; + const gameSessionId = 1; // Replace with logic to get the current game session ID + console.log('Chat Message:', chatMessage); console.log('Username:', username); window.dispatchEvent(new CustomEvent('chat-message', { detail: { user: username, message: chatMessage } })); - // Process !place command fetch('/twitch/parse', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') }, - body: JSON.stringify({ message: chatMessage }) + body: JSON.stringify({ message: chatMessage, username: username, game_session_id: gameSessionId }) }) .then(response => response.json()) .then(data => { if (data && data.command === 'place') { - console.log('Parsed Command:', data); - // Call the existing API with parsed coordinates and color - // Example API call: /api/place/{x}/{y}/{color} - fetch(`/api/place/${data.x}/${data.y}/${data.color}`, { method: 'POST' }) - .then(response => response.json()) - .then(result => { - console.log('API Result:', result); - }) - .catch(error => { - console.error('API Error:', error); - }); + console.log('Parsed Place Command:', data); + colorCell(`${data.x}${data.y}`, data.color); } }) .catch(error => { @@ -66,6 +58,7 @@ ws.onmessage = (event) => { } }; + ws.onerror = (error) => { console.error('WebSocket Error:', error); }; diff --git a/resources/js/grid.js b/resources/js/grid.js new file mode 100755 index 0000000..2958ba3 --- /dev/null +++ b/resources/js/grid.js @@ -0,0 +1,93 @@ +function colorCell(cellName, colorName) { + console.log(`colorCell called with: ${cellName}, ${colorName}`); + + // Map of valid named colors to their hex values + const validColors = { + "white": "#FFFFFF", + "lightGray": "#E4E4E4", + "mediumGray": "#888888", + "darkGray": "#222222", + "pink": "#FFA7D1", + "red": "#E50000", + "orange": "#E59500", + "brown": "#A06A42", + "yellow": "#E5D900", + "lightGreen": "#94E044", + "green": "#02BE01", + "cyan": "#00D3DD", + "blue": "#0083C7", + "darkBlue": "#0000EA", + "purple": "#CF6EE4", + "darkPurple": "#820080", + "black": "#000000" + }; + + // Check if the provided color name is valid + if (!validColors[colorName]) { + console.warn(`Invalid color name: ${colorName}. Please use a valid named color.`); + return; + } + + // Find the cell using its class name + const cell = document.querySelector(`.cell.${cellName}`); + + // If the cell exists, change its background color to the corresponding hex value + if (cell) { + cell.style.backgroundColor = validColors[colorName]; + } else { + console.warn(`Cell ${cellName} not found.`); + } +} + +// Attach colorCell function to the window object to make it globally accessible +window.colorCell = colorCell; + +document.addEventListener('DOMContentLoaded', function() { + const gridSize = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--grid-size').trim()); + const grid = document.querySelector('.grid-container'); + + function getLabel(index) { + let label = ''; + while (index >= 0) { + label = String.fromCharCode((index % 26) + 65) + label; + index = Math.floor(index / 26) - 1; + } + return label; + } + + // Create top labels + grid.innerHTML += '
'; // Empty top-left corner + for (let i = 0; i < gridSize; i++) { + grid.innerHTML += `
${getLabel(i)}
`; + } + grid.innerHTML += '
'; // Empty top-right corner + + // Create rows with side labels and cells + for (let i = 1; i <= gridSize; i++) { + grid.innerHTML += `
${i}
`; + for (let j = 0; j < gridSize; j++) { + let cellName = `${getLabel(j)}${i}`; // This will generate names like A1, A2, B1, etc. + grid.innerHTML += `
`; + } + grid.innerHTML += `
${i}
`; + } + + // Create bottom labels + grid.innerHTML += '
'; // Empty bottom-left corner + for (let i = 0; i < gridSize; i++) { + grid.innerHTML += `
${getLabel(i)}
`; + } + grid.innerHTML += '
'; // Empty bottom-right corner + + // Fetch and apply the current state + fetch('/api/current-state') + .then(response => response.json()) + .then(data => { + data.forEach(pixel => { + colorCell(`${pixel.x}${pixel.y}`, pixel.color); + }); + }) + .catch(error => { + console.error('Error fetching current state:', error); + }); +}); diff --git a/resources/js/palette-editor.js b/resources/js/palette-editor.js new file mode 100644 index 0000000..43b4cb2 --- /dev/null +++ b/resources/js/palette-editor.js @@ -0,0 +1,195 @@ +document.addEventListener('DOMContentLoaded', function() { + const paletteSelector = document.getElementById('palette-selector'); + const newPaletteButton = document.getElementById('new-palette'); + const newPaletteForm = document.getElementById('new-palette-form'); + const createPaletteForm = document.getElementById('create-palette-form'); + const addColorForm = document.getElementById('add-color-form'); + const createColorForm = document.getElementById('create-color-form'); + const paletteColorsDiv = document.getElementById('palette-colors'); + const colorEditorsDiv = document.getElementById('color-editors'); + const addColorButton = document.getElementById('add-color'); + const savePaletteButton = document.getElementById('save-palette'); + + newPaletteButton.addEventListener('click', function() { + newPaletteForm.style.display = 'block'; + }); + + createPaletteForm.addEventListener('submit', function(event) { + event.preventDefault(); + const formData = new FormData(createPaletteForm); + fetch('/palette-editor', { + method: 'POST', + body: formData + }) + .then(response => response.json()) + .then(data => { + alert('Palette created: ' + data.name); + paletteSelector.innerHTML += ``; + newPaletteForm.style.display = 'none'; + createPaletteForm.reset(); + }) + .catch(error => { + console.error('Error:', error); + }); + }); + + paletteSelector.addEventListener('change', function() { + const paletteId = paletteSelector.value; + if (paletteId) { + loadPaletteColors(paletteId); + } else { + paletteColorsDiv.innerHTML = ''; + addColorForm.style.display = 'none'; + colorEditorsDiv.innerHTML = ''; + } + }); + + addColorButton.addEventListener('click', function() { + addColorEditor(); + }); + + savePaletteButton.addEventListener('click', function() { + const paletteId = createColorForm.getAttribute('data-palette-id'); + const colorEditors = document.querySelectorAll('.color-editor'); + colorEditors.forEach(editor => { + const colorId = editor.getAttribute('data-color-id'); + const colorName = editor.querySelector('.color-name').value; + const colorHex = editor.querySelector('.color-hex-input').value; + if (colorId) { + // Update existing color + fetch(`/palette-editor/${paletteId}/colors/${colorId}`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') + }, + body: JSON.stringify({ name: colorName, hex_value: colorHex }) + }) + .then(response => response.json()) + .then(data => { + alert('Color updated: ' + data.name); + }) + .catch(error => { + console.error('Error:', error); + }); + } else { + // Add new color + fetch(`/palette-editor/${paletteId}/colors`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') + }, + body: JSON.stringify({ name: colorName, hex_value: colorHex }) + }) + .then(response => response.json()) + .then(data => { + alert('Color added: ' + data.name); + editor.setAttribute('data-color-id', data.id); + }) + .catch(error => { + console.error('Error:', error); + }); + } + }); + }); + + function loadPaletteColors(paletteId) { + fetch(`/palette-editor/${paletteId}/colors`) + .then(response => response.json()) + .then(data => { + paletteColorsDiv.innerHTML = '

Colors in Palette

'; + colorEditorsDiv.innerHTML = ''; + data.forEach(color => { + addColorEditor(color.id, color.name, color.hex_value); + }); + addColorForm.style.display = 'block'; + createColorForm.setAttribute('data-palette-id', paletteId); + }) + .catch(error => { + console.error('Error:', error); + }); + } + + function addColorEditor(colorId = '', colorName = '', colorHex = '#ffffff') { + const editor = document.createElement('div'); + editor.className = 'color-editor col-md-2 mb-3'; + editor.setAttribute('data-color-id', colorId); + editor.innerHTML = ` +
+
+ + +
+
+ +
+ +
+
+ +
+
+ `; + colorEditorsDiv.appendChild(editor); + + const deleteButton = editor.querySelector('.delete-color'); + deleteButton.addEventListener('click', function() { + if (colorId) { + const paletteId = createColorForm.getAttribute('data-palette-id'); + fetch(`/palette-editor/${paletteId}/colors/${colorId}`, { + method: 'DELETE', + headers: { + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') + } + }) + .then(response => response.json()) + .then(data => { + alert('Color deleted: ' + data.message); + colorEditorsDiv.removeChild(editor); + }) + .catch(error => { + console.error('Error:', error); + }); + } else { + colorEditorsDiv.removeChild(editor); + } + }); + + const pickr = Pickr.create({ + el: editor.querySelector('.color-picker'), + theme: 'classic', // or 'monolith', or 'nano' + default: colorHex, + components: { + preview: true, + opacity: false, + hue: true, + + interaction: { + hex: true, + input: true, + clear: true, + save: true + } + } + }); + + pickr.on('save', (color, instance) => { + editor.querySelector('.color-hex-input').value = color.toHEXA().toString(); + pickr.hide(); + }); + + pickr.on('clear', instance => { + editor.querySelector('.color-hex-input').value = ''; + }); + } + + // Load default colors on page load + window.onload = function() { + const defaultPaletteOption = Array.from(paletteSelector.options).find(option => option.text === 'default-colors'); + if (defaultPaletteOption) { + defaultPaletteOption.selected = true; + loadPaletteColors(defaultPaletteOption.value); + } + }; +}); diff --git a/resources/js/twitch.js b/resources/js/twitch.js new file mode 100644 index 0000000..7bb08dc --- /dev/null +++ b/resources/js/twitch.js @@ -0,0 +1,130 @@ +let ws; + +function connectWebSocket() { + console.log("Attempting to connect to Twitch chat with websocket..."); + ws = new WebSocket('wss://irc-ws.chat.twitch.tv:443'); + + ws.onopen = () => { + console.log('Connected to Twitch chat'); + + const oauthToken = import.meta.env.VITE_TWITCH_BOT_OAUTH_TOKEN; + const username = import.meta.env.VITE_TWITCH_BOT_USERNAME; + const channel = import.meta.env.VITE_TWITCH_CHANNEL; + + console.log('OAuth Token:', oauthToken ? 'Loaded' : 'Missing'); + console.log('Username:', username ? username : 'Missing'); + console.log('Channel:', channel ? channel : 'Missing'); + + if (!oauthToken || !username || !channel) { + console.error('Missing required environment variables'); + return; + } + + ws.send(`PASS ${oauthToken}`); + ws.send(`NICK ${username}`); + ws.send(`JOIN #${channel}`); + }; + + ws.onmessage = (event) => { + console.log('Received:', event.data); + + const parsedMessage = parseTwitchMessage(event.data); + console.log('Parsed Message:', parsedMessage); + + if (parsedMessage.command === '376') { + console.log('End of MOTD received. Ready to process messages.'); + return; + } + + if (parsedMessage && parsedMessage.command === 'JOIN') { + console.log(`Joined channel: ${parsedMessage.params[0]}`); + } + + if (parsedMessage && parsedMessage.command === 'PRIVMSG') { + const chatMessage = parsedMessage.params.slice(1).join(' ').trim(); + const username = parsedMessage.prefix.split('!')[0]; + console.log('Chat Message:', chatMessage); + console.log('Username:', username); + + const commandPattern = /^(?:!place|!p|!paint)\s+([A-P])\s*(\d{1,2})\s+(\w+)$/i; + const commandMatch = chatMessage.match(commandPattern); + console.log('Command Match:', commandMatch); + if (commandMatch) { + const [, x, y, color] = commandMatch; + console.log(`Parsed Command: !place ${x}${y} ${color}`); + sendPlaceCommand(chatMessage, username, x, y, color); + } else { + console.log('No matching command found in the message.'); + } + } else { + console.log('Message is not a PRIVMSG.'); + } + }; + + ws.onerror = (error) => { + console.error('WebSocket Error:', error); + }; + + ws.onclose = () => { + console.log('WebSocket connection closed'); + console.log('WebSocket attempting to reconnect'); + setTimeout(connectWebSocket, 5000); // Reconnect after 5 seconds + }; +} + +function parseTwitchMessage(message) { + console.log('Raw Message:', message); + + const prefixEnd = message.indexOf(' '); + const prefix = message.substring(1, prefixEnd); + + const commandEnd = message.indexOf(' ', prefixEnd + 1); + const command = message.substring(prefixEnd + 1, commandEnd); + + const params = message.substring(commandEnd + 1).split(' :'); + const tagsStart = message.indexOf('@'); + const tags = {}; + + if (tagsStart !== -1) { + const tagsEnd = message.indexOf(' ', tagsStart + 1); + const tagsRaw = message.substring(tagsStart + 1, tagsEnd); + tagsRaw.split(';').forEach(tag => { + const [key, value] = tag.split('='); + tags[key] = value; + }); + } + + console.log('Parsed Tags:', tags); + console.log('Parsed Command:', command); + console.log('Parsed Params:', params); + + return { prefix, command, params, tags }; +} + +function sendPlaceCommand(chatMessage, username, x, y, color) { + console.log(`Sending command to server: !place ${x}${y} ${color}`); + fetch('/twitch/parse', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') + }, + body: JSON.stringify({ message: chatMessage, username: username, game_session_id: 1 }) // Adjust game_session_id as needed + }) + .then(response => response.json()) + .then(data => { + console.log('Server Response:', data); + if (data && data.command === 'place') { + console.log('Parsed Place Command from server:', data); + colorCell(`${data.x}${data.y}`, data.color); + } else { + console.error('Invalid command in server response.'); + } + }) + .catch(error => { + console.error('Parsing Error:', error); + }); +} + +// Connect to the WebSocket when the script loads +connectWebSocket(); diff --git a/resources/views/auth/confirm-password.blade.php b/resources/views/auth/confirm-password.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/auth/forgot-password.blade.php b/resources/views/auth/forgot-password.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/auth/reset-password.blade.php b/resources/views/auth/reset-password.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/auth/verify-email.blade.php b/resources/views/auth/verify-email.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/application-logo.blade.php b/resources/views/components/application-logo.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/auth-session-status.blade.php b/resources/views/components/auth-session-status.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/danger-button.blade.php b/resources/views/components/danger-button.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/dropdown-link.blade.php b/resources/views/components/dropdown-link.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/dropdown.blade.php b/resources/views/components/dropdown.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/input-error.blade.php b/resources/views/components/input-error.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/input-label.blade.php b/resources/views/components/input-label.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/modal.blade.php b/resources/views/components/modal.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/nav-link.blade.php b/resources/views/components/nav-link.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/primary-button.blade.php b/resources/views/components/primary-button.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/responsive-nav-link.blade.php b/resources/views/components/responsive-nav-link.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/secondary-button.blade.php b/resources/views/components/secondary-button.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/components/text-input.blade.php b/resources/views/components/text-input.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php old mode 100644 new mode 100755 index 2a10b97..f474b4e --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,43 +1,13 @@ - - -

- {{ __('Dashboard') }} -

-
- -
-
-
-
-
-
-
-
-
-
-
-
- - + + + + + + Dynamic Grid + @vite(['resources/css/grid.css', 'resources/js/grid.js', 'resources/js/twitch.js']) + + + +
+ + diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php old mode 100644 new mode 100755 index 0086a4d..f0dc6bd --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -12,11 +12,10 @@ - @vite(['resources/css/app.css', 'resources/js/app.js', 'resources/js/client.js' ]) + @vite(['resources/css/app.css', 'resources/js/app.js', 'resources/js/twitch.js' ])
- @include('layouts.navigation') @isset($header) diff --git a/resources/views/layouts/guest.blade.php b/resources/views/layouts/guest.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/layouts/palette-layout.blade.php b/resources/views/layouts/palette-layout.blade.php new file mode 100644 index 0000000..f288cc5 --- /dev/null +++ b/resources/views/layouts/palette-layout.blade.php @@ -0,0 +1,28 @@ + + + + + + @yield('title', 'Palette Editor') + + + + + + + @vite(['resources/css/app.css', 'resources/css/palette-editor.css', 'resources/js/palette-editor.js']) + + +
+ @yield('content') +
+ + + + + + + + + + diff --git a/resources/views/old_dashboard.blade.php b/resources/views/old_dashboard.blade.php new file mode 100755 index 0000000..14453c8 --- /dev/null +++ b/resources/views/old_dashboard.blade.php @@ -0,0 +1,63 @@ + + +

+ {{ __('Dashboard') }} +

+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ + diff --git a/resources/views/palette-editor.blade.php b/resources/views/palette-editor.blade.php new file mode 100644 index 0000000..666eda1 --- /dev/null +++ b/resources/views/palette-editor.blade.php @@ -0,0 +1,41 @@ +@extends('layouts.palette-layout') + +@section('title', 'Palette Editor') + +@section('content') +
+

Palette Editor

+
+ + +
+ +
+
+ + + + + + +@endsection diff --git a/resources/views/profile/edit.blade.php b/resources/views/profile/edit.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/profile/partials/delete-user-form.blade.php b/resources/views/profile/partials/delete-user-form.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/profile/partials/update-password-form.blade.php b/resources/views/profile/partials/update-password-form.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/profile/partials/update-profile-information-form.blade.php b/resources/views/profile/partials/update-profile-information-form.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/prototype.blade.php b/resources/views/prototype.blade.php index 5ed721d..7928645 100755 --- a/resources/views/prototype.blade.php +++ b/resources/views/prototype.blade.php @@ -4,103 +4,9 @@ Dynamic Grid - + @vite(['resources/css/grid.css', 'resources/js/grid.js']) -
- - +
diff --git a/resources/views/testing.blade.php b/resources/views/testing.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php old mode 100644 new mode 100755 index a9898e3..14453c8 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -1,172 +1,63 @@ - - - - - + + +

+ {{ __('Dashboard') }} +

+
- Laravel - - - - - - - - - -
- -
-
-
-
- -
- @if (Route::has('login')) - - @endif -
- -
- -
- -
- Laravel v{{ Illuminate\Foundation\Application::VERSION }} (PHP v{{ PHP_VERSION }}) -
+
+
+
+
+
+
+
+ +
- - +
+ + + diff --git a/routes/auth.php b/routes/auth.php old mode 100644 new mode 100755 diff --git a/routes/console.php b/routes/console.php old mode 100644 new mode 100755 diff --git a/routes/web.php b/routes/web.php old mode 100644 new mode 100755 index 4006031..59df380 --- a/routes/web.php +++ b/routes/web.php @@ -3,9 +3,28 @@ use App\Http\Controllers\ProfileController; use Illuminate\Support\Facades\Route; use App\Http\Controllers\TwitchController; +use App\Http\Controllers\GameSessionController; +use App\Http\Controllers\PaletteController; + +Route::get('/palette-editor', [PaletteController::class, 'index']); +Route::post('/palette-editor', [PaletteController::class, 'store']); +Route::post('/palette-editor/{palette}/colors', [PaletteController::class, 'addColor']); +Route::put('/palette-editor/{palette}/colors/{color}', [PaletteController::class, 'updateColor']); +Route::delete('/palette-editor/{palette}/colors/{color}', [PaletteController::class, 'deleteColor']); +Route::get('/palette-editor/{palette}/colors', [PaletteController::class, 'getColors']); + + Route::post('/twitch/parse', [TwitchController::class, 'parseChatMessage']); +Route::post('/game-session/start', [GameSessionController::class, 'start']); +Route::post('/game-session/end', [GameSessionController::class, 'end']); +Route::get('/game-session/current', [GameSessionController::class, 'current']); + +Route::get('/api/current-state', [TwitchController::class, 'getCurrentState']); + + + Route::get('/', function () { return view('welcome'); }); @@ -16,7 +35,7 @@ Route::get('/dashboard', function () { return view('dashboard'); -})->middleware(['auth', 'verified'])->name('dashboard'); +}); Route::get('/testing', function () { return view('testing'); diff --git a/storage/app/.gitignore b/storage/app/.gitignore old mode 100644 new mode 100755 diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore old mode 100644 new mode 100755 diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore old mode 100644 new mode 100755 diff --git a/tailwind.config.js b/tailwind.config.js old mode 100644 new mode 100755 diff --git a/tests/Feature/Auth/AuthenticationTest.php b/tests/Feature/Auth/AuthenticationTest.php old mode 100644 new mode 100755 diff --git a/tests/Feature/Auth/EmailVerificationTest.php b/tests/Feature/Auth/EmailVerificationTest.php old mode 100644 new mode 100755 diff --git a/tests/Feature/Auth/PasswordConfirmationTest.php b/tests/Feature/Auth/PasswordConfirmationTest.php old mode 100644 new mode 100755 diff --git a/tests/Feature/Auth/PasswordResetTest.php b/tests/Feature/Auth/PasswordResetTest.php old mode 100644 new mode 100755 diff --git a/tests/Feature/Auth/PasswordUpdateTest.php b/tests/Feature/Auth/PasswordUpdateTest.php old mode 100644 new mode 100755 diff --git a/tests/Feature/Auth/RegistrationTest.php b/tests/Feature/Auth/RegistrationTest.php old mode 100644 new mode 100755 diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php old mode 100644 new mode 100755 diff --git a/tests/Feature/ProfileTest.php b/tests/Feature/ProfileTest.php old mode 100644 new mode 100755 diff --git a/tests/TestCase.php b/tests/TestCase.php old mode 100644 new mode 100755 diff --git a/tests/Unit/ExampleTest.php b/tests/Unit/ExampleTest.php old mode 100644 new mode 100755 diff --git a/vite.config.js b/vite.config.js old mode 100644 new mode 100755 index dea2f36..2e3ba96 --- a/vite.config.js +++ b/vite.config.js @@ -7,7 +7,7 @@ export default defineConfig(({ mode }) => { return { plugins: [ laravel({ - input: ['resources/css/app.css', 'resources/js/app.js', 'resources/js/client.js'], + input: ['resources/css/app.css', 'resources/js/app.js', 'resources/css/grid.css', 'resources/js/grid.js', 'resources/js/twitch.js', 'resources/js/palette-editor.js', 'resources/css/palette-editor.css'], refresh: true, }), ],