about summary refs log tree commit diff
path: root/Utilities/LibMatrix.TestDataGenerator/Bot/DataFetcher.cs
blob: 66b8a03f6b21bc4d876aa727e467cfea34b2c9db (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using ArcaneLibs.Extensions;
using LibMatrix.EventTypes.Spec;
using LibMatrix.Homeservers;
using LibMatrix.RoomTypes;
using LibMatrix.Utilities.Bot;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously

namespace TestDataGenerator.Bot;

public class DataFetcher(AuthenticatedHomeserverGeneric hs, ILogger<DataFetcher> logger, LibMatrixBotConfiguration botConfiguration) : IHostedService {
    private Task? _listenerTask;

    private GenericRoom? _logRoom;

    /// <summary>Triggered when the application host is ready to start the service.</summary>
    /// <param name="cancellationToken">Indicates that the start process has been aborted.</param>
    public async Task StartAsync(CancellationToken cancellationToken) {
        _listenerTask = Run(cancellationToken);
        logger.LogInformation("Bot started!");
    }

    private async Task Run(CancellationToken cancellationToken) {
        Directory.GetFiles("bot_data/cache").ToList().ForEach(File.Delete);
        _logRoom = hs.GetRoom(botConfiguration.LogRoom!);

        await _logRoom.SendMessageEventAsync(new RoomMessageEventContent(body: "Test data collector started!"));
        await _logRoom.SendMessageEventAsync(new RoomMessageEventContent(body: "Fetching rooms..."));

        var rooms = await hs.GetJoinedRooms();
        await _logRoom.SendMessageEventAsync(new RoomMessageEventContent(body: $"Fetched {rooms.Count} rooms!"));

        await _logRoom.SendMessageEventAsync(new RoomMessageEventContent(body: "Fetching room data..."));

        var roomAliasTasks = rooms.Select(room => room.GetCanonicalAliasAsync()).ToAsyncEnumerable();
        List<Task<(string, string)>> aliasResolutionTasks = new();
        await foreach (var @event in roomAliasTasks)
            if (@event?.Alias != null) {
                await _logRoom.SendMessageEventAsync(new RoomMessageEventContent(body: $"Fetched room alias {@event.Alias}!"));
                aliasResolutionTasks.Add(Task.Run(async () => {
                    var alias = await hs.ResolveRoomAliasAsync(@event.Alias);
                    return (@event.Alias, alias.RoomId);
                }, cancellationToken));
            }

        var aliasResolutionTaskEnumerator = aliasResolutionTasks.ToAsyncEnumerable();
        await foreach (var result in aliasResolutionTaskEnumerator)
            await _logRoom.SendMessageEventAsync(new RoomMessageEventContent(body: $"Resolved room alias {result.Item1} to {result.Item2}!"));
    }

    /// <summary>Triggered when the application host is performing a graceful shutdown.</summary>
    /// <param name="cancellationToken">Indicates that the shutdown process should no longer be graceful.</param>
    public async Task StopAsync(CancellationToken cancellationToken) {
        logger.LogInformation("Shutting down bot!");
        _listenerTask?.Dispose();
    }
}