From dc34a07711184fcf1e743f38271b12d7adfc5fbc Mon Sep 17 00:00:00 2001 From: Revadike Date: Sat, 18 Apr 2020 07:06:20 +0200 Subject: [PATCH] V1.2.1 --- .eslintrc.json | 173 ++++++++++++++++++++++++++++++++++++++++ README.md | 6 +- config.json | 3 +- gimme_free_epic_shit.js | 52 ++++++------ package.json | 24 ++++-- 5 files changed, 227 insertions(+), 31 deletions(-) create mode 100644 .eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..e4af0bc --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,173 @@ +{ + "env": { + "browser": true, + "node": true, + "es6": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 2018 + }, + "rules": { + "accessor-pairs": "error", + "array-bracket-newline": ["error", "consistent"], + "array-bracket-spacing": ["error", "never", { "arraysInArrays": true }], + "array-callback-return": "error", + "array-element-newline": ["error", "consistent"], + "arrow-body-style": "error", + "arrow-parens": ["error", "as-needed"], + "arrow-spacing": "error", + "block-scoped-var": "error", + "block-spacing": "error", + "brace-style": ["error", "1tbs", { "allowSingleLine": true }], + "camelcase": "error", + "class-methods-use-this": "error", + "comma-dangle": ["error", "only-multiline"], + "comma-spacing": "error", + "comma-style": "error", + "complexity": "error", + "computed-property-spacing": "error", + "consistent-return": "error", + "consistent-this": "error", + "curly": "error", + "default-param-last": "error", + "dot-location": ["error", "property"], + "dot-notation": "error", + "eol-last": "error", + "eqeqeq": ["error", "smart"], + "func-call-spacing": "error", + "func-name-matching": "error", + "func-names": "error", + "func-style": ["error", "declaration", { "allowArrowFunctions": true }], + "function-call-argument-newline": ["error", "consistent"], + "function-paren-newline": ["error", "consistent"], + "generator-star-spacing": "error", + "grouped-accessor-pairs": ["error", "getBeforeSet"], + "implicit-arrow-linebreak": "error", + "indent": ["error", 4, { "SwitchCase": 1 }], + "init-declarations": "error", + "key-spacing": ["error", { "mode": "minimum", "align": "value" }], + "keyword-spacing": "error", + "linebreak-style": "error", + "lines-between-class-members": ["error", "always"], + "max-classes-per-file": "error", + "max-depth": "error", + "max-len": ["error", 130], + "max-nested-callbacks": ["error", 4], + "max-statements-per-line": ["error", { "max": 2 }], + "new-parens": "error", + "newline-per-chained-call": "error", + "no-alert": "error", + "no-array-constructor": "error", + "no-caller": "error", + "no-case-declarations": "error", + "no-confusing-arrow": "error", + "no-constructor-return": "error", + "no-dupe-else-if": "error", + "no-duplicate-imports": "error", + "no-else-return": "error", + "no-empty-function": "error", + "no-eq-null": "error", + "no-eval": "error", + "no-extend-native": "error", + "no-floating-decimal": "error", + "no-implicit-coercion": "error", + "no-implied-eval": "error", + "no-invalid-this": "error", + "no-iterator": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-lonely-if": "error", + "no-loop-func": "error", + "no-mixed-operators": "error", + "no-multi-assign": "error", + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 0, "maxBOF": 0 }], + "no-negated-condition": "error", + "no-nested-ternary": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-wrappers": "error", + "no-octal": "error", + "no-octal-escape": "error", + "no-param-reassign": "error", + "no-proto": "error", + "no-redeclare": "error", + "no-return-assign": "error", + "no-return-await": "error", + "no-script-url": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-setter-return": "error", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-undefined": "error", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": ["error", { "defaultAssignment": false }], + "no-unused-expressions": "error", + "no-use-before-define": "error", + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-var": "error", + "no-void": "error", + "no-with": "error", + "no-whitespace-before-property": "error", + "nonblock-statement-body-position": "error", + "object-curly-newline": "error", + "object-curly-spacing": ["error", "always"], + "object-property-newline": ["error", { "allowAllPropertiesOnSameLine": true }], + "object-shorthand": "error", + "one-var-declaration-per-line": "error", + "operator-assignment": "error", + "operator-linebreak": ["error", "before"], + "padded-blocks": ["error", { "blocks": "never", "classes": "always", "switches": "never" }, { "allowSingleLineBlocks": true }], + "padding-line-between-statements": [ + "error", + { "blankLine": "always", "prev": "function", "next": "function" } + ], + "prefer-arrow-callback": "error", + "prefer-destructuring": ["error", { "array": false, "object": true }], + "prefer-exponentiation-operator": "error", + "prefer-numeric-literals": "error", + "prefer-object-spread": "error", + "prefer-promise-reject-errors": "error", + "prefer-regex-literals": "error", + "prefer-rest-params": "error", + "prefer-spread": "error", + "prefer-template": "error", + "quote-props": "error", + "quotes": ["error", "double", { "avoidEscape": true }], + "radix": ["error", "as-needed"], + "require-await": "error", + "rest-spread-spacing": "error", + "semi": ["error", "always"], + "semi-spacing": "error", + "semi-style": "error", + "sort-imports": "error", + "space-before-blocks": "error", + "space-before-function-paren": ["error", "never"], + "space-in-parens": "error", + "space-infix-ops": "error", + "space-unary-ops": "error", + "spaced-comment": "error", + "strict": ["error", "global"], + "switch-colon-spacing": "error", + "symbol-description": "error", + "template-curly-spacing": "error", + "template-tag-spacing": "error", + "unicode-bom": "error", + "vars-on-top": "error", + "wrap-iife": ["error", "inside"], + "yield-star-spacing": "error", + "yoda": "error" + } +} \ No newline at end of file diff --git a/README.md b/README.md index 906a137..f3476f8 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Claim [available free game promotions](https://www.epicgames.com/store/free-game 1. Download/clone repo 2. (Optional) Edit `config.json` to include your EpicGames credentials 3. Run `npm install` -4. Run `node gimme_free_epic_shit` or `node gimme_free_epic_shit USERNAME PASSWORD`* +4. Run `node gimme_free_epic_shit` or `node gimme_free_epic_shit USERNAME PASSWORD 0/1`* *Only this step is required after the initial use. @@ -24,6 +24,10 @@ Also, this is a good alternative, in case you don't like using Epic's client or To which I will say, why not? Most of these games are actually outstanding games! Even if you don't like Epic and their shenanigans, you will be pleased to know that Epic actually funds all the free copies that are given away: ["But we actually found it was more economical to pay developers [a lump sum] to distribute their game free for two weeks..."](https://arstechnica.com/gaming/2019/03/epic-ceo-youre-going-to-see-lower-prices-on-epic-games-store/) ## Changelog +### V1.2.1 + * Makes `rememberLastSession` optional in config or launch parameter (Closes #8) + * Added ESLint linter + ### V1.2.0 * Now allows web login, if normal login fails, e.g. due to captcha (Closes #3) diff --git a/config.json b/config.json index 539e797..c1f1ac7 100644 --- a/config.json +++ b/config.json @@ -1,4 +1,5 @@ { "email": "YOUR_EMAIL_HERE", - "password": "YOUR_PASSWORD_HERE" + "password": "YOUR_PASSWORD_HERE", + "rememberLastSession": true } \ No newline at end of file diff --git a/gimme_free_epic_shit.js b/gimme_free_epic_shit.js index 93a962e..cfc3e55 100644 --- a/gimme_free_epic_shit.js +++ b/gimme_free_epic_shit.js @@ -1,34 +1,39 @@ -const { Launcher: EpicGames } = require(`epicgames-client`); -const { email, password } = require(`${__dirname}/config.json`); +"use strict"; +const { "Launcher": EpicGames } = require("epicgames-client"); +const { email, password, rememberLastSession } = require(`${__dirname}/config.json`); const credentials = { - email: process.argv[2] || email, - password: process.argv[3] || password, - rememberLastSession: true + "email": process.argv[2] || email, + "password": process.argv[3] || password }; -const client = new EpicGames(credentials); -(async () => { +if (typeof process.argv[4] === "undefined") { + credentials.rememberLastSession = rememberLastSession; +} else { + credentials.rememberLastSession = Boolean(Number(process.argv[4])); +} + +(async() => { + const client = new EpicGames(credentials); + if (!await client.init()) { - throw new Error('Error while initialize process.'); + throw new Error("Error while initialize process."); } - if (!await client.login().catch(() => {})) { + if (!await client.login().catch(() => false)) { console.log(`Failed to login as ${client.config.email}, please attempt manually.`); - const ClientLoginAdapter = require(`epicgames-client-login-adapter`); - credentials.login = credentials.email; - + const ClientLoginAdapter = require("epicgames-client-login-adapter"); let auth = await ClientLoginAdapter.init(credentials); let exchangeCode = await auth.getExchangeCode(); await auth.close(); - + if (!await client.login(null, exchangeCode)) { - throw new Error(`Error while logging in.`); + throw new Error("Error while logging in."); } } - + console.log(`Logged in as ${client.account.name} (${client.account.id})`); - let getAllOffers = async (namespace, pagesize=100) => { + let getAllOffers = async(namespace, pagesize = 100) => { let i = 0; let results = []; while ((i * pagesize) - results.length === 0) { @@ -38,11 +43,11 @@ const client = new EpicGames(credentials); return results; }; - let all = await getAllOffers(`epic`); + let all = await getAllOffers("epic"); let freegames = all - .filter(game => game.categories.find(cat => cat.path === `freegames`) && - game.customAttributes[`com.epicgames.app.offerNs`].value) - .map(game => game.customAttributes[`com.epicgames.app.offerNs`].value); + .filter(game => game.categories.find(cat => cat.path === "freegames") + && game.customAttributes["com.epicgames.app.offerNs"].value) + .map(game => game.customAttributes["com.epicgames.app.offerNs"].value); for (let namespace of freegames) { let offers = await getAllOffers(namespace); @@ -60,10 +65,9 @@ const client = new EpicGames(credentials); } await client.logout(); - console.log(`Logged out of Epic Games`); + console.log("Logged out of Epic Games"); process.exit(0); - })().catch(err => { console.error(err); - process.exit(1) -}); \ No newline at end of file + process.exit(1); +}); diff --git a/package.json b/package.json index c319b39..2ca9708 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,26 @@ { "name": "epicgames-freebies-claimer", + "version": "1.2.1", "description": "Claim free game promotions from the Epic Game Store", - "version": "1.2.0", - "author": "Revadike", - "homepage": "https://revadike.com", - "url": "https://github.com/revadike/epicgames-freebies-claimer", - "license": "MIT", + "author": "Revadike ", "main": "gimme_free_epic_shit.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node gimme_free_epic_shit.js" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/revadike/epicgames-freebies-claimer.git" + }, + "bugs": { + "url": "https://github.com/revadike/epicgames-freebies-claimer/issues" + }, + "homepage": "https://github.com/revadike/epicgames-freebies-claimer", + "url": "https://github.com/revadike/epicgames-freebies-claimer", + "devDependencies": { + "eslint": "^6.8.0" + }, "dependencies": { "epicgames-client": "^2.0.23", "epicgames-client-login-adapter": "^0.1.0"