musiclink/internal/handler/handler.go

63 lines
1.6 KiB
Go

package handler
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
}
// New creates a new message handler.
func New(apiURL string) *Handler {
return &Handler{
detector: detector.New(),
resolver: resolver.New(apiURL),
}
}
// HandleText processes raw text and returns a response string when links are found.
func (h *Handler) HandleText(ctx context.Context, text, username string) (string, bool) {
// Detect music links in the message
links := h.detector.Detect(text)
if len(links) == 0 {
return "", false
}
log.Printf("Found %d music link(s) in message from %s: %s", len(links), 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 "", false
}
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 "", false
}
// Format the response
title := ""
if resolved.Track != nil {
title = resolved.Track.Title
}
response := resolver.Format(resolved, title)
log.Printf("Sending response for %s", link.URL)
return response, true
}