hikan.ru/mvc/models/telegram.go

121 lines
2.5 KiB
Go
Raw Normal View History

2025-02-02 16:43:55 +03:00
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")
}