golang Discord API接口封装与操作插件库disgo的使用

Golang Discord API接口封装与操作插件库disgo的使用

Disgo是一个用于使用Go编程语言创建Discord机器人的库,它提供了灵活、高性能、安全且线程安全的Discord API封装。

什么是Disgo?

Disgo是一个Discord API封装库,旨在提供灵活、高性能、安全且线程安全的实现。它提供了Discord API中的每个功能,包括可选的速率限制、结构化日志记录、分片管理和缓存。

下一代Discord API封装

Disgo是唯一提供100%一对一水平可扩展实现的Go模块。它简化了开发过程,具有以下独家功能:

  • 所有速率限制(全局、每路由、每资源、自定义、网关)
  • 自动网关意图计算
  • 选择性事件处理

Disgo不使用反射或类型断言。

使用API

以下是使用Disgo创建Discord机器人的完整示例:

安装

获取特定版本的disgo:

go get github.com/switchupcb/disgo@v1.10.21

配置

首先需要创建Discord应用程序以获取Bot Token。

bot := &disgo.Client{
    ApplicationID:  "APPID", // 可选
    Authentication: disgo.BotToken("TOKEN"), // 或 BearerToken("TOKEN")
    Authorization:  &disgo.Authorization{ ... },
    Config:         disgo.DefaultConfig(),
    Handlers:       new(disgo.Handlers),
    VoiceHandlers:  new(disgo.VoiceHandlers),
    Sessions:       disgo.NewSessionManager()
}

创建命令

创建应用程序命令请求以添加应用程序命令:

// 创建全局应用程序命令请求
request := disgo.CreateGlobalApplicationCommand{
    Name:        "main",
    Description: disgo.Pointer("A basic command."),
}

// 通过向Discord发送请求来注册新命令
// 返回disgo.ApplicationCommand
newCommand, err := request.Send(bot)
if err != nil {
    log.Printf("failure sending command to Discord: %v", err)
    return
}

处理事件

创建事件处理程序并将其添加到机器人:

// 向机器人添加事件处理程序
bot.Handle(disgo.FlagGatewayEventNameInteractionCreate, func(i *disgo.InteractionCreate) {
    log.Printf("main called by %s", i.User.Username)
})

输出

打开WebSocket会话以接收和发送事件:

// 连接到Discord网关(WebSocket连接)
s := disgo.NewSession()
if err := s.Connect(bot); err != nil {
    log.Printf("can't open websocket session to Discord Gateway: %v", err)
    return
}

当用户在Discord上使用/main命令时,将记录以下消息:

main called by switchupcb.

完整示例代码

package main

import (
	"log"

	"github.com/switchupcb/disgo"
)

func main() {
	// 配置机器人
	bot := &disgo.Client{
		ApplicationID:  "APPID", // 可选
		Authentication: disgo.BotToken("TOKEN"),
		Config:         disgo.DefaultConfig(),
		Handlers:       new(disgo.Handlers),
		Sessions:       disgo.NewSessionManager(),
	}

	// 创建命令
	request := disgo.CreateGlobalApplicationCommand{
		Name:        "main",
		Description: disgo.Pointer("A basic command."),
	}

	_, err := request.Send(bot)
	if err != nil {
		log.Printf("failure sending command to Discord: %v", err)
		return
	}

	// 添加事件处理程序
	bot.Handle(disgo.FlagGatewayEventNameInteractionCreate, func(i *disgo.InteractionCreate) {
		log.Printf("main called by %s", i.User.Username)
	})

	// 连接到网关
	s := disgo.NewSession()
	if err := s.Connect(bot); err != nil {
		log.Printf("can't open websocket session to Discord Gateway: %v", err)
		return
	}

	// 保持程序运行
	select {}
}

特性

为什么选择Go?

Discord机器人是服务器端软件,Go使用Goroutines和Channels维护了卓越的异步处理能力。Go是一种静态类型、编译型编程语言(带有垃圾收集器),与大多数提供Discord API封装的编程语言相比,它在计算性能上表现更好。

Disgo与其他Go Discord API封装的比较

Disgo支持Discord API中的每个功能,并且由于其可选的缓存、分片管理、速率限制和日志记录,是最可定制的Discord API封装。最重要的是Disgo的性能,它通过降低服务器成本为您节省资金。

生态系统

许可证

Apache License 2.0对商业使用是宽松的。

  • Copygen:生成基于自定义类型的代码
  • Dasgo:Discord API的Go类型定义
  • Ecosystem:查看使用Disgo的项目

总结

Disgo提供了一个完整的解决方案来创建和管理Discord机器人,具有高性能和灵活性。通过上述示例,您可以快速开始使用Disgo构建自己的Discord机器人。


更多关于golang Discord API接口封装与操作插件库disgo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang Discord API接口封装与操作插件库disgo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang Discord API 接口封装与 disgo 库使用指南

Discord API 概述

Discord 提供了完善的 REST API 和 WebSocket 网关接口,允许开发者构建机器人、集成应用等。在 Golang 中,我们可以使用 disgo 这样的库来简化与 Discord API 的交互。

disgo 库简介

disgo 是一个功能强大的 Discord API 封装库,提供了以下特性:

  • 完整的 Discord API 覆盖
  • 简洁易用的接口设计
  • 支持 WebSocket 和 REST API
  • 事件驱动架构
  • 完善的文档和示例

安装 disgo

go get github.com/DisgoOrg/disgo

基础使用示例

1. 创建 Discord 机器人客户端

package main

import (
	"github.com/DisgoOrg/disgo"
	"github.com/DisgoOrg/disgo/bot"
	"github.com/DisgoOrg/disgo/discord"
	"github.com/DisgoOrg/disgo/events"
	"github.com/DisgoOrg/disgo/gateway"
	"log"
	"os"
)

func main() {
	// 从环境变量获取token
	token := os.Getenv("DISCORD_BOT_TOKEN")
	if token == "" {
		log.Fatal("DISCORD_BOT_TOKEN 环境变量未设置")
	}

	// 创建客户端
	client, err := disgo.New(token,
		bot.WithGatewayConfigOpts(
			gateway.WithIntents(
				gateway.IntentGuilds,
				gateway.IntentGuildMessages,
				gateway.IntentDirectMessages,
			),
		),
	)
	if err != nil {
		log.Fatal("创建客户端失败:", err)
	}

	// 添加事件监听器
	client.AddEventListeners(&events.ListenerAdapter{
		OnMessageCreate: func(event *events.MessageCreateEvent) {
			handleMessageCreate(client, event)
		},
	})

	// 连接到Discord
	if err = client.Connect(); err != nil {
		log.Fatal("连接Discord失败:", err)
	}

	log.Println("机器人已上线! 按Ctrl+C退出")
	select {} // 保持程序运行
}

func handleMessageCreate(client bot.Client, event *events.MessageCreateEvent) {
	// 忽略机器人自己的消息
	if event.Message.Author.Bot {
		return
	}

	// 如果消息内容是"!ping",回复"pong!"
	if event.Message.Content == "!ping" {
		_, _ = client.Rest().Channels().CreateMessage(event.ChannelID, discord.NewMessageCreateBuilder().
			SetContent("pong!").
			Build(),
		)
	}
}

2. 发送消息

func sendMessage(client bot.Client, channelID discord.Snowflake, content string) {
	// 创建消息构建器
	messageBuilder := discord.NewMessageCreateBuilder().
		SetContent(content).
		AddActionRow(
			discord.NewPrimaryButton("点击我", "button_click"),
		)

	// 发送消息
	message, err := client.Rest().Channels().CreateMessage(channelID, messageBuilder.Build())
	if err != nil {
		log.Printf("发送消息失败: %v", err)
		return
	}
	log.Printf("消息已发送: %s", message.ID)
}

3. 处理按钮交互

client.AddEventListeners(&events.ListenerAdapter{
	OnButtonInteraction: func(event *events.ButtonInteractionEvent) {
		if event.Data.CustomID == "button_click" {
			_ = event.CreateMessage(discord.NewMessageCreateBuilder().
				SetContent("你点击了按钮!").
				SetEphemeral(true).
				Build(),
			)
		}
	},
})

高级功能示例

1. 创建Slash命令

func registerCommands(client bot.Client, guildID discord.Snowflake) {
	// 定义命令
	commands := []discord.ApplicationCommandCreate{
		{
			Name:        "hello",
			Description: "打招呼",
			Options: []discord.ApplicationCommandOption{
				{
					Name:        "name",
					Description: "你的名字",
					Type:        discord.ApplicationCommandOptionTypeString,
					Required:    true,
				},
			},
		},
	}

	// 注册命令
	_, err := client.Rest().Applications().CreateGuildCommands(
		client.ApplicationID(),
		guildID,
		commands...,
	)
	if err != nil {
		log.Printf("注册命令失败: %v", err)
	}
}

// 处理Slash命令
client.AddEventListeners(&events.ListenerAdapter{
	OnApplicationCommandInteraction: func(event *events.ApplicationCommandInteractionEvent) {
		if event.Data.Name == "hello" {
			name := event.Data.Options[0].Value.(string)
			_ = event.CreateMessage(discord.NewMessageCreateBuilder().
				SetContentf("你好, %s!", name).
				Build(),
			)
		}
	},
})

2. 处理消息组件

// 创建带有下拉菜单的消息
func createSelectMenuMessage(client bot.Client, channelID discord.Snowflake) {
	selectMenu := discord.NewStringSelectMenu("food_select", "选择你喜欢的食物").
		AddOptions(
			discord.NewStringSelectMenuOption("披萨", "pizza").
				WithDescription("美味的披萨").
				WithEmoji(discord.Emoji{Name: "🍕"}),
			discord.NewStringSelectMenuOption("汉堡", "hamburger").
				WithDescription("多汁的汉堡").
				WithEmoji(discord.Emoji{Name: "🍔"}),
		)

	messageBuilder := discord.NewMessageCreateBuilder().
		SetContent("请选择你喜欢的食物:").
		AddActionRow(selectMenu)

	_, _ = client.Rest().Channels().CreateMessage(channelID, messageBuilder.Build())
}

// 处理下拉菜单选择
client.AddEventListeners(&events.ListenerAdapter{
	OnStringSelectInteraction: func(event *events.StringSelectInteractionEvent) {
		if event.Data.CustomID == "food_select" {
			selected := event.Data.Values[0]
			var response string
			
			switch selected {
			case "pizza":
				response = "🍕 披萨是个好选择!"
			case "hamburger":
				response = "🍔 汉堡也很棒!"
			default:
				response = "谢谢你的选择!"
			}
			
			_ = event.CreateMessage(discord.NewMessageCreateBuilder().
				SetContent(response).
				Build(),
			)
		}
	},
})

最佳实践

  1. 错误处理:始终检查API调用返回的错误
  2. 速率限制:disgo会自动处理Discord的速率限制,但要注意不要过于频繁地发送请求
  3. 意图(Intents):只请求必要的意图以减少带宽使用
  4. 状态管理:disgo会缓存状态,对于大型服务器可能需要调整缓存设置
  5. 日志记录:配置日志记录以调试问题

总结

disgo 提供了强大而简洁的接口来与 Discord API 交互。通过合理使用其功能,你可以构建出功能丰富的 Discord 机器人。本文介绍了基本消息处理、交互组件和Slash命令等核心功能,你可以在此基础上扩展更复杂的功能。

回到顶部