Enhance TelegramNotifier to manage previous alerts and improve notification clarity
Updated the TelegramNotifier to delete previous alert messages before sending new notifications, ensuring that only the latest alert is visible to subscribers. Introduced a new property in TelegramSubscriber to track the latest alert message ID. Adjusted related tests to verify the new alert management behavior and updated documentation to reflect these changes, enhancing the overall user experience in message handling.
This commit is contained in:
@@ -146,4 +146,61 @@ public class TelegramNotifierTests
|
||||
// Граница разобранного двигается всегда — иначе следующий тик оповестил бы о том же.
|
||||
Assert.Equal(Now, settings.NotifiedUntil);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Notifies_ReplacingItsPreviousAlert()
|
||||
{
|
||||
var fixture = new TestDb();
|
||||
var channel = Channel.Create("Мультреалити", "mult", Now);
|
||||
var previous = Show.Create("Симпсоны", ShowKind.Series);
|
||||
var started = Show.Create("Футурама", ShowKind.Series);
|
||||
|
||||
var subscriber = TelegramSubscriber.Create(100, Guid.NewGuid(), "viewer", Now);
|
||||
subscriber.Toggle(channel.Id, TelegramNotificationKind.ShowStart);
|
||||
subscriber.SetAlertMessage(777);
|
||||
// Программа, запрошенная зрителем, — не оповещение: рассылка её трогать не должна.
|
||||
subscriber.SetNoticeMessage(555);
|
||||
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
seed.Channels.Add(channel);
|
||||
seed.Shows.AddRange(previous, started);
|
||||
seed.TelegramSubscribers.Add(subscriber);
|
||||
seed.ScheduleEntries.Add(Program(channel.Id, previous.Id, Now.AddMinutes(-30), 25));
|
||||
seed.ScheduleEntries.Add(Program(channel.Id, started.Id, Now.AddMinutes(-1), 25));
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
var api = Substitute.For<ITelegramApi>();
|
||||
api.SendMessageAsync(
|
||||
Arg.Any<TelegramSettings>(),
|
||||
Arg.Any<long>(),
|
||||
Arg.Any<string>(),
|
||||
Arg.Any<IReadOnlyList<IReadOnlyList<TelegramButton>>?>(),
|
||||
Arg.Any<CancellationToken>()
|
||||
)
|
||||
.Returns(4242L);
|
||||
var settings = Settings();
|
||||
settings.MarkNotifiedUntil(Now.AddMinutes(-5));
|
||||
|
||||
await using (var db = fixture.New())
|
||||
{
|
||||
await new TelegramNotifier(db, api).RunAsync(settings, Now, CancellationToken.None);
|
||||
await db.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
// Вчерашнее «сейчас в эфире» — уже неправда: старое снимаем, новое запоминаем.
|
||||
await api.Received(1)
|
||||
.DeleteMessageAsync(
|
||||
Arg.Any<TelegramSettings>(),
|
||||
100,
|
||||
777,
|
||||
Arg.Any<CancellationToken>()
|
||||
);
|
||||
|
||||
await using var check = fixture.New();
|
||||
var stored = check.TelegramSubscribers.Single();
|
||||
Assert.Equal(4242L, stored.AlertMessageId);
|
||||
Assert.Equal(555L, stored.NoticeMessageId);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user