+<?php
+
+namespace App\Models;
+
+use Discord\Discord;
+use Discord\Parts\User\Activity;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class DiscordBotCommand extends Model
+{
+ use HasFactory;
+
+ public function execute(Discord $discord) {
+ $this->status = 'executing';
+ $this->executed_at = now();
+ $this->save();
+
+ try {
+ switch ($this->command) {
+ case 'presence':
+ $this->executePresence($discord);
+ break;
+ default:
+ throw new Exception('unrecognized command');
+ }
+ $this->status = 'done';
+ $this->save();
+ } catch (\Exception $e) {
+ $this->status = 'exception';
+ $this->result = [
+ 'type' => get_class($e),
+ 'message' => $e->getMessage(),
+ ];
+ $this->save();
+ }
+ }
+
+ protected function executePresence(Discord $discord) {
+ $activity = null;
+ $idle = false;
+ $status = 'online';
+ $afk = false;
+ if (isset($this->parameters['activity'])) {
+ $activity = new Activity($discord);
+ $activity->type = $this->parameters['activity'];
+ if (isset($this->parameters['name'])) {
+ $activity->name = $this->parameters['name'];
+ }
+ if (isset($this->parameters['url'])) {
+ $activity->url = $this->parameters['url'];
+ }
+ }
+ if (isset($this->parameters['idle'])) {
+ $idle = $this->parameters['idle'];
+ }
+ if (isset($this->parameters['status'])) {
+ $status = $this->parameters['status'];
+ }
+ if (isset($this->parameters['afk'])) {
+ $afk = $this->parameters['afk'];
+ }
+ $discord->updatePresence($activity, $idle, $status, $afk);
+ }
+
+ protected $casts = [
+ 'parameters' => 'array',
+ 'result' => 'array',
+ 'executed_at' => 'datetime',
+ ];
+
+}