diff --git a/.gitignore b/.gitignore
index 1413af9..687f58d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,8 @@
-# See http://help.github.com/ignore-files/ for more about ignoring files.
-
-# compiled output
+mpiled output
/dist
/tmp
/out-tsc
+
# Only exists if Bazel was run
/bazel-out
diff --git a/package.json b/package.json
index 6a0b294..f778182 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,9 @@
"howler": "^2.2.4",
"pako": "^2.1.0",
"pixi-filters": "^6.0.0",
- "pixi.js": "~8.0.4"
+ "pixi.js": "~8.0.4",
+ "@pixi/gif": "^3.0.0",
+ "clientjs": "^0.2.1"
},
"devDependencies": {
"@rollup/plugin-typescript": "^11.1.6",
diff --git a/packages/communication/src/CommunicationManager.ts b/packages/communication/src/CommunicationManager.ts
index 2389d76..8cb6548 100644
--- a/packages/communication/src/CommunicationManager.ts
+++ b/packages/communication/src/CommunicationManager.ts
@@ -4,7 +4,8 @@ import { GetEventDispatcher, NitroEventType } from '@nitrots/events';
import { GetTickerTime } from '@nitrots/utils';
import { NitroMessages } from './NitroMessages';
import { SocketConnection } from './SocketConnection';
-import { AuthenticatedEvent, ClientHelloMessageComposer, ClientPingEvent, InfoRetrieveMessageComposer, PongMessageComposer, SSOTicketMessageComposer } from './messages';
+import { AuthenticatedEvent, ClientHelloMessageComposer, ClientPingEvent, InfoRetrieveMessageComposer, PongMessageComposer, SSOTicketMessageComposer, UniqueIDMessageComposer } from './messages';
+import { ClientJS } from 'clientjs';
export class CommunicationManager implements ICommunicationManager
{
@@ -12,6 +13,73 @@ export class CommunicationManager implements ICommunicationManager
private _messages: IMessageConfiguration = new NitroMessages();
private _pongInterval: any = null;
+
+ private getGpu(): string {
+ const e = document.createElement('canvas');
+ let t, s, i, r;
+ try {
+ if (
+ ((t = e.getContext('webgl') || e.getContext('experimental-webgl')), (s = t.getExtension('WEBGL_debug_renderer_info')), null === t || null === s))
+ return '';
+ } catch (n) {
+ return '';
+ }
+ return ((i = t.getParameter(s.UNMASKED_VENDOR_WEBGL)), (r = t.getParameter(s.UNMASKED_RENDERER_WEBGL)), i + '|' + r);
+ }
+
+ private getMathResult(): string {
+ let e, t;
+ (e = 'Error'), (t = '');
+ try {
+ return (
+ (t ='' + (Math.exp(10) + 1 / Math.exp(10)) / 2 + '|' + Math.tan(-1e300) + ''), t);
+ } catch (s) {
+ return 'Error';
+ }
+ }
+
+ private getCanvas(): any {
+ const e = document.createElement('canvas'), t = e.getContext('2d'), userAgent = navigator.userAgent, screenInfo = '${window.screen.width}x${window.screen.height}', currentDate = new Date().toString(), s = 'ThiosIsVerrySeCuRe02938883721##@@@_moreStuff! | ${userAgent} | ${screenInfo} | ${currentDate}';
+ t.textBaseline = 'top';
+ t.font = "16px 'Arial'";
+ t.textBaseline = 'alphabetic';
+ t.rotate(0.05);
+ t.fillStyle = '#f60';
+ t.fillRect(125, 1, 62, 20);
+ t.fillStyle = '#069';
+ t.fillText(s, 2, 15);
+ t.fillStyle = 'rgba(102, 200, 0, 0.7)';
+ t.fillText(s, 4, 17);
+ t.shadowBlur = 10;
+ t.shadowColor = 'blue';
+ t.fillRect(-20, 10, 234, 5);
+ const i = e.toDataURL();
+ document.body.appendChild(e);
+ let r = 0;
+ if (i.length === 0) return 'nothing!';
+ for (let n = 0; n < i.length; n++) {
+ r = (r << 5) - r + i.charCodeAt(n);
+ r &= r;
+ }
+ return r;
+ }
+
+ private generateMachineID(): string {
+ const fp = new ClientJS();
+ const uniqueId = fp.getCustomFingerprint(
+ fp.getAvailableResolution(),
+ fp.getOS(),
+ fp.getCPU(),
+ fp.getColorDepth(),
+ this.getGpu(),
+ fp.getSilverlightVersion(),
+ fp.getOSVersion(),
+ this.getMathResult(),
+ fp.getCanvasPrint(),
+ this.getCanvas()
+ );
+ return uniqueId == null ? 'FAILED' : `IID-${uniqueId}`;
+ }
constructor()
{
@@ -30,9 +98,12 @@ export class CommunicationManager implements ICommunicationManager
GetEventDispatcher().addEventListener(NitroEventType.SOCKET_OPENED, () =>
{
if(GetConfiguration().getValue('system.pong.manually', false)) this.startPong();
-
+
+ const machineId = this.generateMachineID();
+
this._connection.send(new ClientHelloMessageComposer(null, null, null, null));
this._connection.send(new SSOTicketMessageComposer(GetConfiguration().getValue('sso.ticket', null), GetTickerTime()));
+ this._connection.send(new UniqueIDMessageComposer(machineId, '', ''));
});
GetEventDispatcher().addEventListener(NitroEventType.SOCKET_ERROR, () =>