-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
161 lines (136 loc) · 4.37 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
const puppeteer = require('puppeteer');
const timer = require('./utilities/timer');
const logger = require('./utilities/logger');
const urls = require('./data/urls.json');
const selectors = require('./data/selectors.json');
const config = require('./config.json');
const delaysEnabled = config.timings.delays.enabled;
const minDelay = config.timings.delays.min * 1000;
const maxDelay = config.timings.delays.max * 1000;
const descriptions = config.bump.descriptions.list;
// Browser options
var browserOptions = {
headless: config.browser.hide,
};
if (config.browser.custom.enabled) {
browserOptions.executablePath = config.browser.custom.path;
}
var typingOptions = {};
if (config.timings.typingDelays.enabled) {
typingOptions.delay = config.timings.typingDelays.delay;
}
async function bumpServer() {
// Open browser
logger.log('Opening browser...');
const browser = await launchBrowser();
const page = await browser.newPage();
// Input username and password
logger.log('Inputing username and password...');
await page.goto(urls.base + urls.pages.login);
await page.type(selectors.fields.username, config.account.username, typingOptions);
await page.type(selectors.fields.password, config.account.password, typingOptions);
await delay(page);
// Login
logger.log('Logging in...');
await page.click(selectors.buttons.login);
try {
await page.waitForSelector(selectors.indicators.dashboard);
} catch (error) {
logger.error('Login failed. Please check if the username and password are correct.');
await closeBrowser(browser);
return;
}
await delay(page);
// Nagivate to "Edit Server" page
logger.log('Navigating to "Edit Server" page...');
await page.goto(
`${urls.base}${urls.pages.edit}?${urls.queries.serverId}=${config.account.serverId}`
);
// Check if editing is allowed
const selector = selectors.error;
const success = await page.evaluate(selector => {
return document.querySelectorAll(selector).length === 0;
}, selector);
if (!success) {
logger.error('Editing failed. Please check if the server ID is correct.');
await closeBrowser(browser);
return;
}
await delay(page);
// Set description
if (config.bump.descriptions.enabled) {
const selector = selectors.fields.description;
const description = getRandomDescription();
await page.evaluate(
({ selector, description }) => {
document.querySelector(selector).value = description;
},
{
selector,
description,
}
);
}
// Bump server
if (config.bump.enabled) {
logger.log('Bumping Server...');
await page.evaluate(() => {
saveServer();
});
await delay(page);
}
// Logout
logger.log('Logging out...');
await page.goto(urls.base + urls.pages.logout);
// Close browser
await closeBrowser(browser);
}
async function launchBrowser() {
try {
const browser = await puppeteer.launch(browserOptions);
browser.on('disconnected', async () => {
logger.log('Browser disconnected.');
exit();
});
return browser;
} catch (error) {
logger.error(
'Failed to launch browser. Please check if the executable path is correct or try changing the browser hide option.'
);
exit();
}
}
async function closeBrowser(browser) {
logger.log('Closing browser...');
await browser.close();
}
function getRandomDescription() {
return descriptions[Math.floor(Math.random() * descriptions.length)];
}
async function delay(page) {
if (delaysEnabled) {
const delay = generateRandomDelay();
const time = timer.format(timer.getTimeAfterMs(delay));
logger.log(`Waiting ${delay / 1000} seconds, until "${time}"...`);
await page.waitFor(delay);
}
}
function generateRandomDelay() {
return Math.floor(Math.random() * (maxDelay - minDelay + 1) + minDelay);
}
function exit() {
if (!module.parent) {
process.exit();
}
}
process.on('unhandledRejection', (reason, promise) => {
console.error('Error: Unhandled rejection. Reason: ', reason);
exit();
});
// Main function
if (!module.parent) {
bumpServer();
}
module.exports = {
bumpServer,
};