feat: discard disarm request after timeout

feat: Is Connected command
This commit is contained in:
Guillermo Marcel 2025-05-08 22:35:31 -03:00
parent b11aac2857
commit aecd3e2bdd
3 changed files with 29 additions and 2 deletions

View File

@ -11,6 +11,8 @@ namespace CasaBotApp.Controllers;
public class BotController : IController
{
private const string MESSAGE_DISSARMING = "Disarming the door sensor 🔓";
private const string MESSAGE_DISARM_ERROR = "Alarm is not connected 🚷";
private readonly BotHandler _botHandler;
private readonly ILogger<BotController> _logger;
private readonly AutoScanApp _autoScanApp;
@ -103,8 +105,16 @@ public class BotController : IController
[BotCommand("/disarm", "Disarm the Door Sensor")]
public async Task Disarm(TextMessage msg, BotCommand ctx)
{
await ctx.Responder(msg, "Disarming the door sensor");
_controlServer.RequestDisarm();
await ctx.Responder(msg,
_controlServer.IsConnected() ? MESSAGE_DISSARMING : MESSAGE_DISARM_ERROR);
}
[BotCommand("/status", "Get the status of the alarm")]
public async Task Status(TextMessage msg, BotCommand ctx)
{
await ctx.Responder(msg, _controlServer.IsConnected() ? "Alarm is connected 🟢" : "Alarm is not connected 🔴");
}
private void HandleReply()

View File

@ -13,6 +13,8 @@ public class ControlServer : IControlServer
private readonly Dictionary<long, SensorEvent> _events = new();
private Func<SensorEvent, Task>? _onEventRecived;
private bool _disarmRequestPending;
private DateTime _disarmRequestTime;
private DateTime _lastContactTime;
public ControlServer(ILogger<ControlServer> logger, IOptions<ControlServerOptions> options)
{
@ -37,7 +39,13 @@ public class ControlServer : IControlServer
while (!ct.IsCancellationRequested)
{
var ctx = await _httpListener.GetContextAsync();
// _logger.LogDebug("Got a request");
//Check if the disarm request is from the last 5 minutes
if (_disarmRequestPending && (DateTime.Now - _disarmRequestTime).TotalMinutes > 5)
{
_disarmRequestPending = false;
_logger.LogWarning("Disarm request timed out");
}
var request = ctx.Request;
var response = ctx.Response;
@ -53,6 +61,7 @@ public class ControlServer : IControlServer
var eventDataString = eventData ?? string.Empty;
var sensorEvent = new SensorEvent(eventId, eventTypeEnum, eventDataString);
_lastContactTime = DateTime.Now;
if (sensorEvent.Type == EventType.Update)
{
@ -186,6 +195,13 @@ public class ControlServer : IControlServer
public void RequestDisarm()
{
_disarmRequestPending = true;
_disarmRequestTime = DateTime.Now;
}
public bool IsConnected()
{
//Check if the last contact time was less than 5 minutes ago
return (DateTime.Now - _lastContactTime).TotalMinutes < 1;
}
}

View File

@ -7,4 +7,5 @@ public interface IControlServer : IHostedService
public void OnEvent(Func<SensorEvent, Task> onEventRecived);
public void AuthorizeEvent(long eventId);
public void RequestDisarm();
public bool IsConnected();
}