Files

130 lines
4.0 KiB
C#
Raw Permalink Normal View History

using System.Collections.Concurrent;
using BotFramework;
2022-04-20 00:38:47 +03:00
using BotFramework.Attributes;
using BotFramework.Enums;
using Kruzya.TelegramBot.Core.AutoDelete;
2022-04-20 00:38:47 +03:00
using Kruzya.TelegramBot.Core.Extensions;
using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
2023-07-28 16:53:01 +03:00
using West.TelegramBot.CodeWatcher.Options;
using West.TelegramBot.CodeWatcher.Service;
2022-04-20 00:38:47 +03:00
namespace West.TelegramBot.CodeWatcher;
public class Handler : BotEventHandler
{
private readonly ConcurrentBag<DeleteRequest> _requests;
2023-07-28 16:53:01 +03:00
private readonly CodeWatcherMode _mode;
private readonly IHasteService _haste;
2023-07-28 16:53:01 +03:00
public Handler(ConcurrentBag<DeleteRequest> requests, CodeWatcherMode mode, IHasteService haste)
{
_requests = requests;
2023-07-28 16:53:01 +03:00
_mode = mode;
_haste = haste;
}
2023-07-29 01:50:28 +03:00
[InChat(InChat.Public)]
[Update(UpdateFlag.Message | UpdateFlag.EditedMessage)]
2022-04-20 00:38:47 +03:00
public async Task HandleMessage()
{
var message = RawUpdate.Message ?? RawUpdate.EditedMessage;
2022-04-20 00:38:47 +03:00
2023-01-01 22:53:31 +02:00
if (message?.Entities == null && message?.CaptionEntities == null)
{
return;
}
var text = message.Caption ?? message.Text;
if (text == null)
2022-04-20 00:38:47 +03:00
{
return;
}
if (!await Bot.CanDeleteMessagesAsync(Chat))
{
return;
}
2023-01-01 22:53:31 +02:00
var entities = new List<MessageEntity>();
if (message.Entities != null)
{
entities.AddRange(message.Entities);
}
if (message.CaptionEntities != null)
{
entities.AddRange(message.CaptionEntities);
}
foreach (var entity in entities)
2022-04-20 00:38:47 +03:00
{
if (entity.Type is MessageEntityType.Code or MessageEntityType.Pre)
{
2023-01-01 22:53:31 +02:00
var entityLines = text!
2022-04-20 00:38:47 +03:00
.Substring(entity.Offset, entity.Length)
.SplitToLines()
.ToList();
if (entityLines.Count < 2)
{
continue;
}
2022-06-14 11:23:02 +03:00
if (entityLines.Count >= 20 || entityLines.Any(line => line.Length > 160))
2022-04-20 00:38:47 +03:00
{
2023-07-28 16:53:01 +03:00
await ProcessDetectedCode(message);
2022-04-20 00:38:47 +03:00
return;
}
}
}
}
2023-07-28 16:53:01 +03:00
public async Task ProcessDetectedCode(Message message)
{
switch (await _mode.GetValueAsync(Chat.Id))
{
case "disabled":
return;
case "remove":
await RemoveDetectedCode(message);
break;
case "upload":
await UploadDetectedCode(message);
break;
}
}
public async Task UploadDetectedCode(Message message)
{
var resp = await _haste.PostDocumentAsync(message.Text!);
await Bot.DeleteMessage(Chat.Id, message.MessageId);
2023-07-28 16:53:01 +03:00
await Bot.SendMessage(Chat.Id,
2023-07-28 16:53:01 +03:00
$"{message.From?.ToHtml()}, you posted something long and pre-escaped, so I decided to upload it to our paste service for you.\n" +
$"Here is the link: {_haste.GetHasteUri() + resp.Key}",
parseMode: ParseMode.Html);
}
public async Task RemoveDetectedCode(Message message)
2022-04-20 00:38:47 +03:00
{
await Bot.DeleteMessage(Chat.Id, message.MessageId);
var notifyMsg = await Bot.SendMessage(Chat.Id,
(message.From?.ToHtml() ?? "") + ", не стоит публиковать столь большой код прямо в чат. " +
"Вместо этого загрузите его на https://pastebin.com и отправьте в виде ссылки.",
2023-01-02 19:01:03 +02:00
parseMode: ParseMode.Html);
// TODO: maybe write a wrapper-service around collection to avoid direct interactions with the collection, West, 07.07.2022, 16:53
_requests.Add(new DeleteRequest
{
ChatId = notifyMsg.Chat.Id,
MessageId = notifyMsg.MessageId,
DeleteAt = DateTime.Now.AddSeconds(30)
});
2022-04-20 00:38:47 +03:00
}
}