3 namespace App\Console\Commands;
5 use App\DiscordAppCommands\AosrPresetCommand;
6 use App\Models\DiscordBotCommand as CommandModel;
7 use App\Models\DiscordChannel;
8 use App\Models\DiscordGuild;
9 use App\Models\DiscordRole;
11 use Discord\Parts\Channel\Channel;
12 use Discord\Parts\Channel\Message;
13 use Discord\Parts\Guild\Guild;
14 use Discord\Parts\Guild\Role;
15 use Discord\Parts\User\Activity;
16 use Discord\WebSockets\Event;
17 use Illuminate\Console\Command;
18 use Monolog\Handler\StreamHandler;
20 use React\EventLoop\Loop;
22 class DiscordBotCommand extends Command
25 * The name and signature of the console command.
29 protected $signature = 'discord:bot';
32 * The console command description.
36 protected $description = 'Runs the discord bot';
39 * Execute the console command.
43 public function handle()
45 $logger = new Logger('DiscordBot');
46 $logger->pushHandler(new StreamHandler('php://stdout', Logger::INFO));
47 $discord = new Discord([
49 'token' => config('discord.token'),
51 $discord->on('ready', function (Discord $discord) {
52 $activity = new Activity($discord);
53 $activity->type = Activity::TYPE_LISTENING;
54 $activity->name = 'HolySmoke';
55 $activity->url = 'https://alttp.localhorst.tv/';
56 $discord->updatePresence($activity);
58 $discord->getLoop()->addPeriodicTimer(1, function () use ($discord) {
59 $command = CommandModel::where('status', '=', 'pending')->oldest()->first();
62 $command->execute($discord);
63 } catch (\Exception $e) {
68 if (config('discord.enable_commands')) {
69 AosrPresetCommand::listen($discord);
71 if (config('discord.create_commands')) {
72 AosrPresetCommand::create($discord);
75 $discord->on(Event::GUILD_CREATE, function (Guild $guild, Discord $discord) {
77 DiscordGuild::onUpstreamCreate($guild);
78 } catch (\Exception $e) {
79 $this->error('guild create: '.$e->getMessage());
82 $discord->on(Event::GUILD_UPDATE, function (Guild $guild, Discord $discord, ?Guild $old) {
84 DiscordGuild::onUpstreamUpdate($guild);
85 } catch (\Exception $e) {
86 $this->error('guild update: '.$e->getMessage());
89 $discord->on(Event::CHANNEL_CREATE, function (Channel $channel, Discord $discord) {
91 DiscordChannel::onUpstreamCreate($channel);
92 } catch (\Exception $e) {
93 $this->error('channel create: '.$e->getMessage());
96 $discord->on(Event::CHANNEL_UPDATE, function (Channel $channel, Discord $discord, ?Channel $old) {
98 DiscordChannel::onUpstreamUpdate($channel);
99 } catch (\Exception $e) {
100 $this->error('channel update: '.$e->getMessage());
103 $discord->on(Event::CHANNEL_DELETE, function ($channel, Discord $discord) {
105 DiscordChannel::onUpstreamDelete($channel);
106 } catch (\Exception $e) {
107 $this->error('channel delete: '.$e->getMessage());
110 $discord->on(Event::GUILD_ROLE_CREATE, function (Role $role, Discord $discord) {
112 DiscordRole::onUpstreamCreate($role);
113 } catch (\Exception $e) {
114 $this->error('guild role create: '.$e->getMessage());
117 $discord->on(Event::GUILD_ROLE_UPDATE, function (Role $role, Discord $discord, ?Role $old) {
119 DiscordRole::onUpstreamUpdate($role);
120 } catch (\Exception $e) {
121 $this->error('guild role update: '.$e->getMessage());
124 $discord->on(Event::GUILD_ROLE_DELETE, function ($role, Discord $discord) {
126 DiscordRole::onUpstreamDelete($role);
127 } catch (\Exception $e) {
128 $this->error('guild role delete: '.$e->getMessage());
131 $discord->getLoop()->addSignal(SIGINT, function() use ($discord) {