send search request wip

This commit is contained in:
partisan 2024-08-08 23:09:07 +02:00
parent b9f02e9d1e
commit 84bf55ab24
5 changed files with 152 additions and 106 deletions

View file

@ -11,8 +11,6 @@ import (
"time"
)
var resultsChan = make(chan []ForumSearchResult)
func PerformRedditSearch(query string, safe string, page int) ([]ForumSearchResult, error) {
const (
pageSize = 25
@ -194,27 +192,3 @@ func sendSearchRequestToNode(nodeAddr, query, safe, lang string, page int) ([]Fo
return nil, fmt.Errorf("timeout waiting for results from node %s", nodeAddr)
}
}
func handleForumResultsMessage(msg Message) {
var results []ForumSearchResult
err := json.Unmarshal([]byte(msg.Content), &results)
if err != nil {
log.Printf("Error unmarshalling forum results: %v", err)
return
}
log.Printf("Received forum results: %+v", results)
// Send results to resultsChan
go func() {
resultsChan <- results
}()
}
func fetchForumResults(query, safe, lang string, page int) []ForumSearchResult {
results, err := PerformRedditSearch(query, safe, page)
if err != nil {
log.Printf("Error fetching forum results: %v", err)
return nil
}
return results
}

View file

@ -1,6 +1,7 @@
package main
import (
"encoding/json"
"fmt"
"html/template"
"log"
@ -40,6 +41,7 @@ func handleImageSearch(w http.ResponseWriter, query, safe, lang string, page int
CurrentLang string
HasPrevPage bool
HasNextPage bool
NoResults bool
}{
Results: combinedResults,
Query: query,
@ -49,6 +51,7 @@ func handleImageSearch(w http.ResponseWriter, query, safe, lang string, page int
CurrentLang: lang,
HasPrevPage: page > 1,
HasNextPage: len(combinedResults) >= 50,
NoResults: len(combinedResults) == 0,
}
err = tmpl.Execute(w, data)
@ -120,12 +123,67 @@ func fetchImageResults(query, safe, lang string, page int) []ImageSearchResult {
// If no results found after trying all engines
if len(results) == 0 {
log.Printf("No image results found for query: %s", query)
log.Printf("No image results found for query: %s, trying other nodes", query)
results = tryOtherNodesForImageSearch(query, safe, lang, page)
}
return results
}
func tryOtherNodesForImageSearch(query, safe, lang string, page int) []ImageSearchResult {
for _, nodeAddr := range peers {
results, err := sendImageSearchRequestToNode(nodeAddr, query, safe, lang, page)
if err != nil {
log.Printf("Error contacting node %s: %v", nodeAddr, err)
continue
}
if len(results) > 0 {
return results
}
}
return nil
}
func sendImageSearchRequestToNode(nodeAddr, query, safe, lang string, page int) ([]ImageSearchResult, error) {
searchParams := struct {
Query string `json:"query"`
Safe string `json:"safe"`
Lang string `json:"lang"`
Page int `json:"page"`
ResponseAddr string `json:"responseAddr"`
}{
Query: query,
Safe: safe,
Lang: lang,
Page: page,
ResponseAddr: fmt.Sprintf("http://localhost:%d/node", config.Port),
}
msgBytes, err := json.Marshal(searchParams)
if err != nil {
return nil, fmt.Errorf("failed to marshal search parameters: %v", err)
}
msg := Message{
ID: hostID,
Type: "search-image",
Content: string(msgBytes),
}
err = sendMessage(nodeAddr, msg)
if err != nil {
return nil, fmt.Errorf("failed to send search request to node %s: %v", nodeAddr, err)
}
// Wait for results
select {
case res := <-imageResultsChan:
return res, nil
case <-time.After(30 * time.Second): // Need to handle this better, setting a static number is stupid
return nil, fmt.Errorf("timeout waiting for results from node %s", nodeAddr)
}
}
func wrapImageSearchFunc(f func(string, string, string, int) ([]ImageSearchResult, time.Duration, error)) func(string, string, string, int) ([]SearchResult, time.Duration, error) {
return func(query, safe, lang string, page int) ([]SearchResult, time.Duration, error) {
imageResults, duration, err := f(query, safe, lang, page)

View file

@ -49,6 +49,7 @@ func handleSearchImageMessage(msg Message) {
Safe string `json:"safe"`
Lang string `json:"lang"`
Page int `json:"page"`
ResponseAddr string `json:"responseAddr"`
}
err := json.Unmarshal([]byte(msg.Content), &searchParams)
if err != nil {
@ -56,6 +57,8 @@ func handleSearchImageMessage(msg Message) {
return
}
log.Printf("Received search-image request. ResponseAddr: %s", searchParams.ResponseAddr)
results := fetchImageResults(searchParams.Query, searchParams.Safe, searchParams.Lang, searchParams.Page)
resultsJSON, err := json.Marshal(results)
if err != nil {
@ -69,9 +72,17 @@ func handleSearchImageMessage(msg Message) {
Content: string(resultsJSON),
}
err = sendMessage(msg.ID, responseMsg)
// Log the address to be used for sending the response
log.Printf("Sending image search results to %s", searchParams.ResponseAddr)
if searchParams.ResponseAddr == "" {
log.Printf("Error: Response address is empty")
return
}
err = sendMessage(searchParams.ResponseAddr, responseMsg)
if err != nil {
log.Printf("Error sending image search results to %s: %v", msg.ID, err)
log.Printf("Error sending image search results to %s: %v", searchParams.ResponseAddr, err)
}
}

View file

@ -2,79 +2,80 @@ package main
import (
"encoding/json"
"log"
)
// func sendSearchRequestToNode(nodeAddr, query, safe, lang string, page int, requestID string) ([]ForumSearchResult, error) {
// searchParams := struct {
// Query string `json:"query"`
// Safe string `json:"safe"`
// Lang string `json:"lang"`
// Page int `json:"page"`
// ResponseAddr string `json:"responseAddr"`
// }{
// Query: query,
// Safe: safe,
// Lang: lang,
// Page: page,
// ResponseAddr: "http://localhost:5000/node", // Node 1's address
// }
////// FORUMS /////
// msg := Message{
// ID: requestID,
// Type: "search-forum",
// Content: toJSON(searchParams),
// }
var resultsChan = make(chan []ForumSearchResult)
// msgBytes, err := json.Marshal(msg)
// if err != nil {
// return nil, fmt.Errorf("failed to marshal search request: %v", err)
// }
func sendForumResults(responseAddr string, results []ForumSearchResult) {
resultsMsg := Message{
ID: hostID,
Type: "forum-results",
Content: marshalResults(results),
}
// req, err := http.NewRequest("POST", nodeAddr, bytes.NewBuffer(msgBytes))
// if err != nil {
// return nil, fmt.Errorf("failed to create search request: %v", err)
// }
// req.Header.Set("Content-Type", "application/json")
// req.Header.Set("Authorization", authCode)
// client := &http.Client{
// Timeout: time.Second * 10,
// }
// resp, err := client.Do(req)
// if err != nil {
// return nil, fmt.Errorf("failed to send search request: %v", err)
// }
// defer resp.Body.Close()
// if resp.StatusCode != http.StatusOK {
// body, _ := ioutil.ReadAll(resp.Body)
// return nil, fmt.Errorf("server error: %s", body)
// }
// var responseMsg Message
// err = json.NewDecoder(resp.Body).Decode(&responseMsg)
// if err != nil {
// return nil, fmt.Errorf("failed to decode search response: %v", err)
// }
// if responseMsg.Type != "forum-results" {
// return nil, fmt.Errorf("unexpected message type: %s", responseMsg.Type)
// }
// var results []ForumSearchResult
// err = json.Unmarshal([]byte(responseMsg.Content), &results)
// if err != nil {
// return nil, fmt.Errorf("failed to unmarshal search results: %v", err)
// }
// return results, nil
// }
func toJSON(v interface{}) string {
data, err := json.Marshal(v)
err := sendMessage(responseAddr, resultsMsg)
if err != nil {
log.Printf("Error sending forum search results to %s: %v", responseAddr, err)
} else {
log.Printf("Forum search results sent successfully to %s", responseAddr)
}
}
func marshalResults(results []ForumSearchResult) string {
content, err := json.Marshal(results)
if err != nil {
log.Printf("Error marshalling forum results: %v", err)
return ""
}
return string(data)
return string(content)
}
func handleForumResultsMessage(msg Message) {
var results []ForumSearchResult
err := json.Unmarshal([]byte(msg.Content), &results)
if err != nil {
log.Printf("Error unmarshalling forum results: %v", err)
return
}
log.Printf("Received forum results: %+v", results)
// Send results to resultsChan
go func() {
resultsChan <- results
}()
}
func fetchForumResults(query, safe, lang string, page int) []ForumSearchResult {
results, err := PerformRedditSearch(query, safe, page)
if err != nil {
log.Printf("Error fetching forum results: %v", err)
return nil
}
return results
}
////// FORUMS //////
////// IMAGES /////
var imageResultsChan = make(chan []ImageSearchResult)
func handleImageResultsMessage(msg Message) {
var results []ImageSearchResult
err := json.Unmarshal([]byte(msg.Content), &results)
if err != nil {
log.Printf("Error unmarshalling image results: %v", err)
return
}
log.Printf("Received image results: %+v", results)
// Send results to imageResultsChan
go func() {
imageResultsChan <- results
}()
}
////// IMAGES /////

14
node.go
View file

@ -153,13 +153,15 @@ func interpretMessage(msg Message) {
handleSearchForumMessage(msg)
case "forum-results":
handleForumResultsMessage(msg)
// case "text-results":
// handleTextResultsMessage(msg) // need to implement
case "image-results":
handleImageResultsMessage(msg) // need to implement
// case "video-results":
// handleVideoResultsMessage(msg) // need to implement
// case "file-results":
// handleFileResultsMessage(msg) // need to implement
default:
fmt.Println("Received unknown message type:", msg.Type)
}
}
func generateRequestID() string {
bytes := make([]byte, 16)
rand.Read(bytes)
return fmt.Sprintf("%x", bytes)
}