203 lines
5.2 KiB
Go
Executable file
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)
|
|
}
|