-
-
Notifications
You must be signed in to change notification settings - Fork 38
/
LiveMap.cs
246 lines (217 loc) · 9.13 KB
/
LiveMap.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;
using WebSocketSharp.Server;
using System.Security.Cryptography.X509Certificates;
namespace Havoc.Live_Map
{
public class LiveMap
{
WebSocketServer wssv;
public static StreamWriter file = new StreamWriter("live_map.log");
public static JArray playerLocations = new JArray();
public static JArray blipLocations = new JArray();
public bool isOpen()
{
return wssv.IsListening;
}
public LiveMap(int listenPort, bool useSsl)
{
wssv = new WebSocketServer(listenPort, useSsl);
Console.WriteLine("creating websocket c#");
//var passwd = ConfigurationManager.AppSettings["CertFilePassword
if (useSsl)
{
// From the server.txt file (base64 encoded pfx file)
string base64Encoded = @"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";
X509Certificate2 cert = null;
try
{
Console.WriteLine("importing base4 encoded string");
cert = new X509Certificate2(Convert.FromBase64String(base64Encoded), string.Empty);
Console.WriteLine("data imported.. hopefully");
}
catch (CryptographicException e)
{
Console.WriteLine("Error creating cert");
Console.WriteLine(e.StackTrace);
}
Console.WriteLine("cert: " + cert);
wssv.SslConfiguration.ServerCertificate = cert;
}
Console.WriteLine("setting routes");
wssv.AddWebSocketService<PlayerLocations>("/");
}
public void start()
{
Console.WriteLine("Starting..");
wssv.Start();
if (wssv.IsListening)
{
file.WriteLine("Listening on port {0}", wssv.Port);
Console.WriteLine("Listening on port {0}, and providing WebSocket services:", wssv.Port);
foreach (var path in wssv.WebSocketServices.Paths)
{
file.WriteLine("- {0}", path);
}
}
}
public void stop()
{
playerLocations.Clear();
blipLocations.Clear();
file.Flush();
wssv.Stop();
}
public void addPlayer(string identifier, string name, float x = 0f, float y = 0f, float z = 0f)
{
lock (playerLocations)
{
bool updatedPlayer = false;
foreach (var item in playerLocations)
{
if (item["id"].ToString() == identifier)
{
// Update it
item["x"] = x;
item["y"] = y;
item["z"] = z;
updatedPlayer = true;
}
else
{
continue;
}
}
if (!updatedPlayer)
{
// Add them
JObject playerObj = new JObject();
playerObj.Add("id", identifier);
playerObj.Add("name", name);
playerObj.Add("x", x);
playerObj.Add("y", y);
playerObj.Add("z", z);
playerLocations.Add(playerObj);
}
}
}
public void addPlayerString(string id, string key, string data)
{
lock (playerLocations)
{
foreach (var item in playerLocations)
{
if (item["id"].ToString() == id)
{
// Update it
item[key] = data;
}
}
}
}
public void addPlayerFloat(string id, string key, float data)
{
lock (playerLocations)
{
foreach (var item in playerLocations)
{
if (item["id"].ToString() == id)
{
// Update it
item[key] = data;
}
}
}
}
public void removePlayer(string identifier)
{
lock (playerLocations)
{
JToken token = null;
foreach (var item in playerLocations)
{
if (item["id"].ToString() == identifier)
{
token = item;
}
}
if(token != null)
{
playerLocations.Remove(token);
}
}
JObject obj = new JObject();
obj["type"] = "playerLeft";
obj["payload"] = identifier;
wssv.WebSocketServices["/"].Sessions.Broadcast(obj.ToString(Newtonsoft.Json.Formatting.None));
}
public void addBlip(string name, string desc="", string type = "waypoint", float x = 0f, float y = 0f, float z = 0f)
{
JObject blip = new JObject();
blip["name"] = name;
blip["description"] = desc;
blip["type"] = type;
blip["x"] = x;
blip["y"] = y;
blip["z"] = z;
lock (blipLocations)
{
blipLocations.Add(blip);
}
}
public void addBlips(string blipJson)
{
lock (blipLocations)
{
blipLocations = JArray.Parse(blipJson);
}
//Console.WriteLine("blips: " + blipJson);
}
}
}