Skip to content
Navigation Menu
{{ message }}
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdevelop-bot.html
More file actions
99 lines (92 loc) · 22.7 KB
/
Copy pathdevelop-bot.html
File metadata and controls
99 lines (92 loc) · 22.7 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
<!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 active 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 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: Developing the bot</h1>
<h2>Installing Guilded.NET</h2>
<p>First of all, create a new project. Guilded.NET works with any template.</p>
<blockquote><p>Guilded.NET offers installable MSBuild templates, which can be found <a href="https://www.nuget.org/packages/Guilded.NET.Templates/" rel="nofollow">here</a>. Just be sure to edit the <q>config/config.json</q> file and insert your token.</p></blockquote>
<p>Install Guilded.NET by typing <a href="https://github.com/Guilded-NET/Guilded.NET.Templates" rel="nofollow"><code>dotnet add package Guilded.NET</code></a> and Guilded.NET dependency should be added to your project. Now we’ll need to run your bot.</p>
<h2>Configuring your bot</h2>
<p>Now we’ll need to define prefix and an authentication token for your bot. You can use either constants or configuration files for that, but we’ll use a configuration file.</p>
<p>The name of the directory, the file and even properties in the file can be whatever you want to name it, but make sure it is referenced in your code. We’ll use <q>config/config.json</q> in this documentation.</p>
<p>In your config file, create a property <code>auth</code> and property <code>prefix</code>, where your authentication token and prefix will be stored:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">JSON</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">config/config.json</span></div></section></header><pre class="code-block code-wrapper language-json json"><code class="code-block code-container language-json json"><codeline class="code-block line"><span class="token punctuation">{</span></codeline><codeline class="code-block line"> <span class="token property">"auth"</span><span class="token operator">:</span> <span class="token string">"authentication_credentials_here"</span><span class="token punctuation">,</span></codeline><codeline class="code-block line"> <span class="token property">"prefix"</span><span class="token operator">:</span> <span class="token string">"!"</span></codeline><codeline class="code-block line"><span class="token punctuation">}</span></codeline></code></pre></div>
<p>Be sure to make MSBuild not ignore your config folder in your project file:</p>
<div class="code-block container"><header class="code-block header"><div class="code-block lang">XML</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">ProjectName.csproj</span></div></section></header><pre class="code-block code-wrapper language-xml xml"><code class="code-block code-container language-xml xml"><codeline class="code-block line"><span class="token comment"><!-- ... Other stuff ... --></span></codeline><codeline class="code-block line"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ItemGroup</span><span class="token punctuation">></span></span></codeline><codeline class="code-block line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Content</span> <span class="token attr-name">Include</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>config/*<span class="token punctuation">"</span></span><span class="token punctuation">></span></span></codeline><codeline class="code-block line"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>CopyToOutputDirectory</span><span class="token punctuation">></span></span>Always<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>CopyToOutputDirectory</span><span class="token punctuation">></span></span></codeline><codeline class="code-block line"> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Content</span><span class="token punctuation">></span></span></codeline><codeline class="code-block line"><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ItemGroup</span><span class="token punctuation">></span></span></codeline><codeline class="code-block line"><span class="token comment"><!-- ... Other stuff ... --></span></codeline></code></pre></div>
<p>We now have a configuration file that we can safely reference in our code and use properties in it. You can use either System.Text.Json or Newtonsoft.Json to deserialize our JSON and get its values. For this tutorial, we are going to use Newtonsoft.Json, since Guilded.NET has Newtonsoft.Json as a dependency. Newtonsoft.Json will be removed as a dependency in the future, so if you’ll still want to use Newtonsoft.Json, it is recommended to add Newtonsoft.Json as a dependency in your project.</p>
<p>We are now going to get the configuration and use it in our bot:</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>IO</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line inserted"><span class="token keyword">using</span> <span class="token namespace">Guilded</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line inserted"><span class="token keyword">using</span> <span class="token namespace">Newtonsoft<span class="token punctuation">.</span>Json<span class="token punctuation">.</span>Linq</span><span class="token punctuation">;</span></codeline></code></pre></div>
<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-csharp csharp"><code class="code-block code-container language-csharp csharp"><codeline class="code-block line"><span class="token class-name">JObject</span> config <span class="token operator">=</span> JObject<span class="token punctuation">.</span><span class="token function">Parse</span><span class="token punctuation">(</span>File<span class="token punctuation">.</span><span class="token function">ReadAllText</span><span class="token punctuation">(</span><span class="token string">"./config/config.json"</span><span class="token punctuation">)</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 class-name"><span class="token keyword">string</span></span> auth <span class="token operator">=</span> config<span class="token punctuation">.</span><span class="token generic-method"><span class="token function">Value</span><span class="token generic class-name"><span class="token punctuation"><</span><span class="token keyword">string</span><span class="token punctuation">></span></span></span><span class="token punctuation">(</span><span class="token string">"auth"</span><span class="token punctuation">)</span><span class="token punctuation">,</span></codeline><codeline class="code-block line"> prefix <span class="token operator">=</span> config<span class="token punctuation">.</span><span class="token generic-method"><span class="token function">Value</span><span class="token generic class-name"><span class="token punctuation"><</span><span class="token keyword">string</span><span class="token punctuation">></span></span></span><span class="token punctuation">(</span><span class="token string">"prefix"</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">await</span> <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></codeline></code></pre></div>
<p>You can now run your project, but as we can see, it doesn’t really do anything. But that’s because we are only creating our bot, not connecting to Guilded yet, which we are going to do in the next section.</p>
<h2>Connecting to Guilded</h2>
<p>Method <a href="/">ConnectAsync</a> is used to connect the client to Guilded. But once you use it, the bot will connect to Guilded and program will close seeing that it’s done. One of the ways to stop it from closing is to use <code>await Task.Delay(-1)</code>:</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"><span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>IO</span><span class="token punctuation">;</span></codeline><codeline class="code-block line inserted"><span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Threading<span class="token punctuation">.</span>Tasks</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token keyword">using</span> <span class="token namespace">Guilded</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token keyword">using</span> <span class="token namespace">Newtonsoft<span class="token punctuation">.</span>Json</span><span class="token punctuation">;</span></codeline></code></pre></div>
<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-csharp csharp"><code class="code-block code-container language-csharp csharp"><codeline class="code-block line"><span class="token comment">// Below static void Main()</span></codeline><codeline class="code-block line"><span class="token keyword">static</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">RunAsync</span><span class="token punctuation">(</span><span class="token class-name">GuildedBotClient</span> client<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">await</span> client<span class="token punctuation">.</span><span class="token function">ConnectAsync</span><span class="token punctuation">(</span><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 comment">// Stop program from closing</span></codeline><codeline class="code-block line"> <span class="token keyword">await</span> Task<span class="token punctuation">.</span><span class="token function">Delay</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</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>Now we can reference it in Main method:</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 comment">// static void Main()</span></codeline><codeline class="code-block line"><span class="token function">RunAsync</span><span class="token punctuation">(</span>client<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">GetAwaiter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">GetResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>To see if connection between Guilded and the client are initiated, we can subscribe to <a href="/">Prepared</a> or <a href="/">Connected</a> events:</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><span class="token punctuation">;</span></codeline><codeline class="code-block line"><span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>IO</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"><span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Threading<span class="token punctuation">.</span>Tasks</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token keyword">using</span> <span class="token namespace">Guilded</span><span class="token punctuation">;</span></codeline><codeline class="code-block line"></codeline><codeline class="code-block line"><span class="token keyword">using</span> <span class="token namespace">Newtonsoft<span class="token punctuation">.</span>Json</span><span class="token punctuation">;</span></codeline></code></pre></div>
<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 comment">// Below `await using GuildedBotClient client = ...;`</span></codeline><codeline class="code-block line">client<span class="token punctuation">.</span>Prepared</codeline><codeline class="code-block line"> <span class="token punctuation">.</span><span class="token function">Subscribe</span><span class="token punctuation">(</span>me <span class="token operator">=></span></codeline><codeline class="code-block line"> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token string">"The bot is prepared.\nLogged in as \"{0}\" with the ID \"{1}\""</span><span class="token punctuation">,</span> me<span class="token punctuation">.</span>Name<span class="token punctuation">,</span> me<span class="token punctuation">.</span>Id<span class="token punctuation">)</span></codeline><codeline class="code-block line"> <span class="token punctuation">)</span><span class="token punctuation">;</span></codeline></code></pre></div>
<p>The main difference is that <code>Connected</code> gets connected once the bot is online and can be functional, while <code>Prepared</code> is called once the bot is connected and gets additional information, such as <code>client.Me</code>. If <code>Connected</code> gets called before <code>Prepared</code>, the <code>client.Me</code> property will always be <code>null</code>.</p>
<p>Once the bot successfully connects and does everything it needs, you will be able to see <q>The bot is prepared.</q> in the console.</p>
<p>The bot won’t do anything apart from connecting to Guilded. In <a href="/docs/powering-bot">Powering up the bot</a> document, we are going to give functionality to our bot with text commands.</p>
</div></article>
</div>
</div></div>
</main>
</body>
</html>
You can’t perform that action at this time.
