Fix Avatar Uploading and Cashout

This commit is contained in:
eTronic
2018-07-11 12:55:05 -04:00
parent d2a0e23ff1
commit 0ec2744e0b
7 changed files with 190 additions and 61 deletions

102
Avatar.js
View File

@@ -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++;
});

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -421,7 +421,7 @@ export default class Scraper {
}
getSuggestion() {
if (this.ticker < 3) {
if (this.ticker < 5) {
return 'Wait';
}

View File

@@ -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
View File

@@ -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",

View File

@@ -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",