Updated JavaDocs

This commit is contained in:
Aikar
2018-01-05 20:50:58 -05:00
parent bfc8534176
commit 607374bdfb
10 changed files with 616 additions and 498 deletions
@@ -107,7 +107,7 @@
<li class="blockList">
<hr>
<br>
<pre>public class <a href="../../../src-html/co/aikar/commands/BukkitCommandContexts.html#line.47">BukkitCommandContexts</a>
<pre>public class <a href="../../../src-html/co/aikar/commands/BukkitCommandContexts.html#line.49">BukkitCommandContexts</a>
extends co.aikar.commands.CommandContexts&lt;<a href="../../../co/aikar/commands/BukkitCommandExecutionContext.html" title="class in co.aikar.commands">BukkitCommandExecutionContext</a>&gt;</pre>
</li>
</ul>
@@ -187,7 +187,7 @@ extends co.aikar.commands.CommandContexts&lt;<a href="../../../co/aikar/commands
<ul class="blockListLast">
<li class="blockList">
<h4>BukkitCommandContexts</h4>
<pre>public&nbsp;<a href="../../../src-html/co/aikar/commands/BukkitCommandContexts.html#line.49">BukkitCommandContexts</a>(<a href="../../../co/aikar/commands/BukkitCommandManager.html" title="class in co.aikar.commands">BukkitCommandManager</a>&nbsp;manager)</pre>
<pre>public&nbsp;<a href="../../../src-html/co/aikar/commands/BukkitCommandContexts.html#line.51">BukkitCommandContexts</a>(<a href="../../../co/aikar/commands/BukkitCommandManager.html" title="class in co.aikar.commands">BukkitCommandManager</a>&nbsp;manager)</pre>
</li>
</ul>
</li>
@@ -159,15 +159,18 @@ implements co.aikar.locales.MessageKeyProvider</pre>
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MinecraftMessageKeys.html#NO_PLAYER_FOUND">NO_PLAYER_FOUND</a></span></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MinecraftMessageKeys.html#NO_PLAYER_FOUND_OFFLINE">NO_PLAYER_FOUND_OFFLINE</a></span></code>&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MinecraftMessageKeys.html#NO_PLAYER_FOUND_SERVER">NO_PLAYER_FOUND_SERVER</a></span></code>&nbsp;</td>
</tr>
<tr class="altColor">
<tr class="rowColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MinecraftMessageKeys.html#PLAYER_IS_VANISHED_CONFIRM">PLAYER_IS_VANISHED_CONFIRM</a></span></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MinecraftMessageKeys.html#USERNAME_TOO_SHORT">USERNAME_TOO_SHORT</a></span></code>&nbsp;</td>
</tr>
<tr class="altColor">
<tr class="rowColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MinecraftMessageKeys.html#YOU_MUST_BE_HOLDING_ITEM">YOU_MUST_BE_HOLDING_ITEM</a></span></code>&nbsp;</td>
</tr>
</table>
@@ -294,13 +297,22 @@ the order they are declared.</div>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.36">NO_PLAYER_FOUND_SERVER</a></pre>
</li>
</ul>
<a name="NO_PLAYER_FOUND_OFFLINE">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>NO_PLAYER_FOUND_OFFLINE</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.37">NO_PLAYER_FOUND_OFFLINE</a></pre>
</li>
</ul>
<a name="NO_PLAYER_FOUND">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>NO_PLAYER_FOUND</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.37">NO_PLAYER_FOUND</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.38">NO_PLAYER_FOUND</a></pre>
</li>
</ul>
<a name="LOCATION_PLEASE_SPECIFY_WORLD">
@@ -309,7 +321,7 @@ the order they are declared.</div>
<ul class="blockList">
<li class="blockList">
<h4>LOCATION_PLEASE_SPECIFY_WORLD</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.38">LOCATION_PLEASE_SPECIFY_WORLD</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.39">LOCATION_PLEASE_SPECIFY_WORLD</a></pre>
</li>
</ul>
<a name="LOCATION_PLEASE_SPECIFY_XYZ">
@@ -318,7 +330,7 @@ the order they are declared.</div>
<ul class="blockList">
<li class="blockList">
<h4>LOCATION_PLEASE_SPECIFY_XYZ</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.39">LOCATION_PLEASE_SPECIFY_XYZ</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.40">LOCATION_PLEASE_SPECIFY_XYZ</a></pre>
</li>
</ul>
<a name="LOCATION_CONSOLE_NOT_RELATIVE">
@@ -327,7 +339,7 @@ the order they are declared.</div>
<ul class="blockListLast">
<li class="blockList">
<h4>LOCATION_CONSOLE_NOT_RELATIVE</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.40">LOCATION_CONSOLE_NOT_RELATIVE</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MinecraftMessageKeys.html" title="enum in co.aikar.commands">MinecraftMessageKeys</a> <a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.41">LOCATION_CONSOLE_NOT_RELATIVE</a></pre>
</li>
</ul>
</li>
@@ -386,7 +398,7 @@ not permitted.)</div>
<ul class="blockListLast">
<li class="blockList">
<h4>getMessageKey</h4>
<pre>public&nbsp;co.aikar.locales.MessageKey&nbsp;<a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.43">getMessageKey</a>()</pre>
<pre>public&nbsp;co.aikar.locales.MessageKey&nbsp;<a href="../../../src-html/co/aikar/commands/MinecraftMessageKeys.html#line.44">getMessageKey</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>getMessageKey</code>&nbsp;in interface&nbsp;<code>co.aikar.locales.MessageKeyProvider</code></dd>
@@ -36,193 +36,228 @@
<span class="sourceLineNo">028</span>import org.bukkit.Bukkit;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.bukkit.ChatColor;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.bukkit.Location;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.bukkit.World;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.bukkit.command.BlockCommandSender;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.bukkit.command.CommandSender;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.bukkit.entity.Entity;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.bukkit.entity.Player;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.bukkit.inventory.PlayerInventory;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.jetbrains.annotations.Nullable;<a name="line.37"></a>
<span class="sourceLineNo">038</span><a name="line.38"></a>
<span class="sourceLineNo">039</span>import java.util.HashSet;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import java.util.Set;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import java.util.regex.Matcher;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import java.util.regex.Pattern;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import java.util.stream.Collectors;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import java.util.stream.Stream;<a name="line.44"></a>
<span class="sourceLineNo">045</span><a name="line.45"></a>
<span class="sourceLineNo">046</span>@SuppressWarnings("WeakerAccess")<a name="line.46"></a>
<span class="sourceLineNo">047</span>public class BukkitCommandContexts extends CommandContexts&lt;BukkitCommandExecutionContext&gt; {<a name="line.47"></a>
<span class="sourceLineNo">048</span><a name="line.48"></a>
<span class="sourceLineNo">049</span> public BukkitCommandContexts(BukkitCommandManager manager) {<a name="line.49"></a>
<span class="sourceLineNo">050</span> super(manager);<a name="line.50"></a>
<span class="sourceLineNo">051</span><a name="line.51"></a>
<span class="sourceLineNo">052</span> registerContext(OnlinePlayer.class, c -&gt; getOnlinePlayer(c.getIssuer(), c.popFirstArg(), c.hasAnnotation(Optional.class)));<a name="line.52"></a>
<span class="sourceLineNo">053</span> registerContext(OnlinePlayer[].class, (c) -&gt; {<a name="line.53"></a>
<span class="sourceLineNo">054</span> BukkitCommandIssuer issuer = c.getIssuer();<a name="line.54"></a>
<span class="sourceLineNo">055</span> final String search = c.popFirstArg();<a name="line.55"></a>
<span class="sourceLineNo">056</span> boolean allowMissing = c.hasFlag("allowmissing");<a name="line.56"></a>
<span class="sourceLineNo">057</span> Set&lt;OnlinePlayer&gt; players = new HashSet&lt;&gt;();<a name="line.57"></a>
<span class="sourceLineNo">058</span> Pattern split = ACFPatterns.COMMA;<a name="line.58"></a>
<span class="sourceLineNo">059</span> String splitter = c.getFlagValue("splitter", (String) null);<a name="line.59"></a>
<span class="sourceLineNo">060</span> if (splitter != null) {<a name="line.60"></a>
<span class="sourceLineNo">061</span> split = Pattern.compile(Pattern.quote(splitter));<a name="line.61"></a>
<span class="sourceLineNo">062</span> }<a name="line.62"></a>
<span class="sourceLineNo">063</span> for (String lookup : split.split(search)) {<a name="line.63"></a>
<span class="sourceLineNo">064</span> OnlinePlayer player = getOnlinePlayer(issuer, lookup, allowMissing);<a name="line.64"></a>
<span class="sourceLineNo">065</span> if (player != null) {<a name="line.65"></a>
<span class="sourceLineNo">066</span> players.add(player);<a name="line.66"></a>
<span class="sourceLineNo">067</span> }<a name="line.67"></a>
<span class="sourceLineNo">068</span> }<a name="line.68"></a>
<span class="sourceLineNo">069</span> if (players.isEmpty() &amp;&amp; !c.hasFlag("allowempty")) {<a name="line.69"></a>
<span class="sourceLineNo">070</span> issuer.sendError(MinecraftMessageKeys.NO_PLAYER_FOUND_SERVER,<a name="line.70"></a>
<span class="sourceLineNo">071</span> "{search}", search);<a name="line.71"></a>
<span class="sourceLineNo">072</span><a name="line.72"></a>
<span class="sourceLineNo">073</span> throw new InvalidCommandArgument(false);<a name="line.73"></a>
<span class="sourceLineNo">074</span> }<a name="line.74"></a>
<span class="sourceLineNo">075</span> return players.toArray(new OnlinePlayer[players.size()]);<a name="line.75"></a>
<span class="sourceLineNo">076</span> });<a name="line.76"></a>
<span class="sourceLineNo">077</span> registerIssuerAwareContext(World.class, (c) -&gt; {<a name="line.77"></a>
<span class="sourceLineNo">078</span> String firstArg = c.getFirstArg();<a name="line.78"></a>
<span class="sourceLineNo">079</span> World world = firstArg != null ? Bukkit.getWorld(firstArg) : null;<a name="line.79"></a>
<span class="sourceLineNo">080</span> if (world != null) {<a name="line.80"></a>
<span class="sourceLineNo">081</span> c.popFirstArg();<a name="line.81"></a>
<span class="sourceLineNo">082</span> }<a name="line.82"></a>
<span class="sourceLineNo">083</span> if (world == null &amp;&amp; c.getSender() instanceof Player) {<a name="line.83"></a>
<span class="sourceLineNo">084</span> world = ((Entity) c.getSender()).getWorld();<a name="line.84"></a>
<span class="sourceLineNo">085</span> }<a name="line.85"></a>
<span class="sourceLineNo">086</span> if (world == null) {<a name="line.86"></a>
<span class="sourceLineNo">087</span> throw new InvalidCommandArgument(MinecraftMessageKeys.INVALID_WORLD);<a name="line.87"></a>
<span class="sourceLineNo">088</span> }<a name="line.88"></a>
<span class="sourceLineNo">089</span> return world;<a name="line.89"></a>
<span class="sourceLineNo">090</span> });<a name="line.90"></a>
<span class="sourceLineNo">091</span> registerIssuerAwareContext(CommandSender.class, BukkitCommandExecutionContext::getSender);<a name="line.91"></a>
<span class="sourceLineNo">092</span> registerIssuerAwareContext(Player.class, (c) -&gt; {<a name="line.92"></a>
<span class="sourceLineNo">093</span> Player player = c.getSender() instanceof Player ? (Player) c.getSender() : null;<a name="line.93"></a>
<span class="sourceLineNo">094</span> if (player == null &amp;&amp; !c.hasAnnotation(Optional.class)) {<a name="line.94"></a>
<span class="sourceLineNo">095</span> throw new InvalidCommandArgument(MessageKeys.NOT_ALLOWED_ON_CONSOLE, false);<a name="line.95"></a>
<span class="sourceLineNo">096</span> }<a name="line.96"></a>
<span class="sourceLineNo">097</span> PlayerInventory inventory = player != null ? player.getInventory() : null;<a name="line.97"></a>
<span class="sourceLineNo">098</span> if (inventory != null &amp;&amp; c.hasFlag("itemheld") &amp;&amp; !ACFBukkitUtil.isValidItem(inventory.getItem(inventory.getHeldItemSlot()))) {<a name="line.98"></a>
<span class="sourceLineNo">099</span> throw new InvalidCommandArgument(MinecraftMessageKeys.YOU_MUST_BE_HOLDING_ITEM, false);<a name="line.99"></a>
<span class="sourceLineNo">100</span> }<a name="line.100"></a>
<span class="sourceLineNo">101</span> return player;<a name="line.101"></a>
<span class="sourceLineNo">102</span> });<a name="line.102"></a>
<span class="sourceLineNo">103</span> registerContext(ChatColor.class, c -&gt; {<a name="line.103"></a>
<span class="sourceLineNo">104</span> String first = c.popFirstArg();<a name="line.104"></a>
<span class="sourceLineNo">105</span> Stream&lt;ChatColor&gt; colors = Stream.of(ChatColor.values());<a name="line.105"></a>
<span class="sourceLineNo">106</span> if (c.hasFlag("colorsonly")) {<a name="line.106"></a>
<span class="sourceLineNo">107</span> colors = colors.filter(color -&gt; color.ordinal() &lt;= 0xF);<a name="line.107"></a>
<span class="sourceLineNo">108</span> }<a name="line.108"></a>
<span class="sourceLineNo">109</span> String filter = c.getFlagValue("filter", (String) null);<a name="line.109"></a>
<span class="sourceLineNo">110</span> if (filter != null) {<a name="line.110"></a>
<span class="sourceLineNo">111</span> filter = ACFUtil.simplifyString(filter);<a name="line.111"></a>
<span class="sourceLineNo">112</span> String finalFilter = filter;<a name="line.112"></a>
<span class="sourceLineNo">113</span> colors = colors.filter(color -&gt; finalFilter.equals(ACFUtil.simplifyString(color.name())));<a name="line.113"></a>
<span class="sourceLineNo">114</span> }<a name="line.114"></a>
<span class="sourceLineNo">115</span><a name="line.115"></a>
<span class="sourceLineNo">116</span> ChatColor match = ACFUtil.simpleMatch(ChatColor.class, first);<a name="line.116"></a>
<span class="sourceLineNo">117</span> if (match == null) {<a name="line.117"></a>
<span class="sourceLineNo">118</span> String valid = colors<a name="line.118"></a>
<span class="sourceLineNo">119</span> .map(color -&gt; "&lt;c2&gt;" + ACFUtil.simplifyString(color.name()) + "&lt;/c2&gt;")<a name="line.119"></a>
<span class="sourceLineNo">120</span> .collect(Collectors.joining("&lt;c1&gt;,&lt;/c1&gt; "));<a name="line.120"></a>
<span class="sourceLineNo">121</span><a name="line.121"></a>
<span class="sourceLineNo">122</span> throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_ONE_OF, "{valid}", valid);<a name="line.122"></a>
<span class="sourceLineNo">031</span>import org.bukkit.OfflinePlayer;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.bukkit.World;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.bukkit.command.BlockCommandSender;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.bukkit.command.CommandSender;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.bukkit.entity.Entity;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.bukkit.entity.Player;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.bukkit.inventory.PlayerInventory;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.jetbrains.annotations.Nullable;<a name="line.38"></a>
<span class="sourceLineNo">039</span><a name="line.39"></a>
<span class="sourceLineNo">040</span>import java.util.HashSet;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import java.util.Set;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import java.util.UUID;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import java.util.regex.Matcher;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import java.util.regex.Pattern;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import java.util.stream.Collectors;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import java.util.stream.Stream;<a name="line.46"></a>
<span class="sourceLineNo">047</span><a name="line.47"></a>
<span class="sourceLineNo">048</span>@SuppressWarnings("WeakerAccess")<a name="line.48"></a>
<span class="sourceLineNo">049</span>public class BukkitCommandContexts extends CommandContexts&lt;BukkitCommandExecutionContext&gt; {<a name="line.49"></a>
<span class="sourceLineNo">050</span><a name="line.50"></a>
<span class="sourceLineNo">051</span> public BukkitCommandContexts(BukkitCommandManager manager) {<a name="line.51"></a>
<span class="sourceLineNo">052</span> super(manager);<a name="line.52"></a>
<span class="sourceLineNo">053</span><a name="line.53"></a>
<span class="sourceLineNo">054</span> registerContext(OnlinePlayer.class, c -&gt; getOnlinePlayer(c.getIssuer(), c.popFirstArg(), c.hasAnnotation(Optional.class)));<a name="line.54"></a>
<span class="sourceLineNo">055</span> registerContext(OnlinePlayer[].class, (c) -&gt; {<a name="line.55"></a>
<span class="sourceLineNo">056</span> BukkitCommandIssuer issuer = c.getIssuer();<a name="line.56"></a>
<span class="sourceLineNo">057</span> final String search = c.popFirstArg();<a name="line.57"></a>
<span class="sourceLineNo">058</span> boolean allowMissing = c.hasFlag("allowmissing");<a name="line.58"></a>
<span class="sourceLineNo">059</span> Set&lt;OnlinePlayer&gt; players = new HashSet&lt;&gt;();<a name="line.59"></a>
<span class="sourceLineNo">060</span> Pattern split = ACFPatterns.COMMA;<a name="line.60"></a>
<span class="sourceLineNo">061</span> String splitter = c.getFlagValue("splitter", (String) null);<a name="line.61"></a>
<span class="sourceLineNo">062</span> if (splitter != null) {<a name="line.62"></a>
<span class="sourceLineNo">063</span> split = Pattern.compile(Pattern.quote(splitter));<a name="line.63"></a>
<span class="sourceLineNo">064</span> }<a name="line.64"></a>
<span class="sourceLineNo">065</span> for (String lookup : split.split(search)) {<a name="line.65"></a>
<span class="sourceLineNo">066</span> OnlinePlayer player = getOnlinePlayer(issuer, lookup, allowMissing);<a name="line.66"></a>
<span class="sourceLineNo">067</span> if (player != null) {<a name="line.67"></a>
<span class="sourceLineNo">068</span> players.add(player);<a name="line.68"></a>
<span class="sourceLineNo">069</span> }<a name="line.69"></a>
<span class="sourceLineNo">070</span> }<a name="line.70"></a>
<span class="sourceLineNo">071</span> if (players.isEmpty() &amp;&amp; !c.hasFlag("allowempty")) {<a name="line.71"></a>
<span class="sourceLineNo">072</span> issuer.sendError(MinecraftMessageKeys.NO_PLAYER_FOUND_SERVER,<a name="line.72"></a>
<span class="sourceLineNo">073</span> "{search}", search);<a name="line.73"></a>
<span class="sourceLineNo">074</span><a name="line.74"></a>
<span class="sourceLineNo">075</span> throw new InvalidCommandArgument(false);<a name="line.75"></a>
<span class="sourceLineNo">076</span> }<a name="line.76"></a>
<span class="sourceLineNo">077</span> return players.toArray(new OnlinePlayer[players.size()]);<a name="line.77"></a>
<span class="sourceLineNo">078</span> });<a name="line.78"></a>
<span class="sourceLineNo">079</span> registerIssuerAwareContext(World.class, (c) -&gt; {<a name="line.79"></a>
<span class="sourceLineNo">080</span> String firstArg = c.getFirstArg();<a name="line.80"></a>
<span class="sourceLineNo">081</span> World world = firstArg != null ? Bukkit.getWorld(firstArg) : null;<a name="line.81"></a>
<span class="sourceLineNo">082</span> if (world != null) {<a name="line.82"></a>
<span class="sourceLineNo">083</span> c.popFirstArg();<a name="line.83"></a>
<span class="sourceLineNo">084</span> }<a name="line.84"></a>
<span class="sourceLineNo">085</span> if (world == null &amp;&amp; c.getSender() instanceof Player) {<a name="line.85"></a>
<span class="sourceLineNo">086</span> world = ((Entity) c.getSender()).getWorld();<a name="line.86"></a>
<span class="sourceLineNo">087</span> }<a name="line.87"></a>
<span class="sourceLineNo">088</span> if (world == null) {<a name="line.88"></a>
<span class="sourceLineNo">089</span> throw new InvalidCommandArgument(MinecraftMessageKeys.INVALID_WORLD);<a name="line.89"></a>
<span class="sourceLineNo">090</span> }<a name="line.90"></a>
<span class="sourceLineNo">091</span> return world;<a name="line.91"></a>
<span class="sourceLineNo">092</span> });<a name="line.92"></a>
<span class="sourceLineNo">093</span> registerIssuerAwareContext(CommandSender.class, BukkitCommandExecutionContext::getSender);<a name="line.93"></a>
<span class="sourceLineNo">094</span> registerIssuerAwareContext(Player.class, (c) -&gt; {<a name="line.94"></a>
<span class="sourceLineNo">095</span> boolean isOptional = c.hasAnnotation(Optional.class);<a name="line.95"></a>
<span class="sourceLineNo">096</span> CommandSender sender = c.getSender();<a name="line.96"></a>
<span class="sourceLineNo">097</span> boolean isPlayerSender = sender instanceof Player;<a name="line.97"></a>
<span class="sourceLineNo">098</span> if (!c.hasFlag("other")) {<a name="line.98"></a>
<span class="sourceLineNo">099</span> Player player = isPlayerSender ? (Player) sender : null;<a name="line.99"></a>
<span class="sourceLineNo">100</span> if (player == null &amp;&amp; !isOptional) {<a name="line.100"></a>
<span class="sourceLineNo">101</span> throw new InvalidCommandArgument(MessageKeys.NOT_ALLOWED_ON_CONSOLE, false);<a name="line.101"></a>
<span class="sourceLineNo">102</span> }<a name="line.102"></a>
<span class="sourceLineNo">103</span> PlayerInventory inventory = player != null ? player.getInventory() : null;<a name="line.103"></a>
<span class="sourceLineNo">104</span> if (inventory != null &amp;&amp; c.hasFlag("itemheld") &amp;&amp; !ACFBukkitUtil.isValidItem(inventory.getItem(inventory.getHeldItemSlot()))) {<a name="line.104"></a>
<span class="sourceLineNo">105</span> throw new InvalidCommandArgument(MinecraftMessageKeys.YOU_MUST_BE_HOLDING_ITEM, false);<a name="line.105"></a>
<span class="sourceLineNo">106</span> }<a name="line.106"></a>
<span class="sourceLineNo">107</span> return player;<a name="line.107"></a>
<span class="sourceLineNo">108</span> } else {<a name="line.108"></a>
<span class="sourceLineNo">109</span> String arg = c.popFirstArg();<a name="line.109"></a>
<span class="sourceLineNo">110</span> if (arg == null &amp;&amp; isOptional) {<a name="line.110"></a>
<span class="sourceLineNo">111</span> if (c.hasFlag("defaultself")) {<a name="line.111"></a>
<span class="sourceLineNo">112</span> if (isPlayerSender) {<a name="line.112"></a>
<span class="sourceLineNo">113</span> return (Player) sender;<a name="line.113"></a>
<span class="sourceLineNo">114</span> } else {<a name="line.114"></a>
<span class="sourceLineNo">115</span> throw new InvalidCommandArgument(MessageKeys.NOT_ALLOWED_ON_CONSOLE, false);<a name="line.115"></a>
<span class="sourceLineNo">116</span> }<a name="line.116"></a>
<span class="sourceLineNo">117</span> } else {<a name="line.117"></a>
<span class="sourceLineNo">118</span> return null;<a name="line.118"></a>
<span class="sourceLineNo">119</span> }<a name="line.119"></a>
<span class="sourceLineNo">120</span> }<a name="line.120"></a>
<span class="sourceLineNo">121</span> OnlinePlayer onlinePlayer = getOnlinePlayer(c.getIssuer(), arg, isOptional);<a name="line.121"></a>
<span class="sourceLineNo">122</span> return onlinePlayer != null ? onlinePlayer.getPlayer() : null;<a name="line.122"></a>
<span class="sourceLineNo">123</span> }<a name="line.123"></a>
<span class="sourceLineNo">124</span> return match;<a name="line.124"></a>
<span class="sourceLineNo">125</span> });<a name="line.125"></a>
<span class="sourceLineNo">126</span> registerContext(Location.class, c -&gt; {<a name="line.126"></a>
<span class="sourceLineNo">127</span> String input = c.popFirstArg();<a name="line.127"></a>
<span class="sourceLineNo">128</span> CommandSender sender = c.getSender();<a name="line.128"></a>
<span class="sourceLineNo">129</span> String[] split = ACFPatterns.COLON.split(input, 2);<a name="line.129"></a>
<span class="sourceLineNo">130</span> if (split.length == 0) {<a name="line.130"></a>
<span class="sourceLineNo">131</span> throw new InvalidCommandArgument(true);<a name="line.131"></a>
<span class="sourceLineNo">132</span> }<a name="line.132"></a>
<span class="sourceLineNo">133</span> if (split.length &lt; 2 &amp;&amp; !(sender instanceof Player) &amp;&amp; !(sender instanceof BlockCommandSender)) {<a name="line.133"></a>
<span class="sourceLineNo">134</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_PLEASE_SPECIFY_WORLD);<a name="line.134"></a>
<span class="sourceLineNo">124</span> });<a name="line.124"></a>
<span class="sourceLineNo">125</span> registerContext(OfflinePlayer.class, c -&gt; {<a name="line.125"></a>
<span class="sourceLineNo">126</span> String name = c.popFirstArg();<a name="line.126"></a>
<span class="sourceLineNo">127</span> UUID uuid = null;<a name="line.127"></a>
<span class="sourceLineNo">128</span> if (c.hasFlag("uuid")) {<a name="line.128"></a>
<span class="sourceLineNo">129</span> uuid = UUID.fromString(name);<a name="line.129"></a>
<span class="sourceLineNo">130</span> }<a name="line.130"></a>
<span class="sourceLineNo">131</span> OfflinePlayer offlinePlayer = uuid != null ? Bukkit.getOfflinePlayer(uuid) : Bukkit.getOfflinePlayer(name);<a name="line.131"></a>
<span class="sourceLineNo">132</span> if (offlinePlayer == null) {<a name="line.132"></a>
<span class="sourceLineNo">133</span> throw new InvalidCommandArgument(MinecraftMessageKeys.NO_PLAYER_FOUND_OFFLINE,<a name="line.133"></a>
<span class="sourceLineNo">134</span> "{search}", name);<a name="line.134"></a>
<span class="sourceLineNo">135</span> }<a name="line.135"></a>
<span class="sourceLineNo">136</span> final String world;<a name="line.136"></a>
<span class="sourceLineNo">137</span> final String rest;<a name="line.137"></a>
<span class="sourceLineNo">138</span> Location sourceLoc = null;<a name="line.138"></a>
<span class="sourceLineNo">139</span> if (split.length == 2) {<a name="line.139"></a>
<span class="sourceLineNo">140</span> world = split[0];<a name="line.140"></a>
<span class="sourceLineNo">141</span> rest = split[1];<a name="line.141"></a>
<span class="sourceLineNo">142</span> } else if (sender instanceof Player) {<a name="line.142"></a>
<span class="sourceLineNo">143</span> sourceLoc = ((Player) sender).getLocation();<a name="line.143"></a>
<span class="sourceLineNo">144</span> world = sourceLoc.getWorld().getName();<a name="line.144"></a>
<span class="sourceLineNo">145</span> rest = split[0];<a name="line.145"></a>
<span class="sourceLineNo">146</span> } else if (sender instanceof BlockCommandSender) {<a name="line.146"></a>
<span class="sourceLineNo">147</span> sourceLoc = ((BlockCommandSender) sender).getBlock().getLocation();<a name="line.147"></a>
<span class="sourceLineNo">148</span> world = sourceLoc.getWorld().getName();<a name="line.148"></a>
<span class="sourceLineNo">149</span> rest = split[0];<a name="line.149"></a>
<span class="sourceLineNo">150</span> } else {<a name="line.150"></a>
<span class="sourceLineNo">151</span> throw new InvalidCommandArgument(true);<a name="line.151"></a>
<span class="sourceLineNo">152</span> }<a name="line.152"></a>
<span class="sourceLineNo">153</span><a name="line.153"></a>
<span class="sourceLineNo">154</span> boolean rel = rest.startsWith("~");<a name="line.154"></a>
<span class="sourceLineNo">155</span> split = ACFPatterns.COMMA.split(rel ? rest.substring(1) : rest);<a name="line.155"></a>
<span class="sourceLineNo">156</span> if (split.length &lt; 3) {<a name="line.156"></a>
<span class="sourceLineNo">157</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_PLEASE_SPECIFY_XYZ);<a name="line.157"></a>
<span class="sourceLineNo">136</span> return offlinePlayer;<a name="line.136"></a>
<span class="sourceLineNo">137</span> });<a name="line.137"></a>
<span class="sourceLineNo">138</span> registerContext(ChatColor.class, c -&gt; {<a name="line.138"></a>
<span class="sourceLineNo">139</span> String first = c.popFirstArg();<a name="line.139"></a>
<span class="sourceLineNo">140</span> Stream&lt;ChatColor&gt; colors = Stream.of(ChatColor.values());<a name="line.140"></a>
<span class="sourceLineNo">141</span> if (c.hasFlag("colorsonly")) {<a name="line.141"></a>
<span class="sourceLineNo">142</span> colors = colors.filter(color -&gt; color.ordinal() &lt;= 0xF);<a name="line.142"></a>
<span class="sourceLineNo">143</span> }<a name="line.143"></a>
<span class="sourceLineNo">144</span> String filter = c.getFlagValue("filter", (String) null);<a name="line.144"></a>
<span class="sourceLineNo">145</span> if (filter != null) {<a name="line.145"></a>
<span class="sourceLineNo">146</span> filter = ACFUtil.simplifyString(filter);<a name="line.146"></a>
<span class="sourceLineNo">147</span> String finalFilter = filter;<a name="line.147"></a>
<span class="sourceLineNo">148</span> colors = colors.filter(color -&gt; finalFilter.equals(ACFUtil.simplifyString(color.name())));<a name="line.148"></a>
<span class="sourceLineNo">149</span> }<a name="line.149"></a>
<span class="sourceLineNo">150</span><a name="line.150"></a>
<span class="sourceLineNo">151</span> ChatColor match = ACFUtil.simpleMatch(ChatColor.class, first);<a name="line.151"></a>
<span class="sourceLineNo">152</span> if (match == null) {<a name="line.152"></a>
<span class="sourceLineNo">153</span> String valid = colors<a name="line.153"></a>
<span class="sourceLineNo">154</span> .map(color -&gt; "&lt;c2&gt;" + ACFUtil.simplifyString(color.name()) + "&lt;/c2&gt;")<a name="line.154"></a>
<span class="sourceLineNo">155</span> .collect(Collectors.joining("&lt;c1&gt;,&lt;/c1&gt; "));<a name="line.155"></a>
<span class="sourceLineNo">156</span><a name="line.156"></a>
<span class="sourceLineNo">157</span> throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_ONE_OF, "{valid}", valid);<a name="line.157"></a>
<span class="sourceLineNo">158</span> }<a name="line.158"></a>
<span class="sourceLineNo">159</span><a name="line.159"></a>
<span class="sourceLineNo">160</span> Double x = ACFUtil.parseDouble(split[0]);<a name="line.160"></a>
<span class="sourceLineNo">161</span> Double y = ACFUtil.parseDouble(split[1]);<a name="line.161"></a>
<span class="sourceLineNo">162</span> Double z = ACFUtil.parseDouble(split[2]);<a name="line.162"></a>
<span class="sourceLineNo">163</span><a name="line.163"></a>
<span class="sourceLineNo">164</span> if (sourceLoc != null &amp;&amp; rel) {<a name="line.164"></a>
<span class="sourceLineNo">165</span> x += sourceLoc.getX();<a name="line.165"></a>
<span class="sourceLineNo">166</span> y += sourceLoc.getY();<a name="line.166"></a>
<span class="sourceLineNo">167</span> z += sourceLoc.getZ();<a name="line.167"></a>
<span class="sourceLineNo">168</span> } else if (rel) {<a name="line.168"></a>
<span class="sourceLineNo">169</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_CONSOLE_NOT_RELATIVE);<a name="line.169"></a>
<span class="sourceLineNo">159</span> return match;<a name="line.159"></a>
<span class="sourceLineNo">160</span> });<a name="line.160"></a>
<span class="sourceLineNo">161</span> registerContext(Location.class, c -&gt; {<a name="line.161"></a>
<span class="sourceLineNo">162</span> String input = c.popFirstArg();<a name="line.162"></a>
<span class="sourceLineNo">163</span> CommandSender sender = c.getSender();<a name="line.163"></a>
<span class="sourceLineNo">164</span> String[] split = ACFPatterns.COLON.split(input, 2);<a name="line.164"></a>
<span class="sourceLineNo">165</span> if (split.length == 0) {<a name="line.165"></a>
<span class="sourceLineNo">166</span> throw new InvalidCommandArgument(true);<a name="line.166"></a>
<span class="sourceLineNo">167</span> }<a name="line.167"></a>
<span class="sourceLineNo">168</span> if (split.length &lt; 2 &amp;&amp; !(sender instanceof Player) &amp;&amp; !(sender instanceof BlockCommandSender)) {<a name="line.168"></a>
<span class="sourceLineNo">169</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_PLEASE_SPECIFY_WORLD);<a name="line.169"></a>
<span class="sourceLineNo">170</span> }<a name="line.170"></a>
<span class="sourceLineNo">171</span><a name="line.171"></a>
<span class="sourceLineNo">172</span> if (x == null || y == null || z == null) {<a name="line.172"></a>
<span class="sourceLineNo">173</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_PLEASE_SPECIFY_XYZ);<a name="line.173"></a>
<span class="sourceLineNo">174</span> }<a name="line.174"></a>
<span class="sourceLineNo">175</span><a name="line.175"></a>
<span class="sourceLineNo">176</span> World worldObj = Bukkit.getWorld(world);<a name="line.176"></a>
<span class="sourceLineNo">177</span> if (worldObj == null) {<a name="line.177"></a>
<span class="sourceLineNo">178</span> throw new InvalidCommandArgument(MinecraftMessageKeys.INVALID_WORLD);<a name="line.178"></a>
<span class="sourceLineNo">179</span> }<a name="line.179"></a>
<span class="sourceLineNo">180</span><a name="line.180"></a>
<span class="sourceLineNo">181</span> if (split.length &gt;= 5) {<a name="line.181"></a>
<span class="sourceLineNo">182</span> Float yaw = ACFUtil.parseFloat(split[3]);<a name="line.182"></a>
<span class="sourceLineNo">183</span> Float pitch = ACFUtil.parseFloat(split[4]);<a name="line.183"></a>
<span class="sourceLineNo">184</span><a name="line.184"></a>
<span class="sourceLineNo">185</span> if (pitch == null || yaw == null) {<a name="line.185"></a>
<span class="sourceLineNo">186</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_PLEASE_SPECIFY_XYZ);<a name="line.186"></a>
<span class="sourceLineNo">187</span> }<a name="line.187"></a>
<span class="sourceLineNo">188</span> return new Location(worldObj, x, y, z, yaw, pitch);<a name="line.188"></a>
<span class="sourceLineNo">189</span> } else {<a name="line.189"></a>
<span class="sourceLineNo">190</span> return new Location(worldObj, x, y, z);<a name="line.190"></a>
<span class="sourceLineNo">191</span> }<a name="line.191"></a>
<span class="sourceLineNo">192</span> });<a name="line.192"></a>
<span class="sourceLineNo">193</span> Pattern versionPattern = Pattern.compile("\\(MC: (\\d)\\.(\\d+)\\.?.*?\\)");<a name="line.193"></a>
<span class="sourceLineNo">194</span> Matcher matcher = versionPattern.matcher(Bukkit.getVersion());<a name="line.194"></a>
<span class="sourceLineNo">195</span> if (matcher.find()) {<a name="line.195"></a>
<span class="sourceLineNo">196</span> int mcMajorVersion = ACFUtil.parseInt(matcher.toMatchResult().group(1), 0);<a name="line.196"></a>
<span class="sourceLineNo">197</span> int mcMinorVersion = ACFUtil.parseInt(matcher.toMatchResult().group(2), 0);<a name="line.197"></a>
<span class="sourceLineNo">198</span> manager.log(LogLevel.INFO, "Minecraft Version: " + mcMajorVersion + "." + mcMinorVersion);<a name="line.198"></a>
<span class="sourceLineNo">199</span> if (mcMajorVersion &gt;= 1 &amp;&amp; mcMinorVersion &gt;= 12) {<a name="line.199"></a>
<span class="sourceLineNo">200</span> BukkitCommandContexts_1_12.register(this);<a name="line.200"></a>
<span class="sourceLineNo">201</span> }<a name="line.201"></a>
<span class="sourceLineNo">202</span> }<a name="line.202"></a>
<span class="sourceLineNo">203</span> }<a name="line.203"></a>
<span class="sourceLineNo">204</span><a name="line.204"></a>
<span class="sourceLineNo">205</span> @Nullable<a name="line.205"></a>
<span class="sourceLineNo">206</span> OnlinePlayer getOnlinePlayer(BukkitCommandIssuer issuer, String lookup, boolean allowMissing) throws InvalidCommandArgument {<a name="line.206"></a>
<span class="sourceLineNo">207</span> Player player = ACFBukkitUtil.findPlayerSmart(issuer, lookup);<a name="line.207"></a>
<span class="sourceLineNo">208</span> //noinspection Duplicates<a name="line.208"></a>
<span class="sourceLineNo">209</span> if (player == null) {<a name="line.209"></a>
<span class="sourceLineNo">210</span> if (allowMissing) {<a name="line.210"></a>
<span class="sourceLineNo">211</span> return null;<a name="line.211"></a>
<span class="sourceLineNo">212</span> }<a name="line.212"></a>
<span class="sourceLineNo">213</span> throw new InvalidCommandArgument(false);<a name="line.213"></a>
<span class="sourceLineNo">214</span> }<a name="line.214"></a>
<span class="sourceLineNo">215</span> return new OnlinePlayer(player);<a name="line.215"></a>
<span class="sourceLineNo">216</span> }<a name="line.216"></a>
<span class="sourceLineNo">217</span>}<a name="line.217"></a>
<span class="sourceLineNo">171</span> final String world;<a name="line.171"></a>
<span class="sourceLineNo">172</span> final String rest;<a name="line.172"></a>
<span class="sourceLineNo">173</span> Location sourceLoc = null;<a name="line.173"></a>
<span class="sourceLineNo">174</span> if (split.length == 2) {<a name="line.174"></a>
<span class="sourceLineNo">175</span> world = split[0];<a name="line.175"></a>
<span class="sourceLineNo">176</span> rest = split[1];<a name="line.176"></a>
<span class="sourceLineNo">177</span> } else if (sender instanceof Player) {<a name="line.177"></a>
<span class="sourceLineNo">178</span> sourceLoc = ((Player) sender).getLocation();<a name="line.178"></a>
<span class="sourceLineNo">179</span> world = sourceLoc.getWorld().getName();<a name="line.179"></a>
<span class="sourceLineNo">180</span> rest = split[0];<a name="line.180"></a>
<span class="sourceLineNo">181</span> } else if (sender instanceof BlockCommandSender) {<a name="line.181"></a>
<span class="sourceLineNo">182</span> sourceLoc = ((BlockCommandSender) sender).getBlock().getLocation();<a name="line.182"></a>
<span class="sourceLineNo">183</span> world = sourceLoc.getWorld().getName();<a name="line.183"></a>
<span class="sourceLineNo">184</span> rest = split[0];<a name="line.184"></a>
<span class="sourceLineNo">185</span> } else {<a name="line.185"></a>
<span class="sourceLineNo">186</span> throw new InvalidCommandArgument(true);<a name="line.186"></a>
<span class="sourceLineNo">187</span> }<a name="line.187"></a>
<span class="sourceLineNo">188</span><a name="line.188"></a>
<span class="sourceLineNo">189</span> boolean rel = rest.startsWith("~");<a name="line.189"></a>
<span class="sourceLineNo">190</span> split = ACFPatterns.COMMA.split(rel ? rest.substring(1) : rest);<a name="line.190"></a>
<span class="sourceLineNo">191</span> if (split.length &lt; 3) {<a name="line.191"></a>
<span class="sourceLineNo">192</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_PLEASE_SPECIFY_XYZ);<a name="line.192"></a>
<span class="sourceLineNo">193</span> }<a name="line.193"></a>
<span class="sourceLineNo">194</span><a name="line.194"></a>
<span class="sourceLineNo">195</span> Double x = ACFUtil.parseDouble(split[0]);<a name="line.195"></a>
<span class="sourceLineNo">196</span> Double y = ACFUtil.parseDouble(split[1]);<a name="line.196"></a>
<span class="sourceLineNo">197</span> Double z = ACFUtil.parseDouble(split[2]);<a name="line.197"></a>
<span class="sourceLineNo">198</span><a name="line.198"></a>
<span class="sourceLineNo">199</span> if (sourceLoc != null &amp;&amp; rel) {<a name="line.199"></a>
<span class="sourceLineNo">200</span> x += sourceLoc.getX();<a name="line.200"></a>
<span class="sourceLineNo">201</span> y += sourceLoc.getY();<a name="line.201"></a>
<span class="sourceLineNo">202</span> z += sourceLoc.getZ();<a name="line.202"></a>
<span class="sourceLineNo">203</span> } else if (rel) {<a name="line.203"></a>
<span class="sourceLineNo">204</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_CONSOLE_NOT_RELATIVE);<a name="line.204"></a>
<span class="sourceLineNo">205</span> }<a name="line.205"></a>
<span class="sourceLineNo">206</span><a name="line.206"></a>
<span class="sourceLineNo">207</span> if (x == null || y == null || z == null) {<a name="line.207"></a>
<span class="sourceLineNo">208</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_PLEASE_SPECIFY_XYZ);<a name="line.208"></a>
<span class="sourceLineNo">209</span> }<a name="line.209"></a>
<span class="sourceLineNo">210</span><a name="line.210"></a>
<span class="sourceLineNo">211</span> World worldObj = Bukkit.getWorld(world);<a name="line.211"></a>
<span class="sourceLineNo">212</span> if (worldObj == null) {<a name="line.212"></a>
<span class="sourceLineNo">213</span> throw new InvalidCommandArgument(MinecraftMessageKeys.INVALID_WORLD);<a name="line.213"></a>
<span class="sourceLineNo">214</span> }<a name="line.214"></a>
<span class="sourceLineNo">215</span><a name="line.215"></a>
<span class="sourceLineNo">216</span> if (split.length &gt;= 5) {<a name="line.216"></a>
<span class="sourceLineNo">217</span> Float yaw = ACFUtil.parseFloat(split[3]);<a name="line.217"></a>
<span class="sourceLineNo">218</span> Float pitch = ACFUtil.parseFloat(split[4]);<a name="line.218"></a>
<span class="sourceLineNo">219</span><a name="line.219"></a>
<span class="sourceLineNo">220</span> if (pitch == null || yaw == null) {<a name="line.220"></a>
<span class="sourceLineNo">221</span> throw new InvalidCommandArgument(MinecraftMessageKeys.LOCATION_PLEASE_SPECIFY_XYZ);<a name="line.221"></a>
<span class="sourceLineNo">222</span> }<a name="line.222"></a>
<span class="sourceLineNo">223</span> return new Location(worldObj, x, y, z, yaw, pitch);<a name="line.223"></a>
<span class="sourceLineNo">224</span> } else {<a name="line.224"></a>
<span class="sourceLineNo">225</span> return new Location(worldObj, x, y, z);<a name="line.225"></a>
<span class="sourceLineNo">226</span> }<a name="line.226"></a>
<span class="sourceLineNo">227</span> });<a name="line.227"></a>
<span class="sourceLineNo">228</span> Pattern versionPattern = Pattern.compile("\\(MC: (\\d)\\.(\\d+)\\.?.*?\\)");<a name="line.228"></a>
<span class="sourceLineNo">229</span> Matcher matcher = versionPattern.matcher(Bukkit.getVersion());<a name="line.229"></a>
<span class="sourceLineNo">230</span> if (matcher.find()) {<a name="line.230"></a>
<span class="sourceLineNo">231</span> int mcMajorVersion = ACFUtil.parseInt(matcher.toMatchResult().group(1), 0);<a name="line.231"></a>
<span class="sourceLineNo">232</span> int mcMinorVersion = ACFUtil.parseInt(matcher.toMatchResult().group(2), 0);<a name="line.232"></a>
<span class="sourceLineNo">233</span> manager.log(LogLevel.INFO, "Minecraft Version: " + mcMajorVersion + "." + mcMinorVersion);<a name="line.233"></a>
<span class="sourceLineNo">234</span> if (mcMajorVersion &gt;= 1 &amp;&amp; mcMinorVersion &gt;= 12) {<a name="line.234"></a>
<span class="sourceLineNo">235</span> BukkitCommandContexts_1_12.register(this);<a name="line.235"></a>
<span class="sourceLineNo">236</span> }<a name="line.236"></a>
<span class="sourceLineNo">237</span> }<a name="line.237"></a>
<span class="sourceLineNo">238</span> }<a name="line.238"></a>
<span class="sourceLineNo">239</span><a name="line.239"></a>
<span class="sourceLineNo">240</span> @Nullable<a name="line.240"></a>
<span class="sourceLineNo">241</span> OnlinePlayer getOnlinePlayer(BukkitCommandIssuer issuer, String lookup, boolean allowMissing) throws InvalidCommandArgument {<a name="line.241"></a>
<span class="sourceLineNo">242</span> Player player = ACFBukkitUtil.findPlayerSmart(issuer, lookup);<a name="line.242"></a>
<span class="sourceLineNo">243</span> //noinspection Duplicates<a name="line.243"></a>
<span class="sourceLineNo">244</span> if (player == null) {<a name="line.244"></a>
<span class="sourceLineNo">245</span> if (allowMissing) {<a name="line.245"></a>
<span class="sourceLineNo">246</span> return null;<a name="line.246"></a>
<span class="sourceLineNo">247</span> }<a name="line.247"></a>
<span class="sourceLineNo">248</span> throw new InvalidCommandArgument(false);<a name="line.248"></a>
<span class="sourceLineNo">249</span> }<a name="line.249"></a>
<span class="sourceLineNo">250</span> return new OnlinePlayer(player);<a name="line.250"></a>
<span class="sourceLineNo">251</span> }<a name="line.251"></a>
<span class="sourceLineNo">252</span>}<a name="line.252"></a>
@@ -42,16 +42,17 @@
<span class="sourceLineNo">034</span> IS_NOT_A_VALID_NAME,<a name="line.34"></a>
<span class="sourceLineNo">035</span> MULTIPLE_PLAYERS_MATCH,<a name="line.35"></a>
<span class="sourceLineNo">036</span> NO_PLAYER_FOUND_SERVER,<a name="line.36"></a>
<span class="sourceLineNo">037</span> NO_PLAYER_FOUND,<a name="line.37"></a>
<span class="sourceLineNo">038</span> LOCATION_PLEASE_SPECIFY_WORLD,<a name="line.38"></a>
<span class="sourceLineNo">039</span> LOCATION_PLEASE_SPECIFY_XYZ,<a name="line.39"></a>
<span class="sourceLineNo">040</span> LOCATION_CONSOLE_NOT_RELATIVE;<a name="line.40"></a>
<span class="sourceLineNo">041</span><a name="line.41"></a>
<span class="sourceLineNo">042</span> private final MessageKey key = MessageKey.of("acf-minecraft." + this.name().toLowerCase());<a name="line.42"></a>
<span class="sourceLineNo">043</span> public MessageKey getMessageKey() {<a name="line.43"></a>
<span class="sourceLineNo">044</span> return key;<a name="line.44"></a>
<span class="sourceLineNo">045</span> }<a name="line.45"></a>
<span class="sourceLineNo">046</span>}<a name="line.46"></a>
<span class="sourceLineNo">037</span> NO_PLAYER_FOUND_OFFLINE,<a name="line.37"></a>
<span class="sourceLineNo">038</span> NO_PLAYER_FOUND,<a name="line.38"></a>
<span class="sourceLineNo">039</span> LOCATION_PLEASE_SPECIFY_WORLD,<a name="line.39"></a>
<span class="sourceLineNo">040</span> LOCATION_PLEASE_SPECIFY_XYZ,<a name="line.40"></a>
<span class="sourceLineNo">041</span> LOCATION_CONSOLE_NOT_RELATIVE;<a name="line.41"></a>
<span class="sourceLineNo">042</span><a name="line.42"></a>
<span class="sourceLineNo">043</span> private final MessageKey key = MessageKey.of("acf-minecraft." + this.name().toLowerCase());<a name="line.43"></a>
<span class="sourceLineNo">044</span> public MessageKey getMessageKey() {<a name="line.44"></a>
<span class="sourceLineNo">045</span> return key;<a name="line.45"></a>
<span class="sourceLineNo">046</span> }<a name="line.46"></a>
<span class="sourceLineNo">047</span>}<a name="line.47"></a>
@@ -108,7 +108,7 @@ var activeTableTab = "activeTableTab";
<li class="blockList">
<hr>
<br>
<pre>public class <a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.39">CommandContexts</a>&lt;R extends <a href="../../../co/aikar/commands/CommandExecutionContext.html" title="class in co.aikar.commands">CommandExecutionContext</a>&lt;?,? extends <a href="../../../co/aikar/commands/CommandIssuer.html" title="interface in co.aikar.commands">CommandIssuer</a>&gt;&gt;
<pre>public class <a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.40">CommandContexts</a>&lt;R extends <a href="../../../co/aikar/commands/CommandExecutionContext.html" title="class in co.aikar.commands">CommandExecutionContext</a>&lt;?,? extends <a href="../../../co/aikar/commands/CommandIssuer.html" title="interface in co.aikar.commands">CommandIssuer</a>&gt;&gt;
extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
</li>
</ul>
@@ -222,7 +222,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
<ul class="blockList">
<li class="blockList">
<h4>contextMap</h4>
<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;,<a href="../../../co/aikar/commands/contexts/ContextResolver.html" title="interface in co.aikar.commands.contexts">ContextResolver</a>&lt;?,<a href="../../../co/aikar/commands/CommandContexts.html" title="type parameter in CommandContexts">R</a> extends <a href="../../../co/aikar/commands/CommandExecutionContext.html" title="class in co.aikar.commands">CommandExecutionContext</a>&lt;?,? extends <a href="../../../co/aikar/commands/CommandIssuer.html" title="interface in co.aikar.commands">CommandIssuer</a>&gt;&gt;&gt; <a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.40">contextMap</a></pre>
<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;,<a href="../../../co/aikar/commands/contexts/ContextResolver.html" title="interface in co.aikar.commands.contexts">ContextResolver</a>&lt;?,<a href="../../../co/aikar/commands/CommandContexts.html" title="type parameter in CommandContexts">R</a> extends <a href="../../../co/aikar/commands/CommandExecutionContext.html" title="class in co.aikar.commands">CommandExecutionContext</a>&lt;?,? extends <a href="../../../co/aikar/commands/CommandIssuer.html" title="interface in co.aikar.commands">CommandIssuer</a>&gt;&gt;&gt; <a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.41">contextMap</a></pre>
</li>
</ul>
<a name="manager">
@@ -231,7 +231,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
<ul class="blockListLast">
<li class="blockList">
<h4>manager</h4>
<pre>protected final&nbsp;<a href="../../../co/aikar/commands/CommandManager.html" title="class in co.aikar.commands">CommandManager</a> <a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.41">manager</a></pre>
<pre>protected final&nbsp;<a href="../../../co/aikar/commands/CommandManager.html" title="class in co.aikar.commands">CommandManager</a> <a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.42">manager</a></pre>
</li>
</ul>
</li>
@@ -249,7 +249,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
<li class="blockList">
<h4>registerSenderAwareContext</h4>
<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.186">registerSenderAwareContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.239">registerSenderAwareContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
<a href="../../../co/aikar/commands/contexts/IssuerAwareContextResolver.html" title="interface in co.aikar.commands.contexts">IssuerAwareContextResolver</a>&lt;T,<a href="../../../co/aikar/commands/CommandContexts.html" title="type parameter in CommandContexts">R</a>&gt;&nbsp;supplier)</pre>
<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Please switch to <a href="../../../co/aikar/commands/CommandContexts.html#registerIssuerAwareContext-java.lang.Class-co.aikar.commands.contexts.IssuerAwareContextResolver-"><code>registerIssuerAwareContext(Class, IssuerAwareContextResolver)</code></a>
as the core wants to use the platform agnostic term of "Issuer" instead of Sender</span></div>
@@ -265,7 +265,7 @@ public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/command
<ul class="blockList">
<li class="blockList">
<h4>registerIssuerAwareContext</h4>
<pre>public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.196">registerIssuerAwareContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
<pre>public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.249">registerIssuerAwareContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
<a href="../../../co/aikar/commands/contexts/IssuerAwareContextResolver.html" title="interface in co.aikar.commands.contexts">IssuerAwareContextResolver</a>&lt;T,<a href="../../../co/aikar/commands/CommandContexts.html" title="type parameter in CommandContexts">R</a>&gt;&nbsp;supplier)</pre>
<div class="block">Registers a context resolver that may conditionally consume input, falling back to using the context of the
issuer to potentially fulfill this context.
@@ -279,7 +279,7 @@ public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/command
<ul class="blockList">
<li class="blockList">
<h4>registerIssuerOnlyContext</h4>
<pre>public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.204">registerIssuerOnlyContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
<pre>public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.257">registerIssuerOnlyContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
<a href="../../../co/aikar/commands/contexts/IssuerOnlyContextResolver.html" title="interface in co.aikar.commands.contexts">IssuerOnlyContextResolver</a>&lt;T,<a href="../../../co/aikar/commands/CommandContexts.html" title="type parameter in CommandContexts">R</a>&gt;&nbsp;supplier)</pre>
<div class="block">Registers a context resolver that will never consume input. It will always satisfy its context based on the
issuer of the command, so it will not appear in syntax strings.</div>
@@ -291,7 +291,7 @@ public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/command
<ul class="blockList">
<li class="blockList">
<h4>registerOptionalContext</h4>
<pre>public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.212">registerOptionalContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
<pre>public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.265">registerOptionalContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
<a href="../../../co/aikar/commands/contexts/OptionalContextResolver.html" title="interface in co.aikar.commands.contexts">OptionalContextResolver</a>&lt;T,<a href="../../../co/aikar/commands/CommandContexts.html" title="type parameter in CommandContexts">R</a>&gt;&nbsp;supplier)</pre>
<div class="block">Registers a context that can safely accept a null input from the command issuer to resolve. This resolver should always
call <a href="../../../co/aikar/commands/CommandExecutionContext.html#popFirstArg--"><code>CommandExecutionContext.popFirstArg()</code></a></div>
@@ -303,7 +303,7 @@ public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/command
<ul class="blockList">
<li class="blockList">
<h4>registerContext</h4>
<pre>public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.220">registerContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
<pre>public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.273">registerContext</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;context,
<a href="../../../co/aikar/commands/contexts/ContextResolver.html" title="interface in co.aikar.commands.contexts">ContextResolver</a>&lt;T,<a href="../../../co/aikar/commands/CommandContexts.html" title="type parameter in CommandContexts">R</a>&gt;&nbsp;supplier)</pre>
<div class="block">Registers a context that requires input from the command issuer to resolve. This resolver should always
call <a href="../../../co/aikar/commands/CommandExecutionContext.html#popFirstArg--"><code>CommandExecutionContext.popFirstArg()</code></a></div>
@@ -315,7 +315,7 @@ public&nbsp;&lt;T&gt;&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/command
<ul class="blockListLast">
<li class="blockList">
<h4>getResolver</h4>
<pre>public&nbsp;<a href="../../../co/aikar/commands/contexts/ContextResolver.html" title="interface in co.aikar.commands.contexts">ContextResolver</a>&lt;?,<a href="../../../co/aikar/commands/CommandContexts.html" title="type parameter in CommandContexts">R</a>&gt;&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.224">getResolver</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;type)</pre>
<pre>public&nbsp;<a href="../../../co/aikar/commands/contexts/ContextResolver.html" title="interface in co.aikar.commands.contexts">ContextResolver</a>&lt;?,<a href="../../../co/aikar/commands/CommandContexts.html" title="type parameter in CommandContexts">R</a>&gt;&nbsp;<a href="../../../src-html/co/aikar/commands/CommandContexts.html#line.277">getResolver</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;type)</pre>
</li>
</ul>
</li>
@@ -184,9 +184,12 @@ implements co.aikar.locales.MessageKeyProvider</pre>
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MessageKeys.html#PERMISSION_DENIED">PERMISSION_DENIED</a></span></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MessageKeys.html#PLEASE_SPECIFY_ONE_OF">PLEASE_SPECIFY_ONE_OF</a></span></code>&nbsp;</td>
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MessageKeys.html#PLEASE_SPECIFY_AT_MOST">PLEASE_SPECIFY_AT_MOST</a></span></code>&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MessageKeys.html#PLEASE_SPECIFY_ONE_OF">PLEASE_SPECIFY_ONE_OF</a></span></code>&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../co/aikar/commands/MessageKeys.html#UNKNOWN_COMMAND">UNKNOWN_COMMAND</a></span></code>&nbsp;</td>
</tr>
</table>
@@ -349,13 +352,22 @@ the order they are declared.</div>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.44">MUST_BE_MAX_LENGTH</a></pre>
</li>
</ul>
<a name="PLEASE_SPECIFY_AT_MOST">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>PLEASE_SPECIFY_AT_MOST</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.45">PLEASE_SPECIFY_AT_MOST</a></pre>
</li>
</ul>
<a name="NOT_ALLOWED_ON_CONSOLE">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>NOT_ALLOWED_ON_CONSOLE</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.45">NOT_ALLOWED_ON_CONSOLE</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.46">NOT_ALLOWED_ON_CONSOLE</a></pre>
</li>
</ul>
<a name="COULD_NOT_FIND_PLAYER">
@@ -364,7 +376,7 @@ the order they are declared.</div>
<ul class="blockList">
<li class="blockList">
<h4>COULD_NOT_FIND_PLAYER</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.46">COULD_NOT_FIND_PLAYER</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.47">COULD_NOT_FIND_PLAYER</a></pre>
</li>
</ul>
<a name="HELP_FORMAT">
@@ -373,7 +385,7 @@ the order they are declared.</div>
<ul class="blockList">
<li class="blockList">
<h4>HELP_FORMAT</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.47">HELP_FORMAT</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.48">HELP_FORMAT</a></pre>
</li>
</ul>
<a name="NO_COMMAND_MATCHED_SEARCH">
@@ -382,7 +394,7 @@ the order they are declared.</div>
<ul class="blockList">
<li class="blockList">
<h4>NO_COMMAND_MATCHED_SEARCH</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.48">NO_COMMAND_MATCHED_SEARCH</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.49">NO_COMMAND_MATCHED_SEARCH</a></pre>
</li>
</ul>
<a name="HELP_PAGE_INFORMATION">
@@ -391,7 +403,7 @@ the order they are declared.</div>
<ul class="blockList">
<li class="blockList">
<h4>HELP_PAGE_INFORMATION</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.49">HELP_PAGE_INFORMATION</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.50">HELP_PAGE_INFORMATION</a></pre>
</li>
</ul>
<a name="HELP_NO_RESULTS">
@@ -400,7 +412,7 @@ the order they are declared.</div>
<ul class="blockListLast">
<li class="blockList">
<h4>HELP_NO_RESULTS</h4>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.50">HELP_NO_RESULTS</a></pre>
<pre>public static final&nbsp;<a href="../../../co/aikar/commands/MessageKeys.html" title="enum in co.aikar.commands">MessageKeys</a> <a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.51">HELP_NO_RESULTS</a></pre>
</li>
</ul>
</li>
@@ -459,7 +471,7 @@ not permitted.)</div>
<ul class="blockListLast">
<li class="blockList">
<h4>getMessageKey</h4>
<pre>public&nbsp;co.aikar.locales.MessageKey&nbsp;<a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.54">getMessageKey</a>()</pre>
<pre>public&nbsp;co.aikar.locales.MessageKey&nbsp;<a href="../../../src-html/co/aikar/commands/MessageKeys.html#line.55">getMessageKey</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>getMessageKey</code>&nbsp;in interface&nbsp;<code>co.aikar.locales.MessageKeyProvider</code></dd>
@@ -217,7 +217,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
<li class="blockList">
<h4>getPermission</h4>
<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.262">getPermission</a>()</pre>
public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.266">getPermission</a>()</pre>
<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
<dl>
<dt><span class="seeLabel">See Also:</span></dt>
@@ -231,7 +231,7 @@ public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.h
<ul class="blockList">
<li class="blockList">
<h4>getRequiredPermissions</h4>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.269">getRequiredPermissions</a>()</pre>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.273">getRequiredPermissions</a>()</pre>
</li>
</ul>
<a name="requiresPermission-java.lang.String-">
@@ -240,7 +240,7 @@ public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.h
<ul class="blockList">
<li class="blockList">
<h4>requiresPermission</h4>
<pre>public&nbsp;boolean&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.276">requiresPermission</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;permission)</pre>
<pre>public&nbsp;boolean&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.280">requiresPermission</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;permission)</pre>
</li>
</ul>
<a name="getPrefSubCommand--">
@@ -249,7 +249,7 @@ public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.h
<ul class="blockList">
<li class="blockList">
<h4>getPrefSubCommand</h4>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.280">getPrefSubCommand</a>()</pre>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.284">getPrefSubCommand</a>()</pre>
</li>
</ul>
<a name="getSyntaxText--">
@@ -258,7 +258,7 @@ public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.h
<ul class="blockList">
<li class="blockList">
<h4>getSyntaxText</h4>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.284">getSyntaxText</a>()</pre>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.288">getSyntaxText</a>()</pre>
</li>
</ul>
<a name="getCommand--">
@@ -267,7 +267,7 @@ public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.h
<ul class="blockList">
<li class="blockList">
<h4>getCommand</h4>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.288">getCommand</a>()</pre>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.292">getCommand</a>()</pre>
</li>
</ul>
<a name="addSubcommand-java.lang.String-">
@@ -276,7 +276,7 @@ public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.h
<ul class="blockList">
<li class="blockList">
<h4>addSubcommand</h4>
<pre>public&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.292">addSubcommand</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
<pre>public&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.296">addSubcommand</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
</li>
</ul>
<a name="addSubcommands-java.util.Collection-">
@@ -285,7 +285,7 @@ public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.h
<ul class="blockListLast">
<li class="blockList">
<h4>addSubcommands</h4>
<pre>public&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.295">addSubcommands</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;cmd)</pre>
<pre>public&nbsp;void&nbsp;<a href="../../../src-html/co/aikar/commands/RegisteredCommand.html#line.299">addSubcommands</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;cmd)</pre>
</li>
</ul>
</li>
@@ -39,213 +39,266 @@
<span class="sourceLineNo">031</span>import co.aikar.commands.contexts.IssuerOnlyContextResolver;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import co.aikar.commands.contexts.OptionalContextResolver;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import com.google.common.collect.Maps;<a name="line.33"></a>
<span class="sourceLineNo">034</span><a name="line.34"></a>
<span class="sourceLineNo">035</span>import java.util.List;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import java.util.Map;<a name="line.36"></a>
<span class="sourceLineNo">037</span><a name="line.37"></a>
<span class="sourceLineNo">038</span>@SuppressWarnings("WeakerAccess")<a name="line.38"></a>
<span class="sourceLineNo">039</span>public class CommandContexts &lt;R extends CommandExecutionContext&lt;?, ? extends CommandIssuer&gt;&gt; {<a name="line.39"></a>
<span class="sourceLineNo">040</span> protected final Map&lt;Class&lt;?&gt;, ContextResolver&lt;?, R&gt;&gt; contextMap = Maps.newHashMap();<a name="line.40"></a>
<span class="sourceLineNo">041</span> protected final CommandManager manager;<a name="line.41"></a>
<span class="sourceLineNo">042</span><a name="line.42"></a>
<span class="sourceLineNo">043</span> CommandContexts(CommandManager manager) {<a name="line.43"></a>
<span class="sourceLineNo">044</span> this.manager = manager;<a name="line.44"></a>
<span class="sourceLineNo">045</span> registerContext(Integer.class, (c) -&gt; {<a name="line.45"></a>
<span class="sourceLineNo">046</span> try {<a name="line.46"></a>
<span class="sourceLineNo">047</span> return ACFUtil.parseNumber(c.popFirstArg(), c.hasFlag("suffixes")).intValue();<a name="line.47"></a>
<span class="sourceLineNo">048</span> } catch (NumberFormatException e) {<a name="line.48"></a>
<span class="sourceLineNo">049</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.49"></a>
<span class="sourceLineNo">050</span> }<a name="line.50"></a>
<span class="sourceLineNo">051</span> });<a name="line.51"></a>
<span class="sourceLineNo">052</span> registerContext(Long.class, (c) -&gt; {<a name="line.52"></a>
<span class="sourceLineNo">053</span> try {<a name="line.53"></a>
<span class="sourceLineNo">054</span> return ACFUtil.parseNumber(c.popFirstArg(), c.hasFlag("suffixes")).longValue();<a name="line.54"></a>
<span class="sourceLineNo">055</span> } catch (NumberFormatException e) {<a name="line.55"></a>
<span class="sourceLineNo">056</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.56"></a>
<span class="sourceLineNo">057</span> }<a name="line.57"></a>
<span class="sourceLineNo">058</span><a name="line.58"></a>
<span class="sourceLineNo">034</span>import org.jetbrains.annotations.NotNull;<a name="line.34"></a>
<span class="sourceLineNo">035</span><a name="line.35"></a>
<span class="sourceLineNo">036</span>import java.util.List;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import java.util.Map;<a name="line.37"></a>
<span class="sourceLineNo">038</span><a name="line.38"></a>
<span class="sourceLineNo">039</span>@SuppressWarnings("WeakerAccess")<a name="line.39"></a>
<span class="sourceLineNo">040</span>public class CommandContexts &lt;R extends CommandExecutionContext&lt;?, ? extends CommandIssuer&gt;&gt; {<a name="line.40"></a>
<span class="sourceLineNo">041</span> protected final Map&lt;Class&lt;?&gt;, ContextResolver&lt;?, R&gt;&gt; contextMap = Maps.newHashMap();<a name="line.41"></a>
<span class="sourceLineNo">042</span> protected final CommandManager manager;<a name="line.42"></a>
<span class="sourceLineNo">043</span><a name="line.43"></a>
<span class="sourceLineNo">044</span> CommandContexts(CommandManager manager) {<a name="line.44"></a>
<span class="sourceLineNo">045</span> this.manager = manager;<a name="line.45"></a>
<span class="sourceLineNo">046</span> registerContext(Short.class, (c) -&gt; {<a name="line.46"></a>
<span class="sourceLineNo">047</span> try {<a name="line.47"></a>
<span class="sourceLineNo">048</span> return parseAndValudateNumber(c, Short.MAX_VALUE).shortValue();<a name="line.48"></a>
<span class="sourceLineNo">049</span> } catch (NumberFormatException e) {<a name="line.49"></a>
<span class="sourceLineNo">050</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.50"></a>
<span class="sourceLineNo">051</span> }<a name="line.51"></a>
<span class="sourceLineNo">052</span> });<a name="line.52"></a>
<span class="sourceLineNo">053</span> registerContext(short.class, (c) -&gt; {<a name="line.53"></a>
<span class="sourceLineNo">054</span> try {<a name="line.54"></a>
<span class="sourceLineNo">055</span> return parseAndValudateNumber(c, Short.MAX_VALUE).shortValue();<a name="line.55"></a>
<span class="sourceLineNo">056</span> } catch (NumberFormatException e) {<a name="line.56"></a>
<span class="sourceLineNo">057</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.57"></a>
<span class="sourceLineNo">058</span> }<a name="line.58"></a>
<span class="sourceLineNo">059</span> });<a name="line.59"></a>
<span class="sourceLineNo">060</span> registerContext(Float.class, (c) -&gt; {<a name="line.60"></a>
<span class="sourceLineNo">060</span> registerContext(Integer.class, (c) -&gt; {<a name="line.60"></a>
<span class="sourceLineNo">061</span> try {<a name="line.61"></a>
<span class="sourceLineNo">062</span> return ACFUtil.parseNumber(c.popFirstArg(), c.hasFlag("suffixes")).floatValue();<a name="line.62"></a>
<span class="sourceLineNo">062</span> return parseAndValudateNumber(c, Integer.MAX_VALUE).intValue();<a name="line.62"></a>
<span class="sourceLineNo">063</span> } catch (NumberFormatException e) {<a name="line.63"></a>
<span class="sourceLineNo">064</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.64"></a>
<span class="sourceLineNo">065</span> }<a name="line.65"></a>
<span class="sourceLineNo">066</span> });<a name="line.66"></a>
<span class="sourceLineNo">067</span> registerContext(Double.class, (c) -&gt; {<a name="line.67"></a>
<span class="sourceLineNo">067</span> registerContext(int.class, (c) -&gt; {<a name="line.67"></a>
<span class="sourceLineNo">068</span> try {<a name="line.68"></a>
<span class="sourceLineNo">069</span> return ACFUtil.parseNumber(c.popFirstArg(), c.hasFlag("suffixes")).doubleValue();<a name="line.69"></a>
<span class="sourceLineNo">069</span> return parseAndValudateNumber(c, Integer.MAX_VALUE).intValue();<a name="line.69"></a>
<span class="sourceLineNo">070</span> } catch (NumberFormatException e) {<a name="line.70"></a>
<span class="sourceLineNo">071</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.71"></a>
<span class="sourceLineNo">072</span> }<a name="line.72"></a>
<span class="sourceLineNo">073</span> });<a name="line.73"></a>
<span class="sourceLineNo">074</span> registerContext(Number.class, (c) -&gt; {<a name="line.74"></a>
<span class="sourceLineNo">074</span> registerContext(Long.class, (c) -&gt; {<a name="line.74"></a>
<span class="sourceLineNo">075</span> try {<a name="line.75"></a>
<span class="sourceLineNo">076</span> return ACFUtil.parseNumber(c.popFirstArg(), c.hasFlag("suffixes"));<a name="line.76"></a>
<span class="sourceLineNo">076</span> return parseAndValudateNumber(c, Long.MAX_VALUE).longValue();<a name="line.76"></a>
<span class="sourceLineNo">077</span> } catch (NumberFormatException e) {<a name="line.77"></a>
<span class="sourceLineNo">078</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.78"></a>
<span class="sourceLineNo">079</span> }<a name="line.79"></a>
<span class="sourceLineNo">080</span> });<a name="line.80"></a>
<span class="sourceLineNo">081</span> registerContext(Boolean.class, (c) -&gt; {<a name="line.81"></a>
<span class="sourceLineNo">082</span> String test = c.popFirstArg();<a name="line.82"></a>
<span class="sourceLineNo">083</span> if (test == null) {<a name="line.83"></a>
<span class="sourceLineNo">084</span> return null;<a name="line.84"></a>
<span class="sourceLineNo">085</span> }<a name="line.85"></a>
<span class="sourceLineNo">086</span> return ACFUtil.isTruthy(test);<a name="line.86"></a>
<span class="sourceLineNo">081</span> registerContext(long.class, (c) -&gt; {<a name="line.81"></a>
<span class="sourceLineNo">082</span> try {<a name="line.82"></a>
<span class="sourceLineNo">083</span> return parseAndValudateNumber(c, Long.MAX_VALUE).longValue();<a name="line.83"></a>
<span class="sourceLineNo">084</span> } catch (NumberFormatException e) {<a name="line.84"></a>
<span class="sourceLineNo">085</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.85"></a>
<span class="sourceLineNo">086</span> }<a name="line.86"></a>
<span class="sourceLineNo">087</span> });<a name="line.87"></a>
<span class="sourceLineNo">088</span> registerContext(String.class, (c) -&gt; {<a name="line.88"></a>
<span class="sourceLineNo">089</span> final Values values = c.getParam().getAnnotation(Values.class);<a name="line.89"></a>
<span class="sourceLineNo">090</span> if (values != null) {<a name="line.90"></a>
<span class="sourceLineNo">091</span> return c.popFirstArg();<a name="line.91"></a>
<span class="sourceLineNo">092</span> }<a name="line.92"></a>
<span class="sourceLineNo">093</span> String ret = (c.isLastArg() &amp;&amp; c.getParam().getAnnotation(Single.class) == null) ?<a name="line.93"></a>
<span class="sourceLineNo">094</span> ACFUtil.join(c.getArgs())<a name="line.94"></a>
<span class="sourceLineNo">095</span> :<a name="line.95"></a>
<span class="sourceLineNo">096</span> c.popFirstArg();<a name="line.96"></a>
<span class="sourceLineNo">097</span><a name="line.97"></a>
<span class="sourceLineNo">098</span> Integer minLen = c.getFlagValue("minlen", (Integer) null);<a name="line.98"></a>
<span class="sourceLineNo">099</span> Integer maxLen = c.getFlagValue("maxlen", (Integer) null);<a name="line.99"></a>
<span class="sourceLineNo">100</span> if (minLen != null) {<a name="line.100"></a>
<span class="sourceLineNo">101</span> if (ret.length() &lt; minLen) {<a name="line.101"></a>
<span class="sourceLineNo">102</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_MIN_LENGTH, "{min}", String.valueOf(minLen));<a name="line.102"></a>
<span class="sourceLineNo">103</span> }<a name="line.103"></a>
<span class="sourceLineNo">104</span> }<a name="line.104"></a>
<span class="sourceLineNo">105</span> if (maxLen != null) {<a name="line.105"></a>
<span class="sourceLineNo">106</span> if (ret.length() &gt; maxLen) {<a name="line.106"></a>
<span class="sourceLineNo">107</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_MAX_LENGTH, "{max}", String.valueOf(maxLen));<a name="line.107"></a>
<span class="sourceLineNo">108</span> }<a name="line.108"></a>
<span class="sourceLineNo">109</span> }<a name="line.109"></a>
<span class="sourceLineNo">110</span><a name="line.110"></a>
<span class="sourceLineNo">111</span> return ret;<a name="line.111"></a>
<span class="sourceLineNo">112</span> });<a name="line.112"></a>
<span class="sourceLineNo">113</span> registerContext(String[].class, (c) -&gt; {<a name="line.113"></a>
<span class="sourceLineNo">114</span> String val;<a name="line.114"></a>
<span class="sourceLineNo">115</span> // Go home IDEA, you're drunk<a name="line.115"></a>
<span class="sourceLineNo">116</span> //noinspection unchecked<a name="line.116"></a>
<span class="sourceLineNo">117</span> List&lt;String&gt; args = c.getArgs();<a name="line.117"></a>
<span class="sourceLineNo">118</span> if (c.isLastArg() &amp;&amp; c.getParam().getAnnotation(Single.class) == null) {<a name="line.118"></a>
<span class="sourceLineNo">119</span> val = ACFUtil.join(args);<a name="line.119"></a>
<span class="sourceLineNo">120</span> } else {<a name="line.120"></a>
<span class="sourceLineNo">121</span> val = c.popFirstArg();<a name="line.121"></a>
<span class="sourceLineNo">122</span> }<a name="line.122"></a>
<span class="sourceLineNo">123</span> Split split = c.getParam().getAnnotation(Split.class);<a name="line.123"></a>
<span class="sourceLineNo">124</span> if (split != null) {<a name="line.124"></a>
<span class="sourceLineNo">125</span> if (val.isEmpty()) {<a name="line.125"></a>
<span class="sourceLineNo">126</span> throw new InvalidCommandArgument();<a name="line.126"></a>
<span class="sourceLineNo">127</span> }<a name="line.127"></a>
<span class="sourceLineNo">128</span> return ACFPatterns.getPattern(split.value()).split(val);<a name="line.128"></a>
<span class="sourceLineNo">129</span> } else if (!c.isLastArg()) {<a name="line.129"></a>
<span class="sourceLineNo">130</span> ACFUtil.sneaky(new IllegalStateException("Weird Command signature... String[] should be last or @Split"));<a name="line.130"></a>
<span class="sourceLineNo">131</span> }<a name="line.131"></a>
<span class="sourceLineNo">132</span><a name="line.132"></a>
<span class="sourceLineNo">133</span> String[] result = args.toArray(new String[args.size()]);<a name="line.133"></a>
<span class="sourceLineNo">134</span> args.clear();<a name="line.134"></a>
<span class="sourceLineNo">135</span> return result;<a name="line.135"></a>
<span class="sourceLineNo">136</span> });<a name="line.136"></a>
<span class="sourceLineNo">137</span><a name="line.137"></a>
<span class="sourceLineNo">138</span> registerContext(Enum.class, (c) -&gt; {<a name="line.138"></a>
<span class="sourceLineNo">139</span> final String first = c.popFirstArg();<a name="line.139"></a>
<span class="sourceLineNo">140</span> //noinspection unchecked<a name="line.140"></a>
<span class="sourceLineNo">141</span> Class&lt;? extends Enum&lt;?&gt;&gt; enumCls = (Class&lt;? extends Enum&lt;?&gt;&gt;) c.getParam().getType();<a name="line.141"></a>
<span class="sourceLineNo">142</span> Enum&lt;?&gt; match = ACFUtil.simpleMatch(enumCls, first);<a name="line.142"></a>
<span class="sourceLineNo">143</span> if (match == null) {<a name="line.143"></a>
<span class="sourceLineNo">144</span> List&lt;String&gt; names = ACFUtil.enumNames(enumCls);<a name="line.144"></a>
<span class="sourceLineNo">145</span> throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_ONE_OF, "{valid}", ACFUtil.join(names));<a name="line.145"></a>
<span class="sourceLineNo">146</span> }<a name="line.146"></a>
<span class="sourceLineNo">147</span> return match;<a name="line.147"></a>
<span class="sourceLineNo">148</span> });<a name="line.148"></a>
<span class="sourceLineNo">149</span> registerOptionalContext(CommandHelp.class, (c) -&gt; {<a name="line.149"></a>
<span class="sourceLineNo">150</span> String first = c.getFirstArg();<a name="line.150"></a>
<span class="sourceLineNo">151</span> String last = c.getLastArg();<a name="line.151"></a>
<span class="sourceLineNo">152</span> int page = 1;<a name="line.152"></a>
<span class="sourceLineNo">153</span> List&lt;String&gt; search = null;<a name="line.153"></a>
<span class="sourceLineNo">154</span> if (last != null &amp;&amp; ACFUtil.isInteger(last)) {<a name="line.154"></a>
<span class="sourceLineNo">155</span> c.popLastArg();<a name="line.155"></a>
<span class="sourceLineNo">156</span> page = ACFUtil.parseInt(last);<a name="line.156"></a>
<span class="sourceLineNo">157</span> if (!c.getArgs().isEmpty()) {<a name="line.157"></a>
<span class="sourceLineNo">158</span> search = c.getArgs();<a name="line.158"></a>
<span class="sourceLineNo">159</span> }<a name="line.159"></a>
<span class="sourceLineNo">160</span> } else if (first != null &amp;&amp; ACFUtil.isInteger(first)) {<a name="line.160"></a>
<span class="sourceLineNo">161</span> c.popFirstArg();<a name="line.161"></a>
<span class="sourceLineNo">162</span> page = ACFUtil.parseInt(first);<a name="line.162"></a>
<span class="sourceLineNo">163</span> if (!c.getArgs().isEmpty()) {<a name="line.163"></a>
<span class="sourceLineNo">164</span> search = c.getArgs();<a name="line.164"></a>
<span class="sourceLineNo">165</span> }<a name="line.165"></a>
<span class="sourceLineNo">166</span> } else if (!c.getArgs().isEmpty()) {<a name="line.166"></a>
<span class="sourceLineNo">167</span> search = c.getArgs();<a name="line.167"></a>
<span class="sourceLineNo">168</span> }<a name="line.168"></a>
<span class="sourceLineNo">169</span> CommandHelp commandHelp = manager.generateCommandHelp();<a name="line.169"></a>
<span class="sourceLineNo">170</span> commandHelp.setPage(page);<a name="line.170"></a>
<span class="sourceLineNo">171</span> Integer perPage = c.getFlagValue("perpage", (Integer) null);<a name="line.171"></a>
<span class="sourceLineNo">172</span> if (perPage != null) {<a name="line.172"></a>
<span class="sourceLineNo">173</span> commandHelp.setPerPage(perPage);<a name="line.173"></a>
<span class="sourceLineNo">174</span> }<a name="line.174"></a>
<span class="sourceLineNo">175</span> commandHelp.setSearch(search);<a name="line.175"></a>
<span class="sourceLineNo">176</span> return commandHelp;<a name="line.176"></a>
<span class="sourceLineNo">177</span> });<a name="line.177"></a>
<span class="sourceLineNo">178</span> }<a name="line.178"></a>
<span class="sourceLineNo">179</span><a name="line.179"></a>
<span class="sourceLineNo">180</span> /**<a name="line.180"></a>
<span class="sourceLineNo">181</span> * @deprecated Please switch to {@link #registerIssuerAwareContext(Class, IssuerAwareContextResolver)}<a name="line.181"></a>
<span class="sourceLineNo">182</span> * as the core wants to use the platform agnostic term of "Issuer" instead of Sender<a name="line.182"></a>
<span class="sourceLineNo">183</span> * @see #registerIssuerAwareContext(Class, IssuerAwareContextResolver)<a name="line.183"></a>
<span class="sourceLineNo">184</span> */<a name="line.184"></a>
<span class="sourceLineNo">185</span> @Deprecated<a name="line.185"></a>
<span class="sourceLineNo">186</span> public &lt;T&gt; void registerSenderAwareContext(Class&lt;T&gt; context, IssuerAwareContextResolver&lt;T, R&gt; supplier) {<a name="line.186"></a>
<span class="sourceLineNo">187</span> contextMap.put(context, supplier);<a name="line.187"></a>
<span class="sourceLineNo">188</span> }<a name="line.188"></a>
<span class="sourceLineNo">189</span><a name="line.189"></a>
<span class="sourceLineNo">190</span> /**<a name="line.190"></a>
<span class="sourceLineNo">191</span> * Registers a context resolver that may conditionally consume input, falling back to using the context of the<a name="line.191"></a>
<span class="sourceLineNo">192</span> * issuer to potentially fulfill this context.<a name="line.192"></a>
<span class="sourceLineNo">193</span> * You may call {@link CommandExecutionContext#getFirstArg()} and then conditionally call {@link CommandExecutionContext#popFirstArg()}<a name="line.193"></a>
<span class="sourceLineNo">194</span> * if you want to consume that input.<a name="line.194"></a>
<span class="sourceLineNo">195</span> */<a name="line.195"></a>
<span class="sourceLineNo">196</span> public &lt;T&gt; void registerIssuerAwareContext(Class&lt;T&gt; context, IssuerAwareContextResolver&lt;T, R&gt; supplier) {<a name="line.196"></a>
<span class="sourceLineNo">197</span> contextMap.put(context, supplier);<a name="line.197"></a>
<span class="sourceLineNo">198</span> }<a name="line.198"></a>
<span class="sourceLineNo">199</span><a name="line.199"></a>
<span class="sourceLineNo">200</span> /**<a name="line.200"></a>
<span class="sourceLineNo">201</span> * Registers a context resolver that will never consume input. It will always satisfy its context based on the<a name="line.201"></a>
<span class="sourceLineNo">202</span> * issuer of the command, so it will not appear in syntax strings.<a name="line.202"></a>
<span class="sourceLineNo">203</span> */<a name="line.203"></a>
<span class="sourceLineNo">204</span> public &lt;T&gt; void registerIssuerOnlyContext(Class&lt;T&gt; context, IssuerOnlyContextResolver&lt;T, R&gt; supplier) {<a name="line.204"></a>
<span class="sourceLineNo">205</span> contextMap.put(context, supplier);<a name="line.205"></a>
<span class="sourceLineNo">206</span> }<a name="line.206"></a>
<span class="sourceLineNo">207</span><a name="line.207"></a>
<span class="sourceLineNo">208</span> /**<a name="line.208"></a>
<span class="sourceLineNo">209</span> * Registers a context that can safely accept a null input from the command issuer to resolve. This resolver should always<a name="line.209"></a>
<span class="sourceLineNo">210</span> * call {@link CommandExecutionContext#popFirstArg()}<a name="line.210"></a>
<span class="sourceLineNo">211</span> */<a name="line.211"></a>
<span class="sourceLineNo">212</span> public &lt;T&gt; void registerOptionalContext(Class&lt;T&gt; context, OptionalContextResolver&lt;T, R&gt; supplier) {<a name="line.212"></a>
<span class="sourceLineNo">213</span> contextMap.put(context, supplier);<a name="line.213"></a>
<span class="sourceLineNo">214</span> }<a name="line.214"></a>
<span class="sourceLineNo">215</span><a name="line.215"></a>
<span class="sourceLineNo">216</span> /**<a name="line.216"></a>
<span class="sourceLineNo">217</span> * Registers a context that requires input from the command issuer to resolve. This resolver should always<a name="line.217"></a>
<span class="sourceLineNo">218</span> * call {@link CommandExecutionContext#popFirstArg()}<a name="line.218"></a>
<span class="sourceLineNo">219</span> */<a name="line.219"></a>
<span class="sourceLineNo">220</span> public &lt;T&gt; void registerContext(Class&lt;T&gt; context, ContextResolver&lt;T, R&gt; supplier) {<a name="line.220"></a>
<span class="sourceLineNo">221</span> contextMap.put(context, supplier);<a name="line.221"></a>
<span class="sourceLineNo">088</span> registerContext(Float.class, (c) -&gt; {<a name="line.88"></a>
<span class="sourceLineNo">089</span> try {<a name="line.89"></a>
<span class="sourceLineNo">090</span> return parseAndValudateNumber(c, Float.MAX_VALUE).floatValue();<a name="line.90"></a>
<span class="sourceLineNo">091</span> } catch (NumberFormatException e) {<a name="line.91"></a>
<span class="sourceLineNo">092</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.92"></a>
<span class="sourceLineNo">093</span> }<a name="line.93"></a>
<span class="sourceLineNo">094</span> });<a name="line.94"></a>
<span class="sourceLineNo">095</span> registerContext(float.class, (c) -&gt; {<a name="line.95"></a>
<span class="sourceLineNo">096</span> try {<a name="line.96"></a>
<span class="sourceLineNo">097</span> return parseAndValudateNumber(c, Float.MAX_VALUE).floatValue();<a name="line.97"></a>
<span class="sourceLineNo">098</span> } catch (NumberFormatException e) {<a name="line.98"></a>
<span class="sourceLineNo">099</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.99"></a>
<span class="sourceLineNo">100</span> }<a name="line.100"></a>
<span class="sourceLineNo">101</span> });<a name="line.101"></a>
<span class="sourceLineNo">102</span> registerContext(Double.class, (c) -&gt; {<a name="line.102"></a>
<span class="sourceLineNo">103</span> try {<a name="line.103"></a>
<span class="sourceLineNo">104</span> return parseAndValudateNumber(c, Double.MAX_VALUE).doubleValue();<a name="line.104"></a>
<span class="sourceLineNo">105</span> } catch (NumberFormatException e) {<a name="line.105"></a>
<span class="sourceLineNo">106</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.106"></a>
<span class="sourceLineNo">107</span> }<a name="line.107"></a>
<span class="sourceLineNo">108</span> });<a name="line.108"></a>
<span class="sourceLineNo">109</span> registerContext(double.class, (c) -&gt; {<a name="line.109"></a>
<span class="sourceLineNo">110</span> try {<a name="line.110"></a>
<span class="sourceLineNo">111</span> return parseAndValudateNumber(c, Double.MAX_VALUE).doubleValue();<a name="line.111"></a>
<span class="sourceLineNo">112</span> } catch (NumberFormatException e) {<a name="line.112"></a>
<span class="sourceLineNo">113</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.113"></a>
<span class="sourceLineNo">114</span> }<a name="line.114"></a>
<span class="sourceLineNo">115</span> });<a name="line.115"></a>
<span class="sourceLineNo">116</span> registerContext(Number.class, (c) -&gt; {<a name="line.116"></a>
<span class="sourceLineNo">117</span> try {<a name="line.117"></a>
<span class="sourceLineNo">118</span> return parseAndValudateNumber(c, Double.MAX_VALUE);<a name="line.118"></a>
<span class="sourceLineNo">119</span> } catch (NumberFormatException e) {<a name="line.119"></a>
<span class="sourceLineNo">120</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER);<a name="line.120"></a>
<span class="sourceLineNo">121</span> }<a name="line.121"></a>
<span class="sourceLineNo">122</span> });<a name="line.122"></a>
<span class="sourceLineNo">123</span> registerContext(Boolean.class, (c) -&gt; ACFUtil.isTruthy(c.popFirstArg()));<a name="line.123"></a>
<span class="sourceLineNo">124</span> registerContext(boolean.class, (c) -&gt; ACFUtil.isTruthy(c.popFirstArg()));<a name="line.124"></a>
<span class="sourceLineNo">125</span> registerContext(char.class, c -&gt; {<a name="line.125"></a>
<span class="sourceLineNo">126</span> String s = c.popFirstArg();<a name="line.126"></a>
<span class="sourceLineNo">127</span> if (s.length() &gt; 1) {<a name="line.127"></a>
<span class="sourceLineNo">128</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_MAX_LENGTH, "{max}", String.valueOf(1));<a name="line.128"></a>
<span class="sourceLineNo">129</span> }<a name="line.129"></a>
<span class="sourceLineNo">130</span> return s.charAt(0);<a name="line.130"></a>
<span class="sourceLineNo">131</span> });<a name="line.131"></a>
<span class="sourceLineNo">132</span> registerContext(String.class, (c) -&gt; {<a name="line.132"></a>
<span class="sourceLineNo">133</span> final Values values = c.getParam().getAnnotation(Values.class);<a name="line.133"></a>
<span class="sourceLineNo">134</span> if (values != null) {<a name="line.134"></a>
<span class="sourceLineNo">135</span> return c.popFirstArg();<a name="line.135"></a>
<span class="sourceLineNo">136</span> }<a name="line.136"></a>
<span class="sourceLineNo">137</span> String ret = (c.isLastArg() &amp;&amp; c.getParam().getAnnotation(Single.class) == null) ?<a name="line.137"></a>
<span class="sourceLineNo">138</span> ACFUtil.join(c.getArgs())<a name="line.138"></a>
<span class="sourceLineNo">139</span> :<a name="line.139"></a>
<span class="sourceLineNo">140</span> c.popFirstArg();<a name="line.140"></a>
<span class="sourceLineNo">141</span><a name="line.141"></a>
<span class="sourceLineNo">142</span> Integer minLen = c.getFlagValue("minlen", (Integer) null);<a name="line.142"></a>
<span class="sourceLineNo">143</span> Integer maxLen = c.getFlagValue("maxlen", (Integer) null);<a name="line.143"></a>
<span class="sourceLineNo">144</span> if (minLen != null) {<a name="line.144"></a>
<span class="sourceLineNo">145</span> if (ret.length() &lt; minLen) {<a name="line.145"></a>
<span class="sourceLineNo">146</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_MIN_LENGTH, "{min}", String.valueOf(minLen));<a name="line.146"></a>
<span class="sourceLineNo">147</span> }<a name="line.147"></a>
<span class="sourceLineNo">148</span> }<a name="line.148"></a>
<span class="sourceLineNo">149</span> if (maxLen != null) {<a name="line.149"></a>
<span class="sourceLineNo">150</span> if (ret.length() &gt; maxLen) {<a name="line.150"></a>
<span class="sourceLineNo">151</span> throw new InvalidCommandArgument(MessageKeys.MUST_BE_MAX_LENGTH, "{max}", String.valueOf(maxLen));<a name="line.151"></a>
<span class="sourceLineNo">152</span> }<a name="line.152"></a>
<span class="sourceLineNo">153</span> }<a name="line.153"></a>
<span class="sourceLineNo">154</span><a name="line.154"></a>
<span class="sourceLineNo">155</span> return ret;<a name="line.155"></a>
<span class="sourceLineNo">156</span> });<a name="line.156"></a>
<span class="sourceLineNo">157</span> registerContext(String[].class, (c) -&gt; {<a name="line.157"></a>
<span class="sourceLineNo">158</span> String val;<a name="line.158"></a>
<span class="sourceLineNo">159</span> // Go home IDEA, you're drunk<a name="line.159"></a>
<span class="sourceLineNo">160</span> //noinspection unchecked<a name="line.160"></a>
<span class="sourceLineNo">161</span> List&lt;String&gt; args = c.getArgs();<a name="line.161"></a>
<span class="sourceLineNo">162</span> if (c.isLastArg() &amp;&amp; c.getParam().getAnnotation(Single.class) == null) {<a name="line.162"></a>
<span class="sourceLineNo">163</span> val = ACFUtil.join(args);<a name="line.163"></a>
<span class="sourceLineNo">164</span> } else {<a name="line.164"></a>
<span class="sourceLineNo">165</span> val = c.popFirstArg();<a name="line.165"></a>
<span class="sourceLineNo">166</span> }<a name="line.166"></a>
<span class="sourceLineNo">167</span> Split split = c.getParam().getAnnotation(Split.class);<a name="line.167"></a>
<span class="sourceLineNo">168</span> if (split != null) {<a name="line.168"></a>
<span class="sourceLineNo">169</span> if (val.isEmpty()) {<a name="line.169"></a>
<span class="sourceLineNo">170</span> throw new InvalidCommandArgument();<a name="line.170"></a>
<span class="sourceLineNo">171</span> }<a name="line.171"></a>
<span class="sourceLineNo">172</span> return ACFPatterns.getPattern(split.value()).split(val);<a name="line.172"></a>
<span class="sourceLineNo">173</span> } else if (!c.isLastArg()) {<a name="line.173"></a>
<span class="sourceLineNo">174</span> ACFUtil.sneaky(new IllegalStateException("Weird Command signature... String[] should be last or @Split"));<a name="line.174"></a>
<span class="sourceLineNo">175</span> }<a name="line.175"></a>
<span class="sourceLineNo">176</span><a name="line.176"></a>
<span class="sourceLineNo">177</span> String[] result = args.toArray(new String[args.size()]);<a name="line.177"></a>
<span class="sourceLineNo">178</span> args.clear();<a name="line.178"></a>
<span class="sourceLineNo">179</span> return result;<a name="line.179"></a>
<span class="sourceLineNo">180</span> });<a name="line.180"></a>
<span class="sourceLineNo">181</span><a name="line.181"></a>
<span class="sourceLineNo">182</span> registerContext(Enum.class, (c) -&gt; {<a name="line.182"></a>
<span class="sourceLineNo">183</span> final String first = c.popFirstArg();<a name="line.183"></a>
<span class="sourceLineNo">184</span> //noinspection unchecked<a name="line.184"></a>
<span class="sourceLineNo">185</span> Class&lt;? extends Enum&lt;?&gt;&gt; enumCls = (Class&lt;? extends Enum&lt;?&gt;&gt;) c.getParam().getType();<a name="line.185"></a>
<span class="sourceLineNo">186</span> Enum&lt;?&gt; match = ACFUtil.simpleMatch(enumCls, first);<a name="line.186"></a>
<span class="sourceLineNo">187</span> if (match == null) {<a name="line.187"></a>
<span class="sourceLineNo">188</span> List&lt;String&gt; names = ACFUtil.enumNames(enumCls);<a name="line.188"></a>
<span class="sourceLineNo">189</span> throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_ONE_OF, "{valid}", ACFUtil.join(names));<a name="line.189"></a>
<span class="sourceLineNo">190</span> }<a name="line.190"></a>
<span class="sourceLineNo">191</span> return match;<a name="line.191"></a>
<span class="sourceLineNo">192</span> });<a name="line.192"></a>
<span class="sourceLineNo">193</span> registerOptionalContext(CommandHelp.class, (c) -&gt; {<a name="line.193"></a>
<span class="sourceLineNo">194</span> String first = c.getFirstArg();<a name="line.194"></a>
<span class="sourceLineNo">195</span> String last = c.getLastArg();<a name="line.195"></a>
<span class="sourceLineNo">196</span> int page = 1;<a name="line.196"></a>
<span class="sourceLineNo">197</span> List&lt;String&gt; search = null;<a name="line.197"></a>
<span class="sourceLineNo">198</span> if (last != null &amp;&amp; ACFUtil.isInteger(last)) {<a name="line.198"></a>
<span class="sourceLineNo">199</span> c.popLastArg();<a name="line.199"></a>
<span class="sourceLineNo">200</span> page = ACFUtil.parseInt(last);<a name="line.200"></a>
<span class="sourceLineNo">201</span> if (!c.getArgs().isEmpty()) {<a name="line.201"></a>
<span class="sourceLineNo">202</span> search = c.getArgs();<a name="line.202"></a>
<span class="sourceLineNo">203</span> }<a name="line.203"></a>
<span class="sourceLineNo">204</span> } else if (first != null &amp;&amp; ACFUtil.isInteger(first)) {<a name="line.204"></a>
<span class="sourceLineNo">205</span> c.popFirstArg();<a name="line.205"></a>
<span class="sourceLineNo">206</span> page = ACFUtil.parseInt(first);<a name="line.206"></a>
<span class="sourceLineNo">207</span> if (!c.getArgs().isEmpty()) {<a name="line.207"></a>
<span class="sourceLineNo">208</span> search = c.getArgs();<a name="line.208"></a>
<span class="sourceLineNo">209</span> }<a name="line.209"></a>
<span class="sourceLineNo">210</span> } else if (!c.getArgs().isEmpty()) {<a name="line.210"></a>
<span class="sourceLineNo">211</span> search = c.getArgs();<a name="line.211"></a>
<span class="sourceLineNo">212</span> }<a name="line.212"></a>
<span class="sourceLineNo">213</span> CommandHelp commandHelp = manager.generateCommandHelp();<a name="line.213"></a>
<span class="sourceLineNo">214</span> commandHelp.setPage(page);<a name="line.214"></a>
<span class="sourceLineNo">215</span> Integer perPage = c.getFlagValue("perpage", (Integer) null);<a name="line.215"></a>
<span class="sourceLineNo">216</span> if (perPage != null) {<a name="line.216"></a>
<span class="sourceLineNo">217</span> commandHelp.setPerPage(perPage);<a name="line.217"></a>
<span class="sourceLineNo">218</span> }<a name="line.218"></a>
<span class="sourceLineNo">219</span> commandHelp.setSearch(search);<a name="line.219"></a>
<span class="sourceLineNo">220</span> return commandHelp;<a name="line.220"></a>
<span class="sourceLineNo">221</span> });<a name="line.221"></a>
<span class="sourceLineNo">222</span> }<a name="line.222"></a>
<span class="sourceLineNo">223</span><a name="line.223"></a>
<span class="sourceLineNo">224</span> public ContextResolver&lt;?, R&gt; getResolver(Class&lt;?&gt; type) {<a name="line.224"></a>
<span class="sourceLineNo">225</span> Class&lt;?&gt; rootType = type;<a name="line.225"></a>
<span class="sourceLineNo">226</span> do {<a name="line.226"></a>
<span class="sourceLineNo">227</span> if (type == Object.class) {<a name="line.227"></a>
<span class="sourceLineNo">228</span> break;<a name="line.228"></a>
<span class="sourceLineNo">229</span> }<a name="line.229"></a>
<span class="sourceLineNo">230</span><a name="line.230"></a>
<span class="sourceLineNo">231</span> final ContextResolver&lt;?, R&gt; resolver = contextMap.get(type);<a name="line.231"></a>
<span class="sourceLineNo">232</span> if (resolver != null) {<a name="line.232"></a>
<span class="sourceLineNo">233</span> return resolver;<a name="line.233"></a>
<span class="sourceLineNo">234</span> }<a name="line.234"></a>
<span class="sourceLineNo">235</span> } while ((type = type.getSuperclass()) != null);<a name="line.235"></a>
<span class="sourceLineNo">236</span><a name="line.236"></a>
<span class="sourceLineNo">237</span> this.manager.log(LogLevel.ERROR, "Could not find context resolver", new IllegalStateException("No context resolver defined for " + rootType.getName()));<a name="line.237"></a>
<span class="sourceLineNo">238</span> return null;<a name="line.238"></a>
<span class="sourceLineNo">239</span> }<a name="line.239"></a>
<span class="sourceLineNo">240</span>}<a name="line.240"></a>
<span class="sourceLineNo">224</span> @NotNull<a name="line.224"></a>
<span class="sourceLineNo">225</span> private Number parseAndValudateNumber(R c, Number maxValue) throws InvalidCommandArgument {<a name="line.225"></a>
<span class="sourceLineNo">226</span> Number val = ACFUtil.parseNumber(c.popFirstArg(), c.hasFlag("suffixes"));<a name="line.226"></a>
<span class="sourceLineNo">227</span> if (maxValue != null &amp;&amp; val.doubleValue() &gt; maxValue.doubleValue()) {<a name="line.227"></a>
<span class="sourceLineNo">228</span> throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_AT_MOST, "{max}", String.valueOf(maxValue));<a name="line.228"></a>
<span class="sourceLineNo">229</span> }<a name="line.229"></a>
<span class="sourceLineNo">230</span> return val;<a name="line.230"></a>
<span class="sourceLineNo">231</span> }<a name="line.231"></a>
<span class="sourceLineNo">232</span><a name="line.232"></a>
<span class="sourceLineNo">233</span> /**<a name="line.233"></a>
<span class="sourceLineNo">234</span> * @deprecated Please switch to {@link #registerIssuerAwareContext(Class, IssuerAwareContextResolver)}<a name="line.234"></a>
<span class="sourceLineNo">235</span> * as the core wants to use the platform agnostic term of "Issuer" instead of Sender<a name="line.235"></a>
<span class="sourceLineNo">236</span> * @see #registerIssuerAwareContext(Class, IssuerAwareContextResolver)<a name="line.236"></a>
<span class="sourceLineNo">237</span> */<a name="line.237"></a>
<span class="sourceLineNo">238</span> @Deprecated<a name="line.238"></a>
<span class="sourceLineNo">239</span> public &lt;T&gt; void registerSenderAwareContext(Class&lt;T&gt; context, IssuerAwareContextResolver&lt;T, R&gt; supplier) {<a name="line.239"></a>
<span class="sourceLineNo">240</span> contextMap.put(context, supplier);<a name="line.240"></a>
<span class="sourceLineNo">241</span> }<a name="line.241"></a>
<span class="sourceLineNo">242</span><a name="line.242"></a>
<span class="sourceLineNo">243</span> /**<a name="line.243"></a>
<span class="sourceLineNo">244</span> * Registers a context resolver that may conditionally consume input, falling back to using the context of the<a name="line.244"></a>
<span class="sourceLineNo">245</span> * issuer to potentially fulfill this context.<a name="line.245"></a>
<span class="sourceLineNo">246</span> * You may call {@link CommandExecutionContext#getFirstArg()} and then conditionally call {@link CommandExecutionContext#popFirstArg()}<a name="line.246"></a>
<span class="sourceLineNo">247</span> * if you want to consume that input.<a name="line.247"></a>
<span class="sourceLineNo">248</span> */<a name="line.248"></a>
<span class="sourceLineNo">249</span> public &lt;T&gt; void registerIssuerAwareContext(Class&lt;T&gt; context, IssuerAwareContextResolver&lt;T, R&gt; supplier) {<a name="line.249"></a>
<span class="sourceLineNo">250</span> contextMap.put(context, supplier);<a name="line.250"></a>
<span class="sourceLineNo">251</span> }<a name="line.251"></a>
<span class="sourceLineNo">252</span><a name="line.252"></a>
<span class="sourceLineNo">253</span> /**<a name="line.253"></a>
<span class="sourceLineNo">254</span> * Registers a context resolver that will never consume input. It will always satisfy its context based on the<a name="line.254"></a>
<span class="sourceLineNo">255</span> * issuer of the command, so it will not appear in syntax strings.<a name="line.255"></a>
<span class="sourceLineNo">256</span> */<a name="line.256"></a>
<span class="sourceLineNo">257</span> public &lt;T&gt; void registerIssuerOnlyContext(Class&lt;T&gt; context, IssuerOnlyContextResolver&lt;T, R&gt; supplier) {<a name="line.257"></a>
<span class="sourceLineNo">258</span> contextMap.put(context, supplier);<a name="line.258"></a>
<span class="sourceLineNo">259</span> }<a name="line.259"></a>
<span class="sourceLineNo">260</span><a name="line.260"></a>
<span class="sourceLineNo">261</span> /**<a name="line.261"></a>
<span class="sourceLineNo">262</span> * Registers a context that can safely accept a null input from the command issuer to resolve. This resolver should always<a name="line.262"></a>
<span class="sourceLineNo">263</span> * call {@link CommandExecutionContext#popFirstArg()}<a name="line.263"></a>
<span class="sourceLineNo">264</span> */<a name="line.264"></a>
<span class="sourceLineNo">265</span> public &lt;T&gt; void registerOptionalContext(Class&lt;T&gt; context, OptionalContextResolver&lt;T, R&gt; supplier) {<a name="line.265"></a>
<span class="sourceLineNo">266</span> contextMap.put(context, supplier);<a name="line.266"></a>
<span class="sourceLineNo">267</span> }<a name="line.267"></a>
<span class="sourceLineNo">268</span><a name="line.268"></a>
<span class="sourceLineNo">269</span> /**<a name="line.269"></a>
<span class="sourceLineNo">270</span> * Registers a context that requires input from the command issuer to resolve. This resolver should always<a name="line.270"></a>
<span class="sourceLineNo">271</span> * call {@link CommandExecutionContext#popFirstArg()}<a name="line.271"></a>
<span class="sourceLineNo">272</span> */<a name="line.272"></a>
<span class="sourceLineNo">273</span> public &lt;T&gt; void registerContext(Class&lt;T&gt; context, ContextResolver&lt;T, R&gt; supplier) {<a name="line.273"></a>
<span class="sourceLineNo">274</span> contextMap.put(context, supplier);<a name="line.274"></a>
<span class="sourceLineNo">275</span> }<a name="line.275"></a>
<span class="sourceLineNo">276</span><a name="line.276"></a>
<span class="sourceLineNo">277</span> public ContextResolver&lt;?, R&gt; getResolver(Class&lt;?&gt; type) {<a name="line.277"></a>
<span class="sourceLineNo">278</span> Class&lt;?&gt; rootType = type;<a name="line.278"></a>
<span class="sourceLineNo">279</span> do {<a name="line.279"></a>
<span class="sourceLineNo">280</span> if (type == Object.class) {<a name="line.280"></a>
<span class="sourceLineNo">281</span> break;<a name="line.281"></a>
<span class="sourceLineNo">282</span> }<a name="line.282"></a>
<span class="sourceLineNo">283</span><a name="line.283"></a>
<span class="sourceLineNo">284</span> final ContextResolver&lt;?, R&gt; resolver = contextMap.get(type);<a name="line.284"></a>
<span class="sourceLineNo">285</span> if (resolver != null) {<a name="line.285"></a>
<span class="sourceLineNo">286</span> return resolver;<a name="line.286"></a>
<span class="sourceLineNo">287</span> }<a name="line.287"></a>
<span class="sourceLineNo">288</span> } while ((type = type.getSuperclass()) != null);<a name="line.288"></a>
<span class="sourceLineNo">289</span><a name="line.289"></a>
<span class="sourceLineNo">290</span> this.manager.log(LogLevel.ERROR, "Could not find context resolver", new IllegalStateException("No context resolver defined for " + rootType.getName()));<a name="line.290"></a>
<span class="sourceLineNo">291</span> return null;<a name="line.291"></a>
<span class="sourceLineNo">292</span> }<a name="line.292"></a>
<span class="sourceLineNo">293</span>}<a name="line.293"></a>
@@ -50,19 +50,20 @@
<span class="sourceLineNo">042</span> MUST_BE_A_NUMBER,<a name="line.42"></a>
<span class="sourceLineNo">043</span> MUST_BE_MIN_LENGTH,<a name="line.43"></a>
<span class="sourceLineNo">044</span> MUST_BE_MAX_LENGTH,<a name="line.44"></a>
<span class="sourceLineNo">045</span> NOT_ALLOWED_ON_CONSOLE,<a name="line.45"></a>
<span class="sourceLineNo">046</span> COULD_NOT_FIND_PLAYER,<a name="line.46"></a>
<span class="sourceLineNo">047</span> HELP_FORMAT,<a name="line.47"></a>
<span class="sourceLineNo">048</span> NO_COMMAND_MATCHED_SEARCH,<a name="line.48"></a>
<span class="sourceLineNo">049</span> HELP_PAGE_INFORMATION,<a name="line.49"></a>
<span class="sourceLineNo">050</span> HELP_NO_RESULTS<a name="line.50"></a>
<span class="sourceLineNo">051</span> ;<a name="line.51"></a>
<span class="sourceLineNo">052</span><a name="line.52"></a>
<span class="sourceLineNo">053</span> private final MessageKey key = MessageKey.of("acf-core." + this.name().toLowerCase());<a name="line.53"></a>
<span class="sourceLineNo">054</span> public MessageKey getMessageKey() {<a name="line.54"></a>
<span class="sourceLineNo">055</span> return key;<a name="line.55"></a>
<span class="sourceLineNo">056</span> }<a name="line.56"></a>
<span class="sourceLineNo">057</span>}<a name="line.57"></a>
<span class="sourceLineNo">045</span> PLEASE_SPECIFY_AT_MOST,<a name="line.45"></a>
<span class="sourceLineNo">046</span> NOT_ALLOWED_ON_CONSOLE,<a name="line.46"></a>
<span class="sourceLineNo">047</span> COULD_NOT_FIND_PLAYER,<a name="line.47"></a>
<span class="sourceLineNo">048</span> HELP_FORMAT,<a name="line.48"></a>
<span class="sourceLineNo">049</span> NO_COMMAND_MATCHED_SEARCH,<a name="line.49"></a>
<span class="sourceLineNo">050</span> HELP_PAGE_INFORMATION,<a name="line.50"></a>
<span class="sourceLineNo">051</span> HELP_NO_RESULTS<a name="line.51"></a>
<span class="sourceLineNo">052</span> ;<a name="line.52"></a>
<span class="sourceLineNo">053</span><a name="line.53"></a>
<span class="sourceLineNo">054</span> private final MessageKey key = MessageKey.of("acf-core." + this.name().toLowerCase());<a name="line.54"></a>
<span class="sourceLineNo">055</span> public MessageKey getMessageKey() {<a name="line.55"></a>
<span class="sourceLineNo">056</span> return key;<a name="line.56"></a>
<span class="sourceLineNo">057</span> }<a name="line.57"></a>
<span class="sourceLineNo">058</span>}<a name="line.58"></a>
@@ -224,86 +224,90 @@
<span class="sourceLineNo">216</span> if (allowOptional &amp;&amp; def != null) {<a name="line.216"></a>
<span class="sourceLineNo">217</span> args.add(scope.manager.getCommandReplacements().replace(def.value()));<a name="line.217"></a>
<span class="sourceLineNo">218</span> } else if (allowOptional &amp;&amp; opt != null) {<a name="line.218"></a>
<span class="sourceLineNo">219</span> passedArgs.put(parameterName, isOptionalResolver(resolver) ? resolver.getContext(context) : null);<a name="line.219"></a>
<span class="sourceLineNo">220</span> //noinspection UnnecessaryContinue<a name="line.220"></a>
<span class="sourceLineNo">221</span> continue;<a name="line.221"></a>
<span class="sourceLineNo">222</span> } else if (!isOptionalResolver) {<a name="line.222"></a>
<span class="sourceLineNo">223</span> scope.showSyntax(sender, this);<a name="line.223"></a>
<span class="sourceLineNo">224</span> return null;<a name="line.224"></a>
<span class="sourceLineNo">225</span> }<a name="line.225"></a>
<span class="sourceLineNo">226</span> }<a name="line.226"></a>
<span class="sourceLineNo">227</span> final Values values = parameter.getAnnotation(Values.class);<a name="line.227"></a>
<span class="sourceLineNo">228</span> if (values != null) {<a name="line.228"></a>
<span class="sourceLineNo">229</span> String arg = !args.isEmpty() ? args.get(0) : "";<a name="line.229"></a>
<span class="sourceLineNo">230</span><a name="line.230"></a>
<span class="sourceLineNo">231</span> final String[] split = ACFPatterns.PIPE.split(scope.manager.getCommandReplacements().replace(values.value()));<a name="line.231"></a>
<span class="sourceLineNo">232</span> Set&lt;String&gt; possible = Sets.newHashSet();<a name="line.232"></a>
<span class="sourceLineNo">233</span> for (String s : split) {<a name="line.233"></a>
<span class="sourceLineNo">234</span> List&lt;String&gt; check = this.manager.getCommandCompletions().getCompletionValues(this, sender, s, origArgs, opContext.isAsync());<a name="line.234"></a>
<span class="sourceLineNo">235</span> if (!check.isEmpty()) {<a name="line.235"></a>
<span class="sourceLineNo">236</span> possible.addAll(check.stream().map(String::toLowerCase).collect(Collectors.toList()));<a name="line.236"></a>
<span class="sourceLineNo">237</span> } else {<a name="line.237"></a>
<span class="sourceLineNo">238</span> possible.add(s.toLowerCase());<a name="line.238"></a>
<span class="sourceLineNo">239</span> }<a name="line.239"></a>
<span class="sourceLineNo">240</span> }<a name="line.240"></a>
<span class="sourceLineNo">241</span><a name="line.241"></a>
<span class="sourceLineNo">242</span> if (!possible.contains(arg.toLowerCase())) {<a name="line.242"></a>
<span class="sourceLineNo">243</span> throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_ONE_OF,<a name="line.243"></a>
<span class="sourceLineNo">244</span> "{valid}", ACFUtil.join(possible, ", "));<a name="line.244"></a>
<span class="sourceLineNo">245</span> }<a name="line.245"></a>
<span class="sourceLineNo">246</span> }<a name="line.246"></a>
<span class="sourceLineNo">247</span> passedArgs.put(parameterName, resolver.getContext(context));<a name="line.247"></a>
<span class="sourceLineNo">248</span> }<a name="line.248"></a>
<span class="sourceLineNo">249</span> return passedArgs;<a name="line.249"></a>
<span class="sourceLineNo">250</span> }<a name="line.250"></a>
<span class="sourceLineNo">251</span><a name="line.251"></a>
<span class="sourceLineNo">252</span> boolean hasPermission(CommandIssuer issuer) {<a name="line.252"></a>
<span class="sourceLineNo">253</span> return (permission == null || permission.isEmpty() || scope.manager.hasPermission(issuer, permission)) &amp;&amp; scope.hasPermission(issuer);<a name="line.253"></a>
<span class="sourceLineNo">219</span> Object value = isOptionalResolver(resolver) ? resolver.getContext(context) : null;<a name="line.219"></a>
<span class="sourceLineNo">220</span> if (value == null &amp;&amp; parameter.getClass().isPrimitive()) {<a name="line.220"></a>
<span class="sourceLineNo">221</span> throw new IllegalStateException("Parameter " + parameter.getName() + " is primitive and does not support Optional.");<a name="line.221"></a>
<span class="sourceLineNo">222</span> }<a name="line.222"></a>
<span class="sourceLineNo">223</span> passedArgs.put(parameterName, value);<a name="line.223"></a>
<span class="sourceLineNo">224</span> //noinspection UnnecessaryContinue<a name="line.224"></a>
<span class="sourceLineNo">225</span> continue;<a name="line.225"></a>
<span class="sourceLineNo">226</span> } else if (!isOptionalResolver) {<a name="line.226"></a>
<span class="sourceLineNo">227</span> scope.showSyntax(sender, this);<a name="line.227"></a>
<span class="sourceLineNo">228</span> return null;<a name="line.228"></a>
<span class="sourceLineNo">229</span> }<a name="line.229"></a>
<span class="sourceLineNo">230</span> }<a name="line.230"></a>
<span class="sourceLineNo">231</span> final Values values = parameter.getAnnotation(Values.class);<a name="line.231"></a>
<span class="sourceLineNo">232</span> if (values != null) {<a name="line.232"></a>
<span class="sourceLineNo">233</span> String arg = !args.isEmpty() ? args.get(0) : "";<a name="line.233"></a>
<span class="sourceLineNo">234</span><a name="line.234"></a>
<span class="sourceLineNo">235</span> final String[] split = ACFPatterns.PIPE.split(scope.manager.getCommandReplacements().replace(values.value()));<a name="line.235"></a>
<span class="sourceLineNo">236</span> Set&lt;String&gt; possible = Sets.newHashSet();<a name="line.236"></a>
<span class="sourceLineNo">237</span> for (String s : split) {<a name="line.237"></a>
<span class="sourceLineNo">238</span> List&lt;String&gt; check = this.manager.getCommandCompletions().getCompletionValues(this, sender, s, origArgs, opContext.isAsync());<a name="line.238"></a>
<span class="sourceLineNo">239</span> if (!check.isEmpty()) {<a name="line.239"></a>
<span class="sourceLineNo">240</span> possible.addAll(check.stream().map(String::toLowerCase).collect(Collectors.toList()));<a name="line.240"></a>
<span class="sourceLineNo">241</span> } else {<a name="line.241"></a>
<span class="sourceLineNo">242</span> possible.add(s.toLowerCase());<a name="line.242"></a>
<span class="sourceLineNo">243</span> }<a name="line.243"></a>
<span class="sourceLineNo">244</span> }<a name="line.244"></a>
<span class="sourceLineNo">245</span><a name="line.245"></a>
<span class="sourceLineNo">246</span> if (!possible.contains(arg.toLowerCase())) {<a name="line.246"></a>
<span class="sourceLineNo">247</span> throw new InvalidCommandArgument(MessageKeys.PLEASE_SPECIFY_ONE_OF,<a name="line.247"></a>
<span class="sourceLineNo">248</span> "{valid}", ACFUtil.join(possible, ", "));<a name="line.248"></a>
<span class="sourceLineNo">249</span> }<a name="line.249"></a>
<span class="sourceLineNo">250</span> }<a name="line.250"></a>
<span class="sourceLineNo">251</span> passedArgs.put(parameterName, resolver.getContext(context));<a name="line.251"></a>
<span class="sourceLineNo">252</span> }<a name="line.252"></a>
<span class="sourceLineNo">253</span> return passedArgs;<a name="line.253"></a>
<span class="sourceLineNo">254</span> }<a name="line.254"></a>
<span class="sourceLineNo">255</span><a name="line.255"></a>
<span class="sourceLineNo">256</span><a name="line.256"></a>
<span class="sourceLineNo">257</span> /**<a name="line.257"></a>
<span class="sourceLineNo">258</span> * @see #getRequiredPermissions()<a name="line.258"></a>
<span class="sourceLineNo">259</span> * @deprecated<a name="line.259"></a>
<span class="sourceLineNo">260</span> */<a name="line.260"></a>
<span class="sourceLineNo">261</span> @Deprecated<a name="line.261"></a>
<span class="sourceLineNo">262</span> public String getPermission() {<a name="line.262"></a>
<span class="sourceLineNo">263</span> if (this.permission == null || this.permission.isEmpty()) {<a name="line.263"></a>
<span class="sourceLineNo">264</span> return null;<a name="line.264"></a>
<span class="sourceLineNo">265</span> }<a name="line.265"></a>
<span class="sourceLineNo">266</span> return ACFPatterns.COMMA.split(this.permission)[0];<a name="line.266"></a>
<span class="sourceLineNo">267</span> }<a name="line.267"></a>
<span class="sourceLineNo">268</span><a name="line.268"></a>
<span class="sourceLineNo">269</span> public Set&lt;String&gt; getRequiredPermissions() {<a name="line.269"></a>
<span class="sourceLineNo">270</span> if (this.permission == null || this.permission.isEmpty()) {<a name="line.270"></a>
<span class="sourceLineNo">271</span> return ImmutableSet.of();<a name="line.271"></a>
<span class="sourceLineNo">272</span> }<a name="line.272"></a>
<span class="sourceLineNo">273</span> return Sets.newHashSet(ACFPatterns.COMMA.split(this.permission));<a name="line.273"></a>
<span class="sourceLineNo">274</span> }<a name="line.274"></a>
<span class="sourceLineNo">275</span><a name="line.275"></a>
<span class="sourceLineNo">276</span> public boolean requiresPermission(String permission) {<a name="line.276"></a>
<span class="sourceLineNo">277</span> return getRequiredPermissions().contains(permission) || scope.requiresPermission(permission);<a name="line.277"></a>
<span class="sourceLineNo">256</span> boolean hasPermission(CommandIssuer issuer) {<a name="line.256"></a>
<span class="sourceLineNo">257</span> return (permission == null || permission.isEmpty() || scope.manager.hasPermission(issuer, permission)) &amp;&amp; scope.hasPermission(issuer);<a name="line.257"></a>
<span class="sourceLineNo">258</span> }<a name="line.258"></a>
<span class="sourceLineNo">259</span><a name="line.259"></a>
<span class="sourceLineNo">260</span><a name="line.260"></a>
<span class="sourceLineNo">261</span> /**<a name="line.261"></a>
<span class="sourceLineNo">262</span> * @see #getRequiredPermissions()<a name="line.262"></a>
<span class="sourceLineNo">263</span> * @deprecated<a name="line.263"></a>
<span class="sourceLineNo">264</span> */<a name="line.264"></a>
<span class="sourceLineNo">265</span> @Deprecated<a name="line.265"></a>
<span class="sourceLineNo">266</span> public String getPermission() {<a name="line.266"></a>
<span class="sourceLineNo">267</span> if (this.permission == null || this.permission.isEmpty()) {<a name="line.267"></a>
<span class="sourceLineNo">268</span> return null;<a name="line.268"></a>
<span class="sourceLineNo">269</span> }<a name="line.269"></a>
<span class="sourceLineNo">270</span> return ACFPatterns.COMMA.split(this.permission)[0];<a name="line.270"></a>
<span class="sourceLineNo">271</span> }<a name="line.271"></a>
<span class="sourceLineNo">272</span><a name="line.272"></a>
<span class="sourceLineNo">273</span> public Set&lt;String&gt; getRequiredPermissions() {<a name="line.273"></a>
<span class="sourceLineNo">274</span> if (this.permission == null || this.permission.isEmpty()) {<a name="line.274"></a>
<span class="sourceLineNo">275</span> return ImmutableSet.of();<a name="line.275"></a>
<span class="sourceLineNo">276</span> }<a name="line.276"></a>
<span class="sourceLineNo">277</span> return Sets.newHashSet(ACFPatterns.COMMA.split(this.permission));<a name="line.277"></a>
<span class="sourceLineNo">278</span> }<a name="line.278"></a>
<span class="sourceLineNo">279</span><a name="line.279"></a>
<span class="sourceLineNo">280</span> public String getPrefSubCommand() {<a name="line.280"></a>
<span class="sourceLineNo">281</span> return prefSubCommand;<a name="line.281"></a>
<span class="sourceLineNo">280</span> public boolean requiresPermission(String permission) {<a name="line.280"></a>
<span class="sourceLineNo">281</span> return getRequiredPermissions().contains(permission) || scope.requiresPermission(permission);<a name="line.281"></a>
<span class="sourceLineNo">282</span> }<a name="line.282"></a>
<span class="sourceLineNo">283</span><a name="line.283"></a>
<span class="sourceLineNo">284</span> public String getSyntaxText() {<a name="line.284"></a>
<span class="sourceLineNo">285</span> return syntaxText;<a name="line.285"></a>
<span class="sourceLineNo">284</span> public String getPrefSubCommand() {<a name="line.284"></a>
<span class="sourceLineNo">285</span> return prefSubCommand;<a name="line.285"></a>
<span class="sourceLineNo">286</span> }<a name="line.286"></a>
<span class="sourceLineNo">287</span><a name="line.287"></a>
<span class="sourceLineNo">288</span> public String getCommand() {<a name="line.288"></a>
<span class="sourceLineNo">289</span> return command;<a name="line.289"></a>
<span class="sourceLineNo">288</span> public String getSyntaxText() {<a name="line.288"></a>
<span class="sourceLineNo">289</span> return syntaxText;<a name="line.289"></a>
<span class="sourceLineNo">290</span> }<a name="line.290"></a>
<span class="sourceLineNo">291</span><a name="line.291"></a>
<span class="sourceLineNo">292</span> public void addSubcommand(String cmd) {<a name="line.292"></a>
<span class="sourceLineNo">293</span> this.registeredSubcommands.add(cmd);<a name="line.293"></a>
<span class="sourceLineNo">292</span> public String getCommand() {<a name="line.292"></a>
<span class="sourceLineNo">293</span> return command;<a name="line.293"></a>
<span class="sourceLineNo">294</span> }<a name="line.294"></a>
<span class="sourceLineNo">295</span> public void addSubcommands(Collection&lt;String&gt; cmd) {<a name="line.295"></a>
<span class="sourceLineNo">296</span> this.registeredSubcommands.addAll(cmd);<a name="line.296"></a>
<span class="sourceLineNo">297</span> }<a name="line.297"></a>
<span class="sourceLineNo">298</span>}<a name="line.298"></a>
<span class="sourceLineNo">295</span><a name="line.295"></a>
<span class="sourceLineNo">296</span> public void addSubcommand(String cmd) {<a name="line.296"></a>
<span class="sourceLineNo">297</span> this.registeredSubcommands.add(cmd);<a name="line.297"></a>
<span class="sourceLineNo">298</span> }<a name="line.298"></a>
<span class="sourceLineNo">299</span> public void addSubcommands(Collection&lt;String&gt; cmd) {<a name="line.299"></a>
<span class="sourceLineNo">300</span> this.registeredSubcommands.addAll(cmd);<a name="line.300"></a>
<span class="sourceLineNo">301</span> }<a name="line.301"></a>
<span class="sourceLineNo">302</span>}<a name="line.302"></a>