source: TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Player.cs@ 498

Last change on this file since 498 was 487, checked in by alloc, 5 months ago

1.1.0.1 Release for V 1.0

File size: 8.0 KB
Line 
1using System;
2using System.Net;
3using JetBrains.Annotations;
4using Utf8Json;
5using Webserver.Permissions;
6
7namespace Webserver.WebAPI.APIs.WorldState {
8 [UsedImplicitly]
9 public class Player : AbsRestApi {
10 private static readonly byte[] jsonPlayersKey = JsonWriter.GetEncodedPropertyNameWithBeginObject ("players");
11
12 protected override void HandleRestGet (RequestContext _context) {
13 string id = _context.RequestPath;
14 int permissionLevel = _context.PermissionLevel;
15
16 bool bViewAll = PermissionUtils.CanViewAllPlayers (permissionLevel);
17 PlatformUserIdentifierAbs nativeUserId = _context.Connection?.UserId;
18
19 // string qs;
20 // if ((qs = _context.Request.QueryString ["count"]) == null || !int.TryParse (qs, out int count)) {
21 // count = 50;
22 // }
23
24 PrepareEnvelopedResult (out JsonWriter writer);
25
26 writer.WriteRaw (jsonPlayersKey);
27 writer.WriteBeginArray ();
28
29 ClientInfo ci;
30 int written = 0;
31
32 if (string.IsNullOrEmpty (id)) {
33 for (int i = 0; i < ConnectionManager.Instance.Clients.List.Count; i++) {
34 ClientInfo clientInfo = ConnectionManager.Instance.Clients.List [i];
35
36 writePlayerJson (ref writer, ref written, clientInfo.PlatformId, bViewAll, nativeUserId);
37 }
38 } else if (int.TryParse (id, out int entityId) && (ci = ConnectionManager.Instance.Clients.ForEntityId (entityId)) != null) {
39 // TODO: Allow finding offline players, also for search other than by EntityId
40 writePlayerJson (ref writer, ref written, ci.PlatformId, bViewAll, nativeUserId);
41 } else {
42 writer.WriteEndArray ();
43 writer.WriteEndObject ();
44 SendEnvelopedResult (_context, ref writer, HttpStatusCode.NotFound);
45 return;
46 }
47
48 writer.WriteEndArray ();
49 writer.WriteEndObject ();
50
51 SendEnvelopedResult (_context, ref writer);
52 }
53
54
55#region JSON keys for player result
56
57 private static readonly byte[] jsonEntityIdKey = JsonWriter.GetEncodedPropertyNameWithBeginObject ("entityId");
58 private static readonly byte[] jsonNameKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("name");
59 private static readonly byte[] jsonPlatformIdKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("platformId");
60 private static readonly byte[] jsonCrossplatformIdKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("crossplatformId");
61 private static readonly byte[] jsonTotalPlayTimeKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("totalPlayTimeSeconds");
62 private static readonly byte[] jsonLastOnlineKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("lastOnline");
63 private static readonly byte[] jsonOnlineKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("online");
64 private static readonly byte[] jsonIpKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("ip");
65 private static readonly byte[] jsonPingKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("ping");
66 private static readonly byte[] jsonPositionKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("position");
67 private static readonly byte[] jsonLevelKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("level");
68 private static readonly byte[] jsonHealthKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("health");
69 private static readonly byte[] jsonStaminaKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("stamina");
70 private static readonly byte[] jsonScoreKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("score");
71 private static readonly byte[] jsonDeathsKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("deaths");
72
73 private static readonly byte[] jsonKillsKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("kills");
74 private static readonly byte[] jsonKillsZombiesKey = JsonWriter.GetEncodedPropertyNameWithBeginObject ("zombies");
75 private static readonly byte[] jsonKillsPlayersKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("players");
76
77 private static readonly byte[] jsonBannedKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("banned");
78 private static readonly byte[] jsonBanActiveKey = JsonWriter.GetEncodedPropertyNameWithBeginObject ("banActive");
79 private static readonly byte[] jsonBanReasonKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("reason");
80 private static readonly byte[] jsonBanUntilKey = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("until");
81
82#endregion
83
84
85 private void writePlayerJson (ref JsonWriter _writer, ref int _written, PlatformUserIdentifierAbs _nativeUserId,
86 bool _allowViewAll, PlatformUserIdentifierAbs _requesterNativeUserId) {
87
88 if (!_allowViewAll && (_requesterNativeUserId == null || !_requesterNativeUserId.Equals (_nativeUserId) )) {
89 return;
90 }
91
92 ClientInfo ci = ConnectionManager.Instance.Clients.ForUserId (_nativeUserId);
93 if (ci == null) {
94 Log.Warning ("[Web] Player.GET: ClientInfo null");
95 return;
96 }
97
98 int entityId = ci.entityId;
99 GameManager.Instance.World.Players.dict.TryGetValue (entityId, out EntityPlayer entity);
100
101 if (entity == null) {
102 Log.Warning ("[Web] Player.GET: EntityPlayer null");
103 return;
104 }
105
106 if (_written > 0) {
107 _writer.WriteValueSeparator ();
108 }
109 _written++;
110
111 bool online = true; // TODO
112
113 _writer.WriteRaw (jsonEntityIdKey);
114 _writer.WriteInt32 (entityId);
115
116 _writer.WriteRaw (jsonNameKey);
117 _writer.WriteString (ci.playerName);
118
119 _writer.WriteRaw (jsonPlatformIdKey);
120 JsonCommons.WritePlatformUserIdentifier (ref _writer, _nativeUserId);
121
122 _writer.WriteRaw (jsonCrossplatformIdKey);
123 JsonCommons.WritePlatformUserIdentifier (ref _writer, ci.CrossplatformId);
124
125 _writer.WriteRaw (jsonTotalPlayTimeKey);
126 //_writer.WriteLong (player.TotalPlayTime); TODO
127 _writer.WriteNull ();
128
129 _writer.WriteRaw (jsonLastOnlineKey);
130 //JsonCommons.WriteDateTime (ref _writer, player.LastOnline); TODO
131 _writer.WriteNull ();
132
133 _writer.WriteRaw (jsonOnlineKey);
134 _writer.WriteBoolean (online);
135
136 _writer.WriteRaw (jsonIpKey);
137 if (online) {
138 _writer.WriteString (ci.ip);
139 // TODO: Possibly show last used IP?
140 } else {
141 _writer.WriteNull ();
142 }
143
144 _writer.WriteRaw (jsonPingKey);
145 if (online) {
146 _writer.WriteInt32 (ci.ping);
147 } else {
148 _writer.WriteNull ();
149 }
150
151 _writer.WriteRaw (jsonPositionKey);
152 if (online) {
153 JsonCommons.WriteVector3 (ref _writer, entity.GetPosition ());
154 // TODO: Possibly show last position?
155 } else {
156 _writer.WriteNull ();
157 }
158
159 _writer.WriteRaw (jsonLevelKey);
160 _writer.WriteNull (); // TODO
161
162 _writer.WriteRaw (jsonHealthKey);
163 _writer.WriteInt32 (entity.Health);
164
165 _writer.WriteRaw (jsonStaminaKey);
166 _writer.WriteSingle (entity.Stamina);
167
168 _writer.WriteRaw (jsonScoreKey);
169 _writer.WriteInt32 (entity.Score);
170
171 _writer.WriteRaw (jsonDeathsKey);
172 _writer.WriteInt32 (entity.Died);
173
174
175 _writer.WriteRaw (jsonKillsKey);
176
177 _writer.WriteRaw (jsonKillsZombiesKey);
178 _writer.WriteInt32 (entity.KilledZombies);
179
180 _writer.WriteRaw (jsonKillsPlayersKey);
181 _writer.WriteInt32 (entity.KilledPlayers);
182
183 _writer.WriteEndObject (); // End of jsonKillsKey
184
185
186 _writer.WriteRaw (jsonBannedKey);
187
188 bool banned = GameManager.Instance.adminTools.Blacklist.IsBanned (_nativeUserId, out DateTime bannedUntil, out string banReason);
189 if (!banned && ci.CrossplatformId != null) {
190 banned = GameManager.Instance.adminTools.Blacklist.IsBanned (ci.CrossplatformId, out bannedUntil, out banReason);
191 }
192
193 _writer.WriteRaw (jsonBanActiveKey);
194 _writer.WriteBoolean (banned);
195
196 _writer.WriteRaw (jsonBanReasonKey);
197 if (banned) {
198 _writer.WriteString (banReason);
199 } else {
200 _writer.WriteNull ();
201 }
202
203 _writer.WriteRaw (jsonBanUntilKey);
204 if (banned) {
205 JsonCommons.WriteDateTime (ref _writer, bannedUntil);
206 } else {
207 _writer.WriteNull ();
208 }
209
210 _writer.WriteEndObject (); // End of jsonBannedKeys
211
212
213 _writer.WriteEndObject (); // End of jsonEntityIdKey
214 }
215
216 public override int DefaultPermissionLevel () => AdminWebModules.PermissionLevelGuest;
217 }
218}
Note: See TracBrowser for help on using the repository browser.