fix: add comments and fix small warnings in BotHandler.cs
This commit is contained in:
parent
77b4c21571
commit
66aa064e2f
@ -16,22 +16,21 @@ namespace CasaBotApp.TelegramBot;
|
|||||||
public class BotHandler : IUpdateHandler
|
public class BotHandler : IUpdateHandler
|
||||||
{
|
{
|
||||||
private readonly ILogger<BotHandler> _logger;
|
private readonly ILogger<BotHandler> _logger;
|
||||||
private readonly TelegramOptions _telegramOptions;
|
|
||||||
private readonly List<Chat> _subscribers = [];
|
private readonly List<Chat> _subscribers = [];
|
||||||
private readonly List<Chat> _subscribersAlarm = [];
|
private readonly List<Chat> _subscribersAlarm = [];
|
||||||
private readonly Dictionary<string, BotCommand> _commands;
|
private readonly Dictionary<string, BotCommand> _commands;
|
||||||
//TODO hacerlo mejor.
|
|
||||||
private readonly Dictionary<string, CallbackQueueItem> _callbackFunctions = new();
|
private readonly Dictionary<string, CallbackQueueItem> _callbackFunctions = new();
|
||||||
private record CallbackQueueItem(DateTime inserted, Func<string, long, Task<string>> callback);
|
private record CallbackQueueItem(DateTime inserted, Func<string, long, Task<string>> callback);
|
||||||
|
|
||||||
public Func<TextMessage, Task>? OnReply { get; set; } = null;
|
public Func<TextMessage, Task>? OnReply { get; set; }
|
||||||
|
|
||||||
private readonly IBotClient _bot;
|
private readonly IBotClient _bot;
|
||||||
|
|
||||||
public BotHandler(IBotClient bot, IOptions<TelegramOptions> telegramConfiguration, ILogger<BotHandler> logger)
|
public BotHandler(IBotClient bot, IOptions<TelegramOptions> telegramConfiguration, ILogger<BotHandler> logger)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_telegramOptions = telegramConfiguration.Value;
|
var telegramOptions = telegramConfiguration.Value;
|
||||||
_bot = bot;
|
_bot = bot;
|
||||||
_commands = [];
|
_commands = [];
|
||||||
RegisterCommand(new()
|
RegisterCommand(new()
|
||||||
@ -41,7 +40,6 @@ public class BotHandler : IUpdateHandler
|
|||||||
Action = RegisterUser,
|
Action = RegisterUser,
|
||||||
Responder = Respond
|
Responder = Respond
|
||||||
});
|
});
|
||||||
{
|
|
||||||
RegisterCommand(new()
|
RegisterCommand(new()
|
||||||
{
|
{
|
||||||
Command = "/registeralarm",
|
Command = "/registeralarm",
|
||||||
@ -49,20 +47,12 @@ public class BotHandler : IUpdateHandler
|
|||||||
Action = RegisterUserAlarm,
|
Action = RegisterUserAlarm,
|
||||||
Responder = Respond
|
Responder = Respond
|
||||||
});
|
});
|
||||||
}
|
|
||||||
RegisterCommand(new()
|
|
||||||
{
|
|
||||||
Command = "/photo",
|
|
||||||
Description = "Get a photo",
|
|
||||||
Action = SendImageTest,
|
|
||||||
Responder = Respond
|
|
||||||
});
|
|
||||||
|
|
||||||
foreach (var subs in _telegramOptions.SubscribedChatIds)
|
foreach (var subs in telegramOptions.SubscribedChatIds)
|
||||||
{
|
{
|
||||||
Subscribe(subs);
|
Subscribe(subs);
|
||||||
}
|
}
|
||||||
foreach(var sub in _telegramOptions.SubscribedAlarmsChatIds)
|
foreach(var sub in telegramOptions.SubscribedAlarmsChatIds)
|
||||||
{
|
{
|
||||||
SubscribeAlarm(sub);
|
SubscribeAlarm(sub);
|
||||||
}
|
}
|
||||||
@ -105,12 +95,13 @@ public class BotHandler : IUpdateHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send text message to all subscribers
|
/// Send a text message to all subscribers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="message"></param>
|
/// <param name="message"></param>
|
||||||
public Task UpdateText(string message) => UpdateTextInt(_subscribers, message);
|
public Task UpdateText(string message) => UpdateTextInt(_subscribers, message);
|
||||||
public Task AlertText(string message) => UpdateTextInt(_subscribersAlarm, message);
|
public Task AlertText(string message) => UpdateTextInt(_subscribersAlarm, message);
|
||||||
public async Task UpdateTextInt(List<Chat> subscribers,string message)
|
|
||||||
|
private async Task UpdateTextInt(List<Chat> subscribers,string message)
|
||||||
{
|
{
|
||||||
if (subscribers.Count == 0)
|
if (subscribers.Count == 0)
|
||||||
{
|
{
|
||||||
@ -137,7 +128,7 @@ public class BotHandler : IUpdateHandler
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send photo to all subscribers
|
/// Send a photo to all subscribers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="path"></param>
|
/// <param name="path"></param>
|
||||||
/// <param name="caption">Optional message with photo</param>
|
/// <param name="caption">Optional message with photo</param>
|
||||||
@ -145,6 +136,13 @@ public class BotHandler : IUpdateHandler
|
|||||||
public Task UpdatePhoto(string path, string? caption = null, IEnumerable<MsgOption>? options = null) =>
|
public Task UpdatePhoto(string path, string? caption = null, IEnumerable<MsgOption>? options = null) =>
|
||||||
UpdatePhotoInt(_subscribers, path, caption, options);
|
UpdatePhotoInt(_subscribers, path, caption, options);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send a photo to all alert subscribers
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
|
/// <param name="caption"></param>
|
||||||
|
/// <param name="options"></param>
|
||||||
|
/// <returns></returns>
|
||||||
public Task AlertPhoto(string path, string? caption = null, IEnumerable<MsgOption>? options = null) =>
|
public Task AlertPhoto(string path, string? caption = null, IEnumerable<MsgOption>? options = null) =>
|
||||||
UpdatePhotoInt(_subscribersAlarm, path, caption, options);
|
UpdatePhotoInt(_subscribersAlarm, path, caption, options);
|
||||||
|
|
||||||
@ -194,7 +192,7 @@ public class BotHandler : IUpdateHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task HandleQueueExpiration()
|
private Task HandleQueueExpiration()
|
||||||
{
|
{
|
||||||
//remove expired items with more than 3 hs
|
//remove expired items with more than 3 hs
|
||||||
var expired = _callbackFunctions.Where(x => x.Value.inserted.AddHours(3) < DateTime.Now).ToArray();
|
var expired = _callbackFunctions.Where(x => x.Value.inserted.AddHours(3) < DateTime.Now).ToArray();
|
||||||
@ -203,6 +201,7 @@ public class BotHandler : IUpdateHandler
|
|||||||
_callbackFunctions.Remove(item.Key);
|
_callbackFunctions.Remove(item.Key);
|
||||||
_logger.LogDebug("Removed expired callback function {Key}", item.Key);
|
_logger.LogDebug("Removed expired callback function {Key}", item.Key);
|
||||||
}
|
}
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -251,8 +250,8 @@ public class BotHandler : IUpdateHandler
|
|||||||
|
|
||||||
if (_subscribers.Count < 1) return;
|
if (_subscribers.Count < 1) return;
|
||||||
|
|
||||||
var caches = response.Result.Select(x => (x as PhotoMessage).PhotoSet.LastOrDefault()?.Id).ToList();
|
var caches = response.Result.Select(x => (x as PhotoMessage)!.PhotoSet.LastOrDefault()?.Id).ToList();
|
||||||
var media = caches.Select(x => new CachedPhoto(x)).ToList();
|
var media = caches.Select(x => new CachedPhoto(x!)).ToList();
|
||||||
|
|
||||||
//send to the rest of the subscribers
|
//send to the rest of the subscribers
|
||||||
foreach (var subscriber in _subscribers.Skip(1).ToList())
|
foreach (var subscriber in _subscribers.Skip(1).ToList())
|
||||||
@ -272,14 +271,6 @@ public class BotHandler : IUpdateHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SendImageTest(TextMessage msg, BotCommand _)
|
|
||||||
{
|
|
||||||
await using var stream = File.OpenRead(@"C:\Users\GuillermoMarcel\Pictures\prueba.jpeg");
|
|
||||||
|
|
||||||
var send = new SendPhotoFile(msg.Chat.Id.ToString(), stream);
|
|
||||||
await _bot.HandleAsync(send);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task SendPhoto(long chatId, string content, string caption)
|
public async Task SendPhoto(long chatId, string content, string caption)
|
||||||
{
|
{
|
||||||
await using var stream = File.OpenRead(content);
|
await using var stream = File.OpenRead(content);
|
||||||
@ -370,7 +361,15 @@ public class BotHandler : IUpdateHandler
|
|||||||
|
|
||||||
private async Task OnMessage(TextMessage msg)
|
private async Task OnMessage(TextMessage msg)
|
||||||
{
|
{
|
||||||
if(!_commands.TryGetValue(msg.Text, out var command))
|
var cmd = msg.Text;
|
||||||
|
//Deep link support
|
||||||
|
// link format: https://t.me/your_bot?start=command
|
||||||
|
// what we see: "/start command"
|
||||||
|
if (cmd.StartsWith("/start "))
|
||||||
|
{
|
||||||
|
cmd = $"/{cmd[7..]}";
|
||||||
|
}
|
||||||
|
if(!_commands.TryGetValue(cmd, out var command))
|
||||||
{
|
{
|
||||||
if (msg.ReplyToMessage != null && OnReply is not null)
|
if (msg.ReplyToMessage != null && OnReply is not null)
|
||||||
{
|
{
|
||||||
@ -381,12 +380,12 @@ public class BotHandler : IUpdateHandler
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (command?.Action is null)
|
if (command.Action is null)
|
||||||
{
|
{
|
||||||
_logger.LogError("Command {Command} has no action", msg.Text);
|
_logger.LogError("Command {Command} has no action", msg.Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
await command!.Action!(msg, command);
|
await command.Action!(msg, command);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SendHelp(TextMessage msg)
|
private async Task SendHelp(TextMessage msg)
|
||||||
@ -411,7 +410,7 @@ public class BotHandler : IUpdateHandler
|
|||||||
|
|
||||||
_subscribers.Add(msg.Chat);
|
_subscribers.Add(msg.Chat);
|
||||||
_logger.LogInformation("User {User} ({id}) registered to receive messages", msg.Chat.FirstName, msg.Chat.Id);
|
_logger.LogInformation("User {User} ({id}) registered to receive messages", msg.Chat.FirstName, msg.Chat.Id);
|
||||||
await Respond(msg, "You are registered to receive messages every minute");
|
await Respond(msg, "You are registered to receive non-alert messages (Nightly scans)");
|
||||||
}
|
}
|
||||||
private async Task RegisterUserAlarm(TextMessage msg, BotCommand _)
|
private async Task RegisterUserAlarm(TextMessage msg, BotCommand _)
|
||||||
{
|
{
|
||||||
@ -434,6 +433,13 @@ public class BotHandler : IUpdateHandler
|
|||||||
_bot.HandleAsync(new SendPhotoFile(chat.Id.ToString(), path));
|
_bot.HandleAsync(new SendPhotoFile(chat.Id.ToString(), path));
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Entry point for the bot
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="bot">The bot client used to receive and send messages</param>
|
||||||
|
/// <param name="update">Type of update and message info</param>
|
||||||
|
/// <param name="cst"></param>
|
||||||
|
/// <returns></returns>
|
||||||
public Task HandleAsync(IBotClient bot, Update update, CancellationToken cst)
|
public Task HandleAsync(IBotClient bot, Update update, CancellationToken cst)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
Loading…
Reference in New Issue
Block a user