|
@@ -22,35 +22,44 @@ namespace CardCollector.Controllers
|
|
|
{
|
|
|
using static Logs;
|
|
|
|
|
|
+ /* Данный класс управляет получением обновлений и отправкой сообщений */
|
|
|
public static class MessageController
|
|
|
{
|
|
|
- private static readonly Dictionary<long, List<int>> DeletingMessagePool = new();
|
|
|
-
|
|
|
+ /* Данный метод принимает обновления с сервера Телеграм, определяет для него обработчик и обрабатывет команду */
|
|
|
public static async Task HandleUpdateAsync(ITelegramBotClient client, Update update, CancellationToken ct)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
var executor = update.Type switch
|
|
|
{
|
|
|
+ // Тип обновления - сообщение
|
|
|
UpdateType.Message => await Message.Factory(update),
|
|
|
+ // Тип обновления - нажатие на инлайн кнопку
|
|
|
UpdateType.CallbackQuery => await CallBackQuery.Factory(update),
|
|
|
+ // Тип обновления - блокировка/добавление бота
|
|
|
UpdateType.MyChatMember => await MyChatMember.Factory(update),
|
|
|
+ // Тип обновления - вызов бота через @имя_бота
|
|
|
UpdateType.InlineQuery => await InlineQuery.Factory(update),
|
|
|
+ // Тип обновления - выбор результата в инлайн меню
|
|
|
UpdateType.ChosenInlineResult => await ChosenInlineResult.Factory(update),
|
|
|
_ => throw new ArgumentOutOfRangeException()
|
|
|
};
|
|
|
+ // Обработать команду
|
|
|
await executor.Execute();
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
switch (e)
|
|
|
{
|
|
|
+ // Случай, когда не определена обработка для данного типа обновленияот
|
|
|
case ArgumentOutOfRangeException:
|
|
|
LogOut(update.Type);
|
|
|
break;
|
|
|
+ // Ошибка, полученная со стороны Telegram API
|
|
|
case ApiRequestException:
|
|
|
LogOutWarning(e.Message);
|
|
|
break;
|
|
|
+ // Прочие ошибки
|
|
|
default:
|
|
|
LogOutError(e);
|
|
|
break;
|
|
@@ -58,6 +67,7 @@ namespace CardCollector.Controllers
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Обработка ошибок, полученных от сервера Телеграм
|
|
|
public static Task HandleErrorAsync(ITelegramBotClient client, Exception e, CancellationToken ct)
|
|
|
{
|
|
|
switch (e)
|
|
@@ -72,34 +82,10 @@ namespace CardCollector.Controllers
|
|
|
return Task.CompletedTask;
|
|
|
}
|
|
|
|
|
|
- public static void AddNewMessageToPool(UserEntity user, int messageId)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
- DeletingMessagePool[user.ChatId].Add(messageId);
|
|
|
- }
|
|
|
- catch (Exception)
|
|
|
- {
|
|
|
- DeletingMessagePool.Add(user.ChatId, new List<int>());
|
|
|
- DeletingMessagePool[user.ChatId].Add(messageId);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public static async Task DeleteMessagesFromPool(UserEntity user)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
- foreach (var id in DeletingMessagePool[user.ChatId])
|
|
|
- await DeleteMessage(user, id);
|
|
|
- DeletingMessagePool[user.ChatId].Clear();
|
|
|
- DeletingMessagePool.Remove(user.ChatId);
|
|
|
- }
|
|
|
- catch (Exception)
|
|
|
- {
|
|
|
- /* ignore */
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ /* Метод для отправки сообщения
|
|
|
+ user - пользователь, которому необходимо отправить сообщение
|
|
|
+ message - текст сообщения
|
|
|
+ keyboard - клавиатура, которую надо добавить к сообщению */
|
|
|
public static async Task<TgMessage> SendMessage(UserEntity user, string message, IReplyMarkup keyboard = null)
|
|
|
{
|
|
|
try
|
|
@@ -114,12 +100,16 @@ namespace CardCollector.Controllers
|
|
|
return new TgMessage();
|
|
|
}
|
|
|
|
|
|
- public static async Task<TgMessage> SendTextWithHtml(UserEntity info, string message, IReplyMarkup keyboard = null)
|
|
|
+ /* Метод для отправки сообщения с разметкой html
|
|
|
+ user - пользователь, которому необходимо отправить сообщение
|
|
|
+ message - текст сообщения
|
|
|
+ keyboard - клавиатура, которую надо добавить к сообщению */
|
|
|
+ public static async Task<TgMessage> SendTextWithHtml(UserEntity user, string message, IReplyMarkup keyboard = null)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- if (!info.IsBlocked)
|
|
|
- return await Bot.Client.SendTextMessageAsync(info.ChatId, message, ParseMode.Html, replyMarkup: keyboard, disableNotification: true);
|
|
|
+ if (!user.IsBlocked)
|
|
|
+ return await Bot.Client.SendTextMessageAsync(user.ChatId, message, ParseMode.Html, replyMarkup: keyboard, disableNotification: true);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
@@ -128,12 +118,15 @@ namespace CardCollector.Controllers
|
|
|
return new TgMessage();
|
|
|
}
|
|
|
|
|
|
- public static async Task<TgMessage> SendSticker(UserEntity info, string fileId)
|
|
|
+ /* Метод для отправки стикера
|
|
|
+ user - пользователь, которому необходимо отправить сообщение
|
|
|
+ fileId - id стикера, расположенного на серверах телеграм */
|
|
|
+ public static async Task<TgMessage> SendSticker(UserEntity user, string fileId)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- if (!info.IsBlocked)
|
|
|
- return await Bot.Client.SendStickerAsync(info.ChatId, fileId, true);
|
|
|
+ if (!user.IsBlocked)
|
|
|
+ return await Bot.Client.SendStickerAsync(user.ChatId, fileId, true);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
@@ -141,13 +134,18 @@ namespace CardCollector.Controllers
|
|
|
}
|
|
|
return new TgMessage();
|
|
|
}
|
|
|
-
|
|
|
- public static async Task<TgMessage> EditMessage(UserEntity info, int messageId, string message, InlineKeyboardMarkup keyboard = null)
|
|
|
+
|
|
|
+ /* Метод для редактирования сообщения
|
|
|
+ user - пользователь, которому необходимо отредактировать сообщение
|
|
|
+ messageId - id сообщения
|
|
|
+ message - текст сообщения
|
|
|
+ keyboard - клавиатура, которую надо добавить к сообщению */
|
|
|
+ public static async Task<TgMessage> EditMessage(UserEntity user, int messageId, string message, InlineKeyboardMarkup keyboard = null)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- if (!info.IsBlocked)
|
|
|
- return await Bot.Client.EditMessageTextAsync(info.ChatId, messageId, message, replyMarkup: keyboard);
|
|
|
+ if (!user.IsBlocked)
|
|
|
+ return await Bot.Client.EditMessageTextAsync(user.ChatId, messageId, message, replyMarkup: keyboard);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
@@ -156,12 +154,16 @@ namespace CardCollector.Controllers
|
|
|
return new TgMessage();
|
|
|
}
|
|
|
|
|
|
- public static async Task<TgMessage> EditReplyMarkup(UserEntity info, int messageId, InlineKeyboardMarkup keyboard)
|
|
|
+ /* Метод для редактирования клавиатуры под сообщением
|
|
|
+ user - пользователь, которому необходимо отредактировать сообщение
|
|
|
+ messageId - Id сообщения
|
|
|
+ keyboard - новая клавиатура, которую надо добавить к сообщению */
|
|
|
+ public static async Task<TgMessage> EditReplyMarkup(UserEntity user, int messageId, InlineKeyboardMarkup keyboard)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- if (!info.IsBlocked)
|
|
|
- return await Bot.Client.EditMessageReplyMarkupAsync(info.ChatId, messageId, keyboard);
|
|
|
+ if (!user.IsBlocked)
|
|
|
+ return await Bot.Client.EditMessageReplyMarkupAsync(user.ChatId, messageId, keyboard);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
@@ -170,6 +172,9 @@ namespace CardCollector.Controllers
|
|
|
return new TgMessage();
|
|
|
}
|
|
|
|
|
|
+ /* Метод для удаления сообщения
|
|
|
+ user - пользователь, которому необходимо удалить сообщение
|
|
|
+ messageId - Id сообщения */
|
|
|
public static async Task DeleteMessage(UserEntity user, int messageId)
|
|
|
{
|
|
|
try
|
|
@@ -183,12 +188,17 @@ namespace CardCollector.Controllers
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public static async Task<TgMessage> SendImage(UserEntity info, InputOnlineFile inputOnlineFile, string message = null, InlineKeyboardMarkup replyMarkup = null)
|
|
|
+ /* Метод для отправки изображения
|
|
|
+ user - пользователь, которому необходимо отправить сообщение
|
|
|
+ inputOnlineFile - фото, которое необходимо отправить
|
|
|
+ message - текст сообщения
|
|
|
+ keyboard - клавиатура, которую надо добавить к сообщению */
|
|
|
+ public static async Task<TgMessage> SendImage(UserEntity user, InputOnlineFile inputOnlineFile, string message = null, InlineKeyboardMarkup keyboard = null)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- if (!info.IsBlocked)
|
|
|
- return await Bot.Client.SendPhotoAsync(info.ChatId, inputOnlineFile, message, replyMarkup: replyMarkup, disableNotification: true);
|
|
|
+ if (!user.IsBlocked)
|
|
|
+ return await Bot.Client.SendPhotoAsync(user.ChatId, inputOnlineFile, message, replyMarkup: keyboard, disableNotification: true);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
@@ -197,6 +207,9 @@ namespace CardCollector.Controllers
|
|
|
return new TgMessage();
|
|
|
}
|
|
|
|
|
|
+ /* Метод для ответа на запрос @имя_бота
|
|
|
+ queryId - Id запроса
|
|
|
+ results - массив объектов InlineQueryResult */
|
|
|
public static async Task AnswerInlineQuery(string queryId, IEnumerable<InlineQueryResult> results, string offset = null)
|
|
|
{
|
|
|
await Bot.Client.AnswerInlineQueryAsync(queryId, results, isPersonal: true, nextOffset: offset, cacheTime: Constants.INLINE_RESULTS_CACHE_TIME);
|