121 lines
2.5 KiB
Go
121 lines
2.5 KiB
Go
|
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) {
|
||
|
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
|
||
|
}
|
||
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||
|
|
||
|
client := &http.Client{}
|
||
|
resp, err := client.Do(req)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
}
|
||
|
|
||
|
func (b *TGBot) SendFile(filePath, caption string) {
|
||
|
apiURL := fmt.Sprintf("https://api.telegram.org/bot%s/sendDocument", b.Token)
|
||
|
|
||
|
file, err := os.Open(filePath)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
defer file.Close()
|
||
|
|
||
|
body := &bytes.Buffer{}
|
||
|
|
||
|
writer := multipart.NewWriter(body)
|
||
|
|
||
|
part, err := writer.CreateFormFile("document", filepath.Base(file.Name()))
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
_, err = io.Copy(part, file)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
writer.WriteField("chat_id", b.ID)
|
||
|
writer.WriteField("caption", caption)
|
||
|
|
||
|
err = writer.Close()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
req, err := http.NewRequest("POST", apiURL, body)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
req.Header.Set("Content-Type", writer.FormDataContentType())
|
||
|
|
||
|
client := &http.Client{}
|
||
|
resp, err := client.Do(req)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
}
|
||
|
|
||
|
// Telegram backup. Takes database path, query log, cache
|
||
|
func (b *TGBot) Backup(dbpath string, log []string, cache *candycache.Cache) {
|
||
|
// Send db
|
||
|
b.SendFile(dbpath, "📦 Бэкап базы данных")
|
||
|
// Create and send log file
|
||
|
if err := tools.StringSliceToFile(log, "log.txt"); err != nil {
|
||
|
b.SendMessage(fmt.Sprintf("🔴 Ошибка записи логов в файл: %s", err.Error()))
|
||
|
} else {
|
||
|
b.SendFile("log.txt", "📃 Лог запросов за последний час")
|
||
|
}
|
||
|
// Create and send cache dump
|
||
|
if err := WriteCacheDumpToFile(cache, "cache.json"); err != nil {
|
||
|
b.SendMessage(fmt.Sprintf("🔴 Ошибка записи дампа кэша в файл: %s", err.Error()))
|
||
|
} else {
|
||
|
b.SendFile("cache.json", "🗄 Дамп кэша")
|
||
|
}
|
||
|
|
||
|
// Cleanup
|
||
|
for i := range log {
|
||
|
log[i] = ""
|
||
|
}
|
||
|
os.Remove("log.txt")
|
||
|
os.Remove("cache.json")
|
||
|
}
|