stream-overlay/main.go

101 lines
2.4 KiB
Go

package main
import (
"fmt"
"log"
"sync"
_ "embed"
"github.com/gempir/go-twitch-irc/v4"
"github.com/gin-gonic/gin"
)
var (
// Store chat messages for each channel
channelMessages = make(map[string][]string)
mu sync.Mutex
)
func main() {
// Set up Twitch client
client := twitch.NewAnonymousClient() // No need to log in as a bot
// Set up Gin web server
r := gin.Default()
// Serve static files (HTML, CSS, JS)
r.Static("/static", "./static")
// Endpoint to get chat messages for a specific channel
r.GET("/chat/:channel", func(c *gin.Context) {
channel := c.Param("channel")
mu.Lock()
defer mu.Unlock()
messages, exists := channelMessages[channel]
if !exists {
c.JSON(200, gin.H{
"messages": []string{},
})
return
}
c.JSON(200, gin.H{
"messages": messages,
})
})
// Handle Twitch chat messages
client.OnPrivateMessage(func(message twitch.PrivateMessage) {
mu.Lock()
defer mu.Unlock()
channel := message.Channel
messages := channelMessages[channel]
messages = append(messages, fmt.Sprintf("%s: %s", message.User.Name, message.Message))
if len(messages) > 100 { // Keep only the last 100 messages
messages = messages[1:]
}
channelMessages[channel] = messages
})
// Automatically join channels when requested
r.GET("/chat/:channel/overlay", func(c *gin.Context) {
channel := c.Param("channel")
client.Join(channel) // Join the channel if not already joined
c.File("./static/overlay.html") // Serve the overlay HTML
})
// Test endpoint to simulate chat messages via POST requests
r.POST("/test/:channel", func(c *gin.Context) {
channel := c.Param("channel")
var request struct {
Username string `json:"username"`
Message string `json:"message"`
}
if err := c.ShouldBindJSON(&request); err != nil {
c.JSON(400, gin.H{"error": "Invalid request body"})
return
}
mu.Lock()
defer mu.Unlock()
messages := channelMessages[channel]
messages = append(messages, fmt.Sprintf("%s: %s", request.Username, request.Message))
if len(messages) > 100 { // Keep only the last 100 messages
messages = messages[1:]
}
channelMessages[channel] = messages
c.JSON(200, gin.H{"status": "message added"})
})
// Start the web server
go func() {
err := client.Connect()
if err != nil {
log.Fatalf("Error connecting to Twitch: %v", err)
}
}()
r.Run(":8080")
}