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") }