diff --git a/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggerStore.cs b/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggerStore.cs index 9599228..3a6fc4f 100644 --- a/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggerStore.cs +++ b/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggerStore.cs @@ -65,6 +65,16 @@ public sealed class TriggerStore public static string PathIn(string workspace) => Path.Combine(DirectoryIn(workspace), "triggers.json"); + public int Count + { + get { lock (_lock) return _byOwner.Values.Sum(l => l.Count); } + } + + public int OwnerCount + { + get { lock (_lock) return _byOwner.Values.Count(l => l.Count > 0); } + } + public IReadOnlyList List(long owner) { lock (_lock) return _byOwner.TryGetValue(owner, out var list) ? [.. list] : []; diff --git a/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggerTool.cs b/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggerTool.cs index abfda57..e56219c 100644 --- a/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggerTool.cs +++ b/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggerTool.cs @@ -1,6 +1,8 @@ using System.ComponentModel; using System.Globalization; using System.Text; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Volcanic.AgenticCore.Abstractions.Extensions; using Volcanic.AgenticCore.Abstractions.Tools; using Volcanic.AgenticCore.Telegram.Groups; @@ -8,8 +10,12 @@ using Volcanic.AgenticCore.Telegram.Groups; namespace Volcanic.AgenticCore.Telegram.Triggers; /// What the trigger tool, the extension and /triggers share; registered only when triggers are on. -public sealed class TriggerServices(TriggerEngine engine, GroupRegistry groups, IGroupMembership membership, TriggerOptions options) +public sealed class TriggerServices(TriggerEngine engine, GroupRegistry groups, IGroupMembership membership, TriggerOptions options, + ILogger? logger = null) { + /// Every change the tool makes is logged here. + public ILogger Logger { get; } = logger ?? NullLogger.Instance; + public TriggerEngine Engine => engine; public TriggerStore Store => engine.Store; public GroupRegistry Groups => groups; @@ -120,6 +126,8 @@ public sealed class TriggerTool(long owner, TriggerServices services, Func t.Id)), until); return ToolResult.Text($"Snoozed {string.Join(", ", snoozed.Select(t => t.Id))} until {TriggerPrompts.Stamp(until, tz)} ({tz.Id}). " + "Messages are collected meanwhile and checked as one batch when the snooze ends; you get one prompt if anything is related."); } diff --git a/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggersSetup.cs b/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggersSetup.cs index 1bc63fe..e5ac5a3 100644 --- a/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggersSetup.cs +++ b/hosts/Volcanic.AgenticCore.Telegram/Triggers/TriggersSetup.cs @@ -46,9 +46,14 @@ public static class TriggersSetup } /// Flushes snoozes that ended while the host was down and arms the snooze timer. -public sealed class TriggersHostedService(TriggerEngine engine) : IHostedService +public sealed class TriggersHostedService(TriggerEngine engine, GroupRegistry groups, ILogger logger) : IHostedService { - public Task StartAsync(CancellationToken cancellationToken) => engine.StartAsync(cancellationToken); + public Task StartAsync(CancellationToken cancellationToken) + { + logger.LogInformation("Group triggers: {Count} trigger(s) loaded for {Chats} chat(s), {Groups} watched group(s)", + engine.Store.Count, engine.Store.OwnerCount, groups.All().Count(g => g.Active)); + return engine.StartAsync(cancellationToken); + } public Task StopAsync(CancellationToken cancellationToken) {