Added matrix listeners
This commit is contained in:
		@@ -1,14 +1,114 @@
 | 
			
		||||
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
 | 
			
		||||
    {
 | 
			
		||||
        public void RunListener()
 | 
			
		||||
        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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user