Как реализовать поиск в телеграмм боте на Go библиотека telebot
Хочу сделать похожий поиск, никакой информации в интернете не нашел, если у кого то опыт с разрабткой такого поиска на Golang и библиотеки telebot. и вожмоно ли вообще такое
Ответы (1 шт):
Автор решения: Дамир Ахметов
→ Ссылка
bot.Handle(telebot.OnQuery, func(c telebot.Context) error {
query := c.Query() // Получаем *telebot.Query из контекста
queryText := strings.TrimSpace(query.Text)
if queryText == "" {
return nil
}
// Выполняем поиск в базе данных
results, err := searchItemsInDB(queryText)
if err != nil {
log.Println("Ошибка при поиске:", err)
return nil
}
// Создаем результаты для инлайн-режима
var articles []telebot.Result
for _, item := range results {
messageText := fmt.Sprintf("*%s*\nЦена: %d руб.\nКатегория: %s\nГород: %s", item.Name, item.Price, item.Category, item.City)
article := &telebot.ArticleResult{
Title: item.Name,
Description: fmt.Sprintf("%d руб., %s, %s", item.Price, item.Category, item.City),
Text: messageText,
// Убрано ParseMode, так как его больше нет в ArticleResult
}
articles = append(articles, article)
}
// Создаем QueryResponse и отправляем через контекст
response := &telebot.QueryResponse{
Results: articles,
CacheTime: 60, // Время кэширования в секундах, настройте при необходимости
}
// Отправляем результаты инлайн-поиска
return c.Answer(response)
})
/ Структура для хранения данных о товаре
type Item struct {
ID int
Name string
Price int
Description string
City string
}
// Функция для поиска товаров в базе данных
func searchItemsInDB(query string) ([]Item, error) {
rows, err := db.Query("SELECT id, name, price, city FROM sales_items WHERE name ILIKE $1 OR description ILIKE $1 LIMIT 10", "%"+query+"%")
if err != nil {
return nil, err
}
defer rows.Close()
var items []Item
for rows.Next() {
var item Item
if err := rows.Scan(&item.ID, &item.Name, &item.Price, &item.City); err != nil {
return nil, err
}
items = append(items, item)
}
return items, nil
}