1 | 'use strict';
|
2 |
|
3 | var packJS = require('./pack.js');
|
4 | var StringIO = require('./stringio.js');
|
5 | var BigNumber = require('bignumber.js');
|
6 | BigNumber.config({
|
7 | DECIMAL_PLACES: 43,
|
8 | EXPONENTIAL_AT: 50
|
9 | });
|
10 |
|
11 | class ByteReader {
|
12 | constructor(io) {
|
13 | this.io = io;
|
14 | }
|
15 |
|
16 | get read_int64() {
|
17 | var temp = this.io.read(8);
|
18 | var unpacked = packJS.unpack("C*", temp);
|
19 | var result = new BigNumber(0);
|
20 | Object.keys(unpacked).forEach(function(key) {
|
21 | var index = key - 1;
|
22 | var byte = unpacked[key];
|
23 |
|
24 | var a = new BigNumber(256).toPower(new BigNumber(index));
|
25 | var b = new BigNumber(byte).times(a);
|
26 |
|
27 | result = result.plus(b)
|
28 | });
|
29 | return result.toString();
|
30 | }
|
31 |
|
32 | get read_short() {
|
33 | var temp = this.io.read(2);
|
34 | var unpacked = packJS.unpack("S*", temp);
|
35 | return unpacked[''].toString();
|
36 | }
|
37 | }
|
38 |
|
39 | class SharecodeDecoder {
|
40 | constructor(code) {
|
41 | this.code = this.sanitize_code(code);
|
42 | this.originalCode = code;
|
43 |
|
44 | this.DICTIONARY = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefhijkmnopqrstuvwxyz23456789";
|
45 | this.DICTIONARY_LENGTH = this.DICTIONARY.length
|
46 | }
|
47 |
|
48 | decode() {
|
49 | var reader = new ByteReader(this.io);
|
50 | var matchId = reader.read_int64;
|
51 | var outcomeId = reader.read_int64;
|
52 | var tokenId = reader.read_short;
|
53 |
|
54 | return {
|
55 | matchId: matchId,
|
56 | outcomeId: outcomeId,
|
57 | tokenId: tokenId
|
58 | };
|
59 | }
|
60 |
|
61 | sanitize_code(str) {
|
62 | return str.replace(/CSGO|\-/g, '');
|
63 | }
|
64 |
|
65 | get io() {
|
66 | return new StringIO.StringIO(this.decoded_code);
|
67 | }
|
68 |
|
69 | get decoded_code() {
|
70 | var self = this;
|
71 | var result = new Array(18).fill(0);
|
72 | var reversed = this.code.split('').reverse();
|
73 | reversed.forEach(function(char, index) {
|
74 | var addval = self.DICTIONARY.indexOf(char);
|
75 | var tmp = new Array(18).fill(0);
|
76 | var carry = 0;
|
77 | var v = 0;
|
78 | for(var t = 17; t >= 0; t--) {
|
79 | carry = 0;
|
80 | for(var s = t; s >= 0; s--) {
|
81 | if(t - s == 0) {
|
82 | v = tmp[s] + result[t] * 57;
|
83 | }else {
|
84 | v = 0;
|
85 | }
|
86 | v = v + carry;
|
87 | carry = v >> 8;
|
88 | tmp[s] = v & 0xFF;
|
89 | }
|
90 | }
|
91 | result = tmp;
|
92 | carry = 0;
|
93 |
|
94 | for(var t = 17; t >= 0; t--) {
|
95 | if(t == 17) {
|
96 | v = result[t] + addval;
|
97 | }else {
|
98 | v = result[t];
|
99 | }
|
100 | v = v + carry;
|
101 | carry = v >> 8;
|
102 | result[t] = v & 0xFF;
|
103 | }
|
104 | });
|
105 |
|
106 | result.unshift('C*');
|
107 | return packJS.pack.apply(this, result);
|
108 | }
|
109 | }
|
110 |
|
111 | exports.SharecodeDecoder = SharecodeDecoder;
|