AQ update

This commit is contained in:
peter
2020-08-13 12:03:35 +02:00
parent bd5b33e4a1
commit 7c1b0b73ed
35 changed files with 1343 additions and 881 deletions
+2
View File
@@ -13,6 +13,8 @@ log.txt
*.d.ts *.d.ts
*.js *.js
*.ts *.ts
log.txt
!src/**/* !src/**/*
node_modules node_modules
Binary file not shown.
@@ -11,11 +11,6 @@ exports.up = function (knex) {
output: process.stdout output: process.stdout
}) })
return new Promise((res, rej) => { return new Promise((res, rej) => {
r1.question('WARNING\n\nAbout to update your signups table. Please make sure there are no active signups. \nContinue? y/N', answer => {
if(!answer || answer === "" || answer === "n" || answer === "N"){
rej(new Error("User aborted"))
}else{
knex('signups').select('*').then(rows => {
return knex.schema.dropTable('signups').then(_ => { return knex.schema.dropTable('signups').then(_ => {
return knex.schema.createTable('signups', function (table) { return knex.schema.createTable('signups', function (table) {
table.increments('id').primary() table.increments('id').primary()
@@ -35,9 +30,6 @@ exports.up = function (knex) {
} }
}) })
}) })
}
})
})
} }
+1 -1
View File
@@ -12,7 +12,7 @@ exports.up = function (knex) {
exports.down = function (knex) { exports.down = function (knex) {
return knex.schema.table('signups', function (table) { return knex.schema.table('items', function (table) {
table.dropColumn('stats') table.dropColumn('stats')
}) })
} }
+359 -289
View File
@@ -99,6 +99,14 @@
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true "dev": true
}, },
"@types/engine.io": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/@types/engine.io/-/engine.io-3.1.4.tgz",
"integrity": "sha512-98rXVukLD6/ozrQ2O80NAlWDGA4INg+tqsEReWJldqyi2fulC9V7Use/n28SWgROXKm6003ycWV4gZHoF8GA6w==",
"requires": {
"@types/node": "*"
}
},
"@types/fs-extra": { "@types/fs-extra": {
"version": "8.0.0", "version": "8.0.0",
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz",
@@ -131,9 +139,9 @@
"integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ=="
}, },
"@types/node": { "@types/node": {
"version": "11.13.19", "version": "14.0.27",
"resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.19.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
"integrity": "sha512-tLRDU1hmcWamtgRT2iVRdraAQVGFQGgtcqracSo9XyMN1VeZLSVGb8RJJxVqab7UGbijoUijGPVFMjmqzyZIUw==" "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g=="
}, },
"@types/node-fetch": { "@types/node-fetch": {
"version": "2.5.0", "version": "2.5.0",
@@ -143,6 +151,20 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/socket.io": {
"version": "2.1.10",
"resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-2.1.10.tgz",
"integrity": "sha512-1fQMaDU/x2LPljEI/QI5IKl8sBYHM/zv32YYKvNrVEor7/1+MLqMqmWt8Bb8Vpf+PlIPBiTTC0BnrRx7ju3xOw==",
"requires": {
"@types/engine.io": "*",
"@types/node": "*"
}
},
"@types/socket.io-client": {
"version": "1.4.33",
"resolved": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-1.4.33.tgz",
"integrity": "sha512-m4LnxkljsI9fMsjwpW5QhRpMixo2BeeLpFmg0AE+sS4H1pzAd/cs/ftTiL60FLZgfFa8PFRPx5KsHu8O0bADKQ=="
},
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "2.17.0", "version": "2.17.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.17.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.17.0.tgz",
@@ -218,10 +240,16 @@
"negotiator": "0.6.2" "negotiator": "0.6.2"
} }
}, },
"after": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
"integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
},
"ajv": { "ajv": {
"version": "6.10.2", "version": "6.10.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
"integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
"dev": true,
"requires": { "requires": {
"fast-deep-equal": "^2.0.1", "fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0", "fast-json-stable-stringify": "^2.0.0",
@@ -349,18 +377,10 @@
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
}, },
"asn1": { "arraybuffer.slice": {
"version": "0.2.4", "version": "0.0.7",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
}, },
"assign-symbols": { "assign-symbols": {
"version": "1.0.0", "version": "1.0.0",
@@ -381,25 +401,20 @@
"lodash": "^4.17.14" "lodash": "^4.17.14"
} }
}, },
"asynckit": { "async-limiter": {
"version": "0.4.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
}, },
"atob": { "atob": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
}, },
"aws-sign2": { "backo2": {
"version": "0.7.0", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
},
"aws4": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
"integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
@@ -456,12 +471,22 @@
} }
} }
}, },
"bcrypt-pbkdf": { "base64-arraybuffer": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
"integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
},
"base64id": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
"integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
},
"better-assert": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
"requires": { "requires": {
"tweetnacl": "^0.14.3" "callsite": "1.0.0"
} }
}, },
"big.js": { "big.js": {
@@ -476,6 +501,11 @@
"integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
"dev": true "dev": true
}, },
"blob": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
"integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
},
"bluebird": { "bluebird": {
"version": "3.5.5", "version": "3.5.5",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
@@ -645,17 +675,17 @@
"unset-value": "^1.0.0" "unset-value": "^1.0.0"
} }
}, },
"callsite": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
"integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
},
"camelcase": { "camelcase": {
"version": "5.3.1", "version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true "dev": true
}, },
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"chalk": { "chalk": {
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -840,14 +870,6 @@
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz",
"integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==" "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg=="
}, },
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": { "commander": {
"version": "2.20.0", "version": "2.20.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
@@ -860,11 +882,21 @@
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
"dev": true "dev": true
}, },
"component-bind": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
"integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
},
"component-emitter": { "component-emitter": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
}, },
"component-inherit": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
"integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
},
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -993,14 +1025,6 @@
"integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
"dev": true "dev": true
}, },
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"date-format": { "date-format": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz",
@@ -1099,11 +1123,6 @@
} }
} }
}, },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"delegates": { "delegates": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -1274,15 +1293,6 @@
"stream-shift": "^1.0.0" "stream-shift": "^1.0.0"
} }
}, },
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"ee-first": { "ee-first": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -1314,6 +1324,66 @@
"once": "^1.4.0" "once": "^1.4.0"
} }
}, },
"engine.io": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz",
"integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==",
"requires": {
"accepts": "~1.3.4",
"base64id": "2.0.0",
"cookie": "0.3.1",
"debug": "~4.1.0",
"engine.io-parser": "~2.2.0",
"ws": "^7.1.2"
},
"dependencies": {
"cookie": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
}
}
},
"engine.io-client": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz",
"integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==",
"requires": {
"component-emitter": "~1.3.0",
"component-inherit": "0.0.3",
"debug": "~4.1.0",
"engine.io-parser": "~2.2.0",
"has-cors": "1.1.0",
"indexof": "0.0.1",
"parseqs": "0.0.5",
"parseuri": "0.0.5",
"ws": "~6.1.0",
"xmlhttprequest-ssl": "~1.5.4",
"yeast": "0.1.2"
},
"dependencies": {
"ws": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
"integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
"requires": {
"async-limiter": "~1.0.0"
}
}
}
},
"engine.io-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
"integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
"requires": {
"after": "0.8.2",
"arraybuffer.slice": "~0.0.7",
"base64-arraybuffer": "0.1.5",
"blob": "0.0.5",
"has-binary2": "~1.0.2"
}
},
"enhanced-resolve": { "enhanced-resolve": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
@@ -1602,20 +1672,17 @@
} }
} }
}, },
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": { "fast-deep-equal": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
"dev": true
}, },
"fast-json-stable-stringify": { "fast-json-stable-stringify": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
"dev": true
}, },
"fast-levenshtein": { "fast-levenshtein": {
"version": "2.0.6", "version": "2.0.6",
@@ -1829,21 +1896,6 @@
"for-in": "^1.0.1" "for-in": "^1.0.1"
} }
}, },
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"forwarded": { "forwarded": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -1892,6 +1944,13 @@
"path": "^0.12.7", "path": "^0.12.7",
"rxjs": "^6.5.2", "rxjs": "^6.5.2",
"rxjs-compat": "^6.5.2" "rxjs-compat": "^6.5.2"
},
"dependencies": {
"@types/node": {
"version": "11.15.20",
"resolved": "https://registry.npmjs.org/@types/node/-/node-11.15.20.tgz",
"integrity": "sha512-DY2QwdrBqNlsxdMehwzUtSsWHgYYPLVCAuXvOcu3wkzYmchbRunQ7OEZFOrmFoBLfA1ysz2Ypr6vtNP9WQkUaQ=="
}
} }
}, },
"frontblock-generic": { "frontblock-generic": {
@@ -2063,14 +2122,6 @@
"resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
"integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==" "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="
}, },
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"git-cherrypicker": { "git-cherrypicker": {
"version": "0.0.3", "version": "0.0.3",
"resolved": "https://registry.npmjs.org/git-cherrypicker/-/git-cherrypicker-0.0.3.tgz", "resolved": "https://registry.npmjs.org/git-cherrypicker/-/git-cherrypicker-0.0.3.tgz",
@@ -2213,20 +2264,6 @@
"integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
"dev": true "dev": true
}, },
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
"requires": {
"ajv": "^6.5.5",
"har-schema": "^2.0.0"
}
},
"has": { "has": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -2235,6 +2272,26 @@
"function-bind": "^1.1.1" "function-bind": "^1.1.1"
} }
}, },
"has-binary2": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
"integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
"requires": {
"isarray": "2.0.1"
},
"dependencies": {
"isarray": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
}
}
},
"has-cors": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
"integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
},
"has-flag": { "has-flag": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -2311,16 +2368,6 @@
"toidentifier": "1.0.0" "toidentifier": "1.0.0"
} }
}, },
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"iconv-lite": { "iconv-lite": {
"version": "0.4.24", "version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -2370,6 +2417,11 @@
"integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
"dev": true "dev": true
}, },
"indexof": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
},
"infer-owner": { "infer-owner": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
@@ -2609,11 +2661,6 @@
"has-symbols": "^1.0.0" "has-symbols": "^1.0.0"
} }
}, },
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"is-unc-path": { "is-unc-path": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
@@ -2662,11 +2709,6 @@
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
}, },
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"js-yaml": { "js-yaml": {
"version": "3.13.1", "version": "3.13.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
@@ -2677,25 +2719,11 @@
"esprima": "^4.0.0" "esprima": "^4.0.0"
} }
}, },
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"json-schema-traverse": { "json-schema-traverse": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
}, "dev": true
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
}, },
"json5": { "json5": {
"version": "1.0.1", "version": "1.0.1",
@@ -2714,17 +2742,6 @@
"graceful-fs": "^4.1.6" "graceful-fs": "^4.1.6"
} }
}, },
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"key-file-storage": { "key-file-storage": {
"version": "2.2.6", "version": "2.2.6",
"resolved": "https://registry.npmjs.org/key-file-storage/-/key-file-storage-2.2.6.tgz", "resolved": "https://registry.npmjs.org/key-file-storage/-/key-file-storage-2.2.6.tgz",
@@ -2829,6 +2846,28 @@
"path": "^0.12.7", "path": "^0.12.7",
"rpclibrary": "^1.1.3", "rpclibrary": "^1.1.3",
"uuid": "^3.3.3" "uuid": "^3.3.3"
},
"dependencies": {
"crypto-js": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz",
"integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg=="
},
"rpclibrary": {
"version": "1.12.3",
"resolved": "https://registry.npmjs.org/rpclibrary/-/rpclibrary-1.12.3.tgz",
"integrity": "sha512-jht9XEonyYD1pHRMFNUF/Opo91RA2Cu7e9sd5aRnLk19j5/UPJ6NPikCIwNHdXmVRS2rvC12kA9ytQatdt77NA==",
"requires": {
"@types/socket.io": "^2.1.8",
"@types/socket.io-client": "^1.4.33",
"bsock": "^0.1.9",
"crypto-js": "^4.0.0",
"http": "0.0.0",
"socket.io": "^2.3.0",
"socket.io-client": "^2.3.0",
"uuid": "^3.3.3"
}
}
} }
}, },
"locate-path": { "locate-path": {
@@ -3365,9 +3404,9 @@
"dev": true "dev": true
}, },
"nan": { "nan": {
"version": "2.14.0", "version": "2.14.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
"integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw=="
}, },
"nanomatch": { "nanomatch": {
"version": "1.2.13", "version": "1.2.13",
@@ -3388,9 +3427,9 @@
} }
}, },
"needle": { "needle": {
"version": "2.4.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz",
"integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==",
"requires": { "requires": {
"debug": "^3.2.6", "debug": "^3.2.6",
"iconv-lite": "^0.4.4", "iconv-lite": "^0.4.4",
@@ -3479,9 +3518,9 @@
"integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==" "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ=="
}, },
"nopt": { "nopt": {
"version": "4.0.1", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
"requires": { "requires": {
"abbrev": "1", "abbrev": "1",
"osenv": "^0.1.4" "osenv": "^0.1.4"
@@ -3532,16 +3571,16 @@
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
}, },
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
}, },
"object-component": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
},
"object-copy": { "object-copy": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
@@ -3899,6 +3938,22 @@
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
}, },
"parseqs": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
"integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
"requires": {
"better-assert": "~1.0.0"
}
},
"parseuri": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
"integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
"requires": {
"better-assert": "~1.0.0"
}
},
"parseurl": { "parseurl": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -3964,11 +4019,6 @@
"pify": "^3.0.0" "pify": "^3.0.0"
} }
}, },
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"pg-connection-string": { "pg-connection-string": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.1.0.tgz", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.1.0.tgz",
@@ -4128,11 +4178,6 @@
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
}, },
"psl": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
"integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ=="
},
"pump": { "pump": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -4169,7 +4214,8 @@
"punycode": { "punycode": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
}, },
"qs": { "qs": {
"version": "6.7.0", "version": "6.7.0",
@@ -4278,40 +4324,6 @@
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
}, },
"request": {
"version": "2.88.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.0",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.4.3",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
}
}
},
"require-directory": { "require-directory": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -4398,21 +4410,16 @@
} }
}, },
"rpclibrary": { "rpclibrary": {
"version": "1.10.2", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/rpclibrary/-/rpclibrary-1.10.2.tgz", "resolved": "https://registry.npmjs.org/rpclibrary/-/rpclibrary-2.0.1.tgz",
"integrity": "sha512-uf4FtylK+tyVo1O8YVihxYxaI4KHnKBzq05SsLYe8ZPXdO8Hqrv7Je5cwv3bfx0FBCO1vVrSc8DT1P6ypGY6uQ==", "integrity": "sha512-phdU0TkrnNVXdFa5PKkbWvn+MxocowvqalEUG1jfpkc1CoQkJ9AXa4OXSEu5r2a2IFhVauYva/qXv1em5yrHSg==",
"requires": { "requires": {
"bsock": "^0.1.9", "@types/socket.io": "^2.1.8",
"crypto-js": "^4.0.0", "@types/socket.io-client": "^1.4.33",
"http": "0.0.0", "http": "0.0.0",
"socket.io": "^2.3.0",
"socket.io-client": "^2.3.0",
"uuid": "^3.3.3" "uuid": "^3.3.3"
},
"dependencies": {
"crypto-js": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz",
"integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg=="
}
} }
}, },
"run-queue": { "run-queue": {
@@ -4723,6 +4730,104 @@
} }
} }
}, },
"socket.io": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz",
"integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==",
"requires": {
"debug": "~4.1.0",
"engine.io": "~3.4.0",
"has-binary2": "~1.0.2",
"socket.io-adapter": "~1.1.0",
"socket.io-client": "2.3.0",
"socket.io-parser": "~3.4.0"
}
},
"socket.io-adapter": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
"integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
},
"socket.io-client": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
"integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
"requires": {
"backo2": "1.0.2",
"base64-arraybuffer": "0.1.5",
"component-bind": "1.0.0",
"component-emitter": "1.2.1",
"debug": "~4.1.0",
"engine.io-client": "~3.4.0",
"has-binary2": "~1.0.2",
"has-cors": "1.1.0",
"indexof": "0.0.1",
"object-component": "0.0.3",
"parseqs": "0.0.5",
"parseuri": "0.0.5",
"socket.io-parser": "~3.3.0",
"to-array": "0.1.4"
},
"dependencies": {
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
},
"isarray": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"socket.io-parser": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
"integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
"requires": {
"component-emitter": "1.2.1",
"debug": "~3.1.0",
"isarray": "2.0.1"
},
"dependencies": {
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
}
}
}
}
},
"socket.io-parser": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz",
"integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==",
"requires": {
"component-emitter": "1.2.1",
"debug": "~4.1.0",
"isarray": "2.0.1"
},
"dependencies": {
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
},
"isarray": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
}
}
},
"source-list-map": { "source-list-map": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
@@ -4782,29 +4887,12 @@
"dev": true "dev": true
}, },
"sqlite3": { "sqlite3": {
"version": "4.1.1", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.1.1.tgz", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz",
"integrity": "sha512-CvT5XY+MWnn0HkbwVKJAyWEMfzpAPwnTiB3TobA5Mri44SrTovmmh499NPQP+gatkeOipqPlBLel7rn4E/PCQg==", "integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==",
"requires": { "requires": {
"nan": "^2.12.1", "nan": "^2.12.1",
"node-pre-gyp": "^0.11.0", "node-pre-gyp": "^0.11.0"
"request": "^2.87.0"
}
},
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
} }
}, },
"ssri": { "ssri": {
@@ -5063,6 +5151,11 @@
"resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz",
"integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw=="
}, },
"to-array": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
"integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
},
"to-object-path": { "to-object-path": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
@@ -5106,22 +5199,6 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
}, },
"tough-cookie": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
"requires": {
"psl": "^1.1.24",
"punycode": "^1.4.1"
},
"dependencies": {
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
}
}
},
"trash": { "trash": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/trash/-/trash-6.0.0.tgz", "resolved": "https://registry.npmjs.org/trash/-/trash-6.0.0.tgz",
@@ -5193,19 +5270,6 @@
"tslib": "^1.9.3" "tslib": "^1.9.3"
} }
}, },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"requires": {
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"type-check": { "type-check": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@@ -5349,6 +5413,7 @@
"version": "4.2.2", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"dev": true,
"requires": { "requires": {
"punycode": "^2.1.0" "punycode": "^2.1.0"
} }
@@ -5416,16 +5481,6 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
}, },
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"walkdir": { "walkdir": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
@@ -5528,6 +5583,11 @@
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
}, },
"ws": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
"integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
},
"xdg-basedir": { "xdg-basedir": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz",
@@ -5575,6 +5635,11 @@
"resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
"integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
}, },
"xmlhttprequest-ssl": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
"integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
},
"xtend": { "xtend": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -5630,6 +5695,11 @@
"lodash": "^4.17.15", "lodash": "^4.17.15",
"yargs": "^13.3.0" "yargs": "^13.3.0"
} }
},
"yeast": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
} }
} }
} }
+3 -2
View File
@@ -26,6 +26,7 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@types/mocha": "^5.2.7", "@types/mocha": "^5.2.7",
"@types/node": "^14.0.27",
"bsert": "0.0.10", "bsert": "0.0.10",
"bsock": "^0.1.9", "bsock": "^0.1.9",
"child-process-promise": "^2.2.1", "child-process-promise": "^2.2.1",
@@ -47,10 +48,10 @@
"path": "^0.12.7", "path": "^0.12.7",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"rimraf": "^3.0.0", "rimraf": "^3.0.0",
"rpclibrary": "^1.10.2", "rpclibrary": "^2.0.1",
"simple-git": "^1.124.0", "simple-git": "^1.124.0",
"spawn-sync": "^2.0.0", "spawn-sync": "^2.0.0",
"sqlite3": "^4.1.1", "sqlite3": "^4.2.0",
"trash": "^6.0.0", "trash": "^6.0.0",
"tsyringe": "^4.0.1", "tsyringe": "^4.0.1",
"upgiter": "^1.0.4", "upgiter": "^1.0.4",
+9 -5
View File
@@ -79,7 +79,7 @@ export class FrontworkAdmin
]) ])
.catch(e => getLogger('Admin#stop').warn(e)) .catch(e => getLogger('Admin#stop').warn(e))
.finally(() => { .finally(() => {
this.rpcServer.destroy() this.rpcServer.close()
process.exit(0) process.exit(0)
}) })
} }
@@ -107,18 +107,22 @@ export class FrontworkAdmin
} }
private startWebsocket() { private startWebsocket() {
this.rpcServer = new RPCServer(20000, [ this.rpcServer = new RPCServer([
...this.frontworkComponents, ...this.frontworkComponents,
{ {
name: "debug", name: "debug",
exportRPCs: () => [{ RPCs: () => [{
name: 'dumpDb', name: 'dumpDb',
call: async (table) => await this.knex(table).select('*') call: async (table) => await this.knex(table).select('*')
}] }]
} }
], { ], {
visibility: '0.0.0.0' errorHandler: (sock, err, rpc, args) => {
}) console.log(rpc, err);
}
}).listen(20000)
getLogger('Admin#startWebsocket').debug("Websocket up on", 20000) getLogger('Admin#startWebsocket').debug("Websocket up on", 20000)
} }
@@ -20,7 +20,7 @@ implements FrontworkComponent<CharacterManagerIfc, RPCInterface>, ICharacterMana
@Inject(IUserManager) @Inject(IUserManager)
private loginManager : IUserManager private loginManager : IUserManager
exportRPCs = () => [ RPCs = () => [
this.getSpecId, this.getSpecId,
this.getCharacterByName, this.getCharacterByName,
this.getCharacters, this.getCharacters,
@@ -30,8 +30,7 @@ implements FrontworkComponent<CharacterManagerIfc, RPCInterface>, ICharacterMana
this.getHeadCount this.getHeadCount
] ]
exportRPCFeatures = () => [ RPCFeatures = () => []
]
getTableDefinitions = (): TableDefiniton[] => [ getTableDefinitions = (): TableDefiniton[] => [
{ {
+3 -3
View File
@@ -28,14 +28,14 @@ implements FrontworkComponent<GuildManagerIfc, GuildManagerFeatureIfc>, IGuildMa
} }
}, "./config") }, "./config")
exportRPCs = () => [ RPCs = () => [
this.getHeadCount, this.getHeadCount,
this.getGuildInfo this.getGuildInfo
] ]
exportRPCFeatures = () => [{ RPCFeatures = () => [{
name: 'manageGuild' as 'manageGuild', name: 'manageGuild' as 'manageGuild',
exportRPCs: () => [ RPCs: () => [
this.setName, this.setName,
this.setRealm, this.setRealm,
this.setDescription this.setDescription
+3 -1
View File
@@ -9,8 +9,10 @@ export class IItemManager{
setPriority: (itemname:string, priority: any) => Promise<void> setPriority: (itemname:string, priority: any) => Promise<void>
calculatePriorities: (itemname: string, character:Character) => Promise<number> calculatePriorities: (itemname: string, character:Character) => Promise<number>
deletePriority: (priority:SRPriority) => Promise<void> deletePriority: (priority:SRPriority) => Promise<void>
getTokens: (character:Character, tiers: Tiers[], valid?:boolean) => Promise<(SRToken & Character & Item)[] | undefined> getTokens: (character:Character, tiers: Tiers[], valid:boolean) => Promise<(SRToken & Character & Item)[] | undefined>
getToken: (character:Character, item:Item, valid?:boolean) => Promise<(SRToken & Character & Item) | undefined> getToken: (character:Character, item:Item, valid?:boolean) => Promise<(SRToken & Character & Item) | undefined>
getAllPriorities: () => Promise<(SRPriority & Spec & Item)[]> getAllPriorities: () => Promise<(SRPriority & Spec & Item)[]>
wipeCurrencyAndItems: () => Promise<void> wipeCurrencyAndItems: () => Promise<void>
decayTokens: (tier: Tiers, amount?:number) => Promise<void>
decayTokensOfCharacter: (tier: Tiers, character:Character, amount?:number) => Promise<void>
} }
+43 -17
View File
@@ -10,7 +10,7 @@ import { IUserManager } from "../User/Interface";
import { ICharacterManager } from "../Character/Interface"; import { ICharacterManager } from "../Character/Interface";
import { IPubSub } from "../PubSub/Interface"; import { IPubSub } from "../PubSub/Interface";
import { IRaidManager } from "../Raid/Interface"; import { IRaidManager } from "../Raid/Interface";
import { getLogger } from "frontblock-generic/Types"; import { getLogger } from "log4js";
const fetch = require('node-fetch') const fetch = require('node-fetch')
const xml2js = require('xml2js'); const xml2js = require('xml2js');
@@ -36,7 +36,7 @@ export class ItemManager
@Inject(IRaidManager) @Inject(IRaidManager)
private raidManager: IRaidManager private raidManager: IRaidManager
exportRPCs = () => [ RPCs = () => [
this.getItems, this.getItems,
this.getItem, this.getItem,
this.buyToken, this.buyToken,
@@ -46,15 +46,15 @@ export class ItemManager
this.getAllPriorities this.getAllPriorities
] ]
exportRPCFeatures = () => [{ RPCFeatures = () => [{
name: 'managePriorities' as 'managePriorities', name: 'managePriorities' as 'managePriorities',
exportRPCs: () => [ RPCs: () => [
this.setPriority, this.setPriority,
this.deletePriority this.deletePriority
], ],
}, { }, {
name: 'reset' as 'reset', name: 'reset' as 'reset',
exportRPCs: () => [ RPCs: () => [
this.wipeCurrencyAndItems this.wipeCurrencyAndItems
] ]
}] }]
@@ -129,7 +129,7 @@ export class ItemManager
return item return item
}catch(e){ }catch(e){
getLogger('ItemManager', 'error').error(name, e); getLogger('ItemManager').error(name, e);
} }
} }
@@ -191,14 +191,14 @@ export class ItemManager
const streaks = await this.getTokens(character, [item.tier], false) const streaks = await this.getTokens(character, [item.tier], false)
const activeTokens = await this.getTokens(character, [item.tier], true) const activeTokens = await this.getTokens(character, [item.tier], true)
await this.userManager.decrementCurrency(record.user, item.tier, 1) await this.userManager.decrementCurrency(record.user, item.tier, currency)
const modifier = await this.calculatePriorities(itemname, character) const modifier = await this.calculatePriorities(itemname, character)
const tx = await this.admin.knex.transaction() const tx = await this.admin.knex.transaction()
if (streaks.length > 0) { if (streaks.length > 0) { //if an old streak already exists
const myStreak = streaks.find(token => token.itemname === itemname) const myStreak = streaks.find(token => token.itemname === itemname)
if (myStreak) { if (myStreak) { //and the streak is for this item
//getLogger('ItemManager').debug('update signupid and increment level') //getLogger('ItemManager').debug('update signupid and increment level')
await this.admin await this.admin
.knex(item.tier + 'tokens') .knex(item.tier + 'tokens')
@@ -209,12 +209,12 @@ export class ItemManager
}) })
.update({ .update({
signupid: signup.id, signupid: signup.id,
level: myStreak.level + 1 level: myStreak.level + currency + 1
}) })
} }
//getLogger('ItemManager').debug('delete streaks') //getLogger('ItemManager').debug('delete other streaks')
await Promise.all(streaks.map(async s => await this.admin await Promise.all(streaks.map(async s => await this.admin
.knex(item.tier + 'tokens') .knex(item.tier + 'tokens')
.transacting(tx) .transacting(tx)
@@ -226,35 +226,36 @@ export class ItemManager
.del() .del()
)) ))
//If there was a streak for this item we're done
if (myStreak) { if (myStreak) {
await tx.commit() await tx.commit()
await this.notifyRaid({ id: signup.raidid }) await this.notifyRaid({ id: signup.raidid })
return await this.getToken(character, item) return await this.getToken(character, item)
} }
} }
//check if there is an active reserve for this item
const matchingReserve = activeTokens.find(token => token.itemname === itemname) const matchingReserve = activeTokens.find(token => token.itemname === itemname)
if (matchingReserve) { if (matchingReserve) {
//getLogger('ItemManager').debug('upgrade reserve') getLogger('ItemManager').debug('upgrade reserve')
await this.admin await this.admin
.knex(item.tier + 'tokens') .knex(item.tier + 'tokens')
.transacting(tx) .transacting(tx)
.increment('level') .increment('level', currency + 1)
.where({ .where({
signupid: signup.id, signupid: signup.id,
characterid: character.id, characterid: character.id,
itemname: item.itemname itemname: item.itemname
}) })
} else { } else {
//getLogger('ItemManager').debug('new reserve') getLogger('ItemManager').debug('new reserve')
await this.admin await this.admin
.knex(item.tier + 'tokens') .knex(item.tier + 'tokens')
.transacting(tx) .transacting(tx)
.insert({ .insert({
characterid: character.id, characterid: character.id,
itemname: item.itemname, itemname: item.itemname,
level: 1 + modifier, level: 1 + modifier + currency,
signupid: signup.id signupid: signup.id
}) })
} }
@@ -346,7 +347,7 @@ export class ItemManager
.first() .first()
} }
getTokens = async (character: Character, tiers: Tiers[], valid = true): Promise<(SRToken & Character & Item)[]> => { getTokens = async (character: Character, tiers: Tiers[], valid:boolean): Promise<(SRToken & Character & Item)[]> => {
const ret = await Promise.all(tiers.map(async tier => { const ret = await Promise.all(tiers.map(async tier => {
return await this.admin return await this.admin
.knex(tier + 'tokens as t') .knex(tier + 'tokens as t')
@@ -367,6 +368,31 @@ export class ItemManager
return ret.flat() return ret.flat()
} }
decayTokens = async (tier: Tiers, amount = 1) => {
await this.admin
.knex(tier + 'tokens')
.decrement('level', Math.max(amount, 1))
await this.admin
.knex(tier + 'tokens as t')
.where('level', '<=', 0)
.del()
}
decayTokensOfCharacter = async (tier: Tiers, character:Character, amount = 1) => {
await this.admin
.knex(tier + 'tokens')
.where({
characterid: character.id
})
.decrement('level', Math.max(amount, 1))
await this.admin
.knex(tier + 'tokens as t')
.where('level', '<=', 0)
.del()
}
countItems = async (): Promise<number> => { countItems = async (): Promise<number> => {
const count = await this.admin const count = await this.admin
.knex('items') .knex('items')
+1 -1
View File
@@ -143,7 +143,7 @@ implements RPCExporter<PluginLoaderIfc, "PluginLoader">{
name = "PluginLoader" as "PluginLoader"; name = "PluginLoader" as "PluginLoader";
exportRPCs(){ RPCs(){
return [{ return [{
name: "installPlugin" as "installPlugin", name: "installPlugin" as "installPlugin",
call: this.installPlugin, call: this.installPlugin,
+1 -1
View File
@@ -13,7 +13,7 @@ implements RPCExporter{
} }
}= {} }= {}
exportRPCs = () => [ RPCs = () => [
this.unsubscribe, this.unsubscribe,
{ {
name: 'subscribe', name: 'subscribe',
+1 -1
View File
@@ -18,7 +18,7 @@ implements RPCExporter<ConfigLoaderIfc<ConfT>, "Config">{
name = "Config" as "Config" name = "Config" as "Config"
exportRPCs = () => [ RPCs = () => [
this.getConfig, this.getConfig,
this.resetConfig, this.resetConfig,
this.setConfig, this.setConfig,
+3 -2
View File
@@ -6,13 +6,14 @@ export class IRaidManager{
addSignup: (signup: Signup) => Promise<Signup> addSignup: (signup: Signup) => Promise<Signup>
removeSignup: (signup: Signup) => Promise<any> removeSignup: (signup: Signup) => Promise<any>
getSignups: (raid:Raid) => Promise<(Signup & Character & Spec & User)[]> getSignups: (raid:Raid) => Promise<(Signup & Character & Spec & User)[]>
sign: (userToken: string, character:Character, raid:Raid, late:boolean, memo?: string) => Promise<any> sign: (userToken: string, character:Character, raid:Raid, late:boolean, absent:boolean, memo?: string) => Promise<any>
unsign: (userToken: string, character:Character, raid:Raid,) => Promise<any> unsign: (userToken: string, character:Character, raid:Raid,) => Promise<any>
archiveRaid: (raid:Raid) => Promise<RaidData> archiveRaid: (raid:Raid) => Promise<RaidData>
getRaidData: (raid:Raid) => Promise<RaidData> getRaidData: (raid:Raid) => Promise<RaidData>
setBenched: (signup: Signup) => Promise<void> updateSignup: (signup: Signup) => Promise<void>
getPastRaids: (limit: number) => Promise<RaidData[]> getPastRaids: (limit: number) => Promise<RaidData[]>
getArchiveRaid: (id:number) => Promise<RaidData> getArchiveRaid: (id:number) => Promise<RaidData>
startRaid: (raid:Raid) => Promise<RaidData> startRaid: (raid:Raid) => Promise<RaidData>
adminUnsign: (character:Character, raid:Raid) => Promise<any> adminUnsign: (character:Character, raid:Raid) => Promise<any>
cancelRaid: (raid: Raid) => Promise<void>
} }
+2 -1
View File
@@ -15,9 +15,10 @@ export type RaidManagerFeatureIfc = {
addSignup: IRaidManager['addSignup'] addSignup: IRaidManager['addSignup']
removeSignup: IRaidManager['removeSignup'] removeSignup: IRaidManager['removeSignup']
archiveRaid: IRaidManager['archiveRaid'] archiveRaid: IRaidManager['archiveRaid']
setBenched: IRaidManager['setBenched'] updateSignup: IRaidManager['updateSignup']
startRaid: IRaidManager['startRaid'] startRaid: IRaidManager['startRaid']
adminUnsign: IRaidManager['adminUnsign'] adminUnsign: IRaidManager['adminUnsign']
cancelRaid: IRaidManager['cancelRaid']
} }
signup: { signup: {
getSignups: IRaidManager['getSignups'] getSignups: IRaidManager['getSignups']
+62 -26
View File
@@ -33,28 +33,29 @@ export class RaidManager
@Inject(IPubSub) @Inject(IPubSub)
private pubsub: IPubSub<any> private pubsub: IPubSub<any>
exportRPCs = () => [ RPCs = () => [
this.getRaids, this.getRaids,
this.getRaidData, this.getRaidData,
this.getPastRaids, this.getPastRaids,
this.getArchiveRaid this.getArchiveRaid
] ]
exportRPCFeatures() { RPCFeatures() {
return [{ return [{
name: 'manageRaid' as 'manageRaid', name: 'manageRaid' as 'manageRaid',
exportRPCs: () => [ RPCs: () => [
this.createRaid, this.createRaid,
this.addSignup, this.addSignup,
this.removeSignup, this.removeSignup,
this.archiveRaid, this.archiveRaid,
this.setBenched, this.updateSignup,
this.startRaid, this.startRaid,
this.adminUnsign this.adminUnsign,
this.cancelRaid
] ]
}, { }, {
name: 'signup' as 'signup', name: 'signup' as 'signup',
exportRPCs: () => [ RPCs: () => [
this.getSignups, this.getSignups,
this.sign, this.sign,
this.unsign this.unsign
@@ -98,20 +99,20 @@ export class RaidManager
] ]
} }
notifyRaid = async (raid:Raid | {id:number}) => { notifyRaid = async (raid: Raid | { id: number }) => {
const data = await this.getRaidData(<Raid>raid) const data = await this.getRaidData(<Raid>raid)
try{ try {
await this.pubsub.publish(String(raid.id), data) await this.pubsub.publish(String(raid.id), data)
await this.notifyRaids() await this.notifyRaids()
}catch(e){ } catch (e) {
getLogger('RaidManager#notifyRaid').debug(e); getLogger('RaidManager#notifyRaid').debug(e);
} }
} }
notifyRaids = async () => { notifyRaids = async () => {
try{ try {
await this.pubsub.publish('raids', undefined) await this.pubsub.publish('raids', undefined)
}catch(e){ } catch (e) {
getLogger('RaidManager#notifyRaids').debug(e); getLogger('RaidManager#notifyRaids').debug(e);
} }
} }
@@ -171,6 +172,9 @@ export class RaidManager
} }
startRaid = async (raid: Raid): Promise<RaidData> => { startRaid = async (raid: Raid): Promise<RaidData> => {
const data = await this.getRaidData(raid)
data.participants.absent.map(p => this.itemManager.decayTokensOfCharacter(raid.tier, p, 1))
await this.itemManager.decayTokens(data.tier)
const archived = await this.archiveRaid(raid) const archived = await this.archiveRaid(raid)
const giveCurrency = async (b: Character) => { const giveCurrency = async (b: Character) => {
@@ -180,17 +184,15 @@ export class RaidManager
await Promise.all([ await Promise.all([
...archived.participants.bench.map(giveCurrency), ...archived.participants.bench.map(giveCurrency),
...Object.values(archived.participants).flat().map((b:Signup & Character & Spec) => giveCurrency(b)) ...Object.values(archived.participants).flat().map((b: Signup & Character & Spec) => giveCurrency(b))
]) ])
await this.notifyRaids() await this.notifyRaids()
return archived return archived
} }
archiveRaid = async (raid: Raid): Promise<RaidData> => { archiveRaid = async (raid: Raid): Promise<RaidData> => {
const raidData = await this.getRaidData(raid) const raidData = await this.getRaidData(raid)
const tx = await this.admin.knex.transaction() const tx = await this.admin.knex.transaction()
await this.admin.knex('archive') await this.admin.knex('archive')
@@ -225,15 +227,30 @@ export class RaidManager
id: raidData.id, id: raidData.id,
}) })
.first() .first()
try {
return JSON.parse(row.raiddata) return JSON.parse(row.raiddata)
} catch (e) {
getLogger('RaidManager#archiveRaid').error(row.id + " could not get parsed")
return {} as RaidData
}
} }
getArchiveRaid = async (id: number): Promise<RaidData> => { getArchiveRaid = async (id: number): Promise<RaidData> => {
const data = await this.admin.knex('archive').select('raiddata').where({ const data = await this.admin
.knex('archive')
.select('raiddata')
.where({
id: id id: id
}).first() })
.first()
try {
return JSON.parse(data.raiddata) return JSON.parse(data.raiddata)
} catch (e) {
getLogger('RaidManager#getArchiveRaid').error(id + " could not get parsed")
return {} as RaidData
}
} }
getPastRaids = async (limit: number): Promise<RaidData[]> => { getPastRaids = async (limit: number): Promise<RaidData[]> => {
@@ -259,6 +276,7 @@ export class RaidManager
Warrior: <(Signup & Character & Spec)[]>[], Warrior: <(Signup & Character & Spec)[]>[],
late: <(Signup & Character & Spec)[]>[], late: <(Signup & Character & Spec)[]>[],
bench: <(Signup & Character & Spec)[]>[], bench: <(Signup & Character & Spec)[]>[],
absent: <(Signup & Character & Spec)[]>[]
}, },
tokens: {}, tokens: {},
healers: <(Signup & Character & Spec)[]>[], healers: <(Signup & Character & Spec)[]>[],
@@ -271,7 +289,8 @@ export class RaidManager
.where({ .where({
raidid: this.admin.knex.ref('raids.id'), raidid: this.admin.knex.ref('raids.id'),
benched: false, benched: false,
late: false late: false,
absent: false
}) })
.as('signupcount') .as('signupcount')
@@ -283,7 +302,7 @@ export class RaidManager
const characterData: (Signup & Character & Spec)[] = await this.admin const characterData: (Signup & Character & Spec)[] = await this.admin
.knex('signups as s') .knex('signups as s')
.select('s.id as id', 'charactername', 'rank', 'class', 'specid', 'specname', 'race', 'userid', 'benched', 'late', 'raidid', 'characterid', 'specid', 'memo', 'timestamp') .select('s.id as id', 'charactername', 'rank', 'class', 'specid', 'specname', 'race', 'userid', 'benched', 'late', 'raidid', 'characterid', 'specid', 'memo', 'timestamp', 'absent')
.join('raids as r', 's.raidid', '=', 'r.id') .join('raids as r', 's.raidid', '=', 'r.id')
.join('characters as c', 's.characterid', '=', 'c.id') .join('characters as c', 's.characterid', '=', 'c.id')
.join('users as u', 'c.userid', '=', 'u.id') .join('users as u', 'c.userid', '=', 'u.id')
@@ -291,6 +310,10 @@ export class RaidManager
.where('r.id', '=', raid.id) .where('r.id', '=', raid.id)
characterData.forEach(data => { characterData.forEach(data => {
if(data.absent){
raiddata.participants.absent.push(data)
return
}
if (data.benched) { if (data.benched) {
raiddata.participants.bench.push(data) raiddata.participants.bench.push(data)
return return
@@ -307,7 +330,7 @@ export class RaidManager
.select('*', 's.id as id') .select('*', 's.id as id')
.join('raids as r', 's.raidid', '=', 'r.id') .join('raids as r', 's.raidid', '=', 'r.id')
.join('characters as c', 's.characterid', '=', 'c.id') .join('characters as c', 's.characterid', '=', 'c.id')
.join('users as u', 'u.id', '=' ,'c.userid') .join('users as u', 'u.id', '=', 'c.userid')
.join(raidInDb.tier + 'tokens as t', 't.characterid', '=', 'c.id') .join(raidInDb.tier + 'tokens as t', 't.characterid', '=', 'c.id')
.join('items as i', 'i.itemname', '=', 't.itemname') .join('items as i', 'i.itemname', '=', 't.itemname')
.where({ .where({
@@ -327,6 +350,7 @@ export class RaidManager
raiddata.tanks = Object.values(raiddata.participants).flatMap( raiddata.tanks = Object.values(raiddata.participants).flatMap(
(tanks: any[]) => tanks.filter((p: any) => (tanks: any[]) => tanks.filter((p: any) =>
!p.benched !p.benched
&& !p.absent
&& !p.late && !p.late
&& (p.specname === "Protection" && (p.specname === "Protection"
|| p.specname === "Feral (Tank)")) || p.specname === "Feral (Tank)"))
@@ -334,6 +358,7 @@ export class RaidManager
raiddata.healers = Object.values(raiddata.participants).flatMap( raiddata.healers = Object.values(raiddata.participants).flatMap(
(healers: any[]) => healers.filter((p: any) => (healers: any[]) => healers.filter((p: any) =>
!p.benched !p.benched
&& !p.absent
&& !p.late && !p.late
&& (p.specname === "Holy" && (p.specname === "Holy"
|| p.specname === "Discipline" || p.specname === "Discipline"
@@ -354,13 +379,13 @@ export class RaidManager
.select('*', 'si.id as id') .select('*', 'si.id as id')
.where('raidid', '=', raid.id!) .where('raidid', '=', raid.id!)
sign = async (usertoken: string, character: Character, raid: Raid, late: boolean, memo?: string) => { sign = async (usertoken: string, character: Character, raid: Raid, late: boolean, absent:boolean, memo?: string) => {
const maybeUserRecord = this.userManager.getUserRecordByToken(usertoken) const maybeUserRecord = this.userManager.getUserRecordByToken(usertoken)
if (!maybeUserRecord || maybeUserRecord.user.id != character.userid) { if (!maybeUserRecord || maybeUserRecord.user.id != character.userid) {
throw new Error("Bad Usertoken") throw new Error("Bad Usertoken")
} }
if(memo) memo = memo.substring(0, MAX_MEMO_LENGTH) if (memo) memo = memo.substring(0, MAX_MEMO_LENGTH)
const exists = await this.admin const exists = await this.admin
.knex('signups') .knex('signups')
.select('*') .select('*')
@@ -377,6 +402,7 @@ export class RaidManager
raidid: raid.id!, raidid: raid.id!,
characterid: character.id!, characterid: character.id!,
late: late, late: late,
absent: absent,
benched: false, benched: false,
memo: memo memo: memo
}) })
@@ -390,6 +416,7 @@ export class RaidManager
raidid: raid.id!, raidid: raid.id!,
characterid: character.id!, characterid: character.id!,
late: late, late: late,
absent: absent,
benched: false, benched: false,
memo: memo memo: memo
}) })
@@ -407,6 +434,16 @@ export class RaidManager
.first() .first()
} }
cancelRaid = async (raid: Raid) => {
const data = await this.getRaidData(raid)
const participants = Object.values(data.participants).flat()
await Promise.all(
participants.map(async p => await this.adminUnsign({...p, id: p.characterid}, raid))
)
await this.admin.knex('raids').where({id: raid.id}).del()
await this.notifyRaids()
}
unsign = async (usertoken: string, character: Character, raid: Raid) => { unsign = async (usertoken: string, character: Character, raid: Raid) => {
const maybeUserRecord = this.userManager.getUserRecordByToken(usertoken) const maybeUserRecord = this.userManager.getUserRecordByToken(usertoken)
if (!maybeUserRecord || maybeUserRecord.user.id != character.userid) { if (!maybeUserRecord || maybeUserRecord.user.id != character.userid) {
@@ -417,17 +454,16 @@ export class RaidManager
} }
adminUnsign = async (character: Character, raid: Raid) => { adminUnsign = async (character: Character, raid: Raid) => {
const user = await this.characterManager.getUserOfCharacter(character) const user = await this.characterManager.getUserOfCharacter(character)
const tokens = await this.itemManager.getTokens(character, [raid.tier], true) const tokens = await this.itemManager.getTokens(character, [raid.tier], true)
//check if token has to be deleted //check if token has to be deleted
if (tokens) { if (tokens) {
Promise.all( await Promise.all(
tokens.map(async token => { tokens.map(async token => {
await this.userManager.incrementCurrency(user, raid.tier, 1) await this.userManager.incrementCurrency(user, raid.tier, 1)
const prio = await this.itemManager.calculatePriorities(token.itemname, character) const prio = await this.itemManager.calculatePriorities(token.itemname, character)
if (token.level <= prio + 1) { if (token.level <= prio + 2) {
await this.admin await this.admin
.knex(raid.tier + 'tokens') .knex(raid.tier + 'tokens')
.where({ .where({
@@ -442,7 +478,7 @@ export class RaidManager
itemname: token.itemname itemname: token.itemname
}).update({ }).update({
signupid: null, signupid: null,
level: token.level - 1 level: token.level - 2
}) })
} }
}) })
@@ -459,7 +495,7 @@ export class RaidManager
await this.notifyRaid(raid) await this.notifyRaid(raid)
} }
setBenched = async (signup: Signup): Promise<void> => { updateSignup = async (signup: Signup): Promise<void> => {
await this.admin.knex('signups') await this.admin.knex('signups')
.where({ .where({
raidid: signup.raidid, raidid: signup.raidid,
+24 -25
View File
@@ -53,7 +53,7 @@ export class UserManager
userLogins: { [username in string]: UserRecord } = {} userLogins: { [username in string]: UserRecord } = {}
allowed: string[] = [] allowed: string[] = []
exportRPCs = () => [ RPCs = () => [
this.login, this.login,
this.logout, this.logout,
this.getAuth, this.getAuth,
@@ -63,23 +63,23 @@ export class UserManager
this.changePassword this.changePassword
] ]
exportRPCFeatures = () => [ RPCFeatures = () => [
{ {
name: 'manageUser' as 'manageUser', name: 'manageUser' as 'manageUser',
exportRPCs: () => [ RPCs: () => [
this.adminLogout, this.adminLogout,
this.changeRank, this.changeRank,
this.adminChangePassword this.adminChangePassword
] ]
}, { }, {
name: 'modifyPermissions' as 'modifyPermissions', name: 'modifyPermissions' as 'modifyPermissions',
exportRPCs: () => [ RPCs: () => [
this.getPermissions, this.getPermissions,
this.setPermission, this.setPermission,
] ]
}, { }, {
name: 'softreserveCurrency' as 'softreserveCurrency', name: 'softreserveCurrency' as 'softreserveCurrency',
exportRPCs: () => [ RPCs: () => [
this.incrementCurrency, this.incrementCurrency,
this.decrementCurrency, this.decrementCurrency,
this.setCurrency this.setCurrency
@@ -137,7 +137,7 @@ export class UserManager
getLogger('UserManager#initialize').debug('setting up permissions') getLogger('UserManager#initialize').debug('setting up permissions')
await Promise.all( await Promise.all(
[this, ...this.exporters].flatMap(exp => exp.exportRPCFeatures().map(async (feature) => { [this, ...this.exporters].flatMap(exp => exp.RPCFeatures().map(async (feature) => {
try { try {
await this.admin.knex.insert({ rpcname: feature.name }).into('rpcpermissions') await this.admin.knex.insert({ rpcname: feature.name }).into('rpcpermissions')
} catch (e) { } catch (e) {
@@ -149,16 +149,16 @@ export class UserManager
server: rankServer, server: rankServer,
port: 20001 port: 20001
} }
setInterval(this.checkExpiredSessions, 600_000) //setInterval(this.checkExpiredSessions, 600_000)
} }
stop = async () => { stop = async () => {
Object.values(this.userLogins).forEach(x => { Object.values(this.userLogins).forEach(x => {
Object.values(x.connections).forEach(c => c.destroy()) Object.values(x.connections).forEach(c => c.close())
}) })
try { try {
return this.rankServer.server.destroy() return this.rankServer.server.close()
} catch (e) { } catch (e) {
getLogger('UserManager#stop').debug(String(e)) getLogger('UserManager#stop').debug(String(e))
} }
@@ -200,7 +200,7 @@ export class UserManager
return false return false
} }
this.userLogins[data.user.username].connections[socket.port] = socket this.userLogins[data.user.username].connections[socket.id] = socket
//getLogger('UserManager#checkConnection').debug(this.userLogins, this.allowed); //getLogger('UserManager#checkConnection').debug(this.userLogins, this.allowed);
return true return true
@@ -376,28 +376,28 @@ export class UserManager
startRankServer = async (port: number): Promise<RPCServer<FrontcraftFeatureIfc>> => { startRankServer = async (port: number): Promise<RPCServer<FrontcraftFeatureIfc>> => {
let rpcs = [ let rpcs = [
...this.exportRPCFeatures(), ...this.RPCFeatures(),
...this.exporters.flatMap((exp) => exp.exportRPCFeatures()) ...this.exporters.flatMap((exp) => exp.RPCFeatures())
] ]
let rpcServer = new RPCServer<FrontcraftFeatureIfc>(port, rpcs, { let rpcServer = new RPCServer<FrontcraftFeatureIfc>(rpcs, {
accessFilter: async (sesame, exporter) => { accessFilter: async (sesame, exporter) => {
const record = this.getUserRecordByToken(sesame!) const record = this.getUserRecordByToken(sesame!)
if (!record) return false if (!record) return false
return await this.getPermission(exporter.name, record.user.rank) return await this.getPermission(exporter.name, record.user.rank)
}, },
closeHandler: (socket) => { closeHandler: (socket) => {
Object.values(this.userLogins).forEach(login => delete login.connections[socket.port]) Object.values(this.userLogins).forEach(login => delete login.connections[socket.id])
getLogger('UserManager#closeHandler').debug(this.userLogins, this.allowed) //getLogger('UserManager#closeHandler').debug(this.userLogins, this.allowed)
}, },
connectionHandler: (socket) => { connectionHandler: (socket) => {
this.checkConnection(socket, 10).then(res => { this.checkConnection(socket, 10).then(res => {
if (!res) { if (!res) {
getLogger('UserManager#connectionHandler').debug("Connection on "+socket.port+" failed to authenticate") getLogger('UserManager#connectionHandler').debug("Connection "+socket.id+" failed to authenticate")
socket.destroy(); socket.close();
} }
}).catch((e) => { }).catch((e) => {
getLogger('UserManager#connectionHandler').debug(String(e)) getLogger('UserManager#connectionHandler').debug(String(e))
socket.destroy(); socket.close();
}) })
}, },
errorHandler: (socket, e, rpcName, args) => { errorHandler: (socket, e, rpcName, args) => {
@@ -405,8 +405,7 @@ export class UserManager
throw(new Error("RPC failed")) throw(new Error("RPC failed"))
}, },
sesame: (sesame) => this.checkToken(sesame), sesame: (sesame) => this.checkToken(sesame),
visibility: '0.0.0.0' }).listen(port)
})
return rpcServer return rpcServer
} }
@@ -451,8 +450,8 @@ export class UserManager
return usr[tier]! return usr[tier]!
} }
decrementCurrency = async (user: User, tier?: Tiers, value = 1) => { decrementCurrency = async (user: User, tier: Tiers, value = 1) => {
if (!tier || value < 1) return if (value < 1) return
const usr: User = await this.admin const usr: User = await this.admin
.knex('users') .knex('users')
@@ -460,7 +459,7 @@ export class UserManager
.select('*') .select('*')
.first() .first()
if (!usr || usr[tier]! <= 0) return if (!usr || usr[tier]!-value < 0) return
await this.admin await this.admin
.knex('users') .knex('users')
@@ -476,8 +475,8 @@ export class UserManager
.increment(tier, value) .increment(tier, value)
} }
setCurrency = async (user: User, tier?: Tiers, value = 0) => { setCurrency = async (user: User, tier: Tiers, value = 0) => {
if (!tier || value < 0) return if (value < 0) return
await this.admin await this.admin
.knex('users') .knex('users')
.where('id', '=', user.id) .where('id', '=', user.id)
+2 -2
View File
@@ -14,8 +14,8 @@ export interface FrontworkComponent<
{ {
name: Name; name: Name;
exportRPCFeatures(): RPCExporter<FeatureIfc, FeatureName>[] RPCFeatures(): RPCExporter<FeatureIfc, FeatureName>[]
exportRPCs(): RPCDefinitions<Ifc>[Name] RPCs(): RPCDefinitions<Ifc>[Name]
getTableDefinitions(): TableDefiniton[] getTableDefinitions(): TableDefiniton[]
initialize?(): Promise<any> initialize?(): Promise<any>
+415 -279
View File
@@ -1,284 +1,420 @@
export type Tiers = "MC" | 'BWL' | 'ZG' | 'AQ20' | 'AQ40' | 'Naxx' export type Tiers = "MC" | 'BWL' | 'ZG' | 'AQ20' | 'AQ40' | 'Naxx'
export const _Tiers:Tiers[] = ["MC", 'BWL', 'ZG', 'AQ20', 'AQ40', 'Naxx'] export const _Tiers: Tiers[] = ["MC", 'BWL', 'ZG', 'AQ20', 'AQ40', 'Naxx']
export const T1 = [ export const T1 = [
"Robe of Volatile Power", "Robe of Volatile Power",
"Salamander Scale Pants", "Salamander Scale Pants",
"Heavy Dark Iron Ring", "Heavy Dark Iron Ring",
"Ring of Spell Power", "Ring of Spell Power",
"Sorcerous Dagger", "Sorcerous Dagger",
"Wristguards of Stability", "Wristguards of Stability",
"Helm of the Lifegiver", "Helm of the Lifegiver",
"Fire Runed Grimoire", "Fire Runed Grimoire",
"Crimson Shocker", "Crimson Shocker",
"Mana Igniting Cord", "Mana Igniting Cord",
"Quick Strike Ring", "Quick Strike Ring",
"Seal of the Archmagus", "Seal of the Archmagus",
"Talisman of Ephemeral Power", "Talisman of Ephemeral Power",
"Flameguard Gauntlets", "Flameguard Gauntlets",
"Magma Tempered Boots", "Magma Tempered Boots",
"Obsidian Edged Blade", "Obsidian Edged Blade",
"Aged Core Leather Gloves", "Aged Core Leather Gloves",
"Sabatons of the Flamewalker", "Sabatons of the Flamewalker",
"Striker's Mark", "Striker's Mark",
"Medallion of Steadfast Might", "Medallion of Steadfast Might",
"Earthshaker", "Earthshaker",
"Brutality Blade", "Brutality Blade",
"Aurastone Hammer", "Aurastone Hammer",
"Gutgore Ripper", "Gutgore Ripper",
"Drillborer Disk", "Drillborer Disk",
"Azuresong Mageblade", "Azuresong Mageblade",
"Staff of Dominance", "Staff of Dominance",
"Blastershot Launcher", "Blastershot Launcher",
"The Eye of Divinity", "The Eye of Divinity",
"Ancient Petrified Leaf", "Ancient Petrified Leaf",
"Finkle's Lava Dredger", "Finkle's Lava Dredger",
"Core Hound Tooth", "Core Hound Tooth",
"Core Forged Greaves", "Core Forged Greaves",
"Gloves of the Hypnotic Flame", "Gloves of the Hypnotic Flame",
"Sash of Whispered Secrets", "Sash of Whispered Secrets",
"Wild Growth Spaulders", "Wild Growth Spaulders",
"Fireproof Cloak", "Fireproof Cloak",
"Wristguards of True Flight", "Wristguards of True Flight",
"Fireguard Shoulders", "Fireguard Shoulders",
"Cauterizing Band", "Cauterizing Band",
"Onslaught Girdle", "Onslaught Girdle",
"Perdition's Blade", "Perdition's Blade",
"Cloak of the Shrouded Mists", "Cloak of the Shrouded Mists",
"Band of Accuria", "Band of Accuria",
"Crown of Destruction", "Crown of Destruction",
"Choker of the Fire Lord", "Choker of the Fire Lord",
"Band of Sulfuras", "Band of Sulfuras",
"Dragon's Blood Cape", "Dragon's Blood Cape",
"Malistar's Defender", "Malistar's Defender",
"Spinal Reaper", "Spinal Reaper",
"Bonereaver's Edge", "Bonereaver's Edge",
"Shard of the Flame", "Shard of the Flame",
"Essence of the Pure Flame", "Essence of the Pure Flame",
"Eye of Sulfuras", "Eye of Sulfuras",
"Deathbringer", "Deathbringer",
"Vis'kag the Bloodletter", "Vis'kag the Bloodletter",
"Sapphiron Drape", "Sapphiron Drape",
"Ancient Cornerstone Grimoire", "Ancient Cornerstone Grimoire",
"Eskhandar's Collar", "Eskhandar's Collar",
"Ring of Binding", "Ring of Binding",
"Shard of the Scale", "Shard of the Scale",
"Head of Onyxia", "Head of Onyxia",
"Bindings of the Windseeker", "Bindings of the Windseeker",
"Cenarion Belt", "Cenarion Belt",
"Cenarion Boots", "Cenarion Boots",
"Cenarion Bracers", "Cenarion Bracers",
"Cenarion Vestments", "Cenarion Vestments",
"Cenarion Helm", "Cenarion Helm",
"Cenarion Leggings", "Cenarion Leggings",
"Cenarion Spaulders", "Cenarion Spaulders",
"Giantstalker's Belt", "Giantstalker's Belt",
"Giantstalker's Boots", "Giantstalker's Boots",
"Giantstalker's Bracers", "Giantstalker's Bracers",
"Giantstalker's Breastplate", "Giantstalker's Breastplate",
"Giantstalker's Epaulets", "Giantstalker's Epaulets",
"Giantstalker's Gloves", "Giantstalker's Gloves",
"Giantstalker's Helmet", "Giantstalker's Helmet",
"Giantstalker's Leggings", "Giantstalker's Leggings",
"Arcanist Belt", "Arcanist Belt",
"Arcanist Bindings", "Arcanist Bindings",
"Arcanist Crown", "Arcanist Crown",
"Arcanist Boots", "Arcanist Boots",
"Arcanist Gloves", "Arcanist Gloves",
"Arcanist Leggings", "Arcanist Leggings",
"Arcanist Mantle", "Arcanist Mantle",
"Arcanist Robes", "Arcanist Robes",
"Lawbringer Belt", "Lawbringer Belt",
"Lawbringer Boots", "Lawbringer Boots",
"Lawbringer Bracers", "Lawbringer Bracers",
"Lawbringer Chestguard", "Lawbringer Chestguard",
"Lawbringer Gauntlets", "Lawbringer Gauntlets",
"Lawbringer Helm", "Lawbringer Helm",
"Lawbringer Legplates", "Lawbringer Legplates",
"Lawbringer Spaulders", "Lawbringer Spaulders",
"Boots of Prophecy", "Boots of Prophecy",
"Circlet of Prophecy", "Circlet of Prophecy",
"Girdle of Prophecy", "Girdle of Prophecy",
"Gloves of Prophecy", "Gloves of Prophecy",
"Pants of Prophecy", "Pants of Prophecy",
"Mantle of Prophecy", "Mantle of Prophecy",
"Robes of Prophecy", "Robes of Prophecy",
"Vambraces of Prophecy", "Vambraces of Prophecy",
"Nightslayer Belt", "Nightslayer Belt",
"Nightslayer Bracelets", "Nightslayer Bracelets",
"Nightslayer Chestpiece", "Nightslayer Chestpiece",
"Nightslayer Cover", "Nightslayer Cover",
"Nightslayer Gloves", "Nightslayer Gloves",
"Nightslayer Pants", "Nightslayer Pants",
"Nightslayer Shoulder Pads", "Nightslayer Shoulder Pads",
"Felheart Belt", "Felheart Belt",
"Felheart Bracers", "Felheart Bracers",
"Felheart Gloves", "Felheart Gloves",
"Felheart Pants", "Felheart Pants",
"Felheart Robes", "Felheart Robes",
"Felheart Shoulder Pads", "Felheart Shoulder Pads",
"Felheart Horns", "Felheart Horns",
"Belt of Might", "Belt of Might",
"Bracers of Might", "Bracers of Might",
"Breastplate of Might", "Breastplate of Might",
"Gauntlets of Might", "Gauntlets of Might",
"Helm of Might", "Helm of Might",
"Legplates of Might", "Legplates of Might",
"Pauldrons of Might", "Pauldrons of Might",
"Sabatons of Might", "Sabatons of Might",
"Earthfury Belt", "Earthfury Belt",
"Earthfury Boots", "Earthfury Boots",
"Earthfury Bracers", "Earthfury Bracers",
"Earthfury Vestments", "Earthfury Vestments",
"Earthfury Epaulets", "Earthfury Epaulets",
"Earthfury Gauntlets", "Earthfury Gauntlets",
"Earthfury Helmet", "Earthfury Helmet",
"Earthfury Legguards", "Earthfury Legguards",
"Stormrage Cover", "Stormrage Cover",
"Stormrage Legguards", "Stormrage Legguards",
"Dragonstalker's Helm", "Dragonstalker's Helm",
"Dragonstalker's Legguards", "Dragonstalker's Legguards",
"Netherwind Crown", "Netherwind Crown",
"Netherwind Pants", "Netherwind Pants",
"Judgement Crown", "Judgement Crown",
"Judgement Legplates", "Judgement Legplates",
"Halo of Transcendence", "Halo of Transcendence",
"Leggings of Transcendence", "Leggings of Transcendence",
"Bloodfang Hood", "Bloodfang Hood",
"Bloodfang Pants", "Bloodfang Pants",
"Helmet of Ten Storms", "Helmet of Ten Storms",
"Nemesis Skullcap", "Nemesis Skullcap",
"Nemesis Leggings", "Nemesis Leggings",
"Helm of Wrath", "Helm of Wrath",
"Legplates of Wrath", "Legplates of Wrath",
] ]
export const T2:string[] = [ export const T2: string[] = [
"Gloves of Rapid Evolution", "Gloves of Rapid Evolution",
"Mantle of the Blackwing Cabal", "Mantle of the Blackwing Cabal",
"Spineshatter", "Spineshatter",
"The Untamed Blade", "The Untamed Blade",
"Pendant of the Fallen Dragon", "Pendant of the Fallen Dragon",
"Helm of Endless Rage", "Helm of Endless Rage",
"Dragonfang Blade", "Dragonfang Blade",
"Red Dragonscale Protector", "Red Dragonscale Protector",
"Black Brood Pauldrons", "Black Brood Pauldrons",
"Bracers of Arcane Accuracy", "Bracers of Arcane Accuracy",
"Heartstriker", "Heartstriker",
"Maladath, Runed Blade of the Black Flight", "Maladath, Runed Blade of the Black Flight",
"Black Ash Robe", "Black Ash Robe",
"Firemaw's Clutch", "Firemaw's Clutch",
"Claw of the Black Drake", "Claw of the Black Drake",
"Cloak of Firemaw", "Cloak of Firemaw",
"Legguards of the Fallen Crusader", "Legguards of the Fallen Crusader",
"Taut Dragonhide Belt", "Taut Dragonhide Belt",
"Drake Talon Pauldrons", "Drake Talon Pauldrons",
"Rejuvenating Gem", "Rejuvenating Gem",
"Drake Talon Cleaver", "Drake Talon Cleaver",
"Band of Forced Concentration", "Band of Forced Concentration",
"Drake Fang Talisman", "Drake Fang Talisman",
"Ebony Flame Gloves", "Ebony Flame Gloves",
"Malfurion's Blessed Bulwark", "Malfurion's Blessed Bulwark",
"Dragonbreath Hand Cannon", "Dragonbreath Hand Cannon",
"Shadow Wing Focus Staff", "Shadow Wing Focus Staff",
"Shroud of Pure Thought", "Shroud of Pure Thought",
"Circle of Applied Force", "Circle of Applied Force",
"Emberweave Leggings", "Emberweave Leggings",
"Styleen's Impeding Scarab", "Styleen's Impeding Scarab",
"Dragon's Touch", "Dragon's Touch",
"Herald of Woe", "Herald of Woe",
"Taut Dragonhide Shoulderpads", "Taut Dragonhide Shoulderpads",
"Chromatic Boots", "Chromatic Boots",
"Taut Dragonhide Gloves", "Taut Dragonhide Gloves",
"Shimmering Geta", "Shimmering Geta",
"Ring of Blackrock", "Ring of Blackrock",
"Elementium Threaded Cloak", "Elementium Threaded Cloak",
"Angelista's Grasp", "Angelista's Grasp",
"Girdle of the Fallen Crusader", "Girdle of the Fallen Crusader",
"Empowered Leggings", "Empowered Leggings",
"Chromatically Tempered Sword", "Chromatically Tempered Sword",
"Claw of Chromaggus", "Claw of Chromaggus",
"Primalist's Linked Waistguard", "Primalist's Linked Waistguard",
"Ashjre'thul, Crossbow of Smiting", "Ashjre'thul, Crossbow of Smiting",
"Elementium Reinforced Bulwark", "Elementium Reinforced Bulwark",
"Head of Nefarian", "Head of Nefarian",
"Cloak of the Brood Lord", "Cloak of the Brood Lord",
"Boots of the Shadow Flame", "Boots of the Shadow Flame",
"Therazane's Link", "Therazane's Link",
"Archimtiros' Ring of Reckoning", "Archimtiros' Ring of Reckoning",
"Neltharion's Tear", "Neltharion's Tear",
"Pure Elementium Band", "Pure Elementium Band",
"Mish'undare, Circlet of the Mind Flayer", "Mish'undare, Circlet of the Mind Flayer",
"Prestor's Talisman of Connivery", "Prestor's Talisman of Connivery",
"Staff of the Shadow Flame", "Staff of the Shadow Flame",
"Ashkandi, Greatsword of the Brotherhood", "Ashkandi, Greatsword of the Brotherhood",
"Crul'shorukh, Edge of Chaos", "Crul'shorukh, Edge of Chaos",
"Lok'amir il Romathis", "Lok'amir il Romathis",
"Boots of Pure Thought", "Boots of Pure Thought",
"Cloak of Draconic Might", "Cloak of Draconic Might",
"Draconic Maul", "Draconic Maul",
"Doom's Edge", "Doom's Edge",
"Essence Gatherer", "Essence Gatherer",
"Band of Dark Dominion", "Band of Dark Dominion",
"Draconic Avenger", "Draconic Avenger",
"Interlaced Shadow Jerkin", "Interlaced Shadow Jerkin",
"Ringo's Blizzard Boots", "Ringo's Blizzard Boots",
"Scrolls of Blinding Light", "Scrolls of Blinding Light",
"Rune of Metamorphosis", "Rune of Metamorphosis",
"Natural Alignment Crystal", "Natural Alignment Crystal",
"Mind Quickening Gem", "Mind Quickening Gem",
"Lifegiving Gem", "Lifegiving Gem",
"Arcane Infused Gem", "Arcane Infused Gem",
"The Black Book", "The Black Book",
"Venomous Totem", "Venomous Totem",
"Nemesis Spaulders", "Nemesis Spaulders",
"Nemesis Robes", "Nemesis Robes",
"Nemesis Bracers", "Nemesis Bracers",
"Nemesis Gloves", "Nemesis Gloves",
"Nemesis Belt", "Nemesis Belt",
"Nemesis Boots", "Nemesis Boots",
"Netherwind Mantle", "Netherwind Mantle",
"Netherwind Robes", "Netherwind Robes",
"Netherwind Bindings", "Netherwind Bindings",
"Netherwind Gloves", "Netherwind Gloves",
"Netherwind Belt", "Netherwind Belt",
"Netherwind Boots", "Netherwind Boots",
"Bloodfang Spaulders", "Bloodfang Spaulders",
"Bloodfang Chestpiece", "Bloodfang Chestpiece",
"Bloodfang Bracers", "Bloodfang Bracers",
"Bloodfang Gloves", "Bloodfang Gloves",
"Bloodfang Belt", "Bloodfang Belt",
"Bloodfang Boots", "Bloodfang Boots",
"Stormrage Pauldrons", "Stormrage Pauldrons",
"Stormrage Chestguard", "Stormrage Chestguard",
"Stormrage Bracers", "Stormrage Bracers",
"Stormrage Handguards", "Stormrage Handguards",
"Stormrage Belt", "Stormrage Belt",
"Stormrage Boots", "Stormrage Boots",
"Dragonstalker's Spaulders", "Dragonstalker's Spaulders",
"Dragonstalker's Breastplate", "Dragonstalker's Breastplate",
"Dragonstalker's Bracers", "Dragonstalker's Bracers",
"Dragonstalker's Gauntlets", "Dragonstalker's Gauntlets",
"Dragonstalker's Belt", "Dragonstalker's Belt",
"Dragonstalker's Greaves", "Dragonstalker's Greaves",
"Judgement Spaulders", "Judgement Spaulders",
"Judgement Breastplate", "Judgement Breastplate",
"Judgement Bindings", "Judgement Bindings",
"Judgement Gauntlets", "Judgement Gauntlets",
"Judgement Belt", "Judgement Belt",
"Judgement Sabatons", "Judgement Sabatons",
"Pauldrons of Transcendence", "Pauldrons of Transcendence",
"Robes of Transcendence", "Robes of Transcendence",
"Bindings of Transcendence", "Bindings of Transcendence",
"Handguards of Transcendence", "Handguards of Transcendence",
"Belt of Transcendence", "Belt of Transcendence",
"Boots of Transcendence", "Boots of Transcendence",
"Pauldrons of Wrath", "Pauldrons of Wrath",
"Breastplate of Wrath", "Breastplate of Wrath",
"Bracelets of Wrath", "Bracelets of Wrath",
"Gauntlets of Wrath", "Gauntlets of Wrath",
"Waistband of Wrath", "Waistband of Wrath",
"Sabatons of Wrath" "Sabatons of Wrath"
]
const AQ40 = [
//Tokens
"Qiraji Bindings of Command",
"Qiraji Bindings of Dominance",
"Vek'lor's Diadem",
"Vek'nilash's Circlet",
"Ouro's Intact Hide",
"Skin of the Great Sandworm",
"Carapace of the Old God",
"Husk of the Old God",
"Imperial Qiraji Armaments",
"Imperial Qiraji Regalia",
//Prophet Skeram
"Beetle Scaled Wristguards",
"Boots of the Unwavering Will",
"Breastplate of Annihilation",
"Cloak of Concentrated Hatred",
"Leggings of Immersion",
"Barrage Shoulders",
"Pendant of the Qiraji Guardian",
"Ring of Swarming Thought",
"Amulet of Foul Warding",
"Boots of the Redeemed Prophecy",
"Hammer of Ji'zhi",
"Staff of the Qiraji Prophets",
"Boots of the Fallen Prophet",
//Battleguard Sartura
"Robes of the Battleguard",
"Thick Qirajihide Belt",
"Creeping Vine Helm",
"Gauntlets of Steadfast Determination",
"Gloves of Enforcement",
"Leggings of the Festering Swarm",
"Necklace of Purity",
"Recomposed Boots",
"Badge of the Swarmguard",
"Legplates of Blazing Light",
"Sartura's Might",
"Scaled Leggings of Qiraji Fury",
"Silithid Claw",
//Fankriss the Unyielding
"Hive Tunneler's Boots",
"Pauldrons of the Unrelenting",
"Robes of the Guardian Saint",
"Barbed Choker",
"Fetish of the Sand Reaver",
"Mantle of Wicked Revenge",
"Scaled Sand Reaver Leggings",
"Silithid Carapace Chestguard",
"Cloak of Untold Secrets",
"Barb of the Sand Reaver",
"Libram of Grace",
"Ancient Qiraji Ripper",
"Totem of Life",
//Princess Huhuran
"Hive Defiler Wristguards",
"Wasphide Gauntlets",
"Cloak of the Golden Hive",
"Ring of the Martyr",
"Gloves of the Messiah",
"Huhuran's Stinger",
//Twin Emperors
"Boots of Epiphany",
"Vek'lor's Gloves of Devastation",
"Royal Qiraji Belt",
"Royal Scepter of Vek'lor",
"Ring of Emperor Vek'lor",
"Gloves of the Hidden Temple",
"Amulet of Vek'nilash",
"Regenerating Belt of Vek'nilash",
"Belt of the Fallen Emperor",
"Bracelets of Royal Redemption",
"Kalimdor's Revenge",
"Grasp of the Fallen Emperor",
"Qiraji Execution Bracers",
//C'Thun
"Eye of C'Thun",
"Ring of the Godslayer",
"Eyestalk Waist Cord",
"Cloak of the Devoured",
"Gauntlets of Annihilation",
"Scepter of the False Prophet",
"Mark of C'Thun",
"Cloak of Clarity",
"Dark Storm Gauntlets",
"Grasp of the Old God",
"Belt of Never-ending Agony",
"Vanquished Tentacle of C'Thun",
"Dark Edge of Insanity",
"Death's Sting",
//Viscidus
"Gauntlets of Kalimdor",
"Gauntlets of the Righteous Champion",
"Idol of Health",
"Ring of the Qiraji Fury",
"Sharpened Silithid Femur",
"Slime-coated Leggings",
"Scarab Brooch",
//Ouro
"Don Rigoberto's Lost Hat",
"Larvae of the Great Worm",
"The Burrower's Shell",
"Wormscale Blocker",
"Burrower Bracers",
"Jom Gabbar",
//3 Bugs
"Guise of the Devourer",
"Ternary Mantle",
"Cape of the Trinity",
"Robes of the Triumvirate",
"Triad Girdle",
"Angelista's Touch",
"Vest of Swift Execution",
"Ring of the Devoured",
"Petrified Scarab",
"Wand of Qiraji Nobility",
"Angelista's Charm",
"Gloves of Ebru",
"Ooze-ridden Gauntlets",
"Boots of the Fallen Hero",
"Mantle of Phrenic Power",
"Mantle of the Desert's Fury",
"Mantle of the Desert Crusade",
"Bile-Covered Gauntlets",
"Ukko's Ring of Darkness",
] ]
export const ZGMounts = [ export const ZGMounts = [
@@ -288,14 +424,14 @@ export const ZGMounts = [
] ]
export type AllItems = { export type AllItems = {
[tier in Tiers] : string[] [tier in Tiers]: string[]
} }
export const allItems : AllItems = { export const allItems: AllItems = {
MC: T1, MC: T1,
BWL: T2, BWL: T2,
ZG: ZGMounts, ZG: ZGMounts,
AQ20: [], AQ20: [],
AQ40: [], AQ40: AQ40,
Naxx: [] Naxx: []
} }
+1 -1
View File
@@ -18,5 +18,5 @@ implements ConfigExporter<ConfType>, RPCExporter, TableDefinitionExporter{
abstract getTableDefinitions(): TableDefiniton[] abstract getTableDefinitions(): TableDefiniton[]
abstract getDefaultConfig(): ConfType abstract getDefaultConfig(): ConfType
abstract exportRPCs(): RPC<any,any>[] abstract RPCs(): RPC<any,any>[]
} }
+1 -1
View File
@@ -6,5 +6,5 @@ export interface PrivilegedRPCExporter <
Name extends keyof Ifc = keyof Ifc, Name extends keyof Ifc = keyof Ifc,
FeatureName extends keyof FeatureIfc = keyof FeatureIfc, FeatureName extends keyof FeatureIfc = keyof FeatureIfc,
>extends RPCExporter<Ifc, Name>{ >extends RPCExporter<Ifc, Name>{
exportRPCFeatures() : RPCExporter<FeatureIfc, FeatureName>[] RPCFeatures() : RPCExporter<FeatureIfc, FeatureName>[]
} }
+2
View File
@@ -55,6 +55,7 @@ export type RaidData = Raid & {
} & { } & {
late: (Signup & Character & Spec)[] late: (Signup & Character & Spec)[]
bench: (Signup & Character & Spec)[] bench: (Signup & Character & Spec)[]
absent: (Signup & Character & Spec)[]
} }
tokens: { tokens: {
[itemname in string]: (Character & SRToken & Item)[] [itemname in string]: (Character & SRToken & Item)[]
@@ -163,6 +164,7 @@ export type Signup = {
characterid: number characterid: number
benched: boolean benched: boolean
late: boolean late: boolean
absent:boolean
timestamp: string timestamp: string
memo?: string memo?: string
} }
+239 -56
View File
@@ -2645,6 +2645,14 @@
"integrity": "sha1-ytdV8Pxt57cPpuXgivqB70wiSN4=", "integrity": "sha1-ytdV8Pxt57cPpuXgivqB70wiSN4=",
"dev": true "dev": true
}, },
"@types/engine.io": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/@types/engine.io/-/engine.io-3.1.4.tgz",
"integrity": "sha512-98rXVukLD6/ozrQ2O80NAlWDGA4INg+tqsEReWJldqyi2fulC9V7Use/n28SWgROXKm6003ycWV4gZHoF8GA6w==",
"requires": {
"@types/node": "*"
}
},
"@types/events": { "@types/events": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
@@ -2705,10 +2713,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "6.0.90", "version": "14.0.27",
"resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.90.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
"integrity": "sha512-tXoGRVdi7wZX7P1VWoV9Wfk0uYDOAHdEYXAttuWgSrN76Q32wQlSrMX0Rgyv3RTEaQY2ZLQrzYHVM2e8rfo8sA==", "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g=="
"dev": true
}, },
"@types/q": { "@types/q": {
"version": "0.0.32", "version": "0.0.32",
@@ -2722,6 +2729,20 @@
"integrity": "sha512-/DJGXtMuklLQef49qDsmjQofzaGU6D5To2xJZRLBNZO4GLAi30IjxLy6hHRQdycXP+IZKKXqJhYyNJ53SglJ8w==", "integrity": "sha512-/DJGXtMuklLQef49qDsmjQofzaGU6D5To2xJZRLBNZO4GLAi30IjxLy6hHRQdycXP+IZKKXqJhYyNJ53SglJ8w==",
"dev": true "dev": true
}, },
"@types/socket.io": {
"version": "2.1.10",
"resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-2.1.10.tgz",
"integrity": "sha512-1fQMaDU/x2LPljEI/QI5IKl8sBYHM/zv32YYKvNrVEor7/1+MLqMqmWt8Bb8Vpf+PlIPBiTTC0BnrRx7ju3xOw==",
"requires": {
"@types/engine.io": "*",
"@types/node": "*"
}
},
"@types/socket.io-client": {
"version": "1.4.33",
"resolved": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-1.4.33.tgz",
"integrity": "sha512-m4LnxkljsI9fMsjwpW5QhRpMixo2BeeLpFmg0AE+sS4H1pzAd/cs/ftTiL60FLZgfFa8PFRPx5KsHu8O0bADKQ=="
},
"@types/source-list-map": { "@types/source-list-map": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
@@ -2952,7 +2973,6 @@
"version": "1.3.7", "version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"dev": true,
"requires": { "requires": {
"mime-types": "~2.1.24", "mime-types": "~2.1.24",
"negotiator": "0.6.2" "negotiator": "0.6.2"
@@ -3004,8 +3024,7 @@
"after": { "after": {
"version": "0.8.2", "version": "0.8.2",
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
"integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
"dev": true
}, },
"agent-base": { "agent-base": {
"version": "4.3.0", "version": "4.3.0",
@@ -3437,8 +3456,7 @@
"async-limiter": { "async-limiter": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
"dev": true
}, },
"asynckit": { "asynckit": {
"version": "0.4.0", "version": "0.4.0",
@@ -3683,8 +3701,7 @@
"backo2": { "backo2": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
"integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
"dev": true
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
@@ -3749,8 +3766,7 @@
"base64-arraybuffer": { "base64-arraybuffer": {
"version": "0.1.5", "version": "0.1.5",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
"integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
"dev": true
}, },
"base64-js": { "base64-js": {
"version": "1.3.1", "version": "1.3.1",
@@ -3797,7 +3813,6 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
"integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
"dev": true,
"requires": { "requires": {
"callsite": "1.0.0" "callsite": "1.0.0"
} }
@@ -4076,19 +4091,6 @@
"node-releases": "^1.1.47" "node-releases": "^1.1.47"
} }
}, },
"bsert": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/bsert/-/bsert-0.0.10.tgz",
"integrity": "sha512-NHNwlac+WPy4t2LoNh8pXk8uaIGH3NSaIUbTTRXGpE2WEbq0te/tDykYHkFK57YKLPjv/aGHmbqvnGeVWDz57Q=="
},
"bsock": {
"version": "0.1.9",
"resolved": "https://registry.npmjs.org/bsock/-/bsock-0.1.9.tgz",
"integrity": "sha512-/l9Kg/c5o+n/0AqreMxh2jpzDMl1ikl4gUxT7RFNe3A3YRIyZkiREhwcjmqxiymJSRI/Qhew357xGn1SLw/xEw==",
"requires": {
"bsert": "~0.0.10"
}
},
"buffer": { "buffer": {
"version": "4.9.2", "version": "4.9.2",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
@@ -4277,8 +4279,7 @@
"callsite": { "callsite": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
"integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
"dev": true
}, },
"callsites": { "callsites": {
"version": "2.0.0", "version": "2.0.0",
@@ -4752,8 +4753,7 @@
"component-bind": { "component-bind": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
"integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
"dev": true
}, },
"component-emitter": { "component-emitter": {
"version": "1.3.0", "version": "1.3.0",
@@ -4764,8 +4764,7 @@
"component-inherit": { "component-inherit": {
"version": "0.0.3", "version": "0.0.3",
"resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
"integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
"dev": true
}, },
"compressible": { "compressible": {
"version": "2.0.18", "version": "2.0.18",
@@ -9131,11 +9130,25 @@
} }
} }
}, },
"has-binary2": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
"integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
"requires": {
"isarray": "2.0.1"
},
"dependencies": {
"isarray": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
}
}
},
"has-cors": { "has-cors": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
"integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
"dev": true
}, },
"has-flag": { "has-flag": {
"version": "3.0.0", "version": "3.0.0",
@@ -9571,8 +9584,7 @@
"indexof": { "indexof": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
"dev": true
}, },
"infer-owner": { "infer-owner": {
"version": "1.0.4", "version": "1.0.4",
@@ -13468,8 +13480,7 @@
"negotiator": { "negotiator": {
"version": "0.6.2", "version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
"dev": true
}, },
"neo-async": { "neo-async": {
"version": "2.6.1", "version": "2.6.1",
@@ -13925,8 +13936,7 @@
"object-component": { "object-component": {
"version": "0.0.3", "version": "0.0.3",
"resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
"dev": true
}, },
"object-copy": { "object-copy": {
"version": "0.1.0", "version": "0.1.0",
@@ -14440,7 +14450,6 @@
"version": "0.0.5", "version": "0.0.5",
"resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
"integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
"dev": true,
"requires": { "requires": {
"better-assert": "~1.0.0" "better-assert": "~1.0.0"
} }
@@ -14449,7 +14458,6 @@
"version": "0.0.5", "version": "0.0.5",
"resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
"integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
"dev": true,
"requires": { "requires": {
"better-assert": "~1.0.0" "better-assert": "~1.0.0"
} }
@@ -15043,6 +15051,12 @@
"webdriver-manager": "^12.0.6" "webdriver-manager": "^12.0.6"
}, },
"dependencies": { "dependencies": {
"@types/node": {
"version": "6.14.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.10.tgz",
"integrity": "sha512-pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA==",
"dev": true
},
"del": { "del": {
"version": "2.2.2", "version": "2.2.2",
"resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
@@ -15775,20 +15789,191 @@
"integrity": "sha512-ZYzRkETgBrdEGzL5JSKimvjI2CX7ioyZCkX2BpcfyjqI+079W0wHAyj5W4rIZMcDSOHgLZtgz1IdDi/vU77KEQ==" "integrity": "sha512-ZYzRkETgBrdEGzL5JSKimvjI2CX7ioyZCkX2BpcfyjqI+079W0wHAyj5W4rIZMcDSOHgLZtgz1IdDi/vU77KEQ=="
}, },
"rpclibrary": { "rpclibrary": {
"version": "1.10.2", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/rpclibrary/-/rpclibrary-1.10.2.tgz", "resolved": "https://registry.npmjs.org/rpclibrary/-/rpclibrary-2.0.1.tgz",
"integrity": "sha512-uf4FtylK+tyVo1O8YVihxYxaI4KHnKBzq05SsLYe8ZPXdO8Hqrv7Je5cwv3bfx0FBCO1vVrSc8DT1P6ypGY6uQ==", "integrity": "sha512-phdU0TkrnNVXdFa5PKkbWvn+MxocowvqalEUG1jfpkc1CoQkJ9AXa4OXSEu5r2a2IFhVauYva/qXv1em5yrHSg==",
"requires": { "requires": {
"bsock": "^0.1.9", "@types/socket.io": "^2.1.8",
"crypto-js": "^4.0.0", "@types/socket.io-client": "^1.4.33",
"http": "0.0.0", "http": "0.0.0",
"socket.io": "^2.3.0",
"socket.io-client": "^2.3.0",
"uuid": "^3.3.3" "uuid": "^3.3.3"
}, },
"dependencies": { "dependencies": {
"crypto-js": { "arraybuffer.slice": {
"version": "4.0.0", "version": "0.0.7",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
"integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
},
"base64id": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
"integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
},
"blob": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
"integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
},
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
},
"cookie": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
},
"engine.io": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz",
"integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==",
"requires": {
"accepts": "~1.3.4",
"base64id": "2.0.0",
"cookie": "0.3.1",
"debug": "~4.1.0",
"engine.io-parser": "~2.2.0",
"ws": "^7.1.2"
}
},
"engine.io-client": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz",
"integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==",
"requires": {
"component-emitter": "~1.3.0",
"component-inherit": "0.0.3",
"debug": "~4.1.0",
"engine.io-parser": "~2.2.0",
"has-cors": "1.1.0",
"indexof": "0.0.1",
"parseqs": "0.0.5",
"parseuri": "0.0.5",
"ws": "~6.1.0",
"xmlhttprequest-ssl": "~1.5.4",
"yeast": "0.1.2"
},
"dependencies": {
"component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
},
"ws": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
"integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
"requires": {
"async-limiter": "~1.0.0"
}
}
}
},
"engine.io-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
"integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
"requires": {
"after": "0.8.2",
"arraybuffer.slice": "~0.0.7",
"base64-arraybuffer": "0.1.5",
"blob": "0.0.5",
"has-binary2": "~1.0.2"
}
},
"isarray": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"socket.io": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz",
"integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==",
"requires": {
"debug": "~4.1.0",
"engine.io": "~3.4.0",
"has-binary2": "~1.0.2",
"socket.io-adapter": "~1.1.0",
"socket.io-client": "2.3.0",
"socket.io-parser": "~3.4.0"
}
},
"socket.io-adapter": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
"integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
},
"socket.io-client": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
"integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
"requires": {
"backo2": "1.0.2",
"base64-arraybuffer": "0.1.5",
"component-bind": "1.0.0",
"component-emitter": "1.2.1",
"debug": "~4.1.0",
"engine.io-client": "~3.4.0",
"has-binary2": "~1.0.2",
"has-cors": "1.1.0",
"indexof": "0.0.1",
"object-component": "0.0.3",
"parseqs": "0.0.5",
"parseuri": "0.0.5",
"socket.io-parser": "~3.3.0",
"to-array": "0.1.4"
},
"dependencies": {
"socket.io-parser": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
"integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
"requires": {
"component-emitter": "1.2.1",
"debug": "~3.1.0",
"isarray": "2.0.1"
},
"dependencies": {
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
}
}
}
}
},
"socket.io-parser": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz",
"integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==",
"requires": {
"component-emitter": "1.2.1",
"debug": "~4.1.0",
"isarray": "2.0.1"
}
},
"ws": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
"integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
},
"xmlhttprequest-ssl": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
"integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
} }
} }
}, },
@@ -17979,8 +18164,7 @@
"to-array": { "to-array": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
"integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
"dev": true
}, },
"to-arraybuffer": { "to-arraybuffer": {
"version": "1.0.1", "version": "1.0.1",
@@ -21030,8 +21214,7 @@
"yeast": { "yeast": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
"dev": true
}, },
"yn": { "yn": {
"version": "3.1.1", "version": "3.1.1",
+2 -2
View File
@@ -79,7 +79,7 @@
"normalize.css": "6.0.0", "normalize.css": "6.0.0",
"pace-js": "1.0.2", "pace-js": "1.0.2",
"roboto-fontface": "0.8.0", "roboto-fontface": "0.8.0",
"rpclibrary": "^1.10.2", "rpclibrary": "^2.0.1",
"rxjs": "6.5.2", "rxjs": "6.5.2",
"rxjs-compat": "6.3.0", "rxjs-compat": "6.3.0",
"socicon": "3.0.5", "socicon": "3.0.5",
@@ -102,7 +102,7 @@
"@types/jasmine": "2.5.54", "@types/jasmine": "2.5.54",
"@types/jasminewd2": "2.0.3", "@types/jasminewd2": "2.0.3",
"@types/leaflet": "1.2.3", "@types/leaflet": "1.2.3",
"@types/node": "6.0.90", "@types/node": "^14.0.27",
"codelyzer": "^5.0.1", "codelyzer": "^5.0.1",
"conventional-changelog-cli": "1.3.4", "conventional-changelog-cli": "1.3.4",
"jasmine-core": "2.6.4", "jasmine-core": "2.6.4",
@@ -51,6 +51,7 @@ export class FrontcraftArmoryComponent implements OnInit {
const geardata = maybeItems.filter(maybeItem => maybeItem != null) const geardata = maybeItems.filter(maybeItem => maybeItem != null)
this.gear = geardata this.gear = geardata
console.log(this.gear)
console.log(this.gear.map(g => g.stats).reduce(sumStats)) console.log(this.gear.map(g => g.stats).reduce(sumStats))
})) }))
} }
@@ -21,24 +21,5 @@ class = "col-12 col-xl-9">
<span *ngIf="link === 'owner'"> <span *ngIf="link === 'owner'">
Owned by <a [routerLink]="'/frontcraft/user/'+char.username"> {{char.username}} ({{char.rank}})</a> Owned by <a [routerLink]="'/frontcraft/user/'+char.username"> {{char.username}} ({{char.rank}})</a>
</span> </span>
<br/>
<br />
<br />
<h3>Tokens</h3>
<span *ngFor="let token of tokens">
[ {{token.level}} ]
<wowhead [item]="token"></wowhead><br />
</span>
<br />
<br />
<br />
<h3>Gear of the last reported kill <a target="_blank" *ngIf="dataLink != null && dataLink != ''" style="size: 0.5em;" [href]="dataLink">(data)</a></h3>
<h5>{{boss2.name}} {{boss2.date | date : 'MMM d @ HH : mm'}}</h5>
<ng-container *ngFor="let item of gear2">
<wowhead [item]="item"></wowhead><br />
</ng-container>
</nb-card-body> </nb-card-body>
</nb-card> </nb-card>
@@ -4,6 +4,7 @@
</nb-card-header> </nb-card-header>
<nb-card-body> <nb-card-body>
<textarea <textarea
fullWidth
placeholder="Add a note (optional)" placeholder="Add a note (optional)"
rows="7" rows="7"
cols="50" cols="50"
@@ -13,30 +14,38 @@
<br /> <br />
<br /> <br />
<nb-card *ngFor="let character of characters"> <nb-card *ngFor="let character of characters">
<nb-card-header [ngStyle]="{'color': character.color}"> <nb-card-header [ngStyle]="{'color': character.color}" style="text-transform: capitalize;">
<img [src]="'../../../../assets/images/'+character.class.toLowerCase()+'.png'" /> <img [src]="'../../../../assets/images/'+character.class.toLowerCase()+'.png'" />
{{character.charactername}} {{character.charactername}}
</nb-card-header> </nb-card-header>
<nb-card-body> <nb-card-body>
<button <button
(click)="signup(character, false)" (click)="signup(character, false, false)"
nbButton nbButton
outline outline
fullWidth
status="success" status="success"
size="medium"> size="medium">
<nb-icon icon="checkmark-outline"></nb-icon> On Time <nb-icon icon="checkmark-outline"></nb-icon> On Time
</button> </button>
&nbsp;
&nbsp;
&nbsp;
<button <button
(click)="signup(character, true)" (click)="signup(character, true, false)"
nbButton nbButton
outline outline
fullWidth
status="warning" status="warning"
size="medium"> size="medium">
<nb-icon icon="clock-outline"></nb-icon> Late <nb-icon icon="clock-outline"></nb-icon> Late
</button> </button>
<button
(click)="signup(character, false, true)"
nbButton
outline
fullWidth
status="danger"
size="medium">
<nb-icon icon="person-delete-outline"></nb-icon> Absent
</button>
</nb-card-body> </nb-card-body>
</nb-card> </nb-card>
</nb-card-body> </nb-card-body>
@@ -20,12 +20,12 @@ export class FrontcraftCharacerpickerComponent implements OnInit{
private toast : NbToastrService private toast : NbToastrService
){} ){}
signup = async (character: Character, late: boolean) => { signup = async (character: Character, late: boolean, attending: boolean = true) => {
const auth = this.api.getAuth() const auth = this.api.getAuth()
const signup = this.api.get('signup') const signup = this.api.get('signup')
if(!signup) return if(!signup) return
await signup.sign(auth.token.value, character, this.raid, late, this.memo) await signup.sign(auth.token.value, character, this.raid, late, attending, this.memo)
this.toast.show('Signup', 'Success', { status: 'success' }) this.toast.show('Signup', 'Success', { status: 'success' })
this.dialogRef.close() this.dialogRef.close()
} }
@@ -26,35 +26,40 @@
({{mySignup.race}} {{mySignup.specname}} {{mySignup.class}}) ({{mySignup.race}} {{mySignup.specname}} {{mySignup.class}})
<br /> <br />
Status: {{mySignup.status}}<br /><br /> Status: {{mySignup.status}}<br /><br />
<textarea [status]="mySignup.status === 'Attending'?'success':'warning'" <textarea fullWidth *ngIf="mySignup.status !== 'Absent'"
[status]="mySignup.status === 'Attending'?'success':'warning'"
placeholder="Add a note (optional)" rows="10" cols="50" nbInput placeholder="Add a note (optional)" rows="10" cols="50" nbInput
style="white-space: pre-line;" [(ngModel)]="mySignup.memo"> style="white-space: pre-line;" [(ngModel)]="mySignup.memo">
</textarea> </textarea>
</p> </p>
<button *ngIf="mySignup.status === 'Late'" (click)="setLate(false)" nbButton outline <button *ngIf="mySignup.status !== 'Attending'" (click)="setLate(false)" nbButton
status="success" size="medium"> fullWidth outline status="success" size="medium">
<nb-icon icon="checkmark-outline"></nb-icon> On Time <nb-icon icon="checkmark-outline"></nb-icon> On Time
</button> </button>
<button *ngIf="mySignup.status === 'Attending'" (click)="setLate(false)" nbButton <button *ngIf="mySignup.status === 'Attending'" (click)="setLate(false)" nbButton
outline status="success" size="medium"> fullWidth outline status="success" size="medium">
<nb-icon icon="checkmark-outline"></nb-icon> Update <nb-icon icon="checkmark-outline"></nb-icon> Update
</button> </button>
<button *ngIf="mySignup.status === 'Late'" (click)="setLate(true)" nbButton outline <button *ngIf="mySignup.status === 'Late'" (click)="setLate(true)" nbButton fullWidth
status="warning" size="medium"> outline status="warning" size="medium">
<nb-icon icon="clock-outline"></nb-icon> Update <nb-icon icon="clock-outline"></nb-icon> Update
</button> </button>
<button *ngIf="mySignup.status === 'Attending'" (click)="setLate(true)" nbButton outline <button *ngIf="mySignup.status !== 'Late'" (click)="setLate(true)" nbButton fullWidth
status="warning" size="medium"> outline status="warning" size="medium">
<nb-icon icon="clock-outline"></nb-icon> Late <nb-icon icon="clock-outline"></nb-icon> Late
</button> </button>
<button *ngIf="mySignup.status !== 'Absent'" (click)="setAbsent()" nbButton fullWidth
<button (click)="unsign()" nbButton outline status="danger" size="medium"> outline status="danger" size="medium">
<nb-icon icon="person-delete-outline"></nb-icon> Absent
</button>
<p>&nbsp;</p>
<button (click)="unsign()" nbButton fullWidth status="danger" size="medium">
<nb-icon icon="close"></nb-icon>unsign <nb-icon icon="close"></nb-icon>unsign
</button> </button>
</div> </div>
<div *ngIf="!isSignedup"> <div *ngIf="!isSignedup">
<button (click)="signup()" nbButton outline status="success" size="medium"> <button (click)="signup()" fullWidth nbButton outline status="success" size="medium">
<nb-icon icon="person-done-outline"></nb-icon> sign up <nb-icon icon="person-done-outline"></nb-icon> sign up
</button> </button>
</div> </div>
@@ -83,21 +88,26 @@
[src]="'/assets/images/'+participant.class.toLowerCase()+'.png'" /> [src]="'/assets/images/'+participant.class.toLowerCase()+'.png'" />
{{ participant.charactername }} {{ participant.charactername }}
</a> </a>
<ng-template #template> <ng-template #timeInfo>
<div style="padding: 10px">
{{participant.timestamp | date : 'HH:mm EEE MMM d'}}
({{participant.before | date : 'dd'}} days before start)
</div>
</ng-template>
<nb-icon [nbPopover]="timeInfo" nbPopoverTrigger="hover"
style="width: 0.75em; height: 0.75em;" icon="clock-outline"
[status]="participant.before>8.64e+7?(participant.before>2.592e+8?'success':'warning'):'danger'">
</nb-icon>
<ng-template #memoBox>
<div style="padding: 10px"> <div style="padding: 10px">
<p <p
style="white-space: pre-line; max-width: 50vw; word-wrap: break-word;"> style="white-space: pre-line; max-width: 50vw; word-wrap: break-word;">
{{participant.memo}} {{participant.memo}}
</p> </p>
{{participant.timestamp | date : 'HH:mm EEE MMM d'}} ({{participant.before | date : 'dd'}} days before start)
</div> </div>
</ng-template> </ng-template>
<nb-icon <nb-icon *ngIf="participant.memo" [nbPopover]="memoBox" nbPopoverTrigger="hover"
[nbPopover]="template" style="width: 0.75em; height: 0.75em;" icon="message-circle-outline">
nbPopoverTrigger="hover"
style="width: 0.75em; height: 0.75em;"
[icon]="participant.memo != null && participant.memo != ''?'message-circle-outline':'clock-outline'"
[status]="participant.before>8.64e+7?(participant.before>2.592e+8?'success':'warning'):'danger'">
</nb-icon> </nb-icon>
<span *ngIf="participant.rank=='Trial'" style="font-size: 9px;"> <span *ngIf="participant.rank=='Trial'" style="font-size: 9px;">
@@ -127,21 +137,6 @@
[src]="'/assets/images/'+participant.class.toLowerCase()+'.png'" /> [src]="'/assets/images/'+participant.class.toLowerCase()+'.png'" />
{{ participant.charactername }} {{ participant.charactername }}
</a> </a>
<ng-template #template>
<div style="padding: 10px">
<p style="white-space: pre-line;">
{{participant.memo}}
</p>
{{participant.timestamp | date : 'HH:mm EEE MMM d'}} ({{participant.before | date : 'dd'}} days before start)
</div>
</ng-template>
<nb-icon
[nbPopover]="template"
nbPopoverTrigger="hover"
style="width: 0.75em; height: 0.75em;"
[icon]="participant.memo != null && participant.memo != ''?'message-circle-outline':'clock-outline'"
[status]="participant.before>8.64e+7?(participant.before>2.592e+8?'success':'warning'):'danger'">
</nb-icon>
<span *ngIf="participant.rank=='Trial'" style="font-size: 9px;"> <span *ngIf="participant.rank=='Trial'" style="font-size: 9px;">
Trial Trial
</span> </span>
@@ -171,22 +166,6 @@
[src]="'/assets/images/'+participant.class.toLowerCase()+'.png'" /> [src]="'/assets/images/'+participant.class.toLowerCase()+'.png'" />
{{ participant.charactername }} {{ participant.charactername }}
</a> </a>
<ng-template #template>
<div style="padding: 10px">
<p style="white-space: pre-line;">
{{participant.memo}}
</p>
{{participant.timestamp | date : 'HH:mm EEE MMM d'}} ({{participant.before | date : 'dd'}} days before start)
</div>
</ng-template>
<nb-icon
[nbPopover]="template"
nbPopoverTrigger="hover"
style="width: 0.75em; height: 0.75em;"
[icon]="participant.memo != null && participant.memo != ''?'message-circle-outline':'clock-outline'"
[status]="participant.before>8.64e+7?(participant.before>2.592e+8?'success':'warning'):'danger'">
</nb-icon>
<span *ngIf="participant.rank=='Trial'" style="font-size: 9px;"> <span *ngIf="participant.rank=='Trial'" style="font-size: 9px;">
Trial Trial
</span> </span>
@@ -200,6 +179,9 @@
<button (click)="startRaid(raid)" nbButton outline status="success" size="medium"> <button (click)="startRaid(raid)" nbButton outline status="success" size="medium">
start start
</button> </button>
<button (click)="cancelRaid(raid)" nbButton outline status="danger" size="medium">
cancel
</button>
</nb-tab> </nb-tab>
</nb-tabset> </nb-tabset>
</nb-card-body> </nb-card-body>
@@ -120,6 +120,12 @@ export class FrontcraftRaidComponent
this.router.navigateByUrl('/frontcraft/archive/' + raid.id) this.router.navigateByUrl('/frontcraft/archive/' + raid.id)
} }
async cancelRaid(raid: Raid) {
await this.manageRaid!.cancelRaid(raid)
this.toast.show('Raid cancelled', 'Success', { status: 'success' })
this.router.navigateByUrl('/frontcraft/raids')
}
unsign = async () => { unsign = async () => {
const signupFeature = this.api.get('signup') const signupFeature = this.api.get('signup')
if (!signupFeature) return if (!signupFeature) return
@@ -139,7 +145,21 @@ export class FrontcraftRaidComponent
await signup.sign(auth.token.value, { await signup.sign(auth.token.value, {
...this.mySignup, ...this.mySignup,
id: this.mySignup.characterid, id: this.mySignup.characterid,
}, this.raid, value, this.mySignup.memo) }, this.raid, value, false, this.mySignup.memo)
this.toast.show('Signup', 'Success', { status: 'success' })
}
setAbsent = async () => {
const auth = this.api.getAuth()
const signup = this.api.get('signup')
if (!signup) return
await signup.sign(auth.token.value, {
...this.mySignup,
id: this.mySignup.characterid,
}, this.raid, false, true, this.mySignup.memo)
this.toast.show('Signup', 'Success', { status: 'success' }) this.toast.show('Signup', 'Success', { status: 'success' })
} }
@@ -184,7 +204,9 @@ export class FrontcraftRaidComponent
if (matchingSignup) { if (matchingSignup) {
this.mySignup = matchingSignup this.mySignup = matchingSignup
this.isSignedup = true this.isSignedup = true
this.mySignup['status'] = matchingSignup['benched'] ? 'Bench' : matchingSignup['late'] ? 'Late' : 'Attending' console.log(this.mySignup);
this.mySignup['status'] = matchingSignup['absent'] ? 'Absent' : matchingSignup['benched'] ? 'Bench' : matchingSignup['late'] ? 'Late' : 'Attending'
} else { } else {
this.isSignedup = false this.isSignedup = false
this.mySignup = null this.mySignup = null
@@ -209,11 +231,21 @@ export class FrontcraftRaidComponent
} }
setBench(signup: Signup) { setBench(signup: Signup) {
this.manageRaid.setBenched({
const manageRaid = this.api.get('manageRaid')
if(manageRaid){
const signupUpdated:Signup = {
benched: !signup.benched,
absent: false,
late: false,
characterid: signup.characterid, characterid: signup.characterid,
raidid: signup.raidid, raidid: signup.raidid,
late: false, timestamp: signup.timestamp,
benched: !signup.benched id: signup.id,
}).then(_ => this.refresh()) memo: signup.memo
}
manageRaid.updateSignup(signupUpdated)
.then(_ => this.refresh())
}
} }
} }
@@ -14,7 +14,7 @@ import { IApiService } from '../../services/ApiService/ApiService';
</nb-card-header> </nb-card-header>
<nb-card-body> <nb-card-body>
<p> <p>
{{currency}} softreserves remaining You have {{currency}} softreserve(s) remaining
</p> </p>
<div *ngIf="currency>0"> <div *ngIf="currency>0">
<nb-alert accent="danger" *ngIf="invalidatedTokens.length > 0"> <nb-alert accent="danger" *ngIf="invalidatedTokens.length > 0">
@@ -37,7 +37,7 @@ import { IApiService } from '../../services/ApiService/ApiService';
The following reserve will be created<br /> The following reserve will be created<br />
<ul> <ul>
<li> <li>
[ {{1+modifier}} ] [ {{1+currency+modifier}} ]
<img style="min-width: 20px; width: 2.25vw; max-width: 35px" [src]="'https://wow.zamimg.com/images/wow/icons/large/'+item.iconname+'.jpg'" /> <img style="min-width: 20px; width: 2.25vw; max-width: 35px" [src]="'https://wow.zamimg.com/images/wow/icons/large/'+item.iconname+'.jpg'" />
<span [ngStyle]="{'color':item.quality=='Epic'?'#a335ee':'#ff8000'}"> <span [ngStyle]="{'color':item.quality=='Epic'?'#a335ee':'#ff8000'}">
{{item.itemname}} {{item.itemname}}
@@ -49,10 +49,10 @@ import { IApiService } from '../../services/ApiService/ApiService';
</nb-alert> </nb-alert>
<nb-alert accent="info" *ngIf="upgradableToken != null"> <nb-alert accent="info" *ngIf="upgradableToken != null">
The following reserve will be created<br /> The following reserve will be upgraded<br />
<ul> <ul>
<li> <li>
[ {{upgradableToken.level}} ] => [ {{upgradableToken.level+1}} ] <img style="min-width: 20px; width: 2.25vw; max-width: 35px" [src]="'https://wow.zamimg.com/images/wow/icons/large/'+upgradableToken.iconname+'.jpg'" /> [ {{upgradableToken.level}} ] => [ {{upgradableToken.level+1+currency}} ] <img style="min-width: 20px; width: 2.25vw; max-width: 35px" [src]="'https://wow.zamimg.com/images/wow/icons/large/'+upgradableToken.iconname+'.jpg'" />
<span [ngStyle]="{'color':upgradableToken.quality=='Epic'?'#a335ee':'#ff8000'}">{{upgradableToken.itemname}}</span> <span [ngStyle]="{'color':upgradableToken.quality=='Epic'?'#a335ee':'#ff8000'}">{{upgradableToken.itemname}}</span>
</li> </li>
</ul> </ul>
@@ -65,7 +65,7 @@ import { IApiService } from '../../services/ApiService/ApiService';
outline outline
status="success" status="success"
size="small"> size="small">
<nb-icon icon="checkmark-outline"></nb-icon> claim <nb-icon icon="checkmark-outline"></nb-icon> okay
</button> </button>
</nb-card-body> </nb-card-body>
</nb-card> </nb-card>
@@ -59,7 +59,7 @@ export class ClientApiService implements IApiService{
// document.cookie = JSON.stringify(auth) // document.cookie = JSON.stringify(auth)
return authSock return authSock
}catch(e){ }catch(e){
if(this.privSocket) this.privSocket.destroy() if(this.privSocket) this.privSocket.close()
return; return;
} }
} }
@@ -120,14 +120,14 @@ export class ClientApiService implements IApiService{
} }
} }
if(this.privSocket) this.privSocket.destroy() if(this.privSocket) this.privSocket.close()
this.privSocket = null this.privSocket = null
this.auth = null this.auth = null
} }
initialize = async (force = false) : Promise<any> => { initialize = async (force = false) : Promise<any> => {
if(this.socket){ if(this.socket){
this.socket.destroy() this.socket.close()
this.socket = null this.socket = null
} }
@@ -71,14 +71,14 @@ export class ServerApiService implements IApiService {
} }
} }
if (this.privSocket) this.privSocket.destroy() if (this.privSocket) this.privSocket.close()
this.privSocket = null this.privSocket = null
this.auth = null this.auth = null
} }
initialize = async (): Promise<any> => { initialize = async (): Promise<any> => {
if (this.socket) { if (this.socket) {
this.socket.destroy() this.socket.close()
this.socket = null this.socket = null
} }
+32 -29
View File
@@ -5,6 +5,7 @@ import { T2, Tiers } from "../src/backend/Types/Items";
import { RPCSocket, ConnectedSocket } from "rpclibrary"; import { RPCSocket, ConnectedSocket } from "rpclibrary";
import { FrontcraftIfc, Auth, User, FrontcraftFeatureIfc, Raid, Character, Rank, Class, Race, Spec, Signup } from "../src/backend/Types/Types"; import { FrontcraftIfc, Auth, User, FrontcraftFeatureIfc, Raid, Character, Rank, Class, Race, Spec, Signup } from "../src/backend/Types/Types";
import { SpecT } from "../src/backend/Types/PlayerSpecs"; import { SpecT } from "../src/backend/Types/PlayerSpecs";
import { ItemManager } from "src/backend/Components/Item/ItemManager";
type protoAccount<C extends Class = Class> = { type protoAccount<C extends Class = Class> = {
@@ -166,7 +167,6 @@ describe('Frontcraft', () => {
username: 'a', username: 'a',
MC: 2 MC: 2
}).then(adminUser => { }).then(adminUser => {
client.UserManager.login(adminUser.username, 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb').then(auth => { client.UserManager.login(adminUser.username, 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb').then(auth => {
const sock = new RPCSocket<FrontcraftFeatureIfc>( const sock = new RPCSocket<FrontcraftFeatureIfc>(
auth.port, auth.port,
@@ -194,8 +194,8 @@ describe('Frontcraft', () => {
}) })
after(() => { after(() => {
client.destroy() client.close()
adminClient.destroy() adminClient.close()
server.stop() server.stop()
}) })
@@ -240,8 +240,8 @@ describe('Frontcraft', () => {
it('should sign up', (done) => { it('should sign up', (done) => {
Promise.all(Object.values(users).map((user) => Promise.all(Object.values(users).map((user) =>
adminClient.signup.sign(user.auth.token.value, user.character, raids[0], false, ""+Math.floor(Math.random()*10000)).catch(done) adminClient.signup.sign(user.auth.token.value, user.character, raids[0], false, true, ""+Math.floor(Math.random()*10000)).catch(done)
)).then(x => { )).then(_ => {
adminClient.signup.getSignups(raids[0]).then(s => { adminClient.signup.getSignups(raids[0]).then(s => {
if (s.length == testAccounts.length) { if (s.length == testAccounts.length) {
s.forEach(sign => { s.forEach(sign => {
@@ -539,7 +539,7 @@ describe('Frontcraft', () => {
users[user.account.username].item = itemname users[user.account.username].item = itemname
if (!token) return false if (!token) return false
return modifier + 1 === token.level return modifier + 2 === token.level
})).then(success => { })).then(success => {
if (success.reduce((prev, curr) => prev && curr, true)) done() if (success.reduce((prev, curr) => prev && curr, true)) done()
}) })
@@ -564,16 +564,8 @@ describe('Frontcraft', () => {
await adminClient.softreserveCurrency.incrementCurrency(user.account, item!.tier, 2) await adminClient.softreserveCurrency.incrementCurrency(user.account, item!.tier, 2)
const before = await client.ItemManager.getToken(user.character, item!) const before = await client.ItemManager.getToken(user.character, item!)
if (!before || before.level !== 4) { if (!before || before.level !== 5) {
console.log("expected level to be 4", before ? before.level : '?'); console.log("expected level to be 5", before ? before.level : '?');
return
}
await client.ItemManager.buyToken(user.auth.token.value, user.character.charactername, itemname, user.signup!)
const after = await client.ItemManager.buyToken(user.auth.token.value, user.character.charactername, itemname, user.signup!)
if (!after || after.level !== 6) {
console.log("expected level after to be 6", after ? after.level : '?');
return return
} }
done() done()
@@ -625,7 +617,7 @@ describe('Frontcraft', () => {
adminClient.reset.wipeCurrencyAndItems().then(() => { adminClient.reset.wipeCurrencyAndItems().then(() => {
client.UserManager.getUser(testAccounts[0].name).then(user => { client.UserManager.getUser(testAccounts[0].name).then(user => {
if (user && user.MC === 1) { if (user && user.MC === 1) {
client.ItemManager.getTokens(users[testAccounts[0].name.toLowerCase()].character, ['BWL']).then(tokens => { client.ItemManager.getTokens(users[testAccounts[0].name.toLowerCase()].character, ['BWL'], true).then(tokens => {
if (tokens!.length === 0) { if (tokens!.length === 0) {
done() done()
} else { } else {
@@ -652,7 +644,7 @@ describe('Frontcraft', () => {
} }
const user = Object.values(users)[0] const user = Object.values(users)[0]
const createRaid = adminClient.manageRaid.createRaid const createRaid = adminClient.manageRaid.createRaid
const sign = async (raid: Raid, late = false) => await adminClient.signup.sign(user.auth.token.value, user.character, raid, late) const sign = async (raid: Raid, late = false) => await adminClient.signup.sign(user.auth.token.value, user.character, raid, late, false)
const buyToken = async (signup: Signup, itemname: string) => await client.ItemManager.buyToken(user.auth.token.value, user.character.charactername, itemname, signup) const buyToken = async (signup: Signup, itemname: string) => await client.ItemManager.buyToken(user.auth.token.value, user.character.charactername, itemname, signup)
const getCurrency = async (tier: Tiers) => { const getCurrency = async (tier: Tiers) => {
const dbUser = await client.UserManager.getUser(user.account.username) const dbUser = await client.UserManager.getUser(user.account.username)
@@ -661,7 +653,6 @@ describe('Frontcraft', () => {
createRaid(Raid(0, 'BWL')).then(async (BWL0: Raid) => { createRaid(Raid(0, 'BWL')).then(async (BWL0: Raid) => {
const T2_0 = await client.ItemManager.getItem(T2[0]) const T2_0 = await client.ItemManager.getItem(T2[0])
//const BWL0 = await createRaid(Raid(0, 'BWL'))
const signupBWL0 = await sign(BWL0) const signupBWL0 = await sign(BWL0)
let BWL = await getCurrency(BWL0.tier) let BWL = await getCurrency(BWL0.tier)
let token = await buyToken(signupBWL0, T2[0]) let token = await buyToken(signupBWL0, T2[0])
@@ -676,14 +667,26 @@ describe('Frontcraft', () => {
let reserves = await client.ItemManager.getTokens(user.character, [BWL0.tier], true) let reserves = await client.ItemManager.getTokens(user.character, [BWL0.tier], true)
let streaks = await client.ItemManager.getTokens(user.character, [BWL0.tier], false) let streaks = await client.ItemManager.getTokens(user.character, [BWL0.tier], false)
if (reserves!.length != 1 if (reserves!.length != 1){
|| streaks!.length != 0 console.log("Expected reserves to be of length 1", reserves);
|| reserves![0].itemname !== T2_0!.itemname done(new Error("Bad token status"))
|| reserves![0].level !== 1) {
console.log("Bad Token status 1", reserves, streaks);
done(new Error("Bad Token status"))
return
} }
if(streaks!.length != 0){
console.log("Expected streaks to be of length 0", streaks);
done(new Error("Bad token status"))
}
if(reserves![0].itemname !== T2_0!.itemname){
console.log("Expected reserve to to be of item "+T2_0!.itemname, reserves![0]);
done(new Error("Bad token status"))
}
if(reserves![0].level !== 2){
console.log("Expected reserve to to be of level "+2, reserves![0].level);
done(new Error("Bad Token status"))
}
await adminClient.manageRaid.startRaid(BWL0) await adminClient.manageRaid.startRaid(BWL0)
reserves = await client.ItemManager.getTokens(user.character, [BWL0.tier], true) reserves = await client.ItemManager.getTokens(user.character, [BWL0.tier], true)
streaks = await client.ItemManager.getTokens(user.character, [BWL0.tier], false) streaks = await client.ItemManager.getTokens(user.character, [BWL0.tier], false)
@@ -691,7 +694,7 @@ describe('Frontcraft', () => {
|| streaks!.length != 1 || streaks!.length != 1
|| streaks![0].itemname !== T2[0] || streaks![0].itemname !== T2[0]
|| streaks![0].level !== 1) { || streaks![0].level !== 1) {
console.log("Bad Token status", reserves, streaks); console.log("Bad Token status 2", reserves, streaks);
done(new Error("Bad Token status 2")) done(new Error("Bad Token status 2"))
return return
} }
@@ -726,8 +729,8 @@ describe('Frontcraft', () => {
if (reserves!.length != 1 if (reserves!.length != 1
|| streaks!.length != 0 || streaks!.length != 0
|| reserves![0].itemname !== T2[1] || reserves![0].itemname !== T2[1]
|| reserves![0].level !== 1) { || reserves![0].level !== 2) {
console.log("Bad Token status", reserves, streaks); console.log("Bad Token status 3", reserves, streaks);
done(new Error("Bad Token status 3")) done(new Error("Bad Token status 3"))
return return
} }