· 5 years ago · Feb 29, 2020, 06:12 PM
1// WARNING! This file contains some subset of JS that is not supported by type inference.
2// You can try checking 'Transpile to ES5' checkbox if you want the types to be inferred
3'use strict';
4var Bearertoken = "<YOUR CLIENT SIDE TOKEN>";
5var requeststate;
6var express = require("express");
7var app = express();
8var http = require("http").createServer(app);
9var io = require("socket.io")(http);
10var bodyParser = require("body-parser");
11var axios = require("axios");
12var PlayerRoster = new Database;
13var TeamDatabase = new Database;
14var jsonParser = bodyParser.json();
15var playerID = "";
16var gamename = "";
17var gamestate = 0;
18var NickPlayerId = "";
19var playerTempElo = 0;
20var ava = "";
21var fl = "";
22var faceitlvl = 0;
23var playerWins = 0;
24var playerPlayedGames = 0;
25var playerCurrentWinstreak = 0;
26var playerLongestWinstreak = 0;
27var player20Kills = 0;
28var player20HS = 0;
29var player20KD = 0;
30var player20KR = 0;
31app.use(express.static(__dirname + "/public")), app.get("/", function(canCreateDiscussions, res) {
32 res.sendFile(__dirname + "/html/index.html");
33}), app.get("/169", function(canCreateDiscussions, res) {
34 res.sendFile(__dirname + "/html/169.html");
35}), app.get("/43", function(canCreateDiscussions, res) {
36 res.sendFile(__dirname + "/html/43.html");
37}), app.post("/", jsonParser, function(done, taskNamesToRun) {
38 executeRequest(done, taskNamesToRun).catch(function(canCreateDiscussions) {
39 });
40});
41class Request {
42 constructor(reverse, action, flags, name, secret, config, value, total, text, type, connection, client, url, fn, key, level, method, message, data, privateKey, options, protocol, callback, id, query, endpoint, SecretKey, AssociateTag) {
43 this.gamestate = reverse;
44 this.requeststate = action;
45 this.gamename = flags;
46 this.kills = name;
47 this.assists = secret;
48 this.deaths = config;
49 this.mvps = value;
50 this.score = total;
51 this.r_kills = text;
52 this.name = type;
53 this.avatar = connection;
54 this.flag = client;
55 this.elo = url;
56 this.faceitlevel = fn;
57 this.wins = key;
58 this.playedGames = level;
59 this.currentWinstreak = method;
60 this.longestWinstreak = message;
61 this.ownTeamname = data;
62 this.enemyTeamname = privateKey;
63 this.ownTeamAVGElo = options;
64 this.enemyTeamAVGElo = protocol;
65 this.winElo = callback;
66 this.lossElo = id;
67 this.player20Kills = query;
68 this.player20HS = endpoint;
69 this.player20KD = SecretKey;
70 this.player20KR = AssociateTag;
71 }
72}
73async function executeRequest(options, fn) {
74 var value = await processPayload(options.body, fn).catch(function(canCreateDiscussions) {
75 });
76 if ("" !== JSON.stringify(value) && void 0 !== options.body.auth && void 0 !== options.body.auth.token) {
77 io.emit(options.body.auth.token, value);
78 }
79 fn.send("");
80}
81function send(value, event, fn) {
82 if ("" !== JSON.stringify(value) && void 0 !== event.auth && void 0 !== event.auth.token) {
83 io.emit(event.auth.token, value);
84 }
85 fn.send("");
86}
87async function processPayload(event, data) {
88 if (void 0 !== event.auth && void 0 !== event.auth.token || returnEmpty(), void 0 === event.player.state) {
89 i = 0;
90 for (; i < 5; i++) {
91 PlayerRoster.delete("mySteamId", event.provider.steamid);
92 TeamDatabase.delete("mySteamId", event.provider.steamid);
93 }
94 returnEmpty();
95 } else {
96 var comboPopupType = "";
97 gamestate = 1;
98 var FLOAT = event.player.match_stats.kills;
99 var REAL = event.player.match_stats.assists;
100 var CHAR = event.player.match_stats.deaths;
101 var TEXT = event.player.match_stats.mvps;
102 var VARCHAR = event.player.match_stats.score;
103 var BLOB = event.player.state.round_kills;
104 var options = event.provider.steamid;
105 var v = event.player.steamid;
106 if (void 0 !== TeamDatabase.where("mySteamId", options)[0]) {
107 if (1 === requeststate) {
108 if (void 0 === PlayerRoster.where("playerSteamId", v)[0]) {
109 comboPopupType = new Request(1, 1, " ", 0, 0, 0, 0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, null, null, 0, 0, 0, 0, 0, 0, 0, 0);
110 } else {
111 var gregDate = TeamDatabase.where("mySteamId", options);
112 var vItems = PlayerRoster.where("playerSteamId", v);
113 comboPopupType = new Request(gamestate, requeststate, gregDate[0].gamename, FLOAT, REAL, CHAR, TEXT, VARCHAR, BLOB, vItems[0].playerNickname, vItems[0].playerAvatar, vItems[0].playerFlag, vItems[0].playerElo, vItems[0].playerFaceitLevel, vItems[0].playerWins, vItems[0].playerPlayedGames, vItems[0].playerCurrentWinstreak, vItems[0].playerLongestWinstreak, gregDate[0].ownTeamname, gregDate[0].enemyTeamname, gregDate[0].ownTeamAVGElo, gregDate[0].enemyTeamAVGElo, gregDate[0].winElo, gregDate[0].lossElo,
114 vItems[0].player20Kills, vItems[0].player20HS, vItems[0].player20KD, vItems[0].player20KR);
115 }
116 } else {
117 if (void 0 === PlayerRoster.where("playerSteamId", v)[0]) {
118 gamestate = 1;
119 send(comboPopupType = new Request(1, 1, " ", 0, 0, 0, 0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, null, null, 0, 0, 0, 0, 0, 0, 0, 0), event, data);
120 await getPlayerIdFromPlayer(v, options).catch(function(canCreateDiscussions) {
121 });
122 }
123 gregDate = TeamDatabase.where("mySteamId", options);
124 vItems = PlayerRoster.where("playerSteamId", v);
125 comboPopupType = new Request(gamestate, requeststate, gregDate[0].gamename, FLOAT, REAL, CHAR, TEXT, VARCHAR, BLOB, vItems[0].playerNickname, vItems[0].playerAvatar, vItems[0].playerFlag, vItems[0].playerElo, vItems[0].playerFaceitLevel, vItems[0].playerWins, vItems[0].playerPlayedGames, vItems[0].playerCurrentWinstreak, vItems[0].playerLongestWinstreak, gregDate[0].ownTeamname, gregDate[0].enemyTeamname, gregDate[0].ownTeamAVGElo, gregDate[0].enemyTeamAVGElo, gregDate[0].winElo, gregDate[0].lossElo,
126 vItems[0].player20Kills, vItems[0].player20HS, vItems[0].player20KD, vItems[0].player20KR);
127 }
128 return comboPopupType;
129 }
130 await axios.get("https://open.faceit.com/data/v4/players", {
131 params : {
132 game_player_id : options,
133 game : "csgo"
134 },
135 headers : {
136 Authorization : "Bearer " + Bearertoken
137 }
138 }).then((e) => {
139 if (200 !== e.status) {
140 true;
141 } else {
142 playerID = e.data.player_id;
143 }
144 }).catch(function(canCreateDiscussions) {
145 });
146 await getFaceitMatch(playerID, options).catch(function(canCreateDiscussions) {
147 });
148 returnEmpty();
149 }
150}
151async function getFaceitMatch(id, cacheKey) {
152 await axios.get("https://api.faceit.com/match/v1/matches/groupByState", {
153 params : {
154 userId : id
155 }
156 }).then(async(metaGlobal) => {
157 if (names = Object.getOwnPropertyNames(metaGlobal.data.payload), "VOTING" === names[0] || "READY" === names[0] || "ONGOING" === names[0]) {
158 var data = metaGlobal.data.payload[names[0]][0];
159 var spriteAngle = 0;
160 var secCount = 0;
161 ownFactionNumber = checkForValue(data.teams.faction1, id) ? 1 : 2;
162 enemyFactionNumber = 1 == ownFactionNumber ? 2 : 1;
163 ownTeamname = data.teams["faction" + ownFactionNumber].name;
164 enemyTeamname = data.teams["faction" + enemyFactionNumber].name;
165 for (let i = 0; i < data.teams["faction" + ownFactionNumber].roster.length; i++) {
166 await getEloFromPlayer(data.teams["faction" + ownFactionNumber].roster[i].id);
167 spriteAngle = spriteAngle + playerTempElo;
168 }
169 for (let i = 0; i < data.teams["faction" + enemyFactionNumber].roster.length; i++) {
170 await getEloFromPlayer(data.teams["faction" + enemyFactionNumber].roster[i].id);
171 secCount = secCount + playerTempElo;
172 }
173 ownTeamAVGElo = Math.floor(spriteAngle / 5);
174 enemyTeamAVGElo = Math.floor(secCount / 5);
175 winElo = calculateRatingChange(ownTeamAVGElo, enemyTeamAVGElo);
176 lossElo = 50 - winElo;
177 gamename = "Faceit";
178 TeamDatabase.insert({
179 gamename : gamename,
180 mySteamId : cacheKey,
181 ownTeamname : ownTeamname,
182 enemyTeamname : enemyTeamname,
183 ownTeamAVGElo : ownTeamAVGElo,
184 enemyTeamAVGElo : enemyTeamAVGElo,
185 winElo : winElo,
186 lossElo : lossElo
187 });
188 } else {
189 PlayerRoster.delete("mySteamId", cacheKey);
190 PlayerRoster.delete("mySteamId", cacheKey);
191 PlayerRoster.delete("mySteamId", cacheKey);
192 PlayerRoster.delete("mySteamId", cacheKey);
193 TeamDatabase.delete("mySteamId", cacheKey);
194 gamename = "MM";
195 TeamDatabase.insert({
196 gamename : gamename,
197 mySteamId : cacheKey,
198 wnTeamname : "",
199 enemyTeamname : "",
200 ownTeamAVGElo : 0,
201 enemyTeamAVGElo : 0,
202 winElo : 0,
203 lossElo : 0
204 });
205 }
206 }).catch(function(canCreateDiscussions) {
207 });
208}
209async function getEloFromPlayer(id) {
210 await axios.get("https://open.faceit.com/data/v4/players/" + id, {
211 headers : {
212 Authorization : "Bearer " + Bearertoken
213 }
214 }).then((item) => {
215 if (200 !== item.status) {
216 isNull = true;
217 } else {
218 NickPlayerId = item.data.nickname;
219 playerSteamId = item.data.steam_id_64;
220 playerTempElo = item.data.games.csgo.faceit_elo;
221 playerAvatar = item.data.avatar;
222 playerFlag = "https://cdn-frontend.faceit.com/web/112-1536332382/src/app/assets/images-compress/flags/" + item.data.country.toUpperCase() + ".png";
223 playerFaceitlvl = item.data.games.csgo.skill_level;
224 }
225 }).catch(function(canCreateDiscussions) {
226 });
227}
228async function getStatsFromPlayer(playerID) {
229 await axios.get("https://open.faceit.com/data/v4/players/" + playerID + "/stats/csgo", {
230 headers : {
231 Authorization : "Bearer " + Bearertoken
232 }
233 }).then((response) => {
234 if (200 !== response.status) {
235 isNull = true;
236 } else {
237 playerWins = response.data.lifetime.Wins;
238 playerPlayedGames = response.data.lifetime.Matches;
239 playerCurrentWinstreak = response.data.lifetime["Current Win Streak"];
240 playerLongestWinstreak = response.data.lifetime["Longest Win Streak"];
241 }
242 }).catch(function(canCreateDiscussions) {
243 });
244}
245async function getPlayerIdFromPlayer(levelName, propertyName) {
246 await axios.get("https://open.faceit.com/data/v4/players", {
247 params : {
248 game_player_id : levelName,
249 game : "csgo"
250 },
251 headers : {
252 Authorization : "Bearer " + Bearertoken
253 }
254 }).then(async(body) => {
255 if (200 === body.status) {
256 requeststate = 1;
257 playerID = body.data.player_id;
258 newsteamid = body.data.games.csgo.game_player_id;
259 await getStatsFromPlayer(playerID);
260 await getEloFromPlayer(playerID);
261 await getLast20Matches(playerID);
262 PlayerRoster.insert({
263 mySteamId : propertyName,
264 playerSteamId : newsteamid,
265 playerNickname : NickPlayerId,
266 playerElo : playerTempElo,
267 playerAvatar : playerAvatar,
268 playerFlag : playerFlag,
269 playerFaceitLevel : playerFaceitlvl,
270 playerWins : playerWins,
271 playerPlayedGames : playerPlayedGames,
272 playerCurrentWinstreak : playerCurrentWinstreak,
273 playerLongestWinstreak : playerLongestWinstreak,
274 player20Kills : playerKillsAll,
275 player20HS : playerHSAll,
276 player20KD : playerKDAll,
277 player20KR : playerKRAll
278 });
279 requeststate = 0;
280 }
281 }).catch(function(article_data) {
282 if (404 === article_data.response.status) {
283 isNull = true;
284 PlayerRoster.insert({
285 mySteamId : propertyName,
286 playerSteamId : levelName,
287 playerNickname : "No Faceitaccount",
288 playerElo : 0,
289 playerAvatar : "",
290 playerFlag : "",
291 playerFaceitLevel : 0,
292 playerWins : 0,
293 playerPlayedGames : 0,
294 playerCurrentWinstreak : 0,
295 playerLongestWinstreak : 0,
296 player20Kills : 0,
297 player20HS : 0,
298 player20KD : 0,
299 player20KR : 0
300 });
301 }
302 });
303}
304var playerKills = 0;
305var playerHS = 0;
306var playerKD = 0;
307var playerKR = 0;
308var playerKillsAll = 0;
309var playerHSAll = 0;
310var playerKDAll = 0;
311var playerKRAll = 0;
312async function getLast20Matches(id) {
313 var incomingOptions = Math.floor(Date.now() / 1E3);
314 await axios.get("https://open.faceit.com/data/v4/players/" + id + "/history", {
315 params : {
316 game : "csgo",
317 offset : 0,
318 limit : 20,
319 from : 0,
320 to : incomingOptions
321 },
322 headers : {
323 Authorization : "Bearer " + Bearertoken
324 }
325 }).then(async(news) => {
326 if (200 === news.status) {
327 playerKillsAll = 0;
328 playerHSAll = 0;
329 playerKDAll = 0;
330 playerKRAll = 0;
331 i = 0;
332 for (; i < news.data.items.length; i++) {
333 await getMatchStats(news.data.items[i].match_id, id);
334 playerKillsAll = playerKillsAll + parseInt(playerKills);
335 playerHSAll = playerHSAll + parseInt(playerHS);
336 playerKDAll = playerKDAll + parseInt(playerKD);
337 playerKRAll = playerKRAll + parseInt(playerKR);
338 await Sleep(100);
339 }
340 playerKillsAll = Math.round(playerKillsAll / news.data.items.length);
341 playerHSAll = Math.round(playerHSAll / news.data.items.length);
342 playerKDAll = (playerKDAll / news.data.items.length / 1E3).toFixed(2);
343 playerKRAll = (playerKRAll / news.data.items.length / 1E3).toFixed(2);
344 }
345 }).catch(function(canCreateDiscussions) {
346 });
347}
348var matchid = "";
349async function getMatchStats(domain, skip) {
350 await axios.get("https://open.faceit.com/data/v4/matches/" + domain + "/stats", {
351 headers : {
352 Authorization : "Bearer " + Bearertoken
353 }
354 }).then(async(data) => {
355 if (200 === data.status) {
356 playerownFactionNumber = checkForValueNew(data.data.rounds[0].teams[0].players, skip) ? 0 : 1;
357 var players = data.data.rounds[0].teams[playerownFactionNumber].players;
358 for (let p = 0; p < players.length; p++) {
359 if (players[p].player_id === skip) {
360 playerKills = players[p].player_stats.Kills;
361 playerHS = players[p].player_stats["Headshots %"];
362 playerKD = 1E3 * players[p].player_stats["K/D Ratio"];
363 playerKR = 1E3 * players[p].player_stats["K/R Ratio"];
364 }
365 }
366 }
367 }).catch(function(canCreateDiscussions) {
368 });
369}
370function calculateRatingChange(b, a) {
371 var v;
372 var r;
373 return r = a - b, v = 1 / (1 + Math.pow(10, r / 400)), Math.round(50 * (1 - v));
374}
375function checkForValue(item, arr) {
376 for (let i = 0; i < item.roster.length; i++) {
377 if (item.roster[i].id === arr) {
378 return true;
379 }
380 }
381 return false;
382}
383function checkForValueNew(players, index) {
384 for (let p = 0; p < players.length; p++) {
385 if (players[p].player_id === index) {
386 return true;
387 }
388 }
389 return false;
390}
391function Database() {
392 this.datensatz = [];
393 this.insert = function(dRow) {
394 this.datensatz.push(dRow);
395 };
396 this.where = function(key, val) {
397 if (!key) {
398 return this.datensatz;
399 }
400 var results = [];
401 var i = 0;
402 for (; i < this.datensatz.length; i++) {
403 if (this.datensatz[i][key] === val) {
404 results.push(this.datensatz[i]);
405 }
406 }
407 return results;
408 };
409 this.update = function(i, graph, index, total) {
410 var category = 0;
411 for (; category < this.datensatz.length; category++) {
412 if (this.datensatz[category][i] === graph) {
413 this.datensatz[category][index] = total;
414 }
415 }
416 };
417 this.delete = function(e, id) {
418 if (!e) {
419 var t = this.datensatz;
420 return this.datensatz = [], t;
421 }
422 var result = [];
423 var index = 0;
424 for (; index < this.datensatz.length; index++) {
425 if (this.datensatz[index][e] == id) {
426 var s = this.datensatz.splice(index, 1);
427 result = result.concat(s);
428 }
429 }
430 return result;
431 };
432}
433function Sleep(timeout) {
434 return new Promise((_nextEventFunc) => {
435 return setTimeout(_nextEventFunc, timeout);
436 });
437}
438function returnEmpty() {
439 return new Request(0, 0, " ", 0, 0, 0, 0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, null, null, 0, 0, 0, 0, 0, 0, 0, 0);
440}
441http.listen(3001, function() {
442 console.log("listening on *:3001");
443});