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