messages and commands

This commit is contained in:
2026-03-28 03:26:51 +00:00
parent 7c61e8c260
commit c982766c3a
4 changed files with 154 additions and 3 deletions

View File

@@ -27,8 +27,8 @@ The below code will make a bot and login as that bot account you created.
```c#
// Importing the Client SDK and DotEnv.
using Valour.Sdk.Client;
using DotNetEnv;
using Valour.Shared;
using DotNetEnv;
// Creating the client that connects to Valour Servers.
ValourClient client = new ValourClient("https://api.valour.gg/");
@@ -37,7 +37,7 @@ client.SetupHttpClient();
// Import the .env variables into the app.
Env.Load();
// Store the token into a variable inside of the client.
// Store the token into a variable inside of the script.
string token = Environment.GetEnvironmentVariable("TOKEN") ?? string.Empty;
// Check if the token is valid.
@@ -62,7 +62,7 @@ Console.WriteLine($"Logged in as {client.Me.Name} (ID: {client.Me.Id})");
await Task.Delay(Timeout.Infinite);
```
Now to run the bot we need to make sure ew are inside the root directory of the app and then run:
Now to run the bot we need to make sure we are inside the root directory of the app and then run:
```bash
dotnet run

View File

@@ -131,3 +131,5 @@ await channel.SendMessageAsync("Hello from my bot!");
await Task.Delay(Timeout.Infinite);
```
##
## [The Next step is receiving Messages and Commands](4.MessagesAndCommands.md)

View File

@@ -0,0 +1,148 @@
# Receiving messages and Making commands
Now that we can send messages to a channel using the bot its time to receive messages from users so that we can make commands!
**Unfortunately due to a bug in the Valour SDK at this moment the caching of channels isnt working and so we have to do a workaround**
First lets start with making it so the bot can see every channel for every planet its in. We can do this by editing the code just a little bit and looping through each planet and then opening every channel:
```c#
// Fetch all the planets instead of just the first
foreach (Planet planet in client.PlanetService.JoinedPlanets)
{
await planet.EnsureReadyAsync();
await planet.FetchInitialDataAsync();
foreach (Channel chan in planet.Channels)
{
channelCache[chan.Id] = chan;
// If the channel is a chat channel then open that channel to the bot to see.
if (chan.ChannelType == ChannelTypeEnum.PlanetChat)
{
// Open the channel with your bots name!
await chan.OpenWithResult("YourBotName");
}
}
}
```
After every channel is open we have to make the bot listen for incoming messages.
```c#
// Get all messages that are send into text channels
client.MessageService.MessageReceived += onMessageReceived;
```
In order to use this listener we have to make a Function called onMessageReceived (or whatever you named it above). We can do this directly on the listener but some things are restricted by doing this (idk dont ask :P)
Inside this listener is where we execute what we want to do with the incoming message. In this example we have a simple Ping command that replys with Pong!
```c#
// Function for what to do with the received messages
async Task onMessageReceived(Message message)
{
// Prefix.. duh..
string prefix = "bg/";
// What the message says
string content = message.Content;
// Get the channel that the message was sent in
if (!channelCache.TryGetValue(message.ChannelId, out var channel)) return;
// If the message doesnt start with the prefix then just ignore it
if (!content.StartsWith(prefix)) return;
// Check if the message is the prefix + ping
if (content.StartsWith($"{prefix}ping"))
{
// Sends the message `Pong!` to the channel
await channel.SendMessageAsync("Pong!");
}
}
```
This is the basics of how to get commands working with a bot on Valour.
<br><br>
### Full code below
```c#
using Valour.Sdk.Client;
using Valour.Shared;
using DotNetEnv;
using Valour.Sdk.Models;
using Valour.Shared.Models;
ValourClient client = new ValourClient("https://api.valour.gg/");
client.SetupHttpClient();
Env.Load();
string token = Environment.GetEnvironmentVariable("TOKEN") ?? string.Empty;
Dictionary<long, Channel> channelCache = new();
if (string.IsNullOrWhiteSpace(token))
{
Console.WriteLine($"Token invalid. Please make sure you set a valid token in your .env");
return;
}
TaskResult loginResult = await client.InitializeUser(token);
if (!loginResult.Success)
{
Console.WriteLine($"Login failed: {loginResult.Message}");
}
Console.WriteLine($"Logged in as {client.Me.Name} (ID: {client.Me.Id})");
// Fetch all the planets instead of just the first
foreach (Planet planet in client.PlanetService.JoinedPlanets)
{
await planet.EnsureReadyAsync();
await planet.FetchInitialDataAsync();
foreach (Channel chan in planet.Channels)
{
channelCache[chan.Id] = chan;
// If the channel is a chat channel then open that channel to the bot to see.
if (chan.ChannelType == ChannelTypeEnum.PlanetChat)
{
// Open the channel with your bots name!
await chan.OpenWithResult("YourBotName");
}
}
}
// Get all messages that are send into text channels
client.MessageService.MessageReceived += onMessageReceived;
// Function for what to do with the received messages
async Task onMessageReceived(Message message)
{
// Prefix.. duh..
string prefix = "bg/";
// What the message says
string content = message.Content;
// Get the channel that the message was sent in
if (!channelCache.TryGetValue(message.ChannelId, out var channel)) return;
// If the message doesnt start with the prefix then just ignore it
if (!content.StartsWith(prefix)) return;
// Check if the message is the prefix + ping
if (content.StartsWith($"{prefix}ping"))
{
// Sends the message `Pong!` to the channel
await channel.SendMessageAsync("Pong!");
}
}
await Task.Delay(Timeout.Infinite);
```
##
## End of Bot Guide (for now)