ssa
1package tg2
3import (4"io"5"log"6"net/http"7"os"8"time"9
10complexssa "github.com/RB-PRO/ssa/internal/ComplexSSA"11"github.com/RB-PRO/ssa/pkg/ssa"12"github.com/RB-PRO/ssa/pkg/ssa2"13tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"14)
15
16// Структура бота
17type TG struct {18Bot *tgbotapi.BotAPI19}
20
21// Создаём бота
22func NewBot(token string) (*TG, error) {23bot, ErrNewBotAPI := tgbotapi.NewBotAPI(token)24if ErrNewBotAPI != nil {25return nil, ErrNewBotAPI26}27bot.Debug = false28log.Printf("Авторизовался: %s", bot.Self.UserName)29return &TG{bot}, nil30}
31func BotStart2() {32tg, ErrNewBot := NewBot("6720852434:AAFYUm2yplhsXWVKkXHa--o9tmkXZrNcpew")33if ErrNewBot != nil {34log.Panic(ErrNewBot)35}36tg.RangeUpdates()37}
38
39func Full() {40
41// FileDirection := update.Message.From.UserName + "_" + time.Now().Format("2006-01-02_15-04")42FileDirection := "P1H1_edited"43FilePath := "TelegramVideoNote/" + "test2/"44// MakeDir(FilePath)45
46// Массив RGB47// RGB, _ := ExtractRGB(FilePath+"/", FileDirection+".mp4")48RGB, _ := ExtractRGB(FilePath, FileDirection+".avi")49
50// Нормирование51RGB_but := Butter(RGB)52
53// Пульсовая волна54pw, _ := CalcPW(RGB_but, FilePath+"/")55
56////////////////////////////////////////////////////57// SSA_tgbot(FilePath+"/", pw)58// file := tgbotapi.FilePath(FilePath + "/smo.png")59// tg.Bot.Send(tgbotapi.NewPhoto(update.Message.Chat.ID, file))60
61ssaAnalis, _ := ssa2.NewSSA(pw, ssa2.Setup{62Cad: 30,63Win: 1024,64NPart: 20,65FMi: 40.0 / 60.0,66FMa: 240.0 / 60.0,67})68ssaAnalis.Col()69ssaAnalis.SpwEstimation()70ssaAnalis.PwEstimation()71ssa2.CreateLineChart(ssaAnalis.Pto_fMAX, FilePath+"/pto.png")72}
73
74// Слушаем сообшения в телеграме
75func (tg *TG) RangeUpdates() {76u := tgbotapi.NewUpdate(0)77u.Timeout = 6078updates := tg.Bot.GetUpdatesChan(u)79for update := range updates {80if update.Message == nil { // ignore any non-Message updates81continue82}83
84if update.Message.VideoNote != nil || update.Message.Video != nil {85
86// Обработка видео-заметки87videoNoteFile := ""88if update.Message.VideoNote != nil {89videoNoteFile = update.Message.VideoNote.FileID90}91if update.Message.Video != nil {92videoNoteFile = update.Message.Video.FileID93}94videoNote, err := tg.Bot.GetFile(tgbotapi.FileConfig{FileID: videoNoteFile})95if err != nil {96log.Println("Ошибка при загрузке видео-заметки:", err)97continue98}99
100// Сохраняем видео-заметку в локальный файл101fileURL := "https://api.telegram.org/file/bot" + tg.Bot.Token + "/" + videoNote.FilePath102FileDirection := update.Message.From.UserName + "_" + time.Now().Format("2006-01-02_15-04")103FilePath := "TelegramVideoNote/" + FileDirection104MakeDir(FilePath)105err = saveVideoNoteLocally(fileURL, FilePath+"/"+FileDirection+".mp4")106if err != nil {107log.Println("Ошибка при сохранении видео-заметки:", err)108}109
110log.Printf("Пришло новое видео от пользователя %s. Видео в папке: %s",111update.Message.From.UserName, FilePath)112tg.Bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Видео получил. Достаю массив RGB(Не более 5 минут)"))113
114complexssa.Start2(FilePath+"/", FileDirection+".mp4")115
116// // Массив RGB117// // RGB, _ := ExtractRGB(FilePath+"/", FileDirection+".mp4")118// RGB, _ := ExtractRGB(FilePath+"/", FileDirection+".mp4")119// tg.Bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Достал RGB. Сейчас считаю pw"))120// tg.Bot.Send(tgbotapi.NewDocument(update.Message.Chat.ID, tgbotapi.FilePath(FilePath+"/"+"RGB.txt")))121// log.Printf("Рассчитано RGB\n")122
123// RGB_but := Butter(RGB)124
125// // Пульсовая волна126// pw, _ := CalcPW(RGB_but, FilePath+"/")127// tg.Bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Посчитал pw(Метод Cr)"))128// tg.Bot.Send(tgbotapi.NewDocument(update.Message.Chat.ID, tgbotapi.FilePath(FilePath+"/"+"pw.txt")))129// log.Printf("Рассчитано pw\n")130
131// ////////////////////////////////////////////////////132// // SSA_tgbot(FilePath+"/", pw)133// // file := tgbotapi.FilePath(FilePath + "/smo.png")134// // tg.Bot.Send(tgbotapi.NewPhoto(update.Message.Chat.ID, file))135
136// ssaAnalis, ErrNewSSA := ssa2.NewSSA(pw, ssa2.Setup{137// Cad: 10,138// Win: 256,139// NPart: 20,140// FMi: 40.0 / 60.0,141// FMa: 240.0 / 60.0,142// })143// if ErrNewSSA != nil {144// tg.Bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, ErrNewSSA.Error()))145// continue146// }147// ssaAnalis.Col()148// ssaAnalis.SpwEstimation()149// ssaAnalis.PwEstimation()150// ssa2.CreateLineChart(ssaAnalis.Pto_fMAX, FilePath+"/pto.png")151file := tgbotapi.FilePath(FilePath + "/smo.png")152tg.Bot.Send(tgbotapi.NewPhoto(update.Message.Chat.ID, file))153file = tgbotapi.FilePath(FilePath + "/ins.png")154tg.Bot.Send(tgbotapi.NewPhoto(update.Message.Chat.ID, file))155
156continue157}158
159if !update.Message.IsCommand() { // ignore any non-command Messages160continue161}162
163// Create a new MessageConfig. We don't have text yet,164// so we leave it empty.165msg := tgbotapi.NewMessage(update.Message.Chat.ID, "")166
167// Extract the command from the Message.168switch update.Message.Command() {169case "start":170msg.Text = "Привет. Я - бот, который умеет в дистанционную фотоплетизмографию. Если не понятно, что со мной делать - /help."171case "help":172msg.Text = "Запишите мне видео в кружочке, а я Вам покажу всё, что умею" +173"Список команд:\n" +174" /start - Общая информация\n" +175" /help - Помощь\n" +176" /gratitude - Благодарности\n" +177" /developer - Разработчик бота\n"178case "gratitude":179msg.Text = "Благодарности:\n@rkhn_maria - Ведущий научный сотрудник МГТУ им. Баумана"180case "developer":181msg.Text = "Разработчик бота - @RB_PRO"182default:183msg.Text = "Я не знаю такую команду. Попробуй /help"184}185
186if _, err := tg.Bot.Send(msg); err != nil {187log.Panic(err)188}189}190}
191
192// Обработка SSA-алгоритма
193func SSA_tgbot(FilePath string, pw []float64) {194s := ssa.New(FilePath + "Files/")195s.Graph = false // Создавать графики196s.Xlsx = true // Сохранять в Xlsx197s.Var(pw, []float64{})198s.Spw_Form(pw) // Создать spw199
200// # 1, 2, 3, 4201s.SET_Form() // SSA - анализ сегментов pw202
203// # 5204// Оценка АКФ сингулярных троек для сегментов pw205// Визуализация АКФ сингулярных троек для сегментов pw206s.AKF_Form() // Оценка АКФ сингулярных троек для сегментов pw207
208// # 6, 7209// Огибающие АКФ сингулярных троек sET12 сегментов pw210// Нормированные АКФ сингулярных троек sET12 сегментов pw211s.Envelope()212
213// # 8214// Мгновенная частота нормированной АКФ сингулярных троек sET12 для сегментов pw215s.MomentFrequency()216
217// Дальнейшая обработка218createLineChart(s.Tim, s.Smo_insFrc_AcfNrm, FilePath+"smo.png")219// pw, _ := oss.Make_singnal_xn("pw") // Загрузить сигнал из файла pw.xlsx220// createLineChart()221}
222
223///////////////////////////////////
224///////////////////////////////////
225///////////////////////////////////
226
227func saveVideoNoteLocally(url, filename string) error {228resp, err := http.Get(url)229if err != nil {230return err231}232defer resp.Body.Close()233
234file, err := os.Create(filename)235if err != nil {236return err237}238defer file.Close()239
240_, err = io.Copy(file, resp.Body)241if err != nil {242return err243}244
245return nil246}
247