WingMan – Rev 5

Subversion Repositories:
Rev:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MQTTnet;
using WingMan.Communication;

namespace WingMan
{
    public class LobbyMessageSynchronizer : IDisposable
    {
        public delegate void LobbyMessageReceived(object sender, LobbyMessageReceivedEventArgs e);

        public event LobbyMessageReceived OnLobbyMessageReceived;
        private MQTTCommunication MQTTCommunication { get; set; }
        public LobbyMessageSynchronizer(MQTTCommunication MQTTCommunication)
        {
            this.MQTTCommunication = MQTTCommunication;

            MQTTCommunication.OnMessageReceived += MqttCommunicationOnOnMessageReceived;
        }

        private void MqttCommunicationOnOnMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
        {
            if(e.ApplicationMessage.Topic != "lobby")
                return;

            using (var memoryStream = new MemoryStream(e.ApplicationMessage.Payload))
            {
                var lobbyMessage = (LobbyMessage)LobbyMessage.XmlSerializer.Deserialize(memoryStream);

                OnLobbyMessageReceived?.Invoke(sender, new LobbyMessageReceivedEventArgs(lobbyMessage.Nick, lobbyMessage.Message));
            }
        }

        public async Task Broadcast(string message)
        {
            using (var memoryStream = new MemoryStream())
            {
                LobbyMessage.XmlSerializer.Serialize(memoryStream, new LobbyMessage
                {
                    Nick = MQTTCommunication.Nick,
                    Message = message
                });

                memoryStream.Position = 0L;

                await MQTTCommunication.Broadcast("lobby", memoryStream.ToArray()).ConfigureAwait(false);
            }
        }

        public void Dispose()
        {
            MQTTCommunication.OnMessageReceived -= MqttCommunicationOnOnMessageReceived;
        }
    }
}