Add Avatar (doesn't work yet) and fix Creator

This commit is contained in:
eTronic
2018-07-09 22:22:51 -04:00
parent 4d81a18fd7
commit 1237039c10
6 changed files with 186 additions and 6 deletions

140
Avatar.js Normal file
View File

@@ -0,0 +1,140 @@
import fs from 'fs';
import request from 'request';
import prompts from 'prompts';
import awsSignRequests from 'aws-sign-requests';
import { parseString } from 'xml2js';
import { accounts } from './accounts.json';
import { HEADERS, SERVER_URL } from './config';
export default class Avatar {
constructor() {
this.logger = null;
this.playersReturned = 0;
}
async run() {
console.log(`You have ${accounts.length} players available!\n`);
const getChoice = async () => {
const response = await prompts([
{
type: 'number',
name: 'count',
message: 'Number of Players to Change Avatar:',
},
]);
return response;
};
const response = await getChoice();
const { count } = response;
const players = accounts.sort(() => Math.round(Math.random()) - 0.5);
for (let i = 0; i < count; i++) {
this.changeAvatar(players[i]);
}
const getSummary = setInterval(() => {
if (this.playersReturned === count) {
fs.writeFile('accounts.json', players, 'utf8', (err, data) => {
if (err) {
console.log('Error saving accounts: ', err);
}
console.log('Done!');
});
clearInterval(getSummary);
}
}, 1000);
}
changeAvatar(player) {
const { username } = player;
console.log(`Attempting to change ${username}'s avatar...`);
request({
url: `https://${SERVER_URL}/credentials/s3`,
headers: {
...HEADERS,
authorization: `Bearer ${player.accessToken}`,
}
}, (error, response, body) => {
try {
const result = JSON.parse(body);
const { error, accessKeyId, secretKey, sessionToken, expiration } = result;
if (error) {
console.log(`Error: ${error}`);
return;
}
this.uploadAvatar({ ...result, player });
} catch (error) {
console.log('Error\n', error.toString('utf8'));
}
});
}
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);
});
});
});
}
setAvatar(player) {
const filename = `https://hypespace-quiz.s3.amazonaws.com/avatars/${player.username}.jpg`;
const options = {
headers: {
...HEADERS,
authorization: `Bearer ${player.accessToken}`,
},
json: true,
body: JSON.stringify({avatarUrl: filename}),
};
request.put(`https://${SERVER_URL}/users/me/avatarUrl`, options)
.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) {
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

@@ -37,7 +37,7 @@ export default class Creator {
const response = await getChoice();
const { count, referral } = response;
const priceCheckRequest = await request(`https://cloudsms.io/api/number/price?key=${this.apiKey}&service=3&tier=0`);
const priceCheckRequest = await request(`https://cloudsms.io/api/number/price?key=${this.apiKey}&service=7&tier=0`);
const { balance, price } = JSON.parse(priceCheckRequest.body);
const totalPrice = price * count;
@@ -128,7 +128,7 @@ export default class Creator {
async register(count, referral) {
for (let i = 0; i < count; i++) {
console.log(`Generating phone number for account #${i + 1}...`);
const newNumberRequest = await request(`https://cloudsms.io/api/number?key=${this.apiKey}&service=3&tier=0`);
const newNumberRequest = await request(`https://cloudsms.io/api/number?key=${this.apiKey}&service=7&tier=0`);
const { status, error, number } = JSON.parse(newNumberRequest.body);
if (status === 'error') {
@@ -141,8 +141,11 @@ export default class Creator {
const verificationId = await this.verifyNumber(number);
if (!verificationId) return;
console.log(`Successfully verified with id ${verificationId}! Checking for confirmation code...`);
console.log(`Successfully verified with id ${verificationId}! Waiting for 10 seconds then checking for confirmation code...`);
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
await delay(10000);
const confirmationCode = await this.readSMS(number);
if (!confirmationCode) return;
@@ -191,7 +194,7 @@ export default class Creator {
}
async readSMS(number) {
const messageRequest = await request(`https://cloudsms.io/api/number/messages?key=${this.apiKey}&number=${number}&recent=30`);
const messageRequest = await request(`https://cloudsms.io/api/number/messages?key=${this.apiKey}&number=${number}`);
const { status, error, messages } = JSON.parse(messageRequest.body);
if (status === 'error') {

View File

@@ -5,6 +5,7 @@ import Summary from './Summary';
import Weekly from './Weekly';
import Cashout from './Cashout';
import TopPlayers from './TopPlayers';
import Avatar from './Avatar';
import * as config from './config';
import { LOG_TYPES } from './constants';
@@ -13,6 +14,7 @@ const choices = [
{ title: 'Play Trivia', select: () => new Trivia().run() },
{ title: 'Create Account', select: () => new Creator().run() },
{ title: 'Update Weekly Lives', select: () => new Weekly().run() },
{ title: 'Change Avatars', select: () => new Avatar().run() },
{ title: 'Show Player Summaries', select: () => new Summary().run() },
{ title: 'Show Top Players', select: () => new TopPlayers().run() },
{ title: 'Cashout', select: () => new Cashout().run() },

29
package-lock.json generated
View File

@@ -129,6 +129,16 @@
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"aws-sign": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.1.2.tgz",
"integrity": "sha1-BsMcnXDau0eXNgfEv/6wp75mEWg="
},
"aws-sign-requests": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/aws-sign-requests/-/aws-sign-requests-0.4.0.tgz",
"integrity": "sha512-TCtwBCiCcTx2fcZut23QC71dk7GuI/1XxJ5EOixGghBhl2V1E4EqsKxJx3jFfvll62waQdltuyTK2edBEQFgeg=="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -7041,6 +7051,11 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
@@ -7287,6 +7302,20 @@
"async-limiter": "1.0.0"
}
},
"xml2js": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
"integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
"requires": {
"sax": "1.2.4",
"xmlbuilder": "9.0.7"
}
},
"xmlbuilder": {
"version": "9.0.7",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
"integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",

View File

@@ -25,6 +25,9 @@
},
"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",
"discord.js": "^11.3.2",
@@ -41,6 +44,7 @@
"request": "^2.87.0",
"request-promise": "^4.2.2",
"url": "^0.11.0",
"ws": "^5.2.1"
"ws": "^5.2.1",
"xml2js": "^0.4.19"
}
}

View File

@@ -513,7 +513,9 @@ export default class Trivia {
removePlayer(userId) {
const player = this.players.find(player => player.userId === userId);
player.removePlayer();
if (player) {
player.removePlayer();
}
this.players = this.players.filter(player => player.userId !== userId);
}