-
Notifications
You must be signed in to change notification settings - Fork 0
/
TelegramBot.cs
139 lines (120 loc) · 5.19 KB
/
TelegramBot.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Types;
using System.Threading;
using CheckSaturday.ScheduleProcessors;
using Telegram.Bot.Types.Enums;
namespace CheckSaturday;
/// <summary>
/// Класс, отвечающий за взаимодействие с пользователем
/// </summary>
public static class TelegramBot
{
private static ITelegramBotClient _tgClient;
public static async Task Start(string token)
{
while (true)
{
try
{
await Task.Delay(1000);
_tgClient ??= new TelegramBotClient(token);
var updates = await _tgClient.GetUpdatesAsync();
if (updates.Length == 0) continue;
// Сбрасываем счётчик неполученных апдейтов
await _tgClient.GetUpdatesAsync(offset: updates.Max(x => x.Id) + 1);
var messages = updates.Where(x => x.IsMessageType());
// Документы, отправленные группой, будут обработаны вместе, иначе -- поотдельности
var documentGroups = updates.Where(x => x.IsDocumentType())
.GroupBy(x => x.Message?.MediaGroupId ?? x.Id.ToString());
foreach (var message in messages)
{
try
{
await HandleMessage(message);
}
catch (Exception e)
{
Console.WriteLine($"Error >> Ошибка обработки сообщения: {e.Message}\n{e.StackTrace}");
}
}
foreach (var document in documentGroups)
{
try
{
await HandleDocuments(document);
}
catch (Exception e)
{
Console.WriteLine($"Error >> Ошибка обработки сообщения: {e.Message}\n{e.StackTrace}");
}
}
LogRequests(updates);
}
catch (Exception e)
{
Console.WriteLine($"Error [{DateTime.Now:G}] >> Ошибка TGBot.Start(): {e.Message}\n{e.StackTrace}");
_tgClient = null;
}
}
}
// TODO: Съедобен ли формат документа
private static async Task HandleDocuments(IEnumerable<Update> updates)
{
string message;
await _tgClient.SendTextMessageAsync(updates.First().GetChatId(), "Словил доки.");
try
{
var couples = await ScheduleFromTelegram.GetCouplesFromUpdates(updates, _tgClient);
message = CouplesReport.BuildMessage(couples, needBeActual: false);
}
catch
{
message = "Документ несъедобен или реально пар нет...";
}
await _tgClient.SendTextMessageAsync(updates.First().GetChatId(), message);
}
private static async Task HandleMessage(Update update)
{
var msg = update.Message.Text.ToLower().Trim();
switch (msg)
{
case "/start":
await _tgClient.SendTextMessageAsync(update.GetChatId(),
"Возрадуйтесь! Теперь можно автоматизировано проверять, есть ли пары во втором корпусе!\n" +
"Напишите <i>/check</i> для проверки наличия пар в субботу на кафедре ИОТС", ParseMode.Html);
break;
case "/check":
await CheckCouples(update);
break;
}
}
private static async Task CheckCouples(Update update)
{
var message = CouplesReport.BuildMessage(ScheduleStaticCover.Couples, needBeActual: true);
await _tgClient.SendTextMessageAsync(update.GetChatId(), message);
}
private static long GetChatId(this Update update)
{
return update.IsCallbackType() ? update.CallbackQuery.Message!.Chat.Id : update.Message.Chat.Id;
}
private static bool IsMessageType(this Update update) =>
update.Type == UpdateType.Message && update.Message?.Text != null;
private static bool IsCallbackType(this Update update) =>
update.Type == UpdateType.CallbackQuery;
private static bool IsDocumentType(this Update update) =>
update?.Message?.Document is { MimeType: "application/vnd.ms-excel" or "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" };
private static void LogRequests(IEnumerable<Update> updates)
{
foreach (var update in updates)
{
var from = update.Message?.From;
var date = DateTime.Now;
var type = update.IsDocumentType() ? "Документ" : "Запрос";
Console.WriteLine($"TG_BOT >> {type} от {from?.FirstName} {from?.LastName} [@{from?.Username}] || Дата: {date:g}\n");
}
}
}