-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommands.html
More file actions
141 lines (134 loc) · 60.4 KB
/
Copy pathcommands.html
File metadata and controls
141 lines (134 loc) · 60.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="../favicon.png" />
<link rel="stylesheet" href="../fontawesome.css" />
<meta name="viewport" content="width=device-width" />
<meta http-equiv="content-security-policy" content="">
<link href="../app/immutable/assets/_layout.3a6a7fd4.css" rel="stylesheet">
<link href="../app/immutable/assets/_page.9068b0fb.css" rel="stylesheet">
<link href="../app/immutable/assets/DocList.312ef88c.css" rel="stylesheet">
<link href="../app/immutable/assets/MarkdownContent.09881ec7.css" rel="stylesheet">
<link href="../app/immutable/assets/IndexWrapper.b786c468.css" rel="stylesheet">
<link href="../app/immutable/assets/embeds.1b9cc348.css" rel="stylesheet">
</head>
<body>
<main class="layout wrapper svelte-77ehm7"><nav class="nav container svelte-1e9pbzu"><div class="nav display svelte-1e9pbzu"><a class="nav branding svelte-1e9pbzu" href="/"><svg class="logo container nav svg svelte-1h116gd" xmlns="http://www.w3.org/2000/svg" width="271.115mm" height="271.115mm" viewBox="0 0 1024 1024"><defs><mask id="gnet-mask"><circle id="gnet-mask-base" cx="512" cy="512" r="440" fill="white"></circle><circle id="gnet-dot-mask" cx="192" cy="512" r="192" fill="black"></circle><path id="gnet-guilded" fill="black" d="M 644.27,704.52
C 600.00,688.00 424.00,622.39 424.00,320.00
424.00,320.00 864.00,320.00 864.00,320.00
864.00,320.00 864.00,376.00 857.26,407.01
857.26,407.01 522.00,408.00 522.00,408.00
522.01,424.05 536.00,560.00 644.00,609.84
664.00,608.00 712.00,568.00 724.00,543.00
724.00,543.00 637.00,542.40 637.00,542.40
608.00,520.00 596.08,483.25 591.00,455.00
591.00,455.00 852.00,455.00 852.00,455.00
824.00,584.00 744.00,672.00 645.00,704.79
644.76,704.71 644.52,704.62 644.27,704.52 Z"></path></mask></defs><g id="gnet-main"><circle id="gnet-base" cx="512" cy="512" r="440" mask="url(#gnet-mask)"></circle><circle id="gnet-dot" cx="192" cy="512" r="132"></circle></g></svg></a>
<ul class="nav button-list svelte-1e9pbzu"><li class="nav button-item svelte-1e9pbzu"><a class="nav button svelte-1e9pbzu" title="Docs" href="/docs">Docs</a></li>
<li class="nav button-item svelte-1e9pbzu"><a class="nav button svelte-1e9pbzu" title="API References" href="/references">API</a></li>
</ul></div>
</nav>
<div class="layout container svelte-77ehm7">
<div class="layout document svelte-77ehm7"><aside class="entry-list container svelte-1eetiev"><div class="entry-list search-field"><div class="entry-list search-wrapper svelte-1eetiev"><i class="entry-list search-icon fas fa-search svelte-1eetiev"></i>
<input id="entry-list-search" class="entry-list search svelte-1eetiev" placeholder="Search docs" value=""></div></div>
<div class="entry-list items-wrapper svelte-1eetiev"><ul class="entry-list items svelte-1eetiev"><li class="entry-category container svelte-flts2q"><header class="entry-category header svelte-flts2q"><h5 class="entry-category header-text svelte-flts2q">Getting Started</h5></header>
<ul class="entry-category body svelte-flts2q"><li class="entry-item container svelte-1bnzhps"><a class="entry-item link svelte-1bnzhps" href="/docs/develop-bot"><i class="container fa-solid fa-play entry-item icon"></i>
<span class="entry-item name">Developing bots</span></a>
</li><li class="entry-item container svelte-1bnzhps"><a class="entry-item link svelte-1bnzhps" href="/docs/powering-bot"><i class="container fa-solid fa-bolt entry-item icon"></i>
<span class="entry-item name">Powering up bot</span></a>
</li><li class="entry-item container active svelte-1bnzhps"><a class="entry-item link svelte-1bnzhps" href="/docs/commands"><i class="container fa-solid fa-bolt entry-item icon"></i>
<span class="entry-item name">Commands</span></a>
</li></ul>
</li><li class="entry-category container svelte-flts2q"><header class="entry-category header svelte-flts2q"><h5 class="entry-category header-text svelte-flts2q">How to Use</h5></header>
<ul class="entry-category body svelte-flts2q"><li class="entry-item container svelte-1bnzhps"><a class="entry-item link svelte-1bnzhps" href="/docs/embeds"><i class="container fa-solid fa-play-circle entry-item icon"></i>
<span class="entry-item name">Embeds</span></a>
</li></ul>
</li><li class="entry-category container svelte-flts2q"><header class="entry-category header svelte-flts2q"><h5 class="entry-category header-text svelte-flts2q">Quick Overview</h5></header>
<ul class="entry-category body svelte-flts2q"><li class="entry-item container svelte-1bnzhps"><a class="entry-item link svelte-1bnzhps" href="/docs/supported"><i class="container fa-solid fa-check-double entry-item icon"></i>
<span class="entry-item name">Supported Features</span></a>
</li></ul>
</li><li class="entry-category container svelte-flts2q"><header class="entry-category header svelte-flts2q"><h5 class="entry-category header-text svelte-flts2q">Resources</h5></header>
<ul class="entry-category body svelte-flts2q"><li class="entry-item container svelte-1bnzhps"><a class="entry-item link svelte-1bnzhps" href="/docs/message"><i class="container fa-solid fa-pencil entry-item icon"></i>
<span class="entry-item name">Message builder</span></a>
</li></ul>
</li></ul></div>
</aside>
<div class="content-wrapper container svelte-1y4vd51"><article class="content-wrapper content svelte-1y4vd51"><div class="markdown-content container svelte-lhtcnm"><h1>Getting Started: Commands</h1>
<p>Commands are one of the most basic ways to interact with a bot on Guilded. Most bots, if not all, have at least one command. So how is it done on Guilded.NET? Well, it’s simple.</p>
<h2>Setting it up</h2>
<p>Guilded.NET’s command system is its own package, which means we will need to install it first. Open up your terminal or console. This is either PowerShell, CMD, Windows Terminal (Windows really has endless terminals, huh?), Git Bash, Terminal or anything similar. Then type the following:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">bash</div></header><pre class="code-block code-wrapper language-bash bash"><code class="code-block code-container language-bash bash"><codeline class="code-block line"><span class="token builtin class-name">cd</span> <span class="token string">"/path/to/Guilded-NET/bot"</span></codeline><codeline class="code-block line">dotnet <span class="token function">add</span> package Guilded.Commands</codeline></code></pre></div>
<p>And that’s about it. Now we need to set it up in the code.</p>
<p>In the place where your client is set up (<code>using var client = ...</code>), add <code>.AddCommands(new BotCommands(), prefix)</code>. This should look something like this:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div><section class="code-block meta"><div class="code-block-meta-prop container"><span class="code-block-meta-prop key">File: </span><span class="code-block-meta-prop value">Program.cs</span></div></section></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token comment">// static void Main()</span></codeline><codeline class="code-block line"><span class="token comment">// ...</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token keyword">using</span> <span class="token class-name"><span class="token keyword">var</span></span> client <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">GuildedBotClient</span><span class="token punctuation">(</span>auth<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">AddCommands</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token constructor-invocation class-name">BotCommands</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> prefix<span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>This will show an error that <code>BotCommands</code> does not exist, so we will have to create it.</p>
<p>Create a new file with <code>.cs</code> extension and create a class in it:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div><section class="code-block meta"><div class="code-block-meta-prop container"><span class="code-block-meta-prop key">File: </span><span class="code-block-meta-prop value">BotCommands.cs</span></div></section></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token keyword">using</span> <span class="token namespace">Guilded<span class="token punctuation">.</span>Commands</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token comment">// Can be whatever you want to name it. It is recommended to use the name of your .csproj file without `.csproj` part</span></codeline><codeline class="code-block line"><span class="token keyword">namespace</span> <span class="token namespace">ProjectNamespace</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BotCommands</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">CommandModule</span></span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ...</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>Any type that will be considered as a command list/command module will always have to extend <code>Guilded.Commands.CommandModule</code> like so:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div><section class="code-block meta"><div class="code-block-meta-prop container"><span class="code-block-meta-prop key">File: </span><span class="code-block-meta-prop value">BotCommands.cs</span></div></section></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BotCommands</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">CommandModule</span></span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ... Commands here ...</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>We can do the fun part now. Let’s do a ping command.</p>
<h2>Method-based commands</h2>
<p>To declare a method as a command, we will have to always add <code>[Command]</code> attribute. This will also be true for class-based commands, but we will go over them later.</p>
<p>Method-based commands will also always:</p>
<ul><li>need to have <code>CommandEvent</code> parameter as its first parameter, no matter if it contains any arguments or not</li>
<li>return <code>Task</code> value, whether it’s asynchronous or not</li>
<li>never be abstract (it can still be declared as <code>virtual</code> or <code>static</code>)</li></ul>
<p>All declared commands should be inside <code>BotCommands</code> class. Otherwise, they will not be seen by Guilded.NET.</p>
<p>So let’s do a quick ping command:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div><section class="code-block meta"><div class="code-block-meta-prop container"><span class="code-block-meta-prop key">File: </span><span class="code-block-meta-prop value">BotCommands.cs</span></div></section></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Ping</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> invokation<span class="token punctuation">.</span><span class="token function">ReplyAsync</span><span class="token punctuation">(</span><span class="token string">"Pong!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>As you can see, like with <code>MessageEvent</code> (<code>msgCreated</code> in the previous code), you can use <code>ReplyAsync</code> on <code>CommandEvent</code> instances. <code>CommandEvent</code> extends <code>MessageEvent</code>, so anything that works with <code>MessageEvent</code> should work with <code>CommandEvent</code>.</p>
<p>The name of the command will always automatically be all-lowercase name of the method with <code>Command</code> and <code>Async</code> removed at the end. <code>PingCommand</code>, <code>PingCommandAsync</code>, <code>PingAsync</code> and <code>Ping</code> will all be converted to <code>ping</code>.</p>
<p>However, if we don’t like the automatically picked name of the command, we can override it by passing a string to <code>[Command]</code> attribute:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BotCommands</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">CommandModule</span></span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"online"</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"> <span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Ping</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> invokation<span class="token punctuation">.</span><span class="token function">ReplyAsync</span><span class="token punctuation">(</span><span class="token string">"I am online!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>And we can also add aliases to them:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span><span class="token attribute-arguments"><span class="token punctuation">(</span>Aliases <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> <span class="token punctuation">{</span> <span class="token string">"pong"</span><span class="token punctuation">,</span> <span class="token string">"p"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Ping</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">)</span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ...</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"online"</span><span class="token punctuation">,</span> Aliases <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> <span class="token punctuation">{</span> <span class="token string">"on"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">IsOnlineCommand</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">)</span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ...</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>Besides that, there are non-functional <code>DescriptionAttribute</code> and <code>ExampleAttribute</code>. These won’t do anything by themselves, but it can be used in your <code>help</code> command:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Description</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"Says whatever you give it"</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span><span class="token attribute-arguments"><span class="token punctuation">(</span>Aliases <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> <span class="token punctuation">{</span> <span class="token string">"talk"</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token punctuation">[</span> <span class="token attribute"><span class="token class-name">Example</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"Hello there!"</span><span class="token punctuation">)</span></span><span class="token punctuation">,</span> <span class="token class-name">Example</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"talk"</span><span class="token punctuation">,</span> <span class="token string">"Hello there!"</span><span class="token punctuation">)</span></span></span> <span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Say</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">,</span> <span class="token range operator">..</span><span class="token range operator">..</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token range operator">..</span><span class="token range operator">..</span><span class="token punctuation">.</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>Example attribute can have either 1 or 2 arguments. If one argument is passed, then it’s the use of the command. If 2 arguments are passed, then 1st argument is the used name or alias of the command in the example and second one is the use of the command:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Example</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"How to use the command"</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Example</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"command-alias"</span><span class="token punctuation">,</span> <span class="token string">"How to use the command"</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline></code></pre></div>
<p>As you can see, we added an example to <code>Say</code> command with arguments, so how do commands with arguments? Well, it’s relatively easy. We add an argument of any type with <code>[CommandParam]</code>. While <code>[CommandParam]</code> is optional, it is recommended to use it for readability reasons. You can also pass a string to <code>[CommandParam]</code> to change the name of the argument.</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Add</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> <span class="token class-name"><span class="token keyword">int</span></span> x<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> <span class="token class-name"><span class="token keyword">int</span></span> y<span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> invokation<span class="token punctuation">.</span><span class="token function">ReplyAsync</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">x</span><span class="token punctuation">}</span></span><span class="token string"> + </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">y</span><span class="token punctuation">}</span></span><span class="token string"> = </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">x <span class="token operator">+</span> y</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>Now if we type <q>/add 10 20</q>, our bot will respond with <q>10 + 20 = 30</q>.</p>
<p>However, if we write <q>/add a 10</q>, the bot will not respond. This is to be expected. The bot will not call the command if the argument count or the arguments are wrong. If we go back and write <q>!ping</q>, the bot will definitely respond with <q>Pong!</q>. However, writing <q>/ping x</q> will not make the bot respond, as the argument count is wrong.</p>
<p>One of the ways to fix this is to make multiple methods with the same name, but different arguments:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span><span class="token attribute-arguments"><span class="token punctuation">(</span>Aliases <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> <span class="token punctuation">{</span> <span class="token string">"plus"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Add</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> <span class="token class-name"><span class="token keyword">int</span></span> x<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> <span class="token class-name"><span class="token keyword">int</span></span> y<span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> invokation<span class="token punctuation">.</span><span class="token function">ReplyAsync</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">x</span><span class="token punctuation">}</span></span><span class="token string"> + </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">y</span><span class="token punctuation">}</span></span><span class="token string"> = </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">x <span class="token operator">+</span> y</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span><span class="token attribute-arguments"><span class="token punctuation">(</span>Aliases <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> <span class="token punctuation">{</span> <span class="token string">"plus"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Add</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> <span class="token class-name"><span class="token keyword">int</span></span> x<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> <span class="token class-name"><span class="token keyword">int</span></span> y<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> z<span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> invokation<span class="token punctuation">.</span><span class="token function">ReplyAsync</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">x</span><span class="token punctuation">}</span></span><span class="token string"> + </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">y</span><span class="token punctuation">}</span></span><span class="token string"> + </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">z</span><span class="token punctuation">}</span></span><span class="token string"> = </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">x <span class="token operator">+</span> y <span class="token operator">+</span> z</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>And we can go on and on and on with it. This can be difficult to scale if you want to accept potentially even hundreds of arguments. For that, we can use “rest argument”. It allows us to get one or more arguments in a command:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Words</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> <span class="token keyword">params</span> <span class="token class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> words<span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> invokation<span class="token punctuation">.</span><span class="token function">ReplyAsync</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"I got these words: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp"><span class="token keyword">string</span><span class="token punctuation">.</span><span class="token function">Join</span><span class="token punctuation">(</span><span class="token string">", "</span><span class="token punctuation">,</span> words<span class="token punctuation">)</span></span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>Writing <q>/words a b c d e f</q> will make the bot respond with <q>I got these words: a, b, c, d, e, f</q>.</p>
<p>Another cool thing you can use is “defautable” arguments, which allow argument count to be at a certain range and have default values for unspecified arguments. These are declared like so:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-cs cs"><code class="code-block code-container language-cs cs"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Say</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> <span class="token class-name"><span class="token keyword">string</span></span> word<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span></span><span class="token punctuation">]</span> <span class="token class-name"><span class="token keyword">uint</span></span> times <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> invokation<span class="token punctuation">.</span><span class="token function">ReplyAsync</span><span class="token punctuation">(</span><span class="token keyword">string</span><span class="token punctuation">.</span><span class="token function">Join</span><span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">,</span> Enumerable<span class="token punctuation">.</span><span class="token function">Repeat</span><span class="token punctuation">(</span>word<span class="token punctuation">,</span> times<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>So now, we can either do <q>/say Word</q> that would result in <q>Word</q> response or <q>/say Word 3</q> that would result in <q>Word Word Word</q>.</p>
<h2>Class-based commands</h2>
<p>While doing some commands, we will eventually come to realization that we need sub-commands as well. And while you can do it the hard-way, Guilded.NET also covers that. This changes from using methods as commands to using classes. The class-based commands will always have to extend <code>Guilded.Commands.CommandBase</code> as well.</p>
<blockquote><p>Class-based commands still need to be declared in <code>CommandModule</code>, however.</p></blockquote>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-csharp csharp"><code class="code-block code-container language-csharp csharp"><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BotCommands</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">CommandModule</span></span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ...</span></codeline><codeline class="code-block line"> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"config"</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ServerConfig</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">CommandBase</span></span></codeline><codeline class="code-block line"> <span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ... Sub-commands here...</span></codeline><codeline class="code-block line"> <span class="token punctuation">}</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>Commands with sub-commands act similar to <code>CommandModule</code> — it’s actually the opposite — so we should be able to declare sub-commands the same way we declare commands:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-csharp csharp"><code class="code-block code-container language-csharp csharp"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"config"</span><span class="token punctuation">,</span> Aliases <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> <span class="token punctuation">{</span> <span class="token string">"settings"</span><span class="token punctuation">,</span> <span class="token string">"conf"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ServerConfig</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">CommandBase</span></span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"> <span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">GetPrefix</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">)</span></codeline><codeline class="code-block line"> <span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ...</span></codeline><codeline class="code-block line"> <span class="token punctuation">}</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"> <span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">ChangePrefix</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandParam</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"new prefix"</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span> <span class="token class-name"><span class="token keyword">string</span></span> prefix<span class="token punctuation">)</span></codeline><codeline class="code-block line"> <span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ...</span></codeline><codeline class="code-block line"> <span class="token punctuation">}</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>Of course, some people might use <q>/config</q> command and it would lead to the bot not having any response. For that, there are “command fallbacks” for that. It should be declared similar to commands, but we have to use <code>[CommandFallback(...)]</code> attribute for that instead:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-csharp csharp"><code class="code-block code-container language-csharp csharp"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">Command</span><span class="token attribute-arguments"><span class="token punctuation">(</span><span class="token string">"config"</span><span class="token punctuation">,</span> Aliases <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> <span class="token punctuation">{</span> <span class="token string">"settings"</span><span class="token punctuation">,</span> <span class="token string">"conf"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ServerConfig</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">CommandBase</span></span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ...</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"> <span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandFallback</span><span class="token attribute-arguments"><span class="token punctuation">(</span>FallbackType<span class="token punctuation">.</span>Unspecified<span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"> <span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">UnspecifiedSubcommand</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">)</span></codeline><codeline class="code-block line"> <span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ...</span></codeline><codeline class="code-block line"> <span class="token punctuation">}</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>Of course, we will have to list down all the possible commands. We don’t really need to write out all commands and we can use <code>this.Commands</code> for that. However, as previously stated, multiple commands with the same name are treated differently, so iterating through command list would end up with duplicated command names in the list. For that, we can use <code>this.CommandLookup</code>, which groups together all the commands with matching names (it will not group by aliases, however). Here’s an example of its usage:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div><section class="code-block meta"></section></header><pre class="code-block code-wrapper language-csharp csharp"><code class="code-block code-container language-csharp csharp"><codeline class="code-block line inserted"><span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Linq</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token comment">// ...</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandFallback</span><span class="token attribute-arguments"><span class="token punctuation">(</span>FallbackType<span class="token punctuation">.</span>Unspecified<span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">UnspecifiedSubcommand</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> invokation<span class="token punctuation">.</span><span class="token function">ReplyAsync</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"Please specify a sub-command.\nHere are available sub-commands: `</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp"><span class="token keyword">string</span><span class="token punctuation">.</span><span class="token function">Join</span><span class="token punctuation">(</span><span class="token string">"`, `"</span><span class="token punctuation">,</span> CommandLookup<span class="token punctuation">.</span><span class="token function">Select</span><span class="token punctuation">(</span><span class="token keyword">group</span> <span class="token operator">=></span> <span class="token keyword">group</span><span class="token punctuation">.</span>Key<span class="token punctuation">)</span><span class="token punctuation">)</span></span><span class="token punctuation">}</span></span><span class="token string">`"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>This is also the reason why class-based commands require extending <code>CommandBase</code>: to provide <code>this.Commands</code>, <code>this.CommandLookup</code> and other properties. If you declare a method as a static method, these properties will not be available in any way, as the command’s instance will be somewhat private/hard to dig out.</p>
<p>And now by writing <q>/config</q> the bot should respond with:</p>
<blockquote><p>Please specify a sub-command.</p>
<p>Here are available sub-commands: <code>prefix</code>, <code>another-subcommand</code></p></blockquote>
<p>We can also detect sub-commands that weren’t found:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-csharp csharp"><code class="code-block code-container language-csharp csharp"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandFallback</span><span class="token attribute-arguments"><span class="token punctuation">(</span>FallbackType<span class="token punctuation">.</span>NoCommandFound<span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">UnknownCommand</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">)</span> <span class="token operator">=></span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> invokation<span class="token punctuation">.</span><span class="token function">ReplyAsync</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"Unknown sub-command `</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">invokation<span class="token punctuation">.</span>CommandName</span><span class="token punctuation">}</span></span><span class="token string">`"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>The name of the command will not be given as an argument, but you can get the used name in <code>CommandEvent</code>. Once again, commands are unique and aren’t fully based on command names, bla bla. So the command won’t really be seen as an existing command if bad arguments are given. We can, however, use <code>CommandLookup</code> to check if any command by that name exists. The problem with it is that we aliases may be ignored. So, if you have command <code>blabla</code> with alias <code>b</code> and someone does <q>/config b</q>, it will say that <q>b</q> doesn’t exist. In this case, it is better to use <code>Commands</code>.</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-csharp csharp"><code class="code-block code-container language-csharp csharp"><codeline class="code-block line"><span class="token punctuation">[</span><span class="token attribute"><span class="token class-name">CommandFallback</span><span class="token attribute-arguments"><span class="token punctuation">(</span>FallbackType<span class="token punctuation">.</span>NoCommandFound<span class="token punctuation">)</span></span></span><span class="token punctuation">]</span></codeline><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">UnknownCommand</span><span class="token punctuation">(</span><span class="token class-name">CommandEvent</span> invokation<span class="token punctuation">)</span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token keyword">if</span> <span class="token punctuation">(</span>Commands<span class="token punctuation">.</span><span class="token function">Any</span><span class="token punctuation">(</span>command <span class="token operator">=></span> command<span class="token punctuation">.</span><span class="token function">HasName</span><span class="token punctuation">(</span>invokation<span class="token punctuation">.</span>CommandName<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span></codeline><codeline class="code-block line"> <span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ... Bad arguments ...</span></codeline><codeline class="code-block line"> <span class="token punctuation">}</span></codeline><codeline class="code-block line"> <span class="token keyword">else</span></codeline><codeline class="code-block line"> <span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ... No such command ...</span></codeline><codeline class="code-block line"> <span class="token punctuation">}</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>This should be improved in the future, but for the time being, this is how it looks.</p>
<p>As previously mentioned, <code>CommandModule</code> is similar to <code>CommandBase</code> (<code>CommandModule</code> extends <code>CommandBase</code>), so you can use <code>[CommandFallback(FallbackType.NoCommandFound)]</code> the same way.</p>
<h2>Server-wide prefixes</h2>
<p>Server-wide prefixes are also available for commands. For that, you need to override <code>DoCommandsAsync</code> method. Here’s an example:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">C#</div></header><pre class="code-block code-wrapper language-csharp csharp"><code class="code-block code-container language-csharp csharp"><codeline class="code-block line"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BotCommands</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">CommandModule</span></span></codeline><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// ...</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"> <span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task<span class="token punctuation"><</span><span class="token keyword">bool</span><span class="token punctuation">></span></span> <span class="token function">DoCommandsAsync</span><span class="token punctuation">(</span><span class="token class-name">MessageEvent</span> msgCreated<span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">string</span></span> globalPrefix<span class="token punctuation">,</span> <span class="token class-name">CommandConfiguration</span> config<span class="token punctuation">)</span></codeline><codeline class="code-block line"> <span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token comment">// Fetch the server-wide prefix</span></codeline><codeline class="code-block line"> <span class="token class-name"><span class="token keyword">string</span><span class="token punctuation">?</span></span> serverPrefix <span class="token operator">=</span> <span class="token range operator">..</span><span class="token range operator">..</span><span class="token punctuation">.</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"> <span class="token keyword">return</span> <span class="token keyword">await</span> <span class="token keyword">base</span><span class="token punctuation">.</span><span class="token function">DoCommandsAsync</span><span class="token punctuation">(</span>msgCreated<span class="token punctuation">,</span> serverPrefix <span class="token operator">??</span> globalPrefix<span class="token punctuation">,</span> config<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ConfigureAwait</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"> <span class="token punctuation">}</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>I should also note that the code behind fetching commands is not magic and it will invoke <code>DoCommandsAsync</code> on any message created. If you want to check if any command has been invoked at all, you can get <code>bool</code> value from <code>base.DoCommandsAsync</code>.</p>
<h2>That’s it</h2>
<p>We are done with the commands for now. Happy coding!</p>
</div></article>
</div>
</div></div>
</main>
</body>
</html>