User: можем ли мы сюда
func main() {
  err := godotenv.Load()
  if err != nil {
    log.Fatalf("Error loading .env file")
  }
  initDB()
  initRedis()
  //initRabbitMQ()
  http.HandleFunc("/telegram", handleTelegramWebhook)
  http.HandleFunc("/get_access", getAccessHandler)
  http.HandleFunc("/get_conf", getConfigHandler)
  http.HandleFunc("/get_plug", getPlugHandler)
  http.HandleFunc("/get_nd_hash", getNDHashHandler)
  http.HandleFunc("/fave", handleFaveHook)
  http.HandleFunc("/tgsentupdate", handleTgSentUpdateHook)
  //http.HandleFunc("/get_devices", getDevicesHandler)
  //http.HandleFunc("/get_subs", getSubscriptionsHandler)
  log.Println("Server started on :8433")
  log.Fatal(http.ListenAndServe(":8433", nil))
}
добавить функцию пуллер которая будет работать параллельно с веб сервером?
Assistant: Generated by BLACKBOX.AI, try unlimited chat https://www.blackbox.ai

Да, вы можете добавить функцию-пуллер, которая будет работать параллельно с веб-сервером. Для этого вы можете использовать горутины в Go. Вот пример того, как это можно сделать:

```go
package main

import (
	"log"
	"net/http"
	"time"

	"github.com/joho/godotenv"
)

func main() {
	err := godotenv.Load()
	if err != nil {
		log.Fatalf("Error loading .env file")
	}
	initDB()
	initRedis()
	// initRabbitMQ()

	// Запускаем пуллер в отдельной горутине
	go startPoller()

	http.HandleFunc("/telegram", handleTelegramWebhook)
	http.HandleFunc("/get_access", getAccessHandler)
	http.HandleFunc("/get_conf", getConfigHandler)
	http.HandleFunc("/get_plug", getPlugHandler)
	http.HandleFunc("/get_nd_hash", getNDHashHandler)
	http.HandleFunc("/fave", handleFaveHook)
	http.HandleFunc("/tgsentupdate", handleTgSentUpdateHook)
	// http.HandleFunc("/get_devices", getDevicesHandler)
	// http.HandleFunc("/get_subs", getSubscriptionsHandler)

	log.Println("Server started on :8433")
	log.Fatal(http.ListenAndServe(":8433", nil))
}

// Функция-пуллер
func startPoller() {
	for {
		// Ваш код для выполнения периодических задач
		log.Println("Poller is
User: 1. давай назовем пуллер startNotification()
2. он должен работать раз в 6 часов
3. делать запрос rows, err := db.Query("SELECT user_id FROM users WHERE notifications = true")

Assistant: Конечно, давайте переработаем функцию для выполнения задачи по вашему запросу. Мы назовем функцию `startNotification()` и настроим её на выполнение задачи каждые 6 часов. Она будет делать запрос к базе данных, чтобы получить `user_id` пользователей с включёнными уведомлениями.

Вот как это может быть реализовано:

```go
package main

import (
        "database/sql"
        "log"
        "net/http"
        "time"

        _ "github.com/go-sql-driver/mysql" // Замените на ваш используемый драйвер
        "github.com/joho/godotenv"
)

var db *sql.DB

func initDB() {
        var err error
        db, err = sql.Open("mysql", "username:password@protocol(address)/dbname")
        if err != nil {
                log.Fatal(err)
        }
}

func main() {
        err := godotenv.Load()
        if err != nil {
                log.Fatalf("Error loading .env file")
        }
        initDB()
        initRedis()
        // initRabbitMQ()

        // Запускаем функцию уведомления в отдельной горутине
        go startNotification()

        http.HandleFunc("/telegram", handleTelegramWebhook)
        http.HandleFunc("/get_access", getAccessHandler)
        http.HandleFunc("/get_conf", getConfigHandler)
        http.HandleFunc("/get_plug", getPlugHandler)
        http.HandleFunc("/get_nd_hash", getNDHashHandler)
        http.HandleFunc("/fave", handleFaveHook)
        http.HandleFunc("/tgsentupdate", handleTgSentUpdateHook)
        // http.HandleFunc("/get_devices", getDevicesHandler)
        // http.HandleFunc("/get_subs", getSubscriptionsHandler)

        log.Println("Server started on :8433")
        log.Fatal(http.ListenAndServe(":8433", nil))
}

// Функция уведомлений
func startNotification() {
        for {
                log.Println("Executing notification check...")

                rows, err := db.Query("SELECT user_id FROM users WHERE notifications = true")
                if err != nil {
                        log.Println("Error querying the database:", err)
                } else {
                        defer rows.Close()
                        
                        for rows.Next() {
                                var userID int
                                if err := rows.Scan(&userID); err != nil {
                                        log.Println("Error scanning row:", err)
                                } else {
                                        // Обработка userID для отправки уведомлений
                                        log.Printf("Notification for user_id: %d\n", userID)
                                }
                        }
                        if err := rows.Err(); err != nil {
                                log.Println("Rows error:", err)
                        }
                }

                time.Sleep(6 * time.Hour) // Пауза на 6 часов
        }
}
```

В этом примере мы определили функцию `startNotification()`, которая каждые 6 часов (с использованием `time.Sleep(6 * time.Hour)`) выполняет SQL-запрос для получения `user_id` пользователей с активированными уведомлениями. Затем она обрабатывает полученные данные. Убедитесь, что правильно настроили соединение с базой данных в функции `initDB()`, используя правильный драйвер и параметры соединения, подходящие вашей конфигурации базы данных.
User: дальше нам нужно по user_id и fave_name != "history" и fave_name != "thrown" получить card_id(удалив дубликаты) из таблицы user_fave

дальше для каждой уникальной card_id нужно получить из таблицы user_cards по user_id и card_id(в таблице это будет просто id) card_id, сделать get запрос по адресу  https://cors.ndst.pw/https://api.themoviedb.org/3/tv/{card_id}?append_to_response=release_dates&api_key={TMDB_KEY из .env}&language=ru из json ответа забрать 
"name":
"last_episode_to_air": {
"season_number":
"episode_number":
"air_date":
"still_path":}

дальше проверить в redis наличие по user_id, card_id и air_date, если есть то ничего не делать, если нет то добавить данные и вызвать sendReplyToTelegram(telegramID, message) где telegramID = SELECT telegram_id FROM users WHERE user_id = user_id, а message=
https://imagetmdb.cub.red/t/p/w300{still_path}\n
Новая серия!\n
{name}\n
Сезон:{season_number} Эпизод:{episode_number}
Assistant: