TeleTok/MatrixListener.cs
2023-02-16 17:03:12 -05:00

114 lines
4.5 KiB
C#

using System;
using System.Configuration;
using Matrix.Sdk;
using Matrix.Sdk.Core.Domain.MatrixRoom;
using Matrix.Sdk.Core.Domain.RoomEvent;
using Matrix.Sdk.Core.Infrastructure.Dto.Room.Create;
using Sodium;
namespace TeleTok
{
public class MatrixListener
{
private static readonly CryptographyService CryptographyService = new();
public record LoginRequest(Uri BaseAddress, string Username, string Password, string DeviceId);
public async Task RunListener()
{
var factory = new MatrixClientFactory();
var anotherFactory = new MatrixClientFactory();
IMatrixClient client = factory.Create();
IMatrixClient anotherClient = anotherFactory.Create();
client.OnMatrixRoomEventsReceived += (sender, eventArgs) =>
{
foreach (BaseRoomEvent roomEvent in eventArgs.MatrixRoomEvents)
{
if (roomEvent is not TextMessageEvent textMessageEvent)
continue;
(string roomId, string senderUserId, string message) = textMessageEvent;
if (client.UserId != senderUserId)
TeleTok.LogMessage($"RoomId: {roomId} received message from {senderUserId}: {message}.");
}
};
anotherClient.OnMatrixRoomEventsReceived += (sender, eventArgs) =>
{
foreach (BaseRoomEvent roomEvent in eventArgs.MatrixRoomEvents)
{
if (roomEvent is not TextMessageEvent textMessageEvent)
continue;
(string roomId, string senderUserId, string message) = textMessageEvent;
if (anotherClient.UserId != senderUserId)
TeleTok.LogMessage($"RoomId: {roomId} received message from {senderUserId}: {message}.");
}
};
(Uri matrixNodeAddress, string username, string password, string deviceId) = CreateLoginRequest();
await client.LoginAsync(matrixNodeAddress, username, password, deviceId);
LoginRequest request2 = CreateLoginRequest();
await anotherClient.LoginAsync(request2.BaseAddress, request2.Username, request2.Password, request2.DeviceId);
if(client.IsLoggedIn)
{
TeleTok.LogMessage($"client.IsLoggedIn: {client.IsLoggedIn}");
TeleTok.LogMessage($"client.IsSyncing: {client.IsSyncing}");
}
client.Start();
anotherClient.Start();
CreateRoomResponse createRoomResponse = await client.CreateTrustedPrivateRoomAsync(new[]
{
anotherClient.UserId
});
await anotherClient.JoinTrustedPrivateRoomAsync(createRoomResponse.RoomId);
var spin = new SpinWait();
while(anotherClient.JoinedRooms.Length ==0)
spin.SpinOnce();
await client.SendMessageAsync(createRoomResponse.RoomId, "Hello");
await anotherClient.SendMessageAsync(anotherClient.JoinedRooms[0].Id, ", ");
await client.SendMessageAsync(createRoomResponse.RoomId, "World");
await anotherClient.SendMessageAsync(anotherClient.JoinedRooms[0].Id, "!");
TeleTok.LogMessage($"client.IsLoggedIn: {client.IsLoggedIn}");
TeleTok.LogMessage($"client.IsSyncing: {client.IsSyncing}");
Console.ReadLine();
client.Stop();
anotherClient.Stop();
Console.WriteLine($"client.IsLoggedIn: {client.IsLoggedIn}");
Console.WriteLine($"client.IsSyncing: {client.IsSyncing}");
}
private static LoginRequest CreateLoginRequest()
{
var seed = Guid.NewGuid().ToString();
KeyPair keyPair = CryptographyService.GenerateEd25519KeyPair(seed);
byte[] loginDigest = CryptographyService.GenerateLoginDigest();
string hexSignature = CryptographyService.GenerateHexSignature(loginDigest, keyPair.PrivateKey);
string publicKeyHex = CryptographyService.ToHexString(keyPair.PublicKey);
string hexId = CryptographyService.GenerateHexId(keyPair.PublicKey);
var password = $"ed:{hexSignature}:{publicKeyHex}";
string deviceId = publicKeyHex;
LoginRequest loginRequest = new LoginRequest(TeleTok.mAddress, TeleTok.mBotUser, TeleTok.mBotPass, deviceId);
return loginRequest;
}
}
}