8 24 81

.Net Discord 机器人开发

引言

使用.NET 开发一个 Discord 机器人

开发环境准备

  1. Discord 开发者账号:在 Discord 开发者门户创建一个应用程序,获取机器人的令牌(Token),这是机器人连接到 Discord 服务器的关键凭证。

        Discord 开发者官方地址:https://discord.com/developers

 

 

代码结构与核心组件解析

使Discord包版本:Discord.Net 3.10.0

DiscordStartupService 类

 新建一个
IHostedService 服务类
复制代码
public class DiscordStartupService : IHostedService
{
    private readonly DiscordSocketClient _discord;
    private readonly ILogger<DiscordSocketClient> _logger;

    public DiscordStartupService(DiscordSocketClient discord, ILogger<DiscordSocketClient> logger)
    {
        _discord = discord;
        _logger = logger;

        _discord.Log += msg => LogHelper.OnLogAsync(_logger, msg);
        _discord.MessageReceived += MessageReceived;
        _discord.UserJoined += UserJoinedHandler;
        _discord.UserLeft += UserLeftHandler;
    }
}
复制代码

 

DiscordSocketClient是与 Discord API 进行交互的主要客户端,而ILogger用于记录机器人运行时的日志信息,帮助我们调试和监控机器人的状态。同时,我们订阅了_discordLog事件,以便记录所有来自 Discord 客户端的日志消息。
LogHelper类
复制代码
 public static class LogHelper
 {
     public static Task OnLogAsync(ILogger logger, LogMessage msg)
     {
         switch (msg.Severity)
         {
             case LogSeverity.Verbose:
                 logger.LogInformation(msg.ToString());
                 break;

             case LogSeverity.Info:
                 logger.LogInformation(msg.ToString());
                 break;

             case LogSeverity.Warning:
                 logger.LogWarning(msg.ToString());
                 break;

             case LogSeverity.Error:
                 logger.LogError(msg.ToString());
                 break;

             case LogSeverity.Critical:
                 logger.LogCritical(msg.ToString());
                 break;
         }
         return Task.CompletedTask;
     }
 }
复制代码

 

 

启动与停止服务


StartAsync方法在应用程序启动时被调用,负责启动 Discord 客户端并执行一些初始化操作。
 
public async Task StartAsync(CancellationToken cancellationToken)
{
    await _discord.LoginAsync(TokenType.Bot, "这里填写机器人的token");
await _discord.StartAsync(); Thread.Sleep(10000); await SendMessage(); }

 

在这里,我们首先调用_discord.StartAsync()启动 Discord 客户端连接到 Discord 服务器。然后使用Thread.Sleep(10000)暂停 10 秒钟,以确保客户端完全连接并准备就绪。注意:准备就绪才能调用Discord相关方法,不然无法调用。最后,调用SendMessage方法发送游戏账号连接相关的消息,这里是发送消息是为了测试连接是否正常。

StopAsync方法在应用程序停止时被调用,负责关闭 Discord 客户端连接。
 
public async Task StopAsync(CancellationToken cancellationToken)
{
    await _discord.LogoutAsync();
    await _discord.StopAsync();
}

 


通过调用_discord.LogoutAsync()_discord.StopAsync(),我们确保机器人正确地从 Discord 服务器注销并停止运行。

发送消息功能

SendMessage方法用于向指定的 Discord 频道发送游戏账号连接的相关信息,包括嵌入消息(Embed)和按钮组件(Component)。
 
复制代码
private async Task SendMessage()
{
    var channel = _discord.GetChannel(111111) as IMessageChannel; // 频道Id
    if (channel!= null)
    {
        var embed = new EmbedBuilder[]
        {
            new EmbedBuilder()
          .WithTitle("标题")
          .WithDescription("内容")
          .WithColor(5832569),
        };

        foreach (var emb in embed)
        {
            await channel.SendMessageAsync(embed: emb.Build());
        }

        var message = await channel.SendMessageAsync("按钮格式", components: new ComponentBuilder()
          .WithButton("按钮1", style: ButtonStyle.Link,
                url: "https://链接1")
          .WithButton("按钮2", style: ButtonStyle.Link,
                url: "https://链接2")
          .Build());
    }
}
复制代码

 

首先,通过_discord.GetChannel方法获取指定 ID 的频道,并将其转换为IMessageChannel类型。如果获取成功,我们创建了一个包含数组embed,分别用于说明连接步骤、首次连接奖励和注意事项。通过foreach循环,依次将这些嵌入消息发送到频道中。

接着,我们使用ComponentBuilder构建了一个包含按钮的消息组件,每个按钮对应不同的游戏服务器连接选项。当用户点击这些按钮时,将跳转到指定的 URL 中。

消息处理功能


MessageReceived方法用于处理用户发送到 Discord 频道的消息。
 
复制代码
private async Task MessageReceived(SocketMessage socketMessage)
{
    if (socketMessage is SocketUserMessage userMessage &&!socketMessage.Author.IsBot && socketMessage.Channel is ITextChannel channel)
    {
        if (channel!= null)
        {
            string link = "https://www.baidu.com";
            string linkText = "hello";
            await channel.SendMessageAsync($"{linkText}: [{linkText}]({link})");
            await socketMessage.Author.SendMessageAsync("欢迎欢迎");
        }
    }
}
复制代码

 


在这个方法中,我们首先检查接收到的消息是否是用户发送的(而非机器人自己发送的),并且消息所在的频道是否是文本频道。如果满足条件,我们向频道发送一条包含超链接的消息,并向消息发送者发送一条私人欢迎消息。

用户加入与离开处理功能

UserJoinedHandler方法在有新用户加入服务器时被调用,用于发送欢迎消息。
 
private async Task UserJoinedHandler(SocketGuildUser user)
{
    await user.SendMessageAsync($"欢迎 {user.Mention} 加入服务器!🎉 欢迎你的到来!");
}

 

在这里,我们直接向新加入的用户发送一条私人欢迎消息,使用user.Mention可以在消息中直接提及该用户。

UserLeftHandler方法在用户离开服务器时被调用,当前代码中虽然逻辑有误(向离开的用户发送欢迎消息),但正确的实现可以用于记录用户离开事件或发送告别消息等。

复制代码
private async Task UserLeftHandler(SocketGuild socketGuild, SocketUser user)
{
    // 正确逻辑示例:
     var logChannel = socketGuild.GetChannel(logChannelId) as ITextChannel;
     if (logChannel!= null)
     {
         await logChannel.SendMessageAsync($"用户 {user.Mention} 离开了服务器。");
     }
}
复制代码

 

部署与运行

  1. 配置令牌:在应用程序的配置文件或环境变量中设置 Discord 机器人的令牌,确保安全存储,避免泄露。
  2. 运行机器人:在服务器或本地环境中启动发布后的应用程序,机器人将连接到 Discord 服务器并开始运行,根据设定的逻辑处理各种事件。

总结与拓展

使用.NET 开发一个功能丰富的 Discord 机器人,实现了游戏账号连接指引、消息处理、用户加入与离开通知等功能。在实际应用中,可以根据需求进一步拓展机器人的功能,例如添加更多的命令处理、与游戏服务器进行数据交互、实现积分系统等。
posted @   Ivan_Ivan  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示