]> git.localhorst.tv Git - alttp.git/commitdiff
(nonfunctional) discord guild event and user subscriptions master
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 3 Jul 2025 14:52:24 +0000 (16:52 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 3 Jul 2025 14:52:24 +0000 (16:52 +0200)
app/Console/Commands/DiscordEpisodeSubscriptionsCommand.php [new file with mode: 0644]
app/DiscordBotCommands/PresenceCommand.php
app/Models/DiscordGuild.php
app/Models/DiscordGuildEventSubscription.php [new file with mode: 0644]
app/Models/DiscordGuildUserSubscription.php [new file with mode: 0644]
database/migrations/2025_07_03_143216_create_discord_guild_event_subscriptions_table.php [new file with mode: 0644]
database/migrations/2025_07_03_143226_create_discord_guild_user_subscriptions_table.php [new file with mode: 0644]

diff --git a/app/Console/Commands/DiscordEpisodeSubscriptionsCommand.php b/app/Console/Commands/DiscordEpisodeSubscriptionsCommand.php
new file mode 100644 (file)
index 0000000..727f77f
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Models\DiscordGuild;
+use App\Models\Episode;
+use Illuminate\Console\Command;
+
+class DiscordEpisodeSubscriptionsCommand extends Command
+{
+       /**
+        * The name and signature of the console command.
+        *
+        * @var string
+        */
+       protected $signature = 'discord:episode-subscriptions';
+
+       /**
+        * The console command description.
+        *
+        * @var string
+        */
+       protected $description = 'Update episode subscriptions and create or update guild events accordingly';
+
+       /**
+        * Execute the console command.
+        *
+        * @return int
+        */
+       public function handle() {
+               $guilds = DiscordGuild::all();
+               foreach ($guilds as $guild) {
+                       try {
+                               $this->handleGuild($guild);
+                       } catch (\Exception $e) {
+                               $this->error('error handling guild '.$guild->name.': '.$e->getMessage());
+                       }
+               }
+               return 0;
+       }
+
+       private function handleGuild(DiscordGuild $guild) {
+               $from = now()->sub(1, 'hour');
+               $eventIDs = $guild->event_subscriptions->pluck('event_id')->toArray();
+               $userIDs = $guild->user_subscriptions->pluck('user_id')->toArray();
+               if (empty($eventIDs) && empty($userIDs)) return;
+
+               $query = Episode::with(['channels', 'event', 'players'])
+                       ->where('episodes.start', '>', $from)
+                       ->orderBy('episodes.start', 'ASC')
+                       ->limit(20);
+               $query->where(function ($subquery) use ($eventIDs, $userIDs) {
+                       if (!empty($eventIDs)) {
+                               $subquery->whereIn('episodes.event_id', $eventIDs);
+                       }
+                       if (!empty($userIDs)) {
+                               $subquery->orWhereHas('players', function ($builder) use ($userIDs) {
+                                       $builder->whereIn('episode_players.user_id', $userIDs);
+                               });
+                       }
+               });
+               $episodes = $query->get();
+               foreach ($episodes as $episode) {
+                       $this->handleEpisode($episode);
+               }
+       }
+
+       private function handleEpisode(Episode $episode) {
+               $this->line($episode->start.' '.$episode->event->title.' ' .$episode->title);
+               foreach ($episode->players as $player) {
+                       $this->line(' - '.$player->name_override);
+               }
+       }
+
+}
index c466b1c07d08cf5eb00a92195a55febd64b03b5e..47c15a59adccdc4b46b0334c98046470f77af401 100644 (file)
@@ -30,7 +30,7 @@ class PresenceCommand extends BaseCommand {
                                }
                        }
                        if ($this->hasParameter('idle')) {
-                               $idle = $this->parameters['idle'];
+                               $idle = $this->getParameter('idle');
                        }
                        if ($this->hasParameter('status')) {
                                $status = $this->getParameter('status');
index db0825aa7c3b38007218c0359b59c538420c233e..37e711bd3f757f14771bf605a5e8612b3182edcb 100644 (file)
@@ -52,10 +52,18 @@ class DiscordGuild extends Model
                return $this->hasMany(DiscordChannel::class)->orderBy('position');
        }
 
+       public function event_subscriptions() {
+               return $this->hasMany(DiscordGuildEventSubscription::class);
+       }
+
        public function roles() {
                return $this->hasMany(DiscordRole::class)->orderBy('position');
        }
 
+       public function user_subscriptions() {
+               return $this->hasMany(DiscordGuildUserSubscription::class);
+       }
+
        protected $fillable = [
                'guild_id',
        ];
diff --git a/app/Models/DiscordGuildEventSubscription.php b/app/Models/DiscordGuildEventSubscription.php
new file mode 100644 (file)
index 0000000..11a5da9
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class DiscordGuildEventSubscription extends Model {
+}
diff --git a/app/Models/DiscordGuildUserSubscription.php b/app/Models/DiscordGuildUserSubscription.php
new file mode 100644 (file)
index 0000000..d1a3e6a
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class DiscordGuildUserSubscription extends Model {
+}
diff --git a/database/migrations/2025_07_03_143216_create_discord_guild_event_subscriptions_table.php b/database/migrations/2025_07_03_143216_create_discord_guild_event_subscriptions_table.php
new file mode 100644 (file)
index 0000000..970347f
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('discord_guild_event_subscriptions', function (Blueprint $table) {
+            $table->id();
+                       $table->foreignId('discord_guild_id')->constrained();
+                       $table->foreignId('event_id')->constrained();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('discord_guild_event_subscriptions');
+    }
+};
diff --git a/database/migrations/2025_07_03_143226_create_discord_guild_user_subscriptions_table.php b/database/migrations/2025_07_03_143226_create_discord_guild_user_subscriptions_table.php
new file mode 100644 (file)
index 0000000..ceae338
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('discord_guild_user_subscriptions', function (Blueprint $table) {
+            $table->id();
+                       $table->foreignId('discord_guild_id')->constrained();
+                       $table->foreignId('user_id')->constrained();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('discord_guild_user_subscriptions');
+    }
+};