golang实现Twitch.tv聊天机器人开发插件库go-twitch-irc的使用

Golang实现Twitch.tv聊天机器人开发插件库go-twitch-irc的使用

简介

go-twitch-irc是一个用于连接Twitch IRC的客户端库,它处理了IRC标签解析等繁琐的工作。下面将介绍如何使用这个库来开发Twitch聊天机器人。

快速开始

以下是一个基本的示例代码,展示如何创建一个Twitch聊天机器人:

package main

import (
	"fmt"

	"github.com/gempir/go-twitch-irc/v4"
)

func main() {
	// 或者使用 client := twitch.NewAnonymousClient() 创建匿名用户(无写入能力)
	client := twitch.NewClient("yourtwitchusername", "oauth:123123123")

	// 设置私聊消息回调
	client.OnPrivateMessage(func(message twitch.PrivateMessage) {
		fmt.Println(message.Message)
	})

	// 加入频道
	client.Join("gempir")

	// 连接Twitch IRC
	err := client.Connect()
	if err != nil {
		panic(err)
	}
}

可用数据结构

库提供了多种数据结构来表示Twitch提供的消息类型:

type User struct {
	ID            string
	Name          string
	DisplayName   string
	Color         string
	Badges        map[string]int
	IsBroadcaster bool
	IsMod         bool
	IsVip         bool
}

type PrivateMessage struct {
	User User

	Raw     string
	Type    MessageType
	RawType string
	Tags    map[string]string
	Message string
	Channel string
	RoomID  string
	ID      string
	Time    time.Time
	Emotes  []*Emote
	Bits    int
	Action  bool
}

// 其他消息类型结构体...

客户端方法

客户端提供了以下方法:

func (c *Client) Say(channel, text string)
func (c *Client) Join(channel string)
func (c *Client) Depart(channel string)
func (c *Client) Userlist(channel string) ([]string, error)
func (c *Client) Connect() error
func (c *Client) Disconnect() error
func (c *Client) Latency() (latency time.Duration, err error)

配置选项

可以配置客户端选项:

client.IrcAddress = "127.0.0.1:3030" // 自定义IRC服务器
client.TLS = false // 默认启用,关闭后将连接到Twitch的非TLS服务器
client.SetupCmd = "LOGIN custom_command_here" // 在成功连接IRC后发送自定义命令
client.Capabilities = []string{twitch.TagsCapability, twitch.CommandsCapability} // 自定义能力
client.SetJoinRateLimiter(twitch.CreateVerifiedRateLimiter()) // 设置自定义速率限制器

回调函数

可用的回调函数:

client.OnConnect(func() {})
client.OnPrivateMessage(func(message PrivateMessage) {})
client.OnWhisperMessage(func(message WhisperMessage) {})
client.OnClearChatMessage(func(message ClearChatMessage) {})
client.OnClearMessage(func(message ClearMessage) {})
client.OnRoomStateMessage(func(message RoomStateMessage) {})
client.OnUserNoticeMessage(func(message UserNoticeMessage) {})
client.OnUserStateMessage(func(message UserStateMessage) {})
client.OnGlobalUserStateMessage(func(message GlobalUserStateMessage) {})
client.OnNoticeMessage(func(message NoticeMessage) {})
client.OnUserJoinMessage(func(message UserJoinMessage) {})
client.OnUserPartMessage(func(message UserPartMessage) {})
client.OnSelfJoinMessage(func(message UserJoinMessage) {})
client.OnSelfPartMessage(func(message UserPartMessage) {})

完整示例

下面是一个更完整的示例,展示如何创建一个响应特定命令的Twitch聊天机器人:

package main

import (
	"fmt"
	"strings"

	"github.com/gempir/go-twitch-irc/v4"
)

func main() {
	// 创建客户端
	client := twitch.NewClient("your_bot_username", "oauth:your_oauth_token")

	// 设置消息回调
	client.OnPrivateMessage(func(message twitch.PrivateMessage) {
		fmt.Printf("[%s] %s: %s\n", message.Channel, message.User.DisplayName, message.Message)
		
		// 响应!hello命令
		if strings.HasPrefix(message.Message, "!hello") {
			client.Say(message.Channel, fmt.Sprintf("Hello @%s!", message.User.DisplayName))
		}
	})

	// 加入频道
	client.Join("target_channel")

	// 连接Twitch
	err := client.Connect()
	if err != nil {
		panic(err)
	}
}

这个示例展示了如何:

  1. 创建一个Twitch客户端
  2. 监听聊天消息
  3. 响应特定命令
  4. 发送回复消息

注意:在实际使用时,需要替换your_bot_usernameoauth:your_oauth_tokentarget_channel为实际值。


更多关于golang实现Twitch.tv聊天机器人开发插件库go-twitch-irc的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现Twitch.tv聊天机器人开发插件库go-twitch-irc的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-twitch-irc开发Twitch聊天机器人

Twitch.tv是全球领先的游戏直播平台,开发聊天机器人可以增强频道互动体验。go-twitch-irc是一个优秀的Golang库,用于连接和操作Twitch IRC聊天。

基础设置

首先安装go-twitch-irc库:

go get github.com/gempir/go-twitch-irc/v4

基本机器人实现

package main

import (
	"fmt"
	"log"
	"github.com/gempir/go-twitch-irc/v4"
)

func main() {
	// 创建客户端
	client := twitch.NewClient("your_bot_username", "oauth:your_oauth_token")

	// 设置事件处理
	client.OnPrivateMessage(func(message twitch.PrivateMessage) {
		fmt.Printf("%s: %s\n", message.User.Name, message.Message)
		
		// 响应特定命令
		if message.Message == "!hello" {
			client.Say(message.Channel, fmt.Sprintf("Hello @%s!", message.User.Name))
		}
	})

	// 连接错误处理
	client.OnConnect(func() {
		log.Println("Connected to Twitch IRC")
	})

	// 加入频道
	client.Join("target_channel_name")

	// 启动连接
	err := client.Connect()
	if err != nil {
		log.Fatal(err)
	}
}

高级功能实现

1. 命令系统

type Command struct {
	Name        string
	Description string
	Handler     func(twitch.PrivateMessage)
}

var commands = map[string]Command{
	"!help": {
		Name:        "!help",
		Description: "显示所有可用命令",
		Handler: func(msg twitch.PrivateMessage) {
			var response string
			for _, cmd := range commands {
				response += fmt.Sprintf("%s - %s | ", cmd.Name, cmd.Description)
			}
			client.Say(msg.Channel, response)
		},
	},
	"!uptime": {
		Name:        "!uptime",
		Description: "显示直播时长",
		Handler: func(msg twitch.PrivateMessage) {
			// 这里可以调用Twitch API获取直播时长
			client.Say(msg.Channel, "主播已直播2小时15分钟")
		},
	},
}

client.OnPrivateMessage(func(message twitch.PrivateMessage) {
	if cmd, exists := commands[message.Message]; exists {
		cmd.Handler(message)
	}
})

2. 用户权限检查

func hasPermission(user twitch.User, requiredLevel string) bool {
	// 简单的权限检查逻辑
	// 实际应用中应该更复杂,可能结合数据库或Twitch API
	switch requiredLevel {
	case "mod":
		return user.IsMod || user.Name == message.Channel
	case "vip":
		return user.IsVip || hasPermission(user, "mod")
	default:
		return true
	}
}

3. 消息速率限制

import "time"

type RateLimiter struct {
	lastMessage time.Time
	delay       time.Duration
}

func (rl *RateLimiter) CanSend() bool {
	return time.Since(rl.lastMessage) > rl.delay
}

func (rl *RateLimiter) Sent() {
	rl.lastMessage = time.Now()
}

// 使用
limiter := RateLimiter{delay: 1 * time.Second}

client.OnPrivateMessage(func(message twitch.PrivateMessage) {
	if message.Message == "!spam" && limiter.CanSend() {
		client.Say(message.Channel, "防刷屏机制生效中")
		limiter.Sent()
	}
})

部署注意事项

  1. OAuth令牌安全:不要将OAuth令牌硬编码在代码中,使用环境变量或配置文件
  2. 错误处理:实现重连逻辑,因为网络可能不稳定
  3. 日志记录:记录重要事件和错误以便调试
  4. Twitch API限制:了解并遵守Twitch API的速率限制

完整示例

package main

import (
	"fmt"
	"log"
	"os"
	"time"
	
	"github.com/gempir/go-twitch-irc/v4"
)

func main() {
	// 从环境变量获取凭证
	username := os.Getenv("TWITCH_BOT_USERNAME")
	oauth := os.Getenv("TWITCH_OAUTH_TOKEN")
	channel := os.Getenv("TWITCH_CHANNEL")

	if username == "" || oauth == "" || channel == "" {
		log.Fatal("请设置TWITCH_BOT_USERNAME, TWITCH_OAUTH_TOKEN和TWITCH_CHANNEL环境变量")
	}

	client := twitch.NewClient(username, oauth)
	
	// 速率限制器
	limiter := struct {
		lastMessage time.Time
		delay       time.Duration
	}{
		delay: 1 * time.Second,
	}

	client.OnPrivateMessage(func(msg twitch.PrivateMessage) {
		log.Printf("[%s] %s: %s", msg.Channel, msg.User.Name, msg.Message)
		
		switch msg.Message {
		case "!hello":
			if time.Since(limiter.lastMessage) > limiter.delay {
				client.Say(msg.Channel, fmt.Sprintf("你好 @%s!", msg.User.Name))
				limiter.lastMessage = time.Now()
			}
		case "!time":
			client.Say(msg.Channel, fmt.Sprintf("当前时间: %s", time.Now().Format("15:04:05")))
		}
	})

	client.OnConnect(func() {
		log.Println("成功连接到Twitch IRC")
	})

	// 加入频道
	client.Join(channel)

	// 自动重连逻辑
	for {
		err := client.Connect()
		if err != nil {
			log.Printf("连接错误: %v, 5秒后重试...", err)
			time.Sleep(5 * time.Second)
		} else {
			break
		}
	}
}

这个示例展示了go-twitch-irc库的基本用法,包括连接Twitch IRC、处理消息、实现简单命令系统和基本的速率限制。你可以在此基础上扩展更复杂的功能,如积分系统、游戏互动等。

回到顶部