Files
Playa/hosts/Volcanic.AgenticCore.Telegram/Triggers/TelegramTriggerDelivery.cs

36 lines
1.6 KiB
C#

using Microsoft.Extensions.Logging;
using Volcanic.AgenticCore.Abstractions.Extensions.Events;
using Volcanic.AgenticCore.Telegram.Chats;
using Volcanic.AgenticCore.Telegram.Inbound;
namespace Volcanic.AgenticCore.Telegram.Triggers;
/// <summary>
/// Trigger prompts go to the owner's session like scheduled prompts (<see cref="Scheduling.TelegramJobDelivery"/>):
/// with the timestamp header, as a follow-up (never steering), bypassing the inbox. The registry is resolved lazily:
/// ChatRegistry → trigger extension → engine → this would otherwise be a construction cycle.
/// </summary>
public sealed class TelegramTriggerDelivery(Func<ChatRegistry> chats, TimeProvider time, ILogger<TelegramTriggerDelivery> logger) : ITriggerDelivery
{
public TimeZoneInfo TimeZoneFor(long owner) => chats().TimeZoneFor(owner);
public async Task DeliverAsync(long owner, string prompt, CancellationToken cancellationToken)
{
var chat = await chats().GetAsync(owner, cancellationToken).ConfigureAwait(false);
var text = MessageContext.TimestampHeader(time.GetUtcNow(), TimeZoneFor(owner)) + "\n" + prompt;
try
{
await chat.Session.PromptAsync(text, null, StreamingBehavior.FollowUp, cancellationToken).ConfigureAwait(false);
}
catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested)
{
throw;
}
catch (Exception ex)
{
logger.LogError(ex, "Trigger prompt in chat {ChatId} failed", owner);
chat.Report($"A group trigger could not be handled: {ex.Message}");
}
}
}