WingMan – Rev 32
?pathlinks?
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet;
using WingMan.Communication;
namespace WingMan.Lobby
{
public class LobbyMessageSynchronizer : IDisposable
{
public delegate void LobbyMessageReceived(object sender, LobbyMessageReceivedEventArgs e);
public LobbyMessageSynchronizer(MqttCommunication mqttCommunication, TaskScheduler taskScheduler,
CancellationToken cancellationToken)
{
MqttCommunication = mqttCommunication;
CancellationToken = cancellationToken;
TaskScheduler = taskScheduler;
mqttCommunication.OnMessageReceived += MqttCommunicationOnOnMessageReceived;
}
private MqttCommunication MqttCommunication { get; }
private CancellationToken CancellationToken { get; }
private TaskScheduler TaskScheduler { get; }
public void Dispose()
{
MqttCommunication.OnMessageReceived -= MqttCommunicationOnOnMessageReceived;
}
public event LobbyMessageReceived OnLobbyMessageReceived;
private async 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);
await Task.Delay(0)
.ContinueWith(
_ => OnLobbyMessageReceived?.Invoke(sender,
new LobbyMessageReceivedEventArgs(lobbyMessage.Nick, lobbyMessage.Message)),
CancellationToken, TaskContinuationOptions.None, TaskScheduler);
}
}
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());
}
}
}
}
Generated by GNU Enscript 1.6.5.90.