package models
import (
"database/sql"
"html/template"
"log"
"main/config"
"main/tools"
"sync"
"time"
"git.hikan.ru/serr/candycache"
"github.com/gin-gonic/gin"
)
// Контекст сайта
type Site struct {
sync.RWMutex
Cfg *config.Config
Tmpl *template.Template // Хранилище шаблонов
Bot *TGBot // Контроллер для отстука в тг бота
LFM *LFMWorker // Контроллер ЛАСТ ФМ
LogEntries []string // Журнал логов (отправляется в ТГ бота)
Posts Posts // Список со всеми постами из базы данных
Tags map[string]int // Список всех тегов
Cache *candycache.Cache // Домик для кэша
LastTrackAjaxBlock string // HTML Аякс блок, соответствующий последнему кэшированному треку с ластфм
RestartTime time.Time // Временной момент рестарта серверного приложения
Version int64 // Окончание ?v=version для всех кэшируемых файлов
DB *sql.DB // Открытое соединение с БД
GinEngine *gin.Engine // Движок Gin
}
// Функция возвращает пустой экземпляр контекста сайта
func NewSiteCtx() *Site {
return &Site{
RestartTime: time.Now(),
Version: time.Now().Unix(),
}
}
// Запуск параллельных процессов
func (s *Site) RunTickers() {
go tools.Ticker(config.Cfg.TgTickerTime*time.Hour, func() {
if err := s.Bot.BackupAll(config.Cfg.DBPath, s.LogEntries, s.Cache); err != nil {
log.Println("s.Bot.Backup() error: ", err)
}
})
go tools.Ticker(config.Cfg.LastFmTickerTime*time.Second, func() {
if track, err := s.LFM.LastTrack(); err != nil {
log.Println("s.LFM.LastTrack() error: ", err)
} else {
s.LastTrackAjaxBlock = s.LFM.TrackAjax(track)
}
})
}
func (s *Site) Run(ip string) error {
if err := s.GinEngine.Run(ip); err != nil {
return err
}
return nil
}