forked from admin/VolcanicAgenticCore
36 lines
1.6 KiB
C#
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}");
|
|
}
|
|
}
|
|
}
|