Fix Avatar Uploading and Cashout
This commit is contained in:
102
Avatar.js
102
Avatar.js
@@ -1,7 +1,8 @@
|
||||
import fs from 'fs';
|
||||
import request from 'request';
|
||||
import prompts from 'prompts';
|
||||
import awsSignRequests from 'aws-sign-requests';
|
||||
import aws4 from 'aws4';
|
||||
import https from 'https';
|
||||
import { parseString } from 'xml2js';
|
||||
|
||||
import { accounts } from './accounts.json';
|
||||
@@ -19,7 +20,7 @@ export default class Avatar {
|
||||
const getChoice = async () => {
|
||||
const response = await prompts([
|
||||
{
|
||||
type: 'number',
|
||||
type: 'text',
|
||||
name: 'count',
|
||||
message: 'Number of Players to Change Avatar:',
|
||||
},
|
||||
@@ -33,19 +34,19 @@ export default class Avatar {
|
||||
|
||||
const players = accounts.sort(() => Math.round(Math.random()) - 0.5);
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
for (let i = 0; i < parseInt(count); i++) {
|
||||
this.changeAvatar(players[i]);
|
||||
}
|
||||
|
||||
const getSummary = setInterval(() => {
|
||||
if (this.playersReturned === count) {
|
||||
fs.writeFile('accounts.json', players, 'utf8', (err, data) => {
|
||||
if (this.playersReturned === parseInt(count)) {
|
||||
clearInterval(getSummary);
|
||||
fs.writeFile('accounts.json', JSON.stringify({accounts:players}, null, 2), 'utf8', (err, data) => {
|
||||
if (err) {
|
||||
console.log('Error saving accounts: ', err);
|
||||
}
|
||||
console.log('Done!');
|
||||
});
|
||||
clearInterval(getSummary);
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
@@ -60,7 +61,7 @@ export default class Avatar {
|
||||
...HEADERS,
|
||||
authorization: `Bearer ${player.accessToken}`,
|
||||
}
|
||||
}, (error, response, body) => {
|
||||
}, async (error, response, body) => {
|
||||
try {
|
||||
const result = JSON.parse(body);
|
||||
const { error, accessKeyId, secretKey, sessionToken, expiration } = result;
|
||||
@@ -80,44 +81,60 @@ export default class Avatar {
|
||||
uploadAvatar({ accessKeyId, secretKey, sessionToken, expiration, player }) {
|
||||
const filename = `${player.username}.jpg`;
|
||||
|
||||
request.get('https://mailaton.com/avagen')
|
||||
.on('response', response => {
|
||||
let options = awsSignRequests({
|
||||
credentials: {
|
||||
accessKeyId,
|
||||
secretAccessKey: secretKey,
|
||||
securityToken: sessionToken,
|
||||
expiration,
|
||||
},
|
||||
method: 'PUT',
|
||||
url: `https://hypespace-quiz.s3.amazonaws.com/avatars/${filename}`,
|
||||
host: 'hypespace-quiz.s3.amazonaws.com',
|
||||
headers: {
|
||||
'content-type': 'image/jpeg',
|
||||
},
|
||||
body: response,
|
||||
});
|
||||
|
||||
request.put(options)
|
||||
.on('response', response => {
|
||||
response.on('data', data => {
|
||||
console.log(`Using accessKey: ${accessKeyId}`);
|
||||
parseString(data, (xmlErr, xmlResult) => { console.log('xmlResult', xmlResult); });
|
||||
this.setAvatar(player);
|
||||
});
|
||||
});
|
||||
request({
|
||||
uri: 'https://mailaton.com/avagen/',
|
||||
encoding: null
|
||||
}, (error, response, body) => {
|
||||
let options = {
|
||||
method: 'PUT',
|
||||
service: 's3',
|
||||
region: 'us-east-1',
|
||||
host: 'hypespace-quiz.s3.amazonaws.com',
|
||||
path: `/avatars/${filename}`,
|
||||
signQuery: true,
|
||||
headers: {
|
||||
'Content-Type': 'image/jpeg',
|
||||
},
|
||||
};
|
||||
|
||||
aws4.sign(options, {
|
||||
accessKeyId,
|
||||
secretAccessKey: secretKey,
|
||||
sessionToken,
|
||||
});
|
||||
|
||||
options.headers = {
|
||||
...options.headers,
|
||||
'Content-Length': new Buffer(body).length,
|
||||
};
|
||||
|
||||
const req = https.request(options, response => {
|
||||
if (response.statusCode === 200) {
|
||||
this.setAvatar(player);
|
||||
} else {
|
||||
console.log('response', response);
|
||||
console.log(`Error uploading avatar. Got Status Code ${response.statusCode}!`);
|
||||
}
|
||||
});
|
||||
|
||||
req.on('error', err => {
|
||||
console.log('Error uploading avatar:', err);
|
||||
});
|
||||
|
||||
req.write(body);
|
||||
|
||||
req.end();
|
||||
});
|
||||
}
|
||||
|
||||
setAvatar(player) {
|
||||
const filename = `https://hypespace-quiz.s3.amazonaws.com/avatars/${player.username}.jpg`;
|
||||
const filename = `${player.username}.jpg`;
|
||||
|
||||
const options = {
|
||||
headers: {
|
||||
...HEADERS,
|
||||
authorization: `Bearer ${player.accessToken}`,
|
||||
},
|
||||
json: true,
|
||||
body: JSON.stringify({avatarUrl: filename}),
|
||||
};
|
||||
|
||||
@@ -125,13 +142,16 @@ export default class Avatar {
|
||||
.on('error', error => console.log('Error:', error))
|
||||
.on('response', response => {
|
||||
response.on('data', data => {
|
||||
const { error, avatarUrl } = JSON.parse(data);
|
||||
console.log(JSON.parse(data));
|
||||
if (error) {
|
||||
try {
|
||||
const { error, avatarUrl } = JSON.parse(data);
|
||||
if (error) {
|
||||
console.log(`Error setting avatar for ${player.username}: ${error}`);
|
||||
} else {
|
||||
console.log(`${player.username}'s avatar successfully changed!`, avatarUrl);
|
||||
player.avatarUrl = avatarUrl;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(`Error setting avatar for ${player.username}: ${error}`);
|
||||
} else {
|
||||
console.log(`${player.username}'s avatar successfully changed!`, avatarUrl);
|
||||
player.avatarUrl = avatarUrl;
|
||||
}
|
||||
this.playersReturned++;
|
||||
});
|
||||
|
||||
24
Cashout.js
24
Cashout.js
@@ -1,6 +1,7 @@
|
||||
import prompts from 'prompts';
|
||||
import request from 'request';
|
||||
import { accounts } from './accounts.json';
|
||||
import { HEADERS, SERVER_URL } from './config';
|
||||
import { CASHOUT_MIN, CATCHALL_DOMAIN, HEADERS, SERVER_URL } from './config';
|
||||
|
||||
export default class Cashout {
|
||||
constructor() {
|
||||
@@ -17,14 +18,15 @@ export default class Cashout {
|
||||
|
||||
const getSummary = setInterval(async () => {
|
||||
if (this.playersReturned === accounts.length) {
|
||||
clearInterval(getSummary);
|
||||
console.log(`${this.fundedPlayers.length} can be cashed out for a total of $${this.totalBalance.toFixed(2)}!`);
|
||||
|
||||
if (this.fundedPlayers === 0) return;
|
||||
if (this.fundedPlayers.length === 0) return;
|
||||
|
||||
const getConfirm = async () => {
|
||||
const response = await prompts([
|
||||
{
|
||||
type: 'string',
|
||||
type: 'text',
|
||||
name: 'confirm',
|
||||
message: 'Confirm Cashout (y/n):',
|
||||
},
|
||||
@@ -33,7 +35,6 @@ export default class Cashout {
|
||||
return response;
|
||||
};
|
||||
|
||||
clearInterval(getSummary);
|
||||
const confirmation = await getConfirm();
|
||||
if (confirmation.confirm.toLowerCase() !== 'y') {
|
||||
return;
|
||||
@@ -59,11 +60,12 @@ export default class Cashout {
|
||||
try {
|
||||
const result = JSON.parse(body);
|
||||
const { lives, leaderboard } = result;
|
||||
const { total, unclaimed: balance } = leaderboard;
|
||||
const { unclaimed } = leaderboard;
|
||||
const balance = parseFloat(unclaimed.replace('$',''));
|
||||
|
||||
if (balance > 0) {
|
||||
console.log(`${username}\thas balance of ${balance} available for withdrawal.`);
|
||||
this.totalBalance += parseFloat(balance.replace('$',''));
|
||||
if (balance > CASHOUT_MIN) {
|
||||
console.log(`${username}\thas balance of ${unclaimed} available for withdrawal.`);
|
||||
this.totalBalance += balance;
|
||||
this.fundedPlayers.push(player);
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -84,9 +86,9 @@ export default class Cashout {
|
||||
...HEADERS,
|
||||
authorization: `Bearer ${player.accessToken}`,
|
||||
},
|
||||
body: {
|
||||
body: JSON.stringify({
|
||||
email,
|
||||
},
|
||||
}),
|
||||
}, (error, response, body) => {
|
||||
this.playersReturned++;
|
||||
try {
|
||||
@@ -100,7 +102,7 @@ export default class Cashout {
|
||||
const getSummary = setInterval(() => {
|
||||
if (this.playersReturned === this.fundedPlayers.length) {
|
||||
clearInterval(getSummary);
|
||||
console.log(`${this.fundedPlayers.length} have cashed out! Enjoy!`);
|
||||
console.log(`${this.fundedPlayers.length} players have cashed out! Enjoy!`);
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
@@ -122,9 +122,10 @@ export default class Player {
|
||||
try {
|
||||
if (!this.canSendAnswer) {
|
||||
this.logger.logSilent(`Player ${this.username} tried to send answer for ${questionId}: ${answer.text} but time expired!`);
|
||||
} else {
|
||||
this.socket.send(JSON.stringify(answerPackage));
|
||||
this.logger.log(`Player ${this.username} sent answer ${answerNumber}) ${answer.text}`);
|
||||
}
|
||||
this.socket.send(JSON.stringify(answerPackage));
|
||||
this.logger.log(`Player ${this.username} sent answer ${answerNumber}) ${answer.text}`);
|
||||
} catch (error) {
|
||||
this.logger.log(`WebSocket error: ${this.username} can\'t send answer.`, LOG_TYPES.ERROR);
|
||||
this.logger.logSilent(error);
|
||||
|
||||
@@ -421,7 +421,7 @@ export default class Scraper {
|
||||
}
|
||||
|
||||
getSuggestion() {
|
||||
if (this.ticker < 3) {
|
||||
if (this.ticker < 5) {
|
||||
return 'Wait';
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ export default class TopPlayers {
|
||||
const playersToShow = Math.min(10, players.length);
|
||||
console.log(`Showing results for top ${playersToShow} players:`);
|
||||
|
||||
for (let i = 0; i < Math.min(10, players.length); i++) {
|
||||
for (let i = 0; i < playersToShow; i++) {
|
||||
const { username, score } = players[i];
|
||||
console.log(`${i + 1}) ${username} with a score of ${score}.`);
|
||||
}
|
||||
@@ -24,7 +24,7 @@ export default class TopPlayers {
|
||||
|
||||
console.log(`\nShowing results for worst ${playersToShow} players:`);
|
||||
|
||||
for (let i = 0; i < Math.min(10, players.length); i++) {
|
||||
for (let i = 0; i < playersToShow; i++) {
|
||||
const { username, score } = players[i];
|
||||
console.log(`${i + 1}) ${username} with a score of ${score}.`);
|
||||
}
|
||||
|
||||
111
package-lock.json
generated
111
package-lock.json
generated
@@ -129,6 +129,65 @@
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
|
||||
},
|
||||
"aws-sdk": {
|
||||
"version": "2.272.1",
|
||||
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.272.1.tgz",
|
||||
"integrity": "sha512-txUTnpFUoC7feZYYaKBAfuNO3v8YVkiNj90fHc4R7NfTsA8TY7r8eKi7kOa3gmwZ4LtkOHw/r3ibq+eGt8cjuQ==",
|
||||
"requires": {
|
||||
"buffer": "4.9.1",
|
||||
"events": "1.1.1",
|
||||
"ieee754": "1.1.8",
|
||||
"jmespath": "0.15.0",
|
||||
"querystring": "0.2.0",
|
||||
"sax": "1.2.1",
|
||||
"url": "0.10.3",
|
||||
"uuid": "3.1.0",
|
||||
"xml2js": "0.4.17"
|
||||
},
|
||||
"dependencies": {
|
||||
"punycode": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
|
||||
"integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
|
||||
},
|
||||
"sax": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
|
||||
"integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o="
|
||||
},
|
||||
"url": {
|
||||
"version": "0.10.3",
|
||||
"resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
|
||||
"integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=",
|
||||
"requires": {
|
||||
"punycode": "1.3.2",
|
||||
"querystring": "0.2.0"
|
||||
}
|
||||
},
|
||||
"uuid": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
|
||||
"integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g=="
|
||||
},
|
||||
"xml2js": {
|
||||
"version": "0.4.17",
|
||||
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz",
|
||||
"integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=",
|
||||
"requires": {
|
||||
"sax": "1.2.1",
|
||||
"xmlbuilder": "4.2.1"
|
||||
}
|
||||
},
|
||||
"xmlbuilder": {
|
||||
"version": "4.2.1",
|
||||
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz",
|
||||
"integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=",
|
||||
"requires": {
|
||||
"lodash": "4.17.10"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"aws-sign": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.1.2.tgz",
|
||||
@@ -144,6 +203,15 @@
|
||||
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
||||
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
|
||||
},
|
||||
"aws-signing-utils": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/aws-signing-utils/-/aws-signing-utils-1.0.3.tgz",
|
||||
"integrity": "sha1-MVt+jz8iOvCvNI//zSepWZ5ull4=",
|
||||
"requires": {
|
||||
"crypto-js": "3.1.9-1",
|
||||
"moment": "2.22.2"
|
||||
}
|
||||
},
|
||||
"aws4": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
|
||||
@@ -978,6 +1046,11 @@
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
||||
},
|
||||
"base64-js": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
|
||||
"integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="
|
||||
},
|
||||
"bcrypt-pbkdf": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
|
||||
@@ -1030,6 +1103,16 @@
|
||||
"electron-to-chromium": "1.3.50"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"version": "4.9.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
|
||||
"integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
|
||||
"requires": {
|
||||
"base64-js": "1.3.0",
|
||||
"ieee754": "1.1.8",
|
||||
"isarray": "1.0.0"
|
||||
}
|
||||
},
|
||||
"buffer-equal-constant-time": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
||||
@@ -1153,6 +1236,11 @@
|
||||
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
|
||||
"integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
|
||||
},
|
||||
"crypto-js": {
|
||||
"version": "3.1.9-1",
|
||||
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz",
|
||||
"integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg="
|
||||
},
|
||||
"cycle": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
|
||||
@@ -1269,6 +1357,11 @@
|
||||
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
|
||||
"dev": true
|
||||
},
|
||||
"events": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
|
||||
"integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
|
||||
},
|
||||
"expand-brackets": {
|
||||
"version": "0.1.5",
|
||||
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
|
||||
@@ -2106,6 +2199,11 @@
|
||||
"sshpk": "1.14.2"
|
||||
}
|
||||
},
|
||||
"https": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz",
|
||||
"integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q="
|
||||
},
|
||||
"https-proxy-agent": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
|
||||
@@ -2130,6 +2228,11 @@
|
||||
"resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz",
|
||||
"integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0="
|
||||
},
|
||||
"ieee754": {
|
||||
"version": "1.1.8",
|
||||
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
|
||||
"integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q="
|
||||
},
|
||||
"inflight": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||
@@ -2248,8 +2351,7 @@
|
||||
"isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
|
||||
"dev": true
|
||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||
},
|
||||
"isobject": {
|
||||
"version": "2.1.0",
|
||||
@@ -2266,6 +2368,11 @@
|
||||
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
|
||||
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
|
||||
},
|
||||
"jmespath": {
|
||||
"version": "0.15.0",
|
||||
"resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz",
|
||||
"integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc="
|
||||
},
|
||||
"js-tokens": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
|
||||
|
||||
@@ -26,8 +26,6 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"async-request": "^1.2.0",
|
||||
"aws-sign": "^0.1.2",
|
||||
"aws-sign-requests": "^0.4.0",
|
||||
"aws4": "^1.7.0",
|
||||
"chalk": "^2.4.1",
|
||||
"cloudsms-api": "^1.0.2",
|
||||
@@ -35,6 +33,7 @@
|
||||
"faker": "^4.1.0",
|
||||
"fingerprintjs2": "^1.8.0",
|
||||
"googleapis": "^32.0.0",
|
||||
"https": "^1.0.0",
|
||||
"https-proxy-agent": "^2.2.1",
|
||||
"md5": "^2.2.1",
|
||||
"moment": "^2.22.2",
|
||||
|
||||
Reference in New Issue
Block a user