Search/node-handle-search.go
partisan 49cb7bb94a
Some checks failed
Run Integration Tests / test (push) Failing after 1m15s
Changed self-crawling as experimental, cleanup unused features
2025-06-08 22:12:15 +02:00

203 lines
5.2 KiB
Go
Executable file

//go:build experimental
// +build experimental
package main
import (
"encoding/json"
)
type searchParams struct {
Query string `json:"query"`
Safe string `json:"safe"`
Lang string `json:"lang"`
Page int `json:"page"`
ResponseAddr string `json:"responseAddr"`
}
func extractTargetFromAddress(addr string) string {
if len(addr) > 5 && addr[len(addr)-5:] == ".sock" {
return addr[:len(addr)-5]
}
return addr
}
// Utility to respond to any search
func respondToSearch(req searchParams, msgType uint8, results any) {
if req.ResponseAddr == "" {
printErr("ResponseAddr is empty")
return
}
respBytes, err := json.Marshal(results)
if err != nil {
printWarn("Failed to marshal results for msg type %d: %v", msgType, err)
return
}
resp := Message{
ID: generateMessageID(),
Type: msgType,
Content: respBytes,
Target: req.ResponseAddr,
}
err = sendMessage(resp)
if err != nil {
printWarn("Failed to send search results to %s: %v", req.ResponseAddr, err)
}
}
func sendBinaryResponse(req searchParams, msgType uint8, payload []byte, msgID uint32) {
if req.ResponseAddr == "" {
printErr("ResponseAddr is empty")
return
}
resp := Message{
ID: msgID,
Type: msgType,
Content: payload,
Target: req.ResponseAddr,
}
if err := sendMessage(resp); err != nil {
printWarn("Failed to send binary search results: %v", err)
}
}
func handleSearchTextMessage(msg Message) {
var req searchParams
if err := json.Unmarshal([]byte(msg.Content), &req); err != nil {
printWarn("Invalid JSON: %v", err)
return
}
printDebug("Received search-text from %s", req.ResponseAddr)
results := fetchTextResults(req.Query, req.Safe, req.Lang, req.Page)
data, err := encodeTextResults(results)
if err != nil {
printWarn("Failed to encode text results: %v", err)
return
}
sendBinaryResponse(req, MsgTypeSearchTextResponse, data, msg.ID)
}
func handleSearchVideoMessage(msg Message) {
var req searchParams
if err := json.Unmarshal([]byte(msg.Content), &req); err != nil {
printWarn("Invalid JSON: %v", err)
return
}
printDebug("Received search-video from %s", req.ResponseAddr)
results := fetchVideoResults(req.Query, req.Safe, req.Lang, req.Page)
data, err := encodeVideoResults(results)
if err != nil {
printWarn("Failed to encode video results: %v", err)
return
}
sendBinaryResponse(req, MsgTypeSearchVideoResponse, data, msg.ID)
}
func handleSearchMusicMessage(msg Message) {
var req searchParams
if err := json.Unmarshal([]byte(msg.Content), &req); err != nil {
printWarn("Invalid JSON: %v", err)
return
}
printDebug("Received search-music from %s", req.ResponseAddr)
results := fetchMusicResults(req.Query, req.Page)
data, err := encodeMusicResults(results)
if err != nil {
printWarn("Failed to encode music results: %v", err)
return
}
sendBinaryResponse(req, MsgTypeSearchMusicResponse, data, msg.ID)
}
func handleSearchFileMessage(msg Message) {
var req searchParams
if err := json.Unmarshal([]byte(msg.Content), &req); err != nil {
printWarn("Invalid JSON: %v", err)
return
}
printDebug("Received search-file from %s", req.ResponseAddr)
results := fetchFileResults(req.Query, req.Safe, req.Lang, req.Page)
data, err := encodeFileResults(results)
if err != nil {
printWarn("Failed to encode file results: %v", err)
return
}
sendBinaryResponse(req, MsgTypeSearchFileResponse, data, msg.ID)
}
func handleSearchForumMessage(msg Message) {
var req searchParams
if err := json.Unmarshal([]byte(msg.Content), &req); err != nil {
printWarn("Invalid JSON: %v", err)
return
}
printDebug("Received search-forum from %s", req.ResponseAddr)
results := fetchForumResults(req.Query, req.Safe, req.Lang, req.Page)
data, err := encodeForumResults(results)
if err != nil {
printWarn("Failed to encode forum results: %v", err)
return
}
sendBinaryResponse(req, MsgTypeSearchForumResponse, data, msg.ID)
}
func handleSearchImageMessage(msg Message) {
var req searchParams
if err := json.Unmarshal([]byte(msg.Content), &req); err != nil {
printWarn("Invalid JSON: %v", err)
return
}
printDebug("Received image search type %d from %s", msg.Type, req.ResponseAddr)
var (
thumbsNeeded bool
fullNeeded bool
)
switch msg.Type {
case MsgTypeSearchImageRawRequest:
thumbsNeeded = false
fullNeeded = false
case MsgTypeSearchImageThumbRequest:
thumbsNeeded = true
fullNeeded = false
case MsgTypeSearchImageFullRequest:
thumbsNeeded = false
fullNeeded = true
case MsgTypeSearchImageAllRequest:
thumbsNeeded = true
fullNeeded = true
default:
printWarn("Unknown image search type: %d", msg.Type)
return
}
results := fetchImageResults(req.Query, req.Safe, req.Lang, req.Page, true, thumbsNeeded)
if fullNeeded || thumbsNeeded {
results = prepareProxiedImages(results, msg.Type)
}
data, err := encodeImageResults(results)
if err != nil {
printWarn("Failed to encode image results: %v", err)
return
}
sendBinaryResponse(req, MsgTypeSearchImageResponse, data, msg.ID)
}