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 }