WingMan – Rev 5
?pathlinks?
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;
}
}
}