From b1ed1a8520ca3852b53de9ec55dc06af82dc44e6 Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Mon, 7 Mar 2022 17:40:28 +0100 Subject: [PATCH 01/10] Added images to item set modal --- style.css | 3 +++ tags/item-set.tag | 27 ++++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/style.css b/style.css index 2ec662b..a41daf3 100644 --- a/style.css +++ b/style.css @@ -482,3 +482,6 @@ span > i1-8n, display: flex; justify-content: space-evenly; } +.item-img{ + border-radius: 500rem; +} \ No newline at end of file diff --git a/tags/item-set.tag b/tags/item-set.tag index 6915bba..e960ca3 100644 --- a/tags/item-set.tag +++ b/tags/item-set.tag @@ -12,21 +12,30 @@

items.start_items

-
- {item} -
+ +
+ +
{item}
+
+

items.core_items

-
- {item} -
+ +
+ +
{item}
+
+

items.big_items

-
- {item} -
+ +
+ +
{item}
+
+
From 6be4b48f79e61d4e89f831c72d31f7e10ae860f4 Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Mon, 7 Mar 2022 17:41:27 +0100 Subject: [PATCH 02/10] Renamed itemlist, itembuttons to item-list, item-buttons --- style.css | 4 ++-- tags/item-set.tag | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/style.css b/style.css index a41daf3..63b847b 100644 --- a/style.css +++ b/style.css @@ -473,12 +473,12 @@ span > i1-8n, .ui.modal .scrolling::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-grey-hover) !important; } -.itemlist { +.item-list { text-align: center; word-break: break-word; justify-items: end; } -.itembuttons { +.item-buttons { display: flex; justify-content: space-evenly; } diff --git a/tags/item-set.tag b/tags/item-set.tag index e960ca3..0251d2f 100644 --- a/tags/item-set.tag +++ b/tags/item-set.tag @@ -6,12 +6,12 @@
-
+
items.upload_items
items.delete_items

items.start_items

-
+
@@ -20,7 +20,7 @@

items.core_items

-
+
@@ -29,7 +29,7 @@

items.big_items

-
+
From 025f32b1cc6e66b88db4c0e661379f77e8394867 Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Mon, 7 Mar 2022 18:31:19 +0100 Subject: [PATCH 03/10] Added price and changed styles --- tags/item-set.tag | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tags/item-set.tag b/tags/item-set.tag index 0251d2f..7a9023f 100644 --- a/tags/item-set.tag +++ b/tags/item-set.tag @@ -13,27 +13,30 @@

items.start_items

-
+
-
{item}
+
{item}
+
Price: {freezer.get().itemsinfo[opts.current.champ_data.pages[opts.page].itemSet.raw_data.start_items.build[key]].gold.base}

items.core_items

-
+
-
{item}
+
{item}
+
Price: {freezer.get().itemsinfo[opts.current.champ_data.pages[opts.page].itemSet.raw_data.core_items.build[key]].gold.base}

items.big_items

-
- -
{item}
+
+ +
{item}
+
Price: {freezer.get().itemsinfo[opts.current.champ_data.pages[opts.page].itemSet.raw_data.big_items.build[key]].gold.base}
From 9eb7edf0988447cacbac27147d42169df57888ac Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Mon, 7 Mar 2022 18:46:56 +0100 Subject: [PATCH 04/10] Added dynamic lol version to img url --- tags/item-set.tag | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tags/item-set.tag b/tags/item-set.tag index 7a9023f..15f5c5a 100644 --- a/tags/item-set.tag +++ b/tags/item-set.tag @@ -14,7 +14,7 @@
- +
{item}
Price: {freezer.get().itemsinfo[opts.current.champ_data.pages[opts.page].itemSet.raw_data.start_items.build[key]].gold.base}
@@ -24,7 +24,7 @@
- +
{item}
Price: {freezer.get().itemsinfo[opts.current.champ_data.pages[opts.page].itemSet.raw_data.core_items.build[key]].gold.base}
@@ -34,7 +34,7 @@
- +
{item}
Price: {freezer.get().itemsinfo[opts.current.champ_data.pages[opts.page].itemSet.raw_data.big_items.build[key]].gold.base}
From 48901d09ef183c18b898b4bcea263e8597a8fbfb Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Sat, 12 Mar 2022 11:17:30 +0100 Subject: [PATCH 05/10] Added margin so that text is eveningly --- style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/style.css b/style.css index 63b847b..517e718 100644 --- a/style.css +++ b/style.css @@ -484,4 +484,5 @@ span > i1-8n, } .item-img{ border-radius: 500rem; + margin-bottom: 1rem; } \ No newline at end of file From 309d981c8fd280f642345e9d83e77860dff50e1f Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Sat, 12 Mar 2022 11:52:13 +0100 Subject: [PATCH 06/10] Added dynamic locals for itemsInfo --- src/app.js | 486 ++++++++++++++++++++++++++++------------------------- 1 file changed, 258 insertions(+), 228 deletions(-) diff --git a/src/app.js b/src/app.js index eb4ba64..e21fe2d 100644 --- a/src/app.js +++ b/src/app.js @@ -3,8 +3,26 @@ var freezer = require('./state'); var fs = require('fs'); const isDev = !require('electron').remote.require('electron').app.isPackaged; const { groupBy } = require('lodash'); +const LANG_CODES = { + cz: 'cs_CZ', + de: 'de_DE', + en: 'en_US', + fr: 'fr_FR', + gr: 'el_GR', + es: 'es_ES', + hu: 'hu_HU', + it: 'it_IT', + pl: 'pl_PL', + pt_br: 'pt_BR', + pt: 'en_US',// lol doesnt have these in ther lang codes + ro: 'ro_RO', + rs: 'en_US', + ru: 'ru_RU', + se: 'en_US', + tr: 'tr_TR' +} -if(settings.get("darktheme") == null){ +if (settings.get("darktheme") == null) { const { nativeTheme } = require('electron').remote.require('electron') settings.set("darktheme", nativeTheme.shouldUseDarkColors ?? false); } @@ -25,7 +43,7 @@ freezer.get().tab.set({ active: settings.get("lasttab"), loaded: true }); var request = require('request'); -var {ipcRenderer} = require('electron'); +var { ipcRenderer } = require('electron'); ipcRenderer.on('updateinfo:ready', (event, arg) => { // Determining whether an update is available var appVersion = require('electron').remote.app.getVersion(); @@ -33,7 +51,7 @@ ipcRenderer.on('updateinfo:ready', (event, arg) => { isUpdateAvailable = latestv !== appVersion && !isDev; // Is this really necessary? => The log can only be seen by Dev anyway - if(isUpdateAvailable){ + if (isUpdateAvailable) { console.log("github new latest found"); } @@ -79,6 +97,7 @@ freezer.on("favautoupload:switch", (val) => { freezer.on("lang:update", (val) => { freezer.get().configfile.set("lang", val); settings.set("lang", val); + getItemsJson(freezer.get().lolversions[0], val || 'en_US'); }); (setMinimizeButtonBehaviour = () => { @@ -114,14 +133,14 @@ freezer.on("content:reload", () => { freezer.on("changelog:ready", () => { var appVersion = require('electron').remote.app.getVersion(); console.log(appVersion, settings.get("changelogversion")) - if(settings.get("changelogversion") != appVersion) { + if (settings.get("changelogversion") != appVersion) { freezer.get().set("showchangelog", true); settings.set("changelogversion", appVersion); } }); request('https://ddragon.leagueoflegends.com/api/versions.json', function (error, response, data) { - if(!error && response && response.statusCode == 200) { + if (!error && response && response.statusCode == 200) { var ver = JSON.parse(data); freezer.get().set('lolversions', ver); freezer.emit("version:set", ver[0]); @@ -130,34 +149,27 @@ request('https://ddragon.leagueoflegends.com/api/versions.json', function (error }); freezer.on('version:set', (ver) => { - request('https://ddragon.leagueoflegends.com/cdn/'+ver+'/data/en_US/runesReforged.json', function(error, response, data) { - if(!error && response && response.statusCode == 200){ + request('https://ddragon.leagueoflegends.com/cdn/' + ver + '/data/en_US/runesReforged.json', function (error, response, data) { + if (!error && response && response.statusCode == 200) { freezer.get().set('runesreforgedinfo', JSON.parse(data)); } else throw Error("Couldn't fetch runesReforged.json from ddragon.") }); - request('https://ddragon.leagueoflegends.com/cdn/'+ver+'/data/en_US/champion.json', function(error, response, data) { - if(!error && response && response.statusCode == 200){ + request('https://ddragon.leagueoflegends.com/cdn/' + ver + '/data/en_US/champion.json', function (error, response, data) { + if (!error && response && response.statusCode == 200) { freezer.get().set('championsinfo', JSON.parse(data).data); freezer.emit("championsinfo:set"); } else throw Error("Couldn't fetch champions.json from ddragon.") }); - request('https://ddragon.leagueoflegends.com/cdn/'+ver+'/data/en_US/item.json', - function (error, response, data) { - if (!error && response && response.statusCode == 200) { - freezer.get().set("itemsinfo", JSON.parse(data).data); - freezer.emit("itemsinfo:set"); - } else throw Error("Couldn't fetch item.json from ddragon."); - } - ); + getItemsJson(ver, freezer.get().configfile.lang || 'en_US'); }); freezer.on('api:connected', () => { api.get("/lol-summoner/v1/current-summoner").then((res) => { updateConnectionData(); - if(!res) { + if (!res) { console.log("no session response"); return; } @@ -171,7 +183,7 @@ console.log("plugins", plugins); function loadPlugins() { var remote = {}, local = {}; Object.keys(plugins).forEach((key) => { - if(plugins[key].local === true) local[key] = {name: plugins[key].name}; + if (plugins[key].local === true) local[key] = { name: plugins[key].name }; else remote[key] = { name: plugins[key].name, bookmarks: plugins[key].bookmarks || false, @@ -187,8 +199,8 @@ freezer.on('champion:choose', (champion) => { var plugin = state.tab.active; // Check if champion is already been cached before asking the remote plugin - if(state.plugins.remote[plugin] && state.plugins.remote[plugin].cache[champion]) { - freezer.get().current.set({ champion, champ_data: state.plugins.remote[plugin].cache[champion] || {pages: {}} }); + if (state.plugins.remote[plugin] && state.plugins.remote[plugin].cache[champion]) { + freezer.get().current.set({ champion, champ_data: state.plugins.remote[plugin].cache[champion] || { pages: {} } }); console.log("CACHE HIT!"); return; } @@ -200,11 +212,11 @@ freezer.on('champion:choose', (champion) => { getPagesWrapper(plugins[state.tab.active], champion, (res) => { // Cache results obtained from a remote source - if(freezer.get().plugins.remote[plugin]) + if (freezer.get().plugins.remote[plugin]) freezer.get().plugins.remote[plugin].cache.set(champion, res); - if(freezer.get().tab.active != state.tab.active) return; - freezer.get().current.set({ champion, champ_data: res || {pages: {}} }); + if (freezer.get().tab.active != state.tab.active) return; + freezer.get().current.set({ champion, champ_data: res || { pages: {} } }); freezer.get().tab.set({ loaded: true }); }); }); @@ -218,8 +230,8 @@ freezer.on("tab:switch", (tab) => { var champion = state.current.champion; // Check if champion is already been cached before asking the remote plugin - if(state.plugins.remote[plugin] && state.plugins.remote[plugin].cache[champion]) { - freezer.get().current.set({ champ_data: state.plugins.remote[plugin].cache[champion] || {pages: {}} }); + if (state.plugins.remote[plugin] && state.plugins.remote[plugin].cache[champion]) { + freezer.get().current.set({ champ_data: state.plugins.remote[plugin].cache[champion] || { pages: {} } }); console.log("CACHE HIT!"); return; } @@ -228,14 +240,14 @@ freezer.on("tab:switch", (tab) => { state = freezer.get(); - if(!state.current.champion) return; + if (!state.current.champion) return; getPagesWrapper(plugins[state.tab.active], state.current.champion, (res) => { // Cache results obtained from a remote source - if(freezer.get().plugins.remote[plugin]) + if (freezer.get().plugins.remote[plugin]) freezer.get().plugins.remote[plugin].cache.set(champion, res); - - if(freezer.get().tab.active != state.tab.active) return; - freezer.get().current.set({ champ_data: res || {pages: {}} }); + + if (freezer.get().tab.active != state.tab.active) return; + freezer.get().current.set({ champ_data: res || { pages: {} } }); freezer.get().tab.set({ loaded: true }); }); }); @@ -244,7 +256,7 @@ freezer.on('page:fav', (champion, pagename) => { var state = freezer.get(); plugins[state.tab.active].favPage(champion, pagename); getPagesWrapper(plugins[state.tab.active], champion, (res) => { - state.current.champ_data.set(res); + state.current.champ_data.set(res); }); }); @@ -252,17 +264,17 @@ freezer.on('page:delete', (champion, pagename) => { var state = freezer.get(); plugins[state.tab.active].deletePage(champion, pagename); getPagesWrapper(plugins[state.tab.active], champion, (res) => { - state.current.champ_data.set(res); + state.current.champ_data.set(res); }); }); freezer.on('page:unlinkbookmark', (champion, pagename) => { - if(freezer.get().lastbookmarkedpage.champion == champion && freezer.get().lastbookmarkedpage.page == pagename) - freezer.get().lastbookmarkedpage.set({page: null, champion: null}); + if (freezer.get().lastbookmarkedpage.champion == champion && freezer.get().lastbookmarkedpage.page == pagename) + freezer.get().lastbookmarkedpage.set({ page: null, champion: null }); var state = freezer.get(); plugins[state.tab.active].unlinkBookmark(champion, pagename); getPagesWrapper(plugins[state.tab.active], champion, (res) => { - state.current.champ_data.set(res); + state.current.champ_data.set(res); }); }); @@ -278,7 +290,7 @@ freezer.on('page:bookmark', (champion, pagename) => { }); freezer.on('page:syncbookmark', (champion, pagename) => { - freezer.get().lastsyncedpage.set({champion, page: pagename, loading: true}); + freezer.get().lastsyncedpage.set({ champion, page: pagename, loading: true }); var state = freezer.get(); @@ -286,14 +298,14 @@ freezer.on('page:syncbookmark', (champion, pagename) => { console.log(page) plugins[page.bookmark.remote.id].syncBookmark(page.bookmark, (_page) => { - if(!_page) { - freezer.get().lastsyncedpage.set({champion: null, page: null, loading: false}); + if (!_page) { + freezer.get().lastsyncedpage.set({ champion: null, page: null, loading: false }); return; } plugins[state.tab.active].setPage(champion, _page); getPagesWrapper(plugins[state.tab.active], champion, (res) => { state.current.champ_data.set(res); - freezer.get().lastsyncedpage.set({champion, page: _page.name, loading: false}); + freezer.get().lastsyncedpage.set({ champion, page: _page.name, loading: false }); }); }); }); @@ -302,17 +314,17 @@ freezer.on('page:upload', (champion, pagename) => { var state = freezer.get(); console.log("Upload:", pagename); console.log("State pages", state.current.champ_data.pages); - var page = state.current.champ_data.pages[pagename].prepareRunePage; - console.log('upload2', page); + var page = state.current.champ_data.pages[pagename].prepareRunePage; + console.log('upload2', page); console.log("page.id, page.isEditable", state.connection.page.id, state.connection.page.isEditable); - if(state.connection.page.id && state.connection.page.isEditable && state.connection.summonerLevel >= 10) { + if (state.connection.page.id && state.connection.page.isEditable && state.connection.summonerLevel >= 10) { freezer.off('/lol-perks/v1/currentpage:Update'); freezer.get().lastuploadedpage.set({ champion, page: pagename, loading: true }); api.del("/lol-perks/v1/pages/" + freezer.get().connection.page.id).then((res) => { console.log("api delete current page", res); api.post("/lol-perks/v1/pages/", page).then((res) => { - if(!res) { + if (!res) { console.log("Error: no response after page upload request."); api.get("/lol-perks/v1/currentpage").then((res) => { handleCurrentPageUpdate(res); @@ -327,9 +339,9 @@ freezer.on('page:upload', (champion, pagename) => { }); freezer.on('/lol-perks/v1/currentpage:Update', handleCurrentPageUpdate); freezer.get().lastuploadedpage.set({ champion, page: pagename, valid: res.isValid === true, loading: false }); - + var state = freezer.get(); - if(plugins[state.tab.active].local) { + if (plugins[state.tab.active].local) { plugins[state.tab.active].confirmPageValidity(champion, pagename, res); getPagesWrapper(plugins[state.tab.active], champion, (res) => { state.current.champ_data.set(res); @@ -340,13 +352,13 @@ freezer.on('page:upload', (champion, pagename) => { } }); //upload items to client -freezer.on("items:upload", (champ, role, map,itemset) => { - forgeItemSet(champ.replace(/^\w/, (c) => c.toUpperCase()), role, map, itemset.raw_data); +freezer.on("items:upload", (champ, role, map, itemset) => { + forgeItemSet(champ.replace(/^\w/, (c) => c.toUpperCase()), role, map, itemset.raw_data); }); //delete item set freezer.on("items:delete", (champ, role) => { - deleteItemSet(champ.replace(/^\w/, (c) => c.toUpperCase()), role); + deleteItemSet(champ.replace(/^\w/, (c) => c.toUpperCase()), role); }); freezer.on('currentpage:download', () => { @@ -357,7 +369,7 @@ freezer.on('currentpage:download', () => { plugins[state.tab.active].setPage(champion, page); getPagesWrapper(plugins[state.tab.active], champion, (res) => { - state.current.champ_data.set(res); + state.current.champ_data.set(res); }); }); @@ -365,7 +377,7 @@ freezer.on('/lol-summoner/v1/current-summoner:Update', (summoner) => { var state = freezer.get(); state.session.set({ connected: true, state: null }); - if(!summoner.summonerLevel) { + if (!summoner.summonerLevel) { freezer.get().connection.set({ page: null, summonerLevel: 0 }); } else { @@ -378,12 +390,12 @@ function handleCurrentPageUpdate(page) { console.log("currentpage:Update", page.name); state.connection.set({ page }); - if(page.name != freezer.get().lastuploadedpage.page) freezer.get().lastuploadedpage.set({ champion: null, page: null, valid: false }); + if (page.name != freezer.get().lastuploadedpage.page) freezer.get().lastuploadedpage.set({ champion: null, page: null, valid: false }); } function updateConnectionData() { api.get("/lol-perks/v1/currentpage").then((page) => { - if(!page) { + if (!page) { console.log("Error: current page initialization failed"); return; } @@ -392,21 +404,21 @@ function updateConnectionData() { }); api.get("/lol-summoner/v1/current-summoner").then((summoner) => { - if(!summoner) { + if (!summoner) { console.log("no summoner response"); return; } freezer.get().connection.set("summonerLevel", summoner.summonerLevel); }); - api.get("/lol-perks/v1/perks").then((data) => { - if(!data) return; - freezer.get().tooltips.set("rune", data); + api.get("/lol-perks/v1/perks").then((data) => { + if (!data) return; + freezer.get().tooltips.set("rune", data); }); } freezer.on('/lol-perks/v1/perks:Update', (data) => { - if(!data) return; + if (!data) return; freezer.get().tooltips.set("rune", data); }); @@ -417,14 +429,14 @@ freezer.on('/lol-champ-select/v1/session:Delete', () => { }); freezer.on('/lol-champ-select/v1/session:Update', (data) => { - console.log(data); - if (freezer.get().champselect.gameMode === null) { - api.get('/lol-gameflow/v1/session').then((gameflowData) => { - freezer.get().champselect.set({ gameMode: gameflowData.gameData.queue.gameMode }); - console.log(freezer.get().champselect.gameMode); - }); - } - handleChampionUpdate(data); + console.log(data); + if (freezer.get().champselect.gameMode === null) { + api.get('/lol-gameflow/v1/session').then((gameflowData) => { + freezer.get().champselect.set({ gameMode: gameflowData.gameData.queue.gameMode }); + console.log(freezer.get().champselect.gameMode); + }); + } + handleChampionUpdate(data); }); freezer.on("autochamp:enable", () => { @@ -434,13 +446,13 @@ freezer.on("autochamp:enable", () => { // Check if a champ was already selected in client api.get("/lol-champ-select/v1/session").then((data) => { console.log(data) - if(!data) return; + if (!data) return; handleChampionUpdate(data); }); }); function handleChampionUpdate(data) { - var state = freezer.get(); + var state = freezer.get(); var player = data.myTeam.find((el) => data.localPlayerCellId === el.cellId); if (!player) return; @@ -448,7 +460,7 @@ function handleChampionUpdate(data) { if (player.championId === 0) return; // no champ selected = do nothing var champions = state.championsinfo; - var champion = Object.keys(champions).find((el) => champions[el].key == player.championId); + var champion = Object.keys(champions).find((el) => champions[el].key == player.championId); // Detect champion hover if (state.autochamp === true) { @@ -456,37 +468,37 @@ function handleChampionUpdate(data) { // Switch to local and dont query remote plugin. Undesirable for remote-only users, but prevents request spam // if(champion !== state.current.champion) state.tab.set("active", "local"); freezer.emit('champion:choose', champion); - } - - // Favpage autoupload works only in Classic SR games. - // In ARAM & Rotating game modes such automation is disruptive - if (state.champselect.gameMode !== 'CLASSIC') return; - api.get('/lol-champ-select/v1/current-champion').then((championId) => { - console.log('champ locked:', championId); - if (championId !== 0) - handleFavPageUpload(championId); - }); + } + + // Favpage autoupload works only in Classic SR games. + // In ARAM & Rotating game modes such automation is disruptive + if (state.champselect.gameMode !== 'CLASSIC') return; + api.get('/lol-champ-select/v1/current-champion').then((championId) => { + console.log('champ locked:', championId); + if (championId !== 0) + handleFavPageUpload(championId); + }); } function handleFavPageUpload(championId) { - var state = freezer.get(); - console.log(state); - var champions = state.championsinfo; - var champion = Object.keys(champions).find((el) => champions[el].key == championId); - - // If favpage upload is enabled & not ARAM - if (!state.configfile.favautoupload) return; - // Quit if favorite page was already uploaded, - // or current champion doesn't match what is hovered ingame - if (state.champselect.favUploaded || state.current.champion !== champion) return; - // Is there a favpage for current champ? - var favpage = state.current.champ_data.fav; - if (!favpage) return; - - // All checks passed - console.log("Uploading Fav page:", favpage); - freezer.emit('page:upload', champion, favpage); - state.champselect.set({ favUploaded: true }); + var state = freezer.get(); + console.log(state); + var champions = state.championsinfo; + var champion = Object.keys(champions).find((el) => champions[el].key == championId); + + // If favpage upload is enabled & not ARAM + if (!state.configfile.favautoupload) return; + // Quit if favorite page was already uploaded, + // or current champion doesn't match what is hovered ingame + if (state.champselect.favUploaded || state.current.champion !== champion) return; + // Is there a favpage for current champ? + var favpage = state.current.champ_data.fav; + if (!favpage) return; + + // All checks passed + console.log("Uploading Fav page:", favpage); + freezer.emit('page:upload', champion, favpage); + state.champselect.set({ favUploaded: true }); } freezer.on("autochamp:disable", () => { @@ -502,14 +514,14 @@ const api = require('./lcu-api'); const { platform } = require('os'); connector.on('connect', (data) => { - console.log("client found"); - api.bind(data); + console.log("client found"); + api.bind(data); }); connector.on('disconnect', () => { console.log("client closed"); api.destroy(); - freezer.get().champselect.set({ active: false, gameMode: null, favUploaded: false }); + freezer.get().champselect.set({ active: false, gameMode: null, favUploaded: false }); freezer.get().connection.set({ page: null, summonerLevel: 0 }); freezer.get().session.set({ connected: false, state: "" }); }); @@ -525,17 +537,17 @@ connector.start(); * @param callback callback which is called for the return of the data. * @returns all possible rune pages for a particular champion. */ -function getPagesWrapper(plugin, champion, callback){ +function getPagesWrapper(plugin, champion, callback) { // Determine rune pages from the plugin for the champ plugin.getPages(champion, (res) => { // Go through all rune pages - Object.keys(res.pages).forEach(function(key) { + Object.keys(res.pages).forEach(function (key) { // Add a new property that contains a rune page adapted for delivery to LoL res.pages[key].prepareRunePage = prepareRunePage(key, res.pages[key].selectedPerkIds); // Take over sorting from "prepareRunePage" (if not sorted correctly by plugin) res.pages[key].selectedPerkIds = res.pages[key].prepareRunePage.selectedPerkIds; - }); + }); // Return callback(res); @@ -548,78 +560,78 @@ function getPagesWrapper(plugin, champion, callback){ * @param {Array} runes - A list of runes ids * @return {Array} A rune page as expected by LoL. */ - function prepareRunePage(pageName, runes) { - // Minimal rune page as LoL expects it as a handover - let runePageMeta = { - name: pageName, - current: true, - primaryStyleId: -1, - selectedPerkIds: [], - subStyleId: -1, - } - - // Index map for later sorting - const indexes = new Map(); - - // Sorting function that sorts the runes based on the index in the tree - const sortingFunc = (a, b) => indexes.get(a) - indexes.get(b); - - // Creates a tree of style id and the matching runes - const tree = freezer.get().runesreforgedinfo.reduce((obj, curr) => { - obj[curr.id] = [].concat(...curr.slots.map(row => row.runes.map(i => i.id))); - return obj; - }, {}); - - // Creates a list of style ids based on the tree - const styleIds = Object.keys(tree).map(Number); - - // Filters style ids from the runes - const filteredRunes = runes.filter(rune => !styleIds.includes(rune)); - - // Groups the passed runes fit to the respective style id - const groupedRunes = groupBy(filteredRunes, (rune) => { - for (const style of styleIds) { - const runeIndex = tree[style].indexOf(rune); - if (runeIndex !== -1) { - indexes.set(rune, runeIndex); - return style; - } - } - }); - - // Variables for determining the 'primaryStyleId' and 'secondaryStyleId - let primaryStyleLength = -1; - let primaryStyleId = -1; - let secondaryStyleLength = -1; - let secondaryStyleId = -1; - - // Get 'primaryStyleId' and 'secondaryStyleId' based on the number of runes - for (const styleId in groupedRunes) { - if (styleId !== 'undefined') { - if (groupedRunes[styleId].length > primaryStyleLength) { - secondaryStyleId = primaryStyleId; - primaryStyleId = styleId; - primaryStyleLength = groupedRunes[styleId].length; - } else if (groupedRunes[styleId].length >= secondaryStyleLength) { - secondaryStyleId = styleId; - secondaryStyleLength = groupedRunes[styleId].length; - } - } - } - - // Sorts the groups for the respective style - groupedRunes[primaryStyleId].sort(sortingFunc); - groupedRunes[secondaryStyleId].sort(sortingFunc); - - // Merges primary and secondary runes in the correct order - runePageMeta.selectedPerkIds = groupedRunes[primaryStyleId].concat(groupedRunes[secondaryStyleId], groupedRunes['undefined'] ?? []); - - // Set StyleIds - runePageMeta.primaryStyleId = parseInt(primaryStyleId); - runePageMeta.subStyleId = parseInt(secondaryStyleId); - - // Return rune page - return runePageMeta; +function prepareRunePage(pageName, runes) { + // Minimal rune page as LoL expects it as a handover + let runePageMeta = { + name: pageName, + current: true, + primaryStyleId: -1, + selectedPerkIds: [], + subStyleId: -1, + } + + // Index map for later sorting + const indexes = new Map(); + + // Sorting function that sorts the runes based on the index in the tree + const sortingFunc = (a, b) => indexes.get(a) - indexes.get(b); + + // Creates a tree of style id and the matching runes + const tree = freezer.get().runesreforgedinfo.reduce((obj, curr) => { + obj[curr.id] = [].concat(...curr.slots.map(row => row.runes.map(i => i.id))); + return obj; + }, {}); + + // Creates a list of style ids based on the tree + const styleIds = Object.keys(tree).map(Number); + + // Filters style ids from the runes + const filteredRunes = runes.filter(rune => !styleIds.includes(rune)); + + // Groups the passed runes fit to the respective style id + const groupedRunes = groupBy(filteredRunes, (rune) => { + for (const style of styleIds) { + const runeIndex = tree[style].indexOf(rune); + if (runeIndex !== -1) { + indexes.set(rune, runeIndex); + return style; + } + } + }); + + // Variables for determining the 'primaryStyleId' and 'secondaryStyleId + let primaryStyleLength = -1; + let primaryStyleId = -1; + let secondaryStyleLength = -1; + let secondaryStyleId = -1; + + // Get 'primaryStyleId' and 'secondaryStyleId' based on the number of runes + for (const styleId in groupedRunes) { + if (styleId !== 'undefined') { + if (groupedRunes[styleId].length > primaryStyleLength) { + secondaryStyleId = primaryStyleId; + primaryStyleId = styleId; + primaryStyleLength = groupedRunes[styleId].length; + } else if (groupedRunes[styleId].length >= secondaryStyleLength) { + secondaryStyleId = styleId; + secondaryStyleLength = groupedRunes[styleId].length; + } + } + } + + // Sorts the groups for the respective style + groupedRunes[primaryStyleId].sort(sortingFunc); + groupedRunes[secondaryStyleId].sort(sortingFunc); + + // Merges primary and secondary runes in the correct order + runePageMeta.selectedPerkIds = groupedRunes[primaryStyleId].concat(groupedRunes[secondaryStyleId], groupedRunes['undefined'] ?? []); + + // Set StyleIds + runePageMeta.primaryStyleId = parseInt(primaryStyleId); + runePageMeta.subStyleId = parseInt(secondaryStyleId); + + // Return rune page + return runePageMeta; } /** * Creates an item set for a given champ and writes it to a json file located in leaguepath/Config/Champions/{champ}/Recommended/ @@ -628,43 +640,43 @@ function getPagesWrapper(plugin, champion, callback){ * @param {string} map Either aram or normal * @param {object} itemset The object that contains an array of items for every category (start, core, big)_items */ -function forgeItemSet(champ, role, map,itemset) { - // https://static.developer.riotgames.com/docs/lol/maps.json - const mapNameIds ={ - aram: 12, - normal:11 - } - const path = getPathForItemSet(champ); - const file = `${champ}.json`; - data = { - title: `${champ} ${role}`, - type: "custom", - map: "any", - mode: "any", - associatedMaps: [mapNameIds[map]], - associatedChampions: [parseInt(freezer.get().championsinfo[champ].key, 10)], //Champ ID - preferredItemSlots: [], - sortrank: 1, - startedFrom: "blank", - blocks: [], - }; - Object.keys(itemset).forEach((category) => { - data.blocks.push(createItemBlock(itemset[category], category)); - }); - fs.access(path + file, (err) => { - // Directory didn't exists so it must be created - if (err) { - fs.mkdir(path, { recursive: true }, () => { +function forgeItemSet(champ, role, map, itemset) { + // https://static.developer.riotgames.com/docs/lol/maps.json + const mapNameIds = { + aram: 12, + normal: 11 + } + const path = getPathForItemSet(champ); + const file = `${champ}.json`; + data = { + title: `${champ} ${role}`, + type: "custom", + map: "any", + mode: "any", + associatedMaps: [mapNameIds[map]], + associatedChampions: [parseInt(freezer.get().championsinfo[champ].key, 10)], //Champ ID + preferredItemSlots: [], + sortrank: 1, + startedFrom: "blank", + blocks: [], + }; + Object.keys(itemset).forEach((category) => { + data.blocks.push(createItemBlock(itemset[category], category)); + }); + fs.access(path + file, (err) => { + // Directory didn't exists so it must be created + if (err) { + fs.mkdir(path, { recursive: true }, () => { + fs.writeFile(path + file, JSON.stringify(data), "UTF8", (err) => { + if (err) console.Error(err); + }); + }); + } else { fs.writeFile(path + file, JSON.stringify(data), "UTF8", (err) => { if (err) console.Error(err); }); - }); - } else{ - fs.writeFile(path + file, JSON.stringify(data), "UTF8", (err) => { - if (err) console.Error(err); - }); - } - }); + } + }); } /** @@ -674,18 +686,18 @@ function forgeItemSet(champ, role, map,itemset) { * @returns An object that contains the type of the block and an array with item ids and their count */ function createItemBlock(items, category) { - let categoryName = category.replace('_', ' '); - categoryName = categoryName.toLowerCase().split(' ') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); - return { - type: categoryName, - items: items.build.map((item) => { - return { - id: `${item}`, - count: 1, - }; - }), - }; + let categoryName = category.replace('_', ' '); + categoryName = categoryName.toLowerCase().split(' ') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); + return { + type: categoryName, + items: items.build.map((item) => { + return { + id: `${item}`, + count: 1, + }; + }), + }; } /** @@ -693,13 +705,13 @@ function createItemBlock(items, category) { * @param {string} champ Name of the given champ * @param {string} role Name of the intended role e.g support */ -function deleteItemSet(champ){ +function deleteItemSet(champ) { const path = getPathForItemSet(champ); const file = `${champ}.json`; fs.access(path + file, (err) => { - if(err) return; - fs.unlink(path + file, (err) =>{ - if(err) console.log("there was an error!") + if (err) return; + fs.unlink(path + file, (err) => { + if (err) console.log("there was an error!") return; }) }) @@ -709,12 +721,30 @@ function deleteItemSet(champ){ * @param {string} champ Name of the give champ * @returns The path to the directory for the given champ respecting specific platforms */ -function getPathForItemSet(champ){ - if(platform != "win32"){ +function getPathForItemSet(champ) { + if (platform != "win32") { return freezer.get().configfile.leaguepath.replace("LeagueClient.exe", "") + `Config/Champions/${champ}/Recommended/`; } - else{ + else { return path = freezer.get().configfile.leaguepath.replace("LeagueClient.exe", "") + `Config\\Champions\\${champ}\\Recommended\\`; } } + +/** + * Loads item info from ddragon + * @param {string} ver The version of the game + * @param {string} lang The current language of RuneBook + * @returns nothing + * @throws Unable to fetch item info + */ +function getItemsJson(ver, lang) { + request('https://ddragon.leagueoflegends.com/cdn/' + ver + '/data/' + LANG_CODES[freezer.get().configfile.lang] + '/item.json', + function (error, response, data) { + if (!error && response && response.statusCode == 200) { + freezer.get().set("itemsinfo", JSON.parse(data).data); + freezer.emit("itemsinfo:set"); + } else throw Error("Couldn't fetch item.json from ddragon."); + } + ); +} // #endregion From a8cbd890007c277c0d2dccde1bdfda234052a37e Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Sat, 12 Mar 2022 12:09:34 +0100 Subject: [PATCH 07/10] extract itemSet logic for generating item name arrays --- plugins/blitzgg.js | 61 +++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 44 deletions(-) diff --git a/plugins/blitzgg.js b/plugins/blitzgg.js index b12d60f..aaddf28 100644 --- a/plugins/blitzgg.js +++ b/plugins/blitzgg.js @@ -3,15 +3,15 @@ const { removePerkIds } = require('./utils'); // #region Settings const supported_modes = [{ - key: 420, - name: "Ranked", - tier: 'PLATINUM_PLUS' - }, - { - key: 450, - name: 'ARAM', - tier: '', - } + key: 420, + name: "Ranked", + tier: 'PLATINUM_PLUS' +}, +{ + key: 450, + name: 'ARAM', + tier: '', +} ]; const baseApiUrl = 'https://league-champion-aggregate.iesdev.com'; @@ -48,15 +48,15 @@ async function getChampionsJsonAsync(championId, gameMode, position = null, useA // Query URL and get the result var result = await rp({ - uri: requestUri, - json: true - }) - .then(function(response) { + uri: requestUri, + json: true + }) + .then(function (response) { // precheck if data is present (currently blitz.gg sends an empty array if no data is present) - if(response["data"] && response["data"].length > 0) + if (response["data"] && response["data"].length > 0) return response; }) - .catch(function(err) { + .catch(function (err) { if (err.statusCode === 400 || err.statusCode === 403 || err.statusCode === 404 || err.statusCode === 500) console.log("JSON was not found => " + err); else if (err.statusCode === 418) { @@ -94,10 +94,6 @@ function getPage(runesJson, champInfo, gameMode) { // Determine selected perk ids const selectedPerkIds = removePerkIds(perksData).concat(statShards); - //gets an array for with items name for every category - const start_items = getItemArray(runesJson, "most_common_starting_items"); - const core_items = getItemArray(runesJson, "most_common_core_builds"); - const big_items = getItemArray(runesJson, "most_common_big_item_builds"); // Return rune page return { name: `[${gameMode.name}] ${champInfo.name} ${runesJson.role}`.trim(), @@ -112,38 +108,15 @@ function getPage(runesJson, champInfo, gameMode) { } }, itemSet: { - start_items: start_items, - core_items: core_items, - big_items: big_items, - raw_data: { start_items: runesJson["stats"]["most_common_starting_items"], core_items: runesJson["stats"]["most_common_core_builds"], big_items: runesJson["stats"]["most_common_big_item_builds"], - }, }, }; } catch (e) { throw Error(e); } } -/** - * A helper methode to get the name of an item per id - * @param {object} runesJson The object that contains the page and item set info - * @param {string} key The key to get from the object - * @returns An array of item names or an empty array if the key wasn't found - */ -function getItemArray(runesJson, key) { - const itemsmap = freezer.get().itemsinfo; - if (runesJson["stats"][key].build != null) { - return runesJson["stats"][key].build.map((item) => { - try { - return itemsmap[item].name; - } catch (error) { - return "Unknown Item"; - } - }); - } else return []; -} /** * Determines all possible rune pages for a given champion for the specified game mode. * @@ -201,7 +174,7 @@ async function _getPagesAsync(champion, callback) { // sort rune pages based on the key (name) const ordered = {}; - Object.keys(runePages.pages).sort().forEach(function(key) { + Object.keys(runePages.pages).sort().forEach(function (key) { ordered[key] = runePages.pages[key]; }); runePages.pages = ordered; @@ -241,7 +214,7 @@ async function _getPagesAsync(champion, callback) { // sort rune pages based on the key (name) const ordered = {}; - Object.keys(runePages.pages).sort().forEach(function(key) { + Object.keys(runePages.pages).sort().forEach(function (key) { ordered[key] = runePages.pages[key]; }); runePages.pages = ordered; From 0e25097822fbd38fdd4c34f9f7c2d816f41752c3 Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Sat, 12 Mar 2022 12:20:26 +0100 Subject: [PATCH 08/10] Refactored itemSet usage to allow for dynamic lang change --- src/app.js | 22 +++++++++++++++++++++- tags/item-set.tag | 24 ++++++++++++------------ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/app.js b/src/app.js index e21fe2d..8da214e 100644 --- a/src/app.js +++ b/src/app.js @@ -353,7 +353,7 @@ freezer.on('page:upload', (champion, pagename) => { }); //upload items to client freezer.on("items:upload", (champ, role, map, itemset) => { - forgeItemSet(champ.replace(/^\w/, (c) => c.toUpperCase()), role, map, itemset.raw_data); + forgeItemSet(champ.replace(/^\w/, (c) => c.toUpperCase()), role, map, itemset); }); //delete item set @@ -547,6 +547,7 @@ function getPagesWrapper(plugin, champion, callback) { // Take over sorting from "prepareRunePage" (if not sorted correctly by plugin) res.pages[key].selectedPerkIds = res.pages[key].prepareRunePage.selectedPerkIds; + // Checks if the plugin exports itemset }); // Return @@ -730,6 +731,25 @@ function getPathForItemSet(champ) { } } +/** + * A helper methode to get the name of an item per id + * @param {object} runesJson The object that contains the page and item set info + * @param {string} key The key to get from the object + * @returns An array of item names or an empty array if the key wasn't found + */ +function getItemArray(runesJson, key) { + const itemsmap = freezer.get().itemsinfo; + if (runesJson["stats"][key].build != null) { + return runesJson["stats"][key].build.map((item) => { + try { + return itemsmap[item].name; + } catch (error) { + return "Unknown Item"; + } + }); + } else return []; +} + /** * Loads item info from ddragon * @param {string} ver The version of the game diff --git a/tags/item-set.tag b/tags/item-set.tag index 15f5c5a..c81026b 100644 --- a/tags/item-set.tag +++ b/tags/item-set.tag @@ -12,31 +12,31 @@

items.start_items

- +
- -
{item}
-
Price: {freezer.get().itemsinfo[opts.current.champ_data.pages[opts.page].itemSet.raw_data.start_items.build[key]].gold.base}
+ +
{freezer.get().itemsinfo[item].name}
+
Price: {freezer.get().itemsinfo[item].gold.base}

items.core_items

- +
- -
{item}
-
Price: {freezer.get().itemsinfo[opts.current.champ_data.pages[opts.page].itemSet.raw_data.core_items.build[key]].gold.base}
+ +
{freezer.get().itemsinfo[item].name}
+
Price: {freezer.get().itemsinfo[item].gold.base}

items.big_items

- +
- -
{item}
-
Price: {freezer.get().itemsinfo[opts.current.champ_data.pages[opts.page].itemSet.raw_data.big_items.build[key]].gold.base}
+ +
{freezer.get().itemsinfo[item].name}
+
Price: {freezer.get().itemsinfo[item].gold.base}
From 9d8ab0c09b1d824890e67fa7bd7dfed155c1193d Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Sat, 12 Mar 2022 14:16:53 +0100 Subject: [PATCH 09/10] Added support op gg item sets --- tags/page-list.tag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tags/page-list.tag b/tags/page-list.tag index b060100..42eaa54 100644 --- a/tags/page-list.tag +++ b/tags/page-list.tag @@ -28,7 +28,7 @@
-
+
From b3bde0f4b924e93d7941f27a057811fbdddacf19 Mon Sep 17 00:00:00 2001 From: 11tuvork28 Date: Sat, 12 Mar 2022 14:19:47 +0100 Subject: [PATCH 10/10] Added itemSets and set limit to one page per position/gamemode --- plugins/opgg.js | 156 ++++++++++++++++++++++++++++++------------------ 1 file changed, 98 insertions(+), 58 deletions(-) diff --git a/plugins/opgg.js b/plugins/opgg.js index afc3028..96e73b0 100644 --- a/plugins/opgg.js +++ b/plugins/opgg.js @@ -6,90 +6,130 @@ const urlModes = 'http://www.op.gg/modes/'; const positions = ["top", 'mid', "jungle", "adc", "support"]; const gameModes = ["aram", "urf"]; -function extractSinglePage(html, champion, name,pageIndex, buildIndex, src){ +function extractSinglePage(html, champion, name, pageIndex, buildIndex, src) { const runeIds = []; const data = extractJSON(html); data["rune_pages"][pageIndex]["builds"][buildIndex]["primary_rune_ids"].forEach((id) => runeIds.push(id)); data["rune_pages"][pageIndex]["builds"][buildIndex]["secondary_rune_ids"].forEach((id) => runeIds.push(id)); data["rune_pages"][pageIndex]["builds"][buildIndex]["stat_mod_ids"].forEach((id) => runeIds.push(id)); - return buildPluginObject(name,src,pageIndex, buildIndex,runeIds, champion); + return buildPluginObject(name, src, pageIndex, buildIndex, runeIds, buildItemSet(data), champion); } -function extractPages(data, champion, position,gameMode,src,callback) { +function extractPages(data, champion, position, gameMode, src, callback) { let runeIds = []; - if(data["rune_pages"].length){ - const limitPages = data["rune_pages"].length < 2? data["rune_pages"].length : 2; - for (let i = 0; i < limitPages; i++) { - for (let j = 0; j < 1; j++) { - try { - data["rune_pages"][i]["builds"][j]["primary_rune_ids"].forEach((id) => runeIds.push(id)); - data["rune_pages"][i]["builds"][j]["secondary_rune_ids"].forEach((id) => runeIds.push(id)); - data["rune_pages"][i]["builds"][j]["stat_mod_ids"].forEach((id) => runeIds.push(id)); - callback(buildPluginObject((gameMode? "["+ toUpper(gameMode) + "]" : "[NORMAL]" ) + champion +" "+ toUpper(position) +" Wins "+ data["rune_pages"][i]["builds"][j]["win"] +" "+ data["meta"]['runePages'].filter((page) => page["id"] ==data["rune_pages"][i]["builds"][j].primary_page_id )[0]["name"],src,i, j,runeIds, champion)); - } catch (error) { - callback(undefined); - } - runeIds = []; + if (data["rune_pages"].length) { + for (let i = 0; i < 1; i++) { + for (let j = 0; j < 1; j++) { + try { + data["rune_pages"][i]["builds"][j]["primary_rune_ids"].forEach((id) => runeIds.push(id)); + data["rune_pages"][i]["builds"][j]["secondary_rune_ids"].forEach((id) => runeIds.push(id)); + data["rune_pages"][i]["builds"][j]["stat_mod_ids"].forEach((id) => runeIds.push(id)); + callback(buildPluginObject((gameMode ? "[" + toUpper(gameMode) + "]" : "[NORMAL]") + champion + " " + toUpper(position) + " Wins " + data["rune_pages"][i]["builds"][j]["win"] + " " + data["meta"]['runePages'].filter((page) => page["id"] == data["rune_pages"][i]["builds"][j].primary_page_id)[0]["name"], src, i, j, runeIds, buildItemSet(data), champion)); + } catch (error) { + buildItemSet(data) + callback(undefined); } + runeIds = []; } + } } else { callback(undefined); } } -function _getPages(champion, callback) { +function _getPages(champion, callback) { const runePages = { pages: {} }; - positions.forEach((pos) =>{ - let url =urlChamp +"/" + champion +"/" + pos + "/build"; - request.get(url, (error, response, html) =>{ + positions.forEach((pos) => { + let url = urlChamp + "/" + champion + "/" + pos + "/build"; + request.get(url, (error, response, html) => { if (!error && response.statusCode === 200) { - extractPages(extractJSON(html), champion,pos,"",url,page => { - if( page != undefined) runePages.pages[page.name] = page; - callback(runePages); + extractPages(extractJSON(html), champion, pos, "", url, page => { + if (page != undefined) runePages.pages[page.name] = page; + callback(runePages); }) } else { - callback(runePages); - throw Error('rune page not loaded'); - }}); + callback(runePages); + throw Error('rune page not loaded'); + } + }); }); gameModes.forEach((mode) => { - let url = urlModes +"/"+ mode+"/"+ champion + "/build" - request.get(url, (error, response, html) =>{ + let url = urlModes + "/" + mode + "/" + champion + "/build" + request.get(url, (error, response, html) => { if (!error && response.statusCode === 200) { - extractPages(extractJSON(html), champion,"",mode,url ,page => { - if( page != undefined) runePages.pages[page.name] = page; - callback(runePages); + extractPages(extractJSON(html), champion, "", mode, url, page => { + if (page != undefined) runePages.pages[page.name] = page; + callback(runePages); }) - }else { - callback(runePages); - throw Error('rune page not loaded'); - }}); + } else { + callback(runePages); + throw Error('rune page not loaded'); + } + }); }); } -function extractJSON(html){ - let str = html.slice(html.indexOf('>{') + 1, html.indexOf('}') +1) - str = '{ "'+str.slice(str.indexOf('"props'), str.length -1).slice(str.indexOf("__N_SSP"), str.length -1).slice(str.indexOf('pageProps'), str.length - 1); - str = str.substring(0, str.indexOf('}},"page') + 1).slice(str.indexOf(':{')+1, str.length -1); - str = str.substring(0,str.indexOf('"_nextI18Next"') - 1); +function extractJSON(html) { + let str = html.slice(html.indexOf('>{') + 1, html.indexOf('}') + 1) + str = '{ "' + str.slice(str.indexOf('"props'), str.length - 1).slice(str.indexOf("__N_SSP"), str.length - 1).slice(str.indexOf('pageProps'), str.length - 1); + str = str.substring(0, str.indexOf('}},"page') + 1).slice(str.indexOf(':{') + 1, str.length - 1); + str = str.substring(0, str.indexOf('"_nextI18Next"') - 1); return JSON.parse(str); } -function buildPluginObject(name, src,pageIndex,buildIndex, runeIds,champion){ +function buildPluginObject(name, src, pageIndex, buildIndex, runeIds, itemSetObj, champion) { return { - name, - selectedPerkIds: runeIds, - bookmark: { - name, - src, - meta: { - pageIndex, - buildIndex, - champion - }, - remote: { - name: 'OP.GG', - id: 'opgg' - } - } - } + name, + selectedPerkIds: runeIds, + bookmark: { + name, + src, + meta: { + pageIndex, + buildIndex, + champion + }, + remote: { + name: 'OP.GG', + id: 'opgg' + } + }, + itemSet: itemSetObj + } +} +function buildItemSet(data) { + let startItemBuild = []; + let coreItemBuild = []; + let bigItemBuild = []; + for (let i = 0; i < (data["starter_items"].length > 2 ? 2 : data["starter_items"].length); i++) { + console.log(data["starter_items"][i]) + data["starter_items"][i]["ids"].forEach((itemID) => startItemBuild.push(itemID)); + }; + for (let i = 0; i < (data["core_items"].length > 4 ? 4 : data["core_items"].length); i++) { + data["core_items"][i]["ids"].forEach((itemID) => coreItemBuild.push(itemID)); + }; + for (let i = 0; i < (data["last_items"].length > 3 ? 3 : data["last_items"].length); i++) { + data["last_items"][i]["ids"].forEach((itemID) => bigItemBuild.push(itemID)) + }; + return { + start_items: { + build: uniq(startItemBuild) + }, + core_items: { + build: uniq(coreItemBuild), + }, + big_items: { + build: uniq(bigItemBuild), + } + } +} +/** + * Takes an array and removes duplicates + * @param {array} a Input array + * @returns an array + */ +function uniq(a) { + var seen = {}; + return a.filter(function (item) { + return seen.hasOwnProperty(item) ? false : (seen[item] = true); + }); } const plugin = { id: 'opgg', @@ -102,7 +142,7 @@ const plugin = { syncBookmark(bookmark, callback) { request.get(bookmark.src, (error, response, html) => { if (!error && response.statusCode == 200) { - callback(extractSinglePage(html, bookmark.meta.champion, bookmark.name , bookmark.meta.pageIndex,bookmark.meta.buildIndex, bookmark.src)); + callback(extractSinglePage(html, bookmark.meta.champion, bookmark.name, bookmark.meta.pageIndex, bookmark.meta.buildIndex, bookmark.src)); } else { throw Error('rune page not loaded'); }