]> git.localhorst.tv Git - alttp.git/blob - app/Console/Commands/DiscordBotCommand.php
sync discord roles
[alttp.git] / app / Console / Commands / DiscordBotCommand.php
1 <?php
2
3 namespace App\Console\Commands;
4
5 use App\Models\DiscordGuild;
6 use App\Models\DiscordRole;
7 use Discord\Discord;
8 use Discord\Parts\Channel\Message;
9 use Discord\Parts\Guild\Guild;
10 use Discord\Parts\Guild\Role;
11 use Discord\WebSockets\Event;
12 use Illuminate\Console\Command;
13 use Monolog\Handler\StreamHandler;
14 use Monolog\Logger;
15 use React\EventLoop\Loop;
16
17 class DiscordBotCommand extends Command
18 {
19         /**
20          * The name and signature of the console command.
21          *
22          * @var string
23          */
24         protected $signature = 'discord:bot';
25
26         /**
27          * The console command description.
28          *
29          * @var string
30          */
31         protected $description = 'Runs the discord bot';
32
33         /**
34          * Execute the console command.
35          *
36          * @return int
37          */
38         public function handle()
39         {
40                 $logger = new Logger('DiscordBot');
41                 $logger->pushHandler(new StreamHandler('php://stdout', Logger::INFO));
42                 $discord = new Discord([
43                         'logger' => $logger,
44                         'token' => config('discord.token'),
45                 ]);
46                 $discord->on(Event::GUILD_CREATE, function (Guild $guild, Discord $discord) {
47                         try {
48                                 DiscordGuild::onUpstreamCreate($guild);
49                         } catch (\Exception $e) {
50                                 $this->error('guild create: '.$e->getMessage());
51                         }
52                 });
53                 $discord->on(Event::GUILD_UPDATE, function (Guild $guild, Discord $discord, ?Guild $old) {
54                         try {
55                                 DiscordGuild::onUpstreamUpdate($guild);
56                         } catch (\Exception $e) {
57                                 $this->error('guild update: '.$e->getMessage());
58                         }
59                 });
60                 $discord->on(Event::GUILD_ROLE_CREATE, function (Role $role, Discord $discord) {
61                         try {
62                                 DiscordRole::onUpstreamCreate($role);
63                         } catch (\Exception $e) {
64                                 $this->error('guild role create: '.$e->getMessage());
65                         }
66                 });
67                 $discord->on(Event::GUILD_ROLE_UPDATE, function (Role $role, Discord $discordi, ?Role $old) {
68                         try {
69                                 DiscordRole::onUpstreamUpdate($role);
70                         } catch (\Exception $e) {
71                                 $this->error('guild role update: '.$e->getMessage());
72                         }
73                 });
74                 $discord->on(Event::GUILD_ROLE_DELETE, function ($role, Discord $discord) {
75                         try {
76                                 DiscordRole::onUpstreamDelete($role);
77                         } catch (\Exception $e) {
78                                 $this->error('guild role delete: '.$e->getMessage());
79                         }
80                 });
81                 $discord->on('ready', function (Discord $discord) {
82                         $discord->on(Event::MESSAGE_CREATE, function (Message $message, Discord $discord) {
83                                 if (!empty($message->guild_id)) return;
84                                 if (!empty($message->webhook_id)) return;
85                                 if (!empty($message->application_id)) return;
86                                 if (is_null($message->author)) return;
87                                 if ($message->author->bot) return;
88                                 $discord->getLoop()->addTimer(0.6, function() use ($message) {
89                                         $message->react('😄');
90                                 });
91                                 if (!is_null($message->channel)) {
92                                         $discord->getLoop()->addTimer(2.0, function() use ($message) {
93                                                 $message->channel->sendMessage('bugger off');
94                                         });
95                                 } else {
96                                         $message->delayedReply('bugger off', 2000);
97                                 }
98                         });
99                 });
100                 $discord->getLoop()->addSignal(SIGINT, function() use ($discord) {
101                         $discord->close();
102                 });
103                 $discord->run();
104                 return 0;
105         }
106 }