WingMan – Diff between revs 9 and 10
?pathlinks?
Rev 9 | Rev 10 | |||
---|---|---|---|---|
1 | using System; |
1 | using System; |
|
2 | using System.IO; |
2 | using System.IO; |
|
3 | using System.Threading; |
3 | using System.Threading; |
|
4 | using System.Threading.Tasks; |
4 | using System.Threading.Tasks; |
|
5 | using MQTTnet; |
5 | using MQTTnet; |
|
6 | using WingMan.Communication; |
6 | using WingMan.Communication; |
|
7 | |
7 | |
|
8 | namespace WingMan.Lobby |
8 | namespace WingMan.Lobby |
|
9 | { |
9 | { |
|
10 | public class LobbyMessageSynchronizer : IDisposable |
10 | public class LobbyMessageSynchronizer : IDisposable |
|
11 | { |
11 | { |
|
12 | public delegate void LobbyMessageReceived(object sender, LobbyMessageReceivedEventArgs e); |
12 | public delegate void LobbyMessageReceived(object sender, LobbyMessageReceivedEventArgs e); |
|
13 | |
13 | |
|
14 | public LobbyMessageSynchronizer(MqttCommunication mqttCommunication, TaskScheduler taskScheduler, |
14 | public LobbyMessageSynchronizer(MqttCommunication mqttCommunication, TaskScheduler taskScheduler, |
|
15 | CancellationToken cancellationToken) |
15 | CancellationToken cancellationToken) |
|
16 | { |
16 | { |
|
17 | MqttCommunication = mqttCommunication; |
17 | MqttCommunication = mqttCommunication; |
|
18 | CancellationToken = cancellationToken; |
18 | CancellationToken = cancellationToken; |
|
19 | TaskScheduler = taskScheduler; |
19 | TaskScheduler = taskScheduler; |
|
20 | |
20 | |
|
21 | mqttCommunication.OnMessageReceived += MqttCommunicationOnOnMessageReceived; |
21 | mqttCommunication.OnMessageReceived += MqttCommunicationOnOnMessageReceived; |
|
22 | } |
22 | } |
|
23 | |
23 | |
|
24 | private MqttCommunication MqttCommunication { get; } |
24 | private MqttCommunication MqttCommunication { get; } |
|
25 | |
25 | |
|
26 | private CancellationToken CancellationToken { get; } |
26 | private CancellationToken CancellationToken { get; } |
|
27 | private TaskScheduler TaskScheduler { get; } |
27 | private TaskScheduler TaskScheduler { get; } |
|
28 | |
28 | |
|
29 | public void Dispose() |
29 | public void Dispose() |
|
30 | { |
30 | { |
|
31 | MqttCommunication.OnMessageReceived -= MqttCommunicationOnOnMessageReceived; |
31 | MqttCommunication.OnMessageReceived -= MqttCommunicationOnOnMessageReceived; |
|
32 | } |
32 | } |
|
33 | |
33 | |
|
34 | public event LobbyMessageReceived OnLobbyMessageReceived; |
34 | public event LobbyMessageReceived OnLobbyMessageReceived; |
|
35 | |
35 | |
|
36 | private async void MqttCommunicationOnOnMessageReceived(object sender, |
36 | private async void MqttCommunicationOnOnMessageReceived(object sender, |
|
37 | MqttApplicationMessageReceivedEventArgs e) |
37 | MqttApplicationMessageReceivedEventArgs e) |
|
38 | { |
38 | { |
|
39 | if (e.ApplicationMessage.Topic != "lobby") |
39 | if (e.ApplicationMessage.Topic != "lobby") |
|
40 | return; |
40 | return; |
|
41 | |
41 | |
|
42 | using (var memoryStream = new MemoryStream(e.ApplicationMessage.Payload)) |
42 | using (var memoryStream = new MemoryStream(e.ApplicationMessage.Payload)) |
|
43 | { |
43 | { |
|
44 | var lobbyMessage = (LobbyMessage) LobbyMessage.XmlSerializer.Deserialize(memoryStream); |
44 | var lobbyMessage = (LobbyMessage) LobbyMessage.XmlSerializer.Deserialize(memoryStream); |
|
45 | |
45 | |
|
46 | await Task.Delay(0) |
46 | await Task.Delay(0) |
|
47 | .ContinueWith( |
47 | .ContinueWith( |
|
48 | _ => OnLobbyMessageReceived?.Invoke(sender, |
48 | _ => OnLobbyMessageReceived?.Invoke(sender, |
|
49 | new LobbyMessageReceivedEventArgs(lobbyMessage.Nick, lobbyMessage.Message)), |
49 | new LobbyMessageReceivedEventArgs(lobbyMessage.Nick, lobbyMessage.Message)), |
|
50 | CancellationToken, TaskContinuationOptions.None, TaskScheduler); |
50 | CancellationToken, TaskContinuationOptions.None, TaskScheduler); |
|
51 | } |
51 | } |
|
52 | } |
52 | } |
|
53 | |
53 | |
|
54 | public async Task Broadcast(string message) |
54 | public async Task Broadcast(string message) |
|
55 | { |
55 | { |
|
56 | using (var memoryStream = new MemoryStream()) |
56 | using (var memoryStream = new MemoryStream()) |
|
57 | { |
57 | { |
|
58 | LobbyMessage.XmlSerializer.Serialize(memoryStream, new LobbyMessage |
58 | LobbyMessage.XmlSerializer.Serialize(memoryStream, new LobbyMessage |
|
59 | { |
59 | { |
|
60 | Nick = MqttCommunication.Nick, |
60 | Nick = MqttCommunication.Nick, |
|
61 | Message = message |
61 | Message = message |
|
62 | }); |
62 | }); |
|
63 | |
63 | |
|
64 | memoryStream.Position = 0L; |
64 | memoryStream.Position = 0L; |
|
65 | |
65 | |
|
66 | await MqttCommunication.Broadcast("lobby", memoryStream.ToArray()).ConfigureAwait(false); |
66 | await MqttCommunication.Broadcast("lobby", memoryStream.ToArray()); |
|
67 | } |
67 | } |
|
68 | } |
68 | } |
|
69 | } |
69 | } |
|
70 | } |
70 | } |
|
71 | |
71 | |