.Net Discord 机器人开发
引言
使用.NET 开发一个 Discord 机器人
开发环境准备
- 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
用于记录机器人运行时的日志信息,帮助我们调试和监控机器人的状态。同时,我们订阅了_discord
的Log
事件,以便记录所有来自 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
方法在用户离开服务器时被调用,当前代码中虽然逻辑有误(向离开的用户发送欢迎消息),但正确的实现可以用于记录用户离开事件或发送告别消息等。部署与运行
- 配置令牌:在应用程序的配置文件或环境变量中设置 Discord 机器人的令牌,确保安全存储,避免泄露。
- 运行机器人:在服务器或本地环境中启动发布后的应用程序,机器人将连接到 Discord 服务器并开始运行,根据设定的逻辑处理各种事件。
总结与拓展
使用.NET 开发一个功能丰富的 Discord 机器人,实现了游戏账号连接指引、消息处理、用户加入与离开通知等功能。在实际应用中,可以根据需求进一步拓展机器人的功能,例如添加更多的命令处理、与游戏服务器进行数据交互、实现积分系统等。
如有错误,欢迎指正,互相学习。谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)