2022-07-07 17:15:40 +03:00
|
|
|
using System.Collections.Concurrent;
|
|
|
|
|
using BotFramework;
|
2022-04-20 00:38:47 +03:00
|
|
|
using BotFramework.Attributes;
|
|
|
|
|
using BotFramework.Enums;
|
2023-01-23 13:12:38 +02:00
|
|
|
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
|
|
|
|
|
{
|
2022-07-07 17:15:40 +03:00
|
|
|
private readonly ConcurrentBag<DeleteRequest> _requests;
|
2023-07-28 16:53:01 +03:00
|
|
|
private readonly CodeWatcherMode _mode;
|
|
|
|
|
private readonly IHasteService _haste;
|
2022-07-07 17:15:40 +03:00
|
|
|
|
2023-07-28 16:53:01 +03:00
|
|
|
public Handler(ConcurrentBag<DeleteRequest> requests, CodeWatcherMode mode, IHasteService haste)
|
2022-07-07 17:15:40 +03:00
|
|
|
{
|
|
|
|
|
_requests = requests;
|
2023-07-28 16:53:01 +03:00
|
|
|
_mode = mode;
|
|
|
|
|
_haste = haste;
|
2022-07-07 17:15:40 +03:00
|
|
|
}
|
|
|
|
|
|
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()
|
|
|
|
|
{
|
2022-07-07 17:15:40 +03:00
|
|
|
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();
|
|
|
|
|
|
2022-07-07 17:02:47 +03:00
|
|
|
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!);
|
2025-02-09 17:50:46 +02:00
|
|
|
await Bot.DeleteMessage(Chat.Id, message.MessageId);
|
2023-07-28 16:53:01 +03:00
|
|
|
|
2025-02-09 17:50:46 +02: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
|
|
|
{
|
2025-02-09 17:50:46 +02:00
|
|
|
await Bot.DeleteMessage(Chat.Id, message.MessageId);
|
|
|
|
|
var notifyMsg = await Bot.SendMessage(Chat.Id,
|
2022-04-20 13:14:01 +03:00
|
|
|
(message.From?.ToHtml() ?? "") + ", не стоит публиковать столь большой код прямо в чат. " +
|
|
|
|
|
"Вместо этого загрузите его на https://pastebin.com и отправьте в виде ссылки.",
|
2023-01-02 19:01:03 +02:00
|
|
|
parseMode: ParseMode.Html);
|
2022-07-07 17:15:40 +03:00
|
|
|
|
|
|
|
|
// 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
|
|
|
}
|
|
|
|
|
}
|