63 lines
1.6 KiB
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
|
|
}
|