ssa

Форк
0
/
bot.go 
246 строк · 8.0 Кб
1
package tg
2

3
import (
4
	"io"
5
	"log"
6
	"net/http"
7
	"os"
8
	"time"
9

10
	complexssa "github.com/RB-PRO/ssa/internal/ComplexSSA"
11
	"github.com/RB-PRO/ssa/pkg/ssa"
12
	"github.com/RB-PRO/ssa/pkg/ssa2"
13
	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
14
)
15

16
// Структура бота
17
type TG struct {
18
	Bot *tgbotapi.BotAPI
19
}
20

21
// Создаём бота
22
func NewBot(token string) (*TG, error) {
23
	bot, ErrNewBotAPI := tgbotapi.NewBotAPI(token)
24
	if ErrNewBotAPI != nil {
25
		return nil, ErrNewBotAPI
26
	}
27
	bot.Debug = false
28
	log.Printf("Авторизовался: %s", bot.Self.UserName)
29
	return &TG{bot}, nil
30
}
31
func BotStart2() {
32
	tg, ErrNewBot := NewBot("6720852434:AAFYUm2yplhsXWVKkXHa--o9tmkXZrNcpew")
33
	if ErrNewBot != nil {
34
		log.Panic(ErrNewBot)
35
	}
36
	tg.RangeUpdates()
37
}
38

39
func Full() {
40

41
	// FileDirection := update.Message.From.UserName + "_" + time.Now().Format("2006-01-02_15-04")
42
	FileDirection := "P1H1_edited"
43
	FilePath := "TelegramVideoNote/" + "test2/"
44
	// MakeDir(FilePath)
45

46
	// Массив RGB
47
	// RGB, _ := ExtractRGB(FilePath+"/", FileDirection+".mp4")
48
	RGB, _ := ExtractRGB(FilePath, FileDirection+".avi")
49

50
	// Нормирование
51
	RGB_but := Butter(RGB)
52

53
	// Пульсовая волна
54
	pw, _ := 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

61
	ssaAnalis, _ := ssa2.NewSSA(pw, ssa2.Setup{
62
		Cad:   30,
63
		Win:   1024,
64
		NPart: 20,
65
		FMi:   40.0 / 60.0,
66
		FMa:   240.0 / 60.0,
67
	})
68
	ssaAnalis.Col()
69
	ssaAnalis.SpwEstimation()
70
	ssaAnalis.PwEstimation()
71
	ssa2.CreateLineChart(ssaAnalis.Pto_fMAX, FilePath+"/pto.png")
72
}
73

74
// Слушаем сообшения в телеграме
75
func (tg *TG) RangeUpdates() {
76
	u := tgbotapi.NewUpdate(0)
77
	u.Timeout = 60
78
	updates := tg.Bot.GetUpdatesChan(u)
79
	for update := range updates {
80
		if update.Message == nil { // ignore any non-Message updates
81
			continue
82
		}
83

84
		if update.Message.VideoNote != nil || update.Message.Video != nil {
85

86
			// Обработка видео-заметки
87
			videoNoteFile := ""
88
			if update.Message.VideoNote != nil {
89
				videoNoteFile = update.Message.VideoNote.FileID
90
			}
91
			if update.Message.Video != nil {
92
				videoNoteFile = update.Message.Video.FileID
93
			}
94
			videoNote, err := tg.Bot.GetFile(tgbotapi.FileConfig{FileID: videoNoteFile})
95
			if err != nil {
96
				log.Println("Ошибка при загрузке видео-заметки:", err)
97
				continue
98
			}
99

100
			// Сохраняем видео-заметку в локальный файл
101
			fileURL := "https://api.telegram.org/file/bot" + tg.Bot.Token + "/" + videoNote.FilePath
102
			FileDirection := update.Message.From.UserName + "_" + time.Now().Format("2006-01-02_15-04")
103
			FilePath := "TelegramVideoNote/" + FileDirection
104
			MakeDir(FilePath)
105
			err = saveVideoNoteLocally(fileURL, FilePath+"/"+FileDirection+".mp4")
106
			if err != nil {
107
				log.Println("Ошибка при сохранении видео-заметки:", err)
108
			}
109

110
			log.Printf("Пришло новое видео от пользователя %s. Видео в папке: %s",
111
				update.Message.From.UserName, FilePath)
112
			tg.Bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, "Видео получил. Достаю массив RGB(Не более 5 минут)"))
113

114
			complexssa.Start2(FilePath+"/", FileDirection+".mp4")
115

116
			// // Массив RGB
117
			// // 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
			// 	continue
146
			// }
147
			// ssaAnalis.Col()
148
			// ssaAnalis.SpwEstimation()
149
			// ssaAnalis.PwEstimation()
150
			// ssa2.CreateLineChart(ssaAnalis.Pto_fMAX, FilePath+"/pto.png")
151
			file := tgbotapi.FilePath(FilePath + "/smo.png")
152
			tg.Bot.Send(tgbotapi.NewPhoto(update.Message.Chat.ID, file))
153
			file = tgbotapi.FilePath(FilePath + "/ins.png")
154
			tg.Bot.Send(tgbotapi.NewPhoto(update.Message.Chat.ID, file))
155

156
			continue
157
		}
158

159
		if !update.Message.IsCommand() { // ignore any non-command Messages
160
			continue
161
		}
162

163
		// Create a new MessageConfig. We don't have text yet,
164
		// so we leave it empty.
165
		msg := tgbotapi.NewMessage(update.Message.Chat.ID, "")
166

167
		// Extract the command from the Message.
168
		switch update.Message.Command() {
169
		case "start":
170
			msg.Text = "Привет. Я - бот, который умеет в дистанционную фотоплетизмографию. Если не понятно, что со мной делать - /help."
171
		case "help":
172
			msg.Text = "Запишите мне видео в кружочке, а я Вам покажу всё, что умею" +
173
				"Список команд:\n" +
174
				" /start - Общая информация\n" +
175
				" /help - Помощь\n" +
176
				" /gratitude - Благодарности\n" +
177
				" /developer - Разработчик бота\n"
178
		case "gratitude":
179
			msg.Text = "Благодарности:\n@rkhn_maria - Ведущий научный сотрудник МГТУ им. Баумана"
180
		case "developer":
181
			msg.Text = "Разработчик бота - @RB_PRO"
182
		default:
183
			msg.Text = "Я не знаю такую команду. Попробуй /help"
184
		}
185

186
		if _, err := tg.Bot.Send(msg); err != nil {
187
			log.Panic(err)
188
		}
189
	}
190
}
191

192
// Обработка SSA-алгоритма
193
func SSA_tgbot(FilePath string, pw []float64) {
194
	s := ssa.New(FilePath + "Files/")
195
	s.Graph = false // Создавать графики
196
	s.Xlsx = true   // Сохранять в Xlsx
197
	s.Var(pw, []float64{})
198
	s.Spw_Form(pw) // Создать spw
199

200
	// # 1, 2, 3, 4
201
	s.SET_Form() // SSA - анализ сегментов pw
202

203
	// # 5
204
	// Оценка АКФ сингулярных троек для сегментов pw
205
	// Визуализация АКФ сингулярных троек для сегментов pw
206
	s.AKF_Form() // Оценка АКФ сингулярных троек для сегментов pw
207

208
	// # 6, 7
209
	// Огибающие АКФ сингулярных троек sET12 сегментов pw
210
	// Нормированные АКФ сингулярных троек sET12 сегментов pw
211
	s.Envelope()
212

213
	// # 8
214
	// Мгновенная частота нормированной АКФ сингулярных троек sET12 для сегментов pw
215
	s.MomentFrequency()
216

217
	// Дальнейшая обработка
218
	createLineChart(s.Tim, s.Smo_insFrc_AcfNrm, FilePath+"smo.png")
219
	// pw, _ := oss.Make_singnal_xn("pw")   // Загрузить сигнал из файла pw.xlsx
220
	// createLineChart()
221
}
222

223
///////////////////////////////////
224
///////////////////////////////////
225
///////////////////////////////////
226

227
func saveVideoNoteLocally(url, filename string) error {
228
	resp, err := http.Get(url)
229
	if err != nil {
230
		return err
231
	}
232
	defer resp.Body.Close()
233

234
	file, err := os.Create(filename)
235
	if err != nil {
236
		return err
237
	}
238
	defer file.Close()
239

240
	_, err = io.Copy(file, resp.Body)
241
	if err != nil {
242
		return err
243
	}
244

245
	return nil
246
}
247

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.