diff --git a/Tests/TestDataGenerator/Bot/DataFetcher.cs b/Tests/TestDataGenerator/Bot/DataFetcher.cs
new file mode 100644
index 0000000..b1f8402
--- /dev/null
+++ b/Tests/TestDataGenerator/Bot/DataFetcher.cs
@@ -0,0 +1,69 @@
+using System.Text;
+using System.Threading.Channels;
+using ArcaneLibs.Extensions;
+using LibMatrix.EventTypes.Spec;
+using LibMatrix.EventTypes.Spec.State;
+using LibMatrix.Helpers;
+using LibMatrix.Homeservers;
+using LibMatrix.Interfaces;
+using LibMatrix.RoomTypes;
+using LibMatrix.Services;
+using LibMatrix.Tests;
+using LibMatrix.Utilities.Bot;
+using LibMatrix.Utilities.Bot.Interfaces;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+
+namespace PluralContactBotPoC.Bot;
+
+public class DataFetcher(AuthenticatedHomeserverGeneric hs, ILogger<DataFetcher> logger, LibMatrixBotConfiguration botConfiguration,
+ // DataFetcherConfiguration configuration,
+ HomeserverResolverService hsResolver) : 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..."));
+
+ Config cfg = new Config();
+
+ 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<(string, string)>.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!");
+ }
+}
diff --git a/Tests/TestDataGenerator/Bot/DataFetcherConfiguration.cs b/Tests/TestDataGenerator/Bot/DataFetcherConfiguration.cs
new file mode 100644
index 0000000..06df0eb
--- /dev/null
+++ b/Tests/TestDataGenerator/Bot/DataFetcherConfiguration.cs
@@ -0,0 +1,9 @@
+using Microsoft.Extensions.Configuration;
+
+namespace PluralContactBotPoC.Bot;
+
+public class DataFetcherConfiguration {
+ public DataFetcherConfiguration(IConfiguration config) => config.GetRequiredSection("DataFetcher").Bind(this);
+
+ // public string
+}
diff --git a/Tests/TestDataGenerator/Program.cs b/Tests/TestDataGenerator/Program.cs
new file mode 100644
index 0000000..9bd091b
--- /dev/null
+++ b/Tests/TestDataGenerator/Program.cs
@@ -0,0 +1,31 @@
+// See https://aka.ms/new-console-template for more information
+
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using ArcaneLibs.Extensions;
+using LibMatrix.Services;
+using LibMatrix.Utilities.Bot;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using PluralContactBotPoC;
+using PluralContactBotPoC.Bot;
+
+Console.WriteLine("Hello, World!");
+
+var host = Host.CreateDefaultBuilder(args).ConfigureServices((_, services) => {
+ services.AddScoped<TieredStorageService>(x =>
+ new TieredStorageService(
+ cacheStorageProvider: new FileStorageProvider("bot_data/cache/"),
+ dataStorageProvider: new FileStorageProvider("bot_data/data/")
+ )
+ );
+ // services.AddSingleton<DataFetcherConfiguration>();
+ services.AddSingleton<AppServiceConfiguration>();
+
+ services.AddRoryLibMatrixServices();
+ services.AddBot(withCommands: false);
+
+ services.AddHostedService<DataFetcher>();
+}).UseConsoleLifetime().Build();
+
+await host.RunAsync();
diff --git a/Tests/TestDataGenerator/Properties/launchSettings.json b/Tests/TestDataGenerator/Properties/launchSettings.json
new file mode 100644
index 0000000..997e294
--- /dev/null
+++ b/Tests/TestDataGenerator/Properties/launchSettings.json
@@ -0,0 +1,26 @@
+{
+ "$schema": "http://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "Default": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "environmentVariables": {
+
+ }
+ },
+ "Development": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "environmentVariables": {
+ "DOTNET_ENVIRONMENT": "Development"
+ }
+ },
+ "Local config": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "environmentVariables": {
+ "DOTNET_ENVIRONMENT": "Local"
+ }
+ }
+ }
+}
diff --git a/Tests/TestDataGenerator/TestDataGenerator.csproj b/Tests/TestDataGenerator/TestDataGenerator.csproj
new file mode 100644
index 0000000..1b5a4a9
--- /dev/null
+++ b/Tests/TestDataGenerator/TestDataGenerator.csproj
@@ -0,0 +1,32 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ <TargetFramework>net7.0</TargetFramework>
+ <LangVersion>preview</LangVersion>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ <PublishAot>false</PublishAot>
+ <InvariantGlobalization>true</InvariantGlobalization>
+ <!-- <PublishTrimmed>true</PublishTrimmed>-->
+ <!-- <PublishReadyToRun>true</PublishReadyToRun>-->
+ <!-- <PublishSingleFile>true</PublishSingleFile>-->
+ <!-- <PublishReadyToRunShowWarnings>true</PublishReadyToRunShowWarnings>-->
+ <!-- <PublishTrimmedShowLinkerSizeComparison>true</PublishTrimmedShowLinkerSizeComparison>-->
+ <!-- <PublishTrimmedShowLinkerSizeComparisonWarnings>true</PublishTrimmedShowLinkerSizeComparisonWarnings>-->
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="appsettings*.json">
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+ </Content>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\LibMatrix\LibMatrix.csproj" />
+ <ProjectReference Include="..\..\Utilities\LibMatrix.Utilities.Bot\LibMatrix.Utilities.Bot.csproj" />
+ <ProjectReference Include="..\LibMatrix.Tests\LibMatrix.Tests.csproj" />
+ </ItemGroup>
+</Project>
diff --git a/Tests/TestDataGenerator/appsettings.Development.json b/Tests/TestDataGenerator/appsettings.Development.json
new file mode 100644
index 0000000..38c45c4
--- /dev/null
+++ b/Tests/TestDataGenerator/appsettings.Development.json
@@ -0,0 +1,18 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Debug",
+ "System": "Information",
+ "Microsoft": "Information"
+ }
+ },
+ "LibMatrixBot": {
+ // The homeserver to connect to
+ "Homeserver": "rory.gay",
+ // The access token to use
+ "AccessToken": "syt_xxxxxxxxxxxxxxxxx",
+ // The command prefix
+ "Prefix": "?",
+ "LogRoom": "!xxxxxxxxxxxxxxxxxxxxxx:example.com"
+ }
+}
diff --git a/Tests/TestDataGenerator/appsettings.json b/Tests/TestDataGenerator/appsettings.json
new file mode 100644
index 0000000..6ba02f3
--- /dev/null
+++ b/Tests/TestDataGenerator/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Debug",
+ "System": "Information",
+ "Microsoft": "Information"
+ }
+ }
+}
|