package models import ( "bytes" "fmt" "io" "main/tools" "mime/multipart" "net/http" "net/url" "os" "path/filepath" "strings" "git.hikan.ru/serr/candycache" ) type TGBot struct { Token string // tg bot token ID string // tg chat id } func TGNew(token, id string) *TGBot { return &TGBot{ Token: token, ID: id, } } func (b *TGBot) SendMessage(text string) error { apiURL := fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", b.Token) data := url.Values{} data.Set("chat_id", b.ID) data.Set("text", text) req, err := http.NewRequest("POST", apiURL, strings.NewReader(data.Encode())) if err != nil { return err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") client := &http.Client{} resp, err := client.Do(req) if err != nil { return err } defer resp.Body.Close() return nil } func (b *TGBot) SendFile(filePath, caption string) error { apiURL := fmt.Sprintf("https://api.telegram.org/bot%s/sendDocument", b.Token) file, err := os.Open(filePath) if err != nil { return err } defer file.Close() body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("document", filepath.Base(file.Name())) if err != nil { return err } _, err = io.Copy(part, file) if err != nil { return err } writer.WriteField("chat_id", b.ID) writer.WriteField("caption", caption) err = writer.Close() if err != nil { return err } req, err := http.NewRequest("POST", apiURL, body) if err != nil { return err } req.Header.Set("Content-Type", writer.FormDataContentType()) client := &http.Client{} resp, err := client.Do(req) if err != nil { return err } defer resp.Body.Close() return nil } // Telegram backup. Takes database path, query log, cache func (b *TGBot) BackupAll(dbpath string, log []string, cache *candycache.Cache) error { if err := b.DatabaseBackup(dbpath); err != nil { return err } if err := b.LogBackup(log); err != nil { return err } if err := b.CacheBackup(cache); err != nil { return err } // Cleanup for i := range log { log[i] = "" } return nil } func (b *TGBot) DatabaseBackup(dbpath string) error { return b.SendFile(dbpath, "📦 Бэкап базы данных") } func (b *TGBot) LogBackup(log []string) error { // Create and send log file if err := tools.StringSliceToFile(log, "log.txt"); err != nil { return err } if err := b.SendFile("log.txt", "📃 Лог запросов за последний час"); err != nil { return err } // Cleanup log file after sending return os.Remove("log.txt") } func (b *TGBot) CacheBackup(cache *candycache.Cache) error { // Create and send cache dump if err := WriteCacheDumpToFile(cache, "cache.json"); err != nil { return err } if err := b.SendFile("cache.json", "🗄 Дамп кэша"); err != nil { return err } // Cleanup cache file after sending return os.Remove("cache.json") }