101 lines
2.4 KiB
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")
|
|
}
|