forked from 834772509/Epicgame-Action
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathclaimer.js
118 lines (104 loc) · 4.35 KB
/
claimer.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
"use strict";
const { "Launcher": EpicGames } = require("epicgames-client");
const { freeGamesPromotions } = require("./src/gamePromotions");
const { writeFile } = require("fs");
const Auths = require(`${__dirname}/device_auths.json`);
const CheckUpdate = require("check-update-github");
const Config = require(`${__dirname}/config.json`);
const History = require(`${__dirname}/history.json`);
const Logger = require("tracer").console(`${__dirname}/logger.js`);
const Package = require("./package.json");
function isUpToDate() {
return new Promise((res, rej) => {
CheckUpdate({
"name": Package.name,
"currentVersion": Package.version,
"user": "revadike",
"branch": "master",
}, (err, latestVersion) => {
if (err) {
rej(err);
} else {
res(latestVersion === Package.version);
}
});
});
}
function write(path, data) {
// eslint-disable-next-line no-extra-parens
return new Promise((res, rej) => writeFile(path, data, (err) => (err ? rej(err) : res(true))));
}
function sleep(delay) {
return new Promise((res) => setTimeout(res, delay * 60000));
}
(async() => {
let { options, delay, loop } = Config;
do {
if (!await isUpToDate()) {
Logger.warn(`There is a new version available: ${Package.url}`);
}
for (let email in Auths) {
let { country } = Auths[email];
let claimedPromos = History[email] || [];
let useDeviceAuth = true;
let clientOptions = { email, ...options };
let client = new EpicGames(clientOptions);
if (!await client.init()) {
Logger.error("Error while initialize process.");
break;
}
// Check before logging in
let freePromos = await freeGamesPromotions(client, country, country);
let unclaimedPromos = freePromos.filter((offer) => !claimedPromos.find(
(_offer) => _offer.id === offer.id && _offer.namespace === offer.namespace,
));
Logger.info(`Found ${unclaimedPromos.length} unclaimed freebie(s) for ${email}`);
if (unclaimedPromos.length === 0) {
continue;
}
let success = await client.login({ useDeviceAuth }).catch(() => false);
if (!success) {
Logger.error(`Failed to login as ${client.config.email}`);
continue;
}
Logger.info(`Logged in as ${client.account.name} (${client.account.id})`);
Auths[email].country = client.account.country;
write(`${__dirname}/device_auths.json`, JSON.stringify(Auths, null, 4)).catch(() => false); // ignore fails
for (let offer of unclaimedPromos) {
try {
let purchased = await client.purchase(offer, 1);
if (purchased) {
Logger.info(`Successfully claimed ${offer.title} (${purchased})`);
} else {
Logger.warn(`${offer.title} was already claimed for this account`);
}
// Also remember already claimed offers
offer.date = Date.now();
claimedPromos.push(offer);
} catch (err) {
Logger.warn(`Failed to claim ${offer.title} (${err})`);
if (err.response
&& err.response.body
&& err.response.body.errorCode === "errors.com.epicgames.purchase.purchase.captcha.challenge") {
// It's pointless to try next one as we'll be asked for captcha again.
Logger.error("Aborting!");
break;
}
}
}
History[email] = claimedPromos;
await client.logout();
Logger.info(`Logged ${client.account.name} out of Epic Games`);
}
await write(`${__dirname}/history.json`, JSON.stringify(History, null, 4));
if (loop) {
Logger.info(`Waiting ${delay} minutes`);
await sleep(delay);
} else {
process.exit(0);
}
} while (loop);
})().catch((err) => {
Logger.error(err);
process.exit(1);
});