1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* Livia |
4
|
|
|
* Copyright 2017-2019 Charlotte Dunois, All Rights Reserved |
5
|
|
|
* |
6
|
|
|
* Website: https://charuru.moe |
7
|
|
|
* License: https://github.com/CharlotteDunois/Livia/blob/master/LICENSE |
8
|
|
|
*/ |
9
|
|
|
|
10
|
|
|
return function ($client) { |
11
|
|
|
return (new class($client) extends \CharlotteDunois\Livia\Commands\Command { |
12
|
|
|
function __construct(\CharlotteDunois\Livia\Client $client) { |
13
|
|
|
parent::__construct($client, array( |
14
|
|
|
'name' => 'help', |
15
|
|
|
'aliases' => array('commands'), |
16
|
|
|
'group' => 'utils', |
17
|
|
|
'description' => 'Displays a list of available commands, or detailed information for a specified command.', |
18
|
|
|
'details' => "The command may be part of a command name or a whole command name.\nIf it isn't specified, all available commands will be listed.", |
19
|
|
|
'examples' => array('help', 'help prefix'), |
20
|
|
|
'guildOnly' => false, |
21
|
|
|
'throttling' => array( |
22
|
|
|
'usages' => 2, |
23
|
|
|
'duration' => 3 |
24
|
|
|
), |
25
|
|
|
'args' => array( |
26
|
|
|
array( |
27
|
|
|
'key' => 'command', |
28
|
|
|
'prompt' => 'Which command would you like to view the help for?', |
29
|
|
|
'type' => 'string', |
30
|
|
|
'default' => '' |
31
|
|
|
) |
32
|
|
|
), |
33
|
|
|
'guarded' => true |
34
|
|
|
)); |
35
|
|
|
} |
36
|
|
|
|
37
|
|
|
function run(\CharlotteDunois\Livia\Commands\Context $context, \ArrayObject $args, bool $fromPattern) { |
38
|
|
|
return $context->direct($this->renderHelpMessage($context, $args), array('split' => true))->then(function ($msg) use ($context) { |
39
|
|
|
if(!($context->message->channel instanceof \CharlotteDunois\Yasmin\Interfaces\DMChannelInterface)) { |
40
|
|
|
return $context->reply('Sent you a DM with information.'); |
41
|
|
|
} |
42
|
|
|
|
43
|
|
|
return $msg; |
44
|
|
|
}, function () use ($context) { |
45
|
|
|
if(!($context->message->channel instanceof \CharlotteDunois\Yasmin\Interfaces\DMChannelInterface)) { |
46
|
|
|
return $context->reply('Unable to send you the help DM. You probably have DMs disabled.'); |
47
|
|
|
} |
48
|
|
|
}); |
49
|
|
|
} |
50
|
|
|
|
51
|
|
|
/** |
52
|
|
|
* @param \CharlotteDunois\Livia\Commands\Context $context |
53
|
|
|
* @param \ArrayObject $args |
54
|
|
|
* @return string |
55
|
|
|
*/ |
56
|
|
|
function renderHelpMessage(\CharlotteDunois\Livia\Commands\Context $context, \ArrayObject $args) { |
57
|
|
|
$groups = $this->client->registry->groups; |
58
|
|
|
$commands = (!empty($args['command']) ? $this->client->registry->findCommands($args['command'], false, $context->message) : $this->client->registry->commands->all()); |
59
|
|
|
|
60
|
|
|
$isDM = ($context->message->channel instanceof \CharlotteDunois\Yasmin\Interfaces\DMChannelInterface); |
61
|
|
|
$showAll = (!empty($args['command']) && \mb_strtolower($args['command']) === 'all'); |
62
|
|
|
|
63
|
|
|
if(!empty($args['command']) && !$showAll) { |
64
|
|
|
$countCommands = \count($commands); |
65
|
|
|
|
66
|
|
|
if($countCommands === 0) { |
67
|
|
|
return 'Unable to identify command. Use '.$this->usage('', ($isDM ? null : $this->client->getGuildPrefix($context->message->guild)), ($isDM ? null : $this->client->user)).' to view the list of all commands.'; |
68
|
|
|
} |
69
|
|
|
|
70
|
|
|
/** @var \CharlotteDunois\Livia\Commands\Command $cmd */ |
71
|
|
|
foreach($commands as $key => $cmd) { |
72
|
|
|
if($cmd->ownerOnly && $cmd->hasPermission($context) !== true) { |
73
|
|
|
unset($commands[$key]); |
74
|
|
|
} |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
$countCommands = \count($commands); |
78
|
|
|
|
79
|
|
|
if($countCommands === 1) { |
80
|
|
|
$command = $commands[0]; |
81
|
|
|
|
82
|
|
|
$help = "__Command **{$command->name}**:__ {$command->description} ".($command->guildOnly ? '(Usable only in servers)' : '').\PHP_EOL.\PHP_EOL. |
83
|
|
|
'**Format:** '.\CharlotteDunois\Livia\Commands\Command::anyUsage($command->name.(!empty($command->format) ? ' '.$command->format : '')).\PHP_EOL; |
84
|
|
|
|
85
|
|
|
if(!empty($command->aliases)) { |
86
|
|
|
$help .= \PHP_EOL.'**Aliases:** '.\implode(', ', $command->aliases); |
87
|
|
|
} |
88
|
|
|
|
89
|
|
|
$help .= \PHP_EOL."**Group:** {$command->group->name} (`{$command->groupID}:{$command->name}`)"; |
90
|
|
|
|
91
|
|
|
if(!empty($command->details)) { |
92
|
|
|
$help .= \PHP_EOL.'**Details:** '.$command->details; |
93
|
|
|
} |
94
|
|
|
|
95
|
|
|
if(!empty($command->examples)) { |
96
|
|
|
$help .= \PHP_EOL.'**Examples:**'.\PHP_EOL.\implode(\PHP_EOL, $command->examples); |
97
|
|
|
} |
98
|
|
|
|
99
|
|
|
return $help; |
100
|
|
|
} elseif($countCommands > 15) { |
101
|
|
|
return 'Multiple commands found. Please be more specific.'; |
102
|
|
|
} elseif($countCommands > 1) { |
103
|
|
|
return \CharlotteDunois\Livia\Utils\DataHelpers::disambiguation($commands, 'commands', 'name'); |
104
|
|
|
} |
105
|
|
|
} else { |
106
|
|
|
$help = 'To run a command in '.($context->message->guild !== null ? $context->message->guild->name : 'any server').', use '. |
107
|
|
|
\CharlotteDunois\Livia\Commands\Command::anyUsage('command', $this->client->getGuildPrefix($context->message->guild), $this->client->user). |
108
|
|
|
'. For example, '. |
109
|
|
|
\CharlotteDunois\Livia\Commands\Command::anyUsage('prefix', $this->client->getGuildPrefix($context->message->guild), $this->client->user).'.'.\PHP_EOL. |
110
|
|
|
'To run a command in this DM, simply use '.\CharlotteDunois\Livia\Commands\Command::anyUsage('command').' with no prefix.'.\PHP_EOL.\PHP_EOL. |
111
|
|
|
'Use '.$this->usage('<command>', null, null).' to view detailed information about a specific command.'.\PHP_EOL. |
112
|
|
|
'Use '.$this->usage('all', null, null).' to view a list of *all* commands, not just available ones.'.\PHP_EOL.\PHP_EOL. |
113
|
|
|
'__**'.($showAll ? 'All commands' : 'Available commands in '.($context->message->guild !== null ? $context->message->guild->name : 'this DM')).'**__'.\PHP_EOL.\PHP_EOL. |
114
|
|
|
\implode(\PHP_EOL.\PHP_EOL, \array_map(function (\CharlotteDunois\Livia\Commands\CommandGroup $group) use ($context, $showAll) { |
115
|
|
|
$cmds = ($showAll ? $group->commands->filter(function (\CharlotteDunois\Livia\Commands\Command $cmd) use ($context) { |
116
|
|
|
return (!$cmd->hidden && (!$cmd->ownerOnly || $this->client->isOwner($context->message->author))); |
117
|
|
|
}) : $group->commands->filter(function (\CharlotteDunois\Livia\Commands\Command $cmd) use ($context) { |
118
|
|
|
return (!$cmd->hidden && $cmd->isUsable($context)); |
119
|
|
|
})); |
120
|
|
|
|
121
|
|
|
return "__{$group->name}__".\PHP_EOL. |
122
|
|
|
\implode(\PHP_EOL, $cmds->sortCustom(function (\CharlotteDunois\Livia\Commands\Command $a, \CharlotteDunois\Livia\Commands\Command $b) { |
123
|
|
|
return $a->name <=> $b->name; |
124
|
|
|
})->map(function (\CharlotteDunois\Livia\Commands\Command $cmd) { |
125
|
|
|
return "**{$cmd->name}:** {$cmd->description}"; |
126
|
|
|
})->all()); |
127
|
|
|
}, ($showAll ? $groups->filter(function (\CharlotteDunois\Livia\Commands\CommandGroup $group) use ($context) { |
128
|
|
|
/** @var \CharlotteDunois\Livia\Commands\Command $cmd */ |
129
|
|
|
foreach($group->commands as $cmd) { |
130
|
|
|
if(!$cmd->hidden && (!$cmd->ownerOnly || $this->client->isOwner($context->message->author))) { |
131
|
|
|
return true; |
132
|
|
|
} |
133
|
|
|
} |
134
|
|
|
|
135
|
|
|
return false; |
136
|
|
|
})->sortCustom(function ($a, $b) { |
137
|
|
|
return $a->name <=> $b->name; |
138
|
|
|
})->all() : $groups->filter(function (\CharlotteDunois\Livia\Commands\CommandGroup $group) use ($context) { |
139
|
|
|
/** @var \CharlotteDunois\Livia\Commands\Command $cmd */ |
140
|
|
|
foreach($group->commands as $cmd) { |
141
|
|
|
if($cmd->isUsable($context)) { |
142
|
|
|
return true; |
143
|
|
|
} |
144
|
|
|
} |
145
|
|
|
|
146
|
|
|
return false; |
147
|
|
|
})->sortCustom(function ($a, $b) { |
148
|
|
|
return $a->name <=> $b->name; |
149
|
|
|
})->all()))); |
150
|
|
|
|
151
|
|
|
return $help; |
152
|
|
|
} |
153
|
|
|
} |
154
|
|
|
}); |
155
|
|
|
}; |
156
|
|
|
|