musiclink/internal/bot/handler.go

66 lines
1.6 KiB
Go

package bot
import (
"context"
"log"
"musiclink/internal/detector"
"musiclink/internal/resolver"
)
// Handler processes incoming messages and generates responses.
type Handler struct {
detector *detector.Detector
resolver *resolver.Resolver
}
// NewHandler creates a new message handler.
func NewHandler(apiURL string) *Handler {
return &Handler{
detector: detector.New(),
resolver: resolver.New(apiURL),
}
}
// Handle processes a message and returns a response if music links were found.
func (h *Handler) Handle(ctx context.Context, msg Message) *Message {
// Detect music links in the message
links := h.detector.Detect(msg.Text)
if len(links) == 0 {
return nil
}
log.Printf("Found %d music link(s) in message from %s: %s", len(links), msg.Username, links[0].URL)
// Process the first link found
link := links[0]
// Resolve to other services via idonthavespotify API
log.Printf("Calling resolver for %s...", link.URL)
resolved, err := h.resolver.Resolve(ctx, link.URL)
if err != nil {
log.Printf("Error resolving link %s: %v", link.URL, err)
return nil
}
log.Printf("Resolver returned for %s (found %d links)", link.URL, len(resolved.Links))
// Only respond if we found links on other services
if len(resolved.Links) <= 1 {
log.Printf("No additional links found for %s", link.URL)
return nil
}
// Format the response
title := ""
if resolved.Track != nil {
title = resolved.Track.Title
}
text := resolver.Format(resolved, title)
log.Printf("Sending response for %s", link.URL)
return &Message{
Text: text,
Gateway: msg.Gateway,
}
}