]> git.localhorst.tv Git - alttp.git/blob - app/Models/DiscordBotCommand.php
ca8a0308ce0d96d37cd3d902b827cef327bb0925
[alttp.git] / app / Models / DiscordBotCommand.php
1 <?php
2
3 namespace App\Models;
4
5 use App\DiscordBotCommands\BaseCommand;
6 use Discord\Discord;
7 use Discord\Parts\Channel\Channel;
8 use Discord\Parts\Guild\Guild;
9 use Illuminate\Database\Eloquent\Factories\HasFactory;
10 use Illuminate\Database\Eloquent\Model;
11
12 class DiscordBotCommand extends Model
13 {
14         use HasFactory;
15
16         public static function queueResult(Result $result) {
17                 $cmd = new DiscordBotCommand();
18                 $cmd->tournament_id = $result->round->tournament_id;
19                 $cmd->command = 'result';
20                 $cmd->parameters = [
21                         'round' => $result->round_id,
22                         'user' => $result->user_id,
23                 ];
24                 $cmd->status = 'pending';
25                 $cmd->save();
26         }
27
28         public function tournament() {
29                 return $this->belongsTo(Tournament::class);
30         }
31
32         public function user() {
33                 return $this->belongsTo(User::class);
34         }
35
36         public function execute(Discord $discord) {
37                 $this->setExecuting();
38
39                 try {
40                         BaseCommand::resolve($discord, $this)
41                                 ->execute()
42                                 ->otherwise(function (\Throwable $e) {
43                                         $this->setException($e);
44                                 })
45                                 ->done(function($v = null) {
46                                         $this->setDone();
47                                 });
48                 } catch (\Exception $e) {
49                         $this->setException($e);
50                 }
51         }
52
53
54         private function setDone() {
55                 $this->status = 'done';
56                 $this->save();
57         }
58
59         private function setExecuting() {
60                 $this->status = 'executing';
61                 $this->executed_at = now();
62                 $this->save();
63         }
64
65         private function setException(\Throwable $e) {
66                 $this->status = 'exception';
67                 $this->result = [
68                         'type' => get_class($e),
69                         'file' => $e->getFile(),
70                         'line' => $e->getLine(),
71                         'message' => $e->getMessage(),
72                 ];
73                 $this->save();
74         }
75
76
77         protected $casts = [
78                 'parameters' => 'array',
79                 'result' => 'array',
80                 'executed_at' => 'datetime',
81         ];
82
83 }