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, () =>