From 64b462559b65b7e3861c9748c51200509c849f36 Mon Sep 17 00:00:00 2001 From: Arne van Iterson Date: Sat, 20 Jun 2020 19:21:51 +0200 Subject: [PATCH] Code cleanup and added save option in-program --- .gitignore | 4 +- assets/data.json | 1 + assets/overlays/headband.png | Bin 0 -> 3444 bytes assets/overlays/hoodie_classic.png | Bin 0 -> 3305 bytes assets/overlays/hoodie_slim.png | Bin 0 -> 4524 bytes assets/overlays/tv.png | Bin 0 -> 3681 bytes css/index.css | 9 +- css/index.css.map | 2 +- css/index.scss | 10 +- data/data.json | 1 - data/skins/in.png | 1 - html/main.hbs | 1 + html/skin_current.hbs | 4 +- html/skin_edit.hbs | 40 ++++++ html/skin_gallery.hbs | 43 ++++++ html/skin_random.hbs | 1 + html/skin_upload.hbs | 2 +- main.js | 14 +- package-lock.json | 5 + package.json | 1 + src/main.js | 12 +- src/skin.js | 207 +++++++++++++++++++++-------- 22 files changed, 280 insertions(+), 78 deletions(-) create mode 100644 assets/data.json create mode 100644 assets/overlays/headband.png create mode 100644 assets/overlays/hoodie_classic.png create mode 100644 assets/overlays/hoodie_slim.png create mode 100644 assets/overlays/tv.png delete mode 100644 data/data.json delete mode 100644 data/skins/in.png create mode 100644 html/skin_edit.hbs create mode 100644 html/skin_gallery.hbs diff --git a/.gitignore b/.gitignore index 40b878d..96fb351 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -node_modules/ \ No newline at end of file +node_modules/ +assets/skins/download/* +assets/skins/edit/* \ No newline at end of file diff --git a/assets/data.json b/assets/data.json new file mode 100644 index 0000000..5bf01c9 --- /dev/null +++ b/assets/data.json @@ -0,0 +1 @@ +{"theme":"light","user":"arne.v.iterson@hotmail.nl","password":"","session":"","skinDefault":"http://assets.mojang.com/SkinTemplates/steve.png"} \ No newline at end of file diff --git a/assets/overlays/headband.png b/assets/overlays/headband.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4257f710b5f0476615e12ed93f4cabcb887c82 GIT binary patch literal 3444 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 AYybcN literal 0 HcmV?d00001 diff --git a/assets/overlays/tv.png b/assets/overlays/tv.png new file mode 100644 index 0000000000000000000000000000000000000000..32a6c3c2db7eaeb8ef91fd5118f584d01cb7330c GIT binary patch literal 3681 zcmcIn3v3ic7(S|1L2F_FfvUJ!8hOaxK5lofyYwjZ?yw~u)>3SVAk6O0^_Jf4UU#>> zYb{tYidr8?#1cShOsq^N=K}kC(FN#tr&`y89^<2>%T0&l;)(WmoMY?u zsc6urR#scpf$K$Ck2ry%OVAmQM3J_`QB)j{0=X7im;`H7&4c&v>%uWr@!(ZlfC@yt zFr=0?8E|RSl1jO$Ru&Yzcs^DX7m5gf&x)d+?-P5smF>633D%R;>qLXgkEJ z1Lc@kHz3A2c|xXH4s#1mns>2+Fc)Jex{#y_N!mrwyvR}_!(izTj=UL4P^|DRO8Y`@ z9z0}OQIRBLv6wUFa_UA6NehBNQVhv31kxbPM$H0oLNjM%Ecl=)8*0>2bq%vE0!gp8 zJUEIpl|m$%HLICvm=IuO97IXlN!ckS6%{$F7p*tKN#}}8!Z3_L%`%ZLoz;zobW1lw z`Us}8;vo(Yw1Gg@$FQ+PB3T!v%~jHz$TA{JUrR9}MWs{&x}pXf|Dsx0Nedz)Am$BGMMPGB z1x8g?WHG245rE2|MnDZDqgoA)Ws56%^{{Rr$0$12;Q2DIx7^T!Y8VO3it9?SGQXFn z1)e7uC!Gv85D?2W(*l|d%X}UjCEr5FTvRj!HomA%MJ$!XjjrV+gk$6>xD9!3PDv0)=CO0NJsbVVglA0edfcaFl9t zvf5^7xIQ)MW+?O_Y5O-VUp|U_K)g&-Q7sr8v$>Ume<^Bn2xjCfIajX6VYu3-B4o^D z5Ij3rvV5on^`HT`GN~^_MKKXm&2)z<0X6ASSe-vS(m}b92P^~xPbq*91cWq@WC_6} zy9J6z6Obw*?dF6`r1~Bj{1bc!txnoW1x21c`c!F4RXdx;wBMz$E*k-s>@gycQ>BsZ z9SRjZJ*^Hy(6Lb=Wi}Rqhy-WZwkb7J4_Yx`z=bu4Ib-PzS_3o&We^1hK&KWo zOb;G3^az&S#h9gIAQ}y;a+0fLgQlcUhAg7^h<;4aaCVdgmZe#m0R+Qw93i1MLgEFM zkR=zOB`GLKK{lEM*}zQtI880&|hQO_O&Qak&07Rwkm$jEIiIQ4Ywlv~8Q$wl)2~ z9*}lBNy0GbzM7drmtcFCy?vvX?EM{TX!jcEcE11VW^}jDnO^2wSQ+2`b=#pe6K|Y! zSC`A28SzKdzE|LEfAfUIq0Mh^?!4@!ubyk|xVUY7>*AHmR+Tn8F1s2lsI+F}ci(wQ z$B{Qa+*bJWlixLO^lzHi_QyKmjEly%U-{F~_qN`!qxjte2fAVhTie#Qu1rjZ)9x3& zrOVkX^VY0Nyx)_%?&{MWn+jIf+!|X{QXdcPXn`}!94m^yo%2w^g5Sowe<+{w+or>p zvscak@s=vv;>pm0k7hj4F8gwKiASzF)*YC&@0wlOeLLUkNzA+Zfit~Z{l4RCAKX#w zne#dE(aF%k!=Ik{@X=%9xD$tZJVMbYJyo4uM>fpsj{myx!v2$AoOu47E$v9_MBBBF z7x}%8;A5|b=InEdSi#z+D^9IW9Ly0mPE$^OeMQwT9n&lPrTHHeZ76D)JZWli-mXxW zVkG+NZt1x7-aX?xUl{ku?VnCMfAM*($3IV;ex<7*lJiZ^U3HG57oBeDY=Omb|CYJW zb{wmHd3xfuNvm^jU+++A-`uvOU+90dciZ0GdA~orV%JwYH|_5%(r>=0)w9luN51bX zpIv-MpH1m~ Xw>{_eg57)UKY?ZbCBA1$RCurrent Skin


+
diff --git a/html/skin_current.hbs b/html/skin_current.hbs index eca8fa3..1baeb39 100644 --- a/html/skin_current.hbs +++ b/html/skin_current.hbs @@ -14,7 +14,7 @@

Current Skin

-
+

@@ -24,7 +24,9 @@
+ +
diff --git a/html/skin_edit.hbs b/html/skin_edit.hbs new file mode 100644 index 0000000..40f843a --- /dev/null +++ b/html/skin_edit.hbs @@ -0,0 +1,40 @@ + + + + + + + {{ title }} + + + + +
+

{{ header }}

+

Edit Skin

+
+ +
+

+ +
+ +
+ +
+ +
+ + + +
+
+ + + +
+ {{ footer }} +
+ + + \ No newline at end of file diff --git a/html/skin_gallery.hbs b/html/skin_gallery.hbs new file mode 100644 index 0000000..cf416b6 --- /dev/null +++ b/html/skin_gallery.hbs @@ -0,0 +1,43 @@ + + + + + + + {{ title }} + + + + +
+

{{ header }}

+

Saved skins

+
+ + + + + +
+ {{ footer }} +
+ + + \ No newline at end of file diff --git a/html/skin_random.hbs b/html/skin_random.hbs index 4f613d6..5740900 100644 --- a/html/skin_random.hbs +++ b/html/skin_random.hbs @@ -27,6 +27,7 @@ +
diff --git a/html/skin_upload.hbs b/html/skin_upload.hbs index 12ea3b4..7718e1c 100644 --- a/html/skin_upload.hbs +++ b/html/skin_upload.hbs @@ -14,7 +14,7 @@

Upload Skin

-
+

diff --git a/main.js b/main.js index 0568b4f..cfd472d 100644 --- a/main.js +++ b/main.js @@ -5,7 +5,11 @@ const path = require("path"); if (process.env.NODE_ENV === "dev") { require("electron-reload")(__dirname, { - electron: path.join(__dirname, "node_modules", ".bin", "electron") + electron: path.join(__dirname, "node_modules", ".bin", "electron"), + ignored: [ + /node_modules|[/\\]\./, + /assets\/skins|[/\\]\./ + ] }); } @@ -30,7 +34,7 @@ function createWindow () { } // Load previous credentials and settings -var authData = JSON.parse(fs.readFileSync("./data/data.json")); +var authData = JSON.parse(fs.readFileSync("./assets/data.json")); // Define handlebars with loaded settings require("electron-handlebars")({ @@ -43,14 +47,14 @@ require("electron-handlebars")({ // Respond to renderer requests ipcMain.on("getAuth", (event) => { - authData = JSON.parse(fs.readFileSync("./data/data.json")); + authData = JSON.parse(fs.readFileSync("./assets/data.json")); event.returnValue = authData; }); ipcMain.on("setAuth", (event, data) => { - authData = JSON.parse(fs.readFileSync("./data/data.json")); + authData = JSON.parse(fs.readFileSync("./assets/data.json")); if (data != authData) { - fs.writeFileSync("./data/data.json", JSON.stringify(data)); + fs.writeFileSync("./assets/data.json", JSON.stringify(data)); } event.returnValue = true; }); diff --git a/package-lock.json b/package-lock.json index a837e52..6ba080c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1944,6 +1944,11 @@ "escape-string-regexp": "^2.0.0" } }, + "merge-images": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-images/-/merge-images-2.0.0.tgz", + "integrity": "sha512-bpI4j54n/Zl6ZTgxaR3xWou/lqI53RAAt8peXijW37BKqoON83LQ7XCZqtFiwzBfEXIws1isYyR06584yffAyA==" + }, "mime": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", diff --git a/package.json b/package.json index 8e07d10..1f3d696 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "electron-handlebars": "^2.0.0", "electron-reload": "^1.5.0", "eslint": "^7.0.0", + "merge-images": "^2.0.0", "pngjs": "^5.0.0", "skinview3d": "^2.0.0-alpha.1", "three": "^0.116.1" diff --git a/src/main.js b/src/main.js index 907f05a..8586270 100644 --- a/src/main.js +++ b/src/main.js @@ -1,14 +1,10 @@ /* eslint-disable no-unused-vars */ const { ipcRenderer, remote } = require("electron"); -const axios = require("axios").default; const path = require("path"); const session = ipcRenderer.sendSync("getSession"); if (!session.accessToken) { - console.log("Session does not exist, return to auth"); remote.getCurrentWindow().loadURL(path.join(`file://${__dirname}/auth.hbs`)); -} else { - console.log("Session does exist, continue"); } const msg = document.querySelectorAll("div.content > p.message")[0]; @@ -16,22 +12,22 @@ msg.classList.add("success"); msg.innerHTML = `Logged in as ${session.selectedProfile.name}`; document.querySelectorAll("div.content > div.right > button#current")[0].addEventListener("click", (e) => { - console.log("Clicked current button"); remote.getCurrentWindow().loadURL(path.join(`file://${__dirname}/skin_current.hbs`)); }); document.querySelectorAll("div.content > div.right > button#upload")[0].addEventListener("click", (e) => { - console.log("Clicked upload button"); remote.getCurrentWindow().loadURL(path.join(`file://${__dirname}/skin_upload.hbs`)); }); document.querySelectorAll("div.content > div.right > button#random")[0].addEventListener("click", (e) => { - console.log("Clicked random button"); remote.getCurrentWindow().loadURL(path.join(`file://${__dirname}/skin_random.hbs`)); }); +document.querySelectorAll("div.content > div.right > button#gallery")[0].addEventListener("click", (e) => { + remote.getCurrentWindow().loadURL(path.join(`file://${__dirname}/skin_gallery.hbs`)); +}); + document.querySelectorAll("div.content > div.right > button#logout")[0].addEventListener("click", (e) => { - console.log("Clicked logout button"); if (ipcRenderer.sendSync("setSession", {})) { var authData = ipcRenderer.sendSync("getAuth"); authData.password = ""; diff --git a/src/skin.js b/src/skin.js index 1c5ad99..83e82b3 100644 --- a/src/skin.js +++ b/src/skin.js @@ -6,7 +6,7 @@ const { } = require("electron"); const axios = require("axios").default; const path = require("path"); - +const fs = require("fs"); const skinview3d = require("skinview3d/dist/skinview3d.min.js"); const session = ipcRenderer.sendSync("getSession"); @@ -24,54 +24,89 @@ var parser = new DOMParser(); var randomUrls = []; // Switch button and views -var btn = document.querySelectorAll("div.content > div.left > button#switch")[0]; +var button = { + switch: document.querySelectorAll("div.left > button#switch"), + edit: document.querySelectorAll("div.right > button#edit"), + random: document.querySelectorAll("div.right > button#random"), + save: document.querySelectorAll("div.right > button#save"), + download: document.querySelectorAll("div.right > button#download"), + main: document.querySelectorAll("div.right > button#main"), + set: document.querySelectorAll("div.right > button#set") +}; +var message = document.querySelectorAll("div.content > p.message")[0]; +var list = document.querySelectorAll("div.right > div#list")[0]; var view = { - flat: document.querySelectorAll("div.content > div.left > img.skin#flat")[0], - mesh: document.querySelectorAll("div.content > div.left > div#mesh")[0] + flat: document.querySelectorAll("div.left > img.skin#flat")[0], + mesh: document.querySelectorAll("div.left > div#mesh")[0] }; +var skin = new skinview3d.SkinViewer({ + domElement: view.mesh, + width: 300, + height: 250 +}); + +var control = skinview3d.createOrbitControls(skin); +control.enableRotate = true; +control.enableZoom = false; +control.enablePan = false; + function setView(url, controls = true) { - btn.style.display = "initial"; + button.switch[0].style.display = "initial"; + view.flat.src = url; - - view.mesh.innerHTML = ""; - - // Set mesh view - let skinViewer = new skinview3d.SkinViewer({ - domElement: view.mesh, - width: 300, - height: 250, - skinUrl: url - }); - - let control = skinview3d.createOrbitControls(skinViewer); + skin.skinUrl = url; control.enableRotate = controls; - control.enableZoom = false; - control.enablePan = false; } +// Switch button action +button.switch[0].addEventListener("click", (e) => { + if (view.flat.style.display == "inline") { + view.flat.style.display = "none"; + view.mesh.style.display = "inline"; + button.switch[0].innerHTML = "Switch to 2D"; + } else { + view.flat.style.display = "inline"; + view.mesh.style.display = "none"; + button.switch[0].innerHTML = "Switch to 3D"; + } +}); + + switch (action) { + case "current": axios({ method: "GET", url: "https://sessionserver.mojang.com/session/minecraft/profile/" + session.selectedProfile.id }).then((data) => { setView(JSON.parse(atob(data.data.properties[0].value)).textures.SKIN.url); + + button.edit[0].addEventListener("click", (e) => { + remote.getCurrentWindow().loadURL(path.join(`file://${__dirname}/skin_edit.hbs`)); + }); }); break; + case "upload": - document.querySelectorAll("div.content > div.right > button").forEach(element => { - element.addEventListener("click", (e) => { - document.querySelectorAll("div.content > div.right > button").forEach(button => { - if (button.id != "main") { - button.style.display = "none"; - } + console.log(window); + + var buttons = document.querySelectorAll("div.right > button"); + buttons.forEach(element => { + if (element.id != "main") { + element.addEventListener("click", (e) => { + buttons.forEach(btn => { + if (btn.id != "main") { + btn.style.display = "none"; + } + }); + document.querySelectorAll(`div.right > form#${element.id}`)[0].style.display = "block"; }); - document.querySelectorAll(`div.content > div.right > form#${element.id}`)[0].style.display = "block"; - }); + } }); break; + case "random": axios({ method: "GET", @@ -101,45 +136,107 @@ case "random": random(); - document.querySelectorAll("div.content > div.right > button#random")[0].addEventListener("click", (e) => { + button.random[0].addEventListener("click", (e) => { random(); }); }); break; + +case "edit": + axios({ + method: "GET", + url: "https://sessionserver.mojang.com/session/minecraft/profile/" + session.selectedProfile.id + }).then((data) => { + const url = JSON.parse(atob(data.data.properties[0].value)).textures.SKIN.url; + setView(url); + + axios({ + method: "get", + url: url, + responseType: "stream", + adapter: require("axios/lib/adapters/http") + }).then((res) => { + res.data.pipe(fs.createWriteStream(path.join(__dirname + "/../assets/skins/edit/in.png"))); + }); + }); + break; + +case "gallery": + fs.readdir(path.join(__dirname + "/../assets/skins/download/"), (err, files) => { + files.forEach(file => { + var ctx = document.createElement("canvas"); + ctx.width = 32; + ctx.height = 32; + var canvas = ctx.getContext("2d"); + + canvas["imageSmoothingEnabled"] = false; /* standard */ + canvas["mozImageSmoothingEnabled"] = false; /* Firefox */ + canvas["oImageSmoothingEnabled"] = false; /* Opera */ + canvas["webkitImageSmoothingEnabled"] = false; /* Safari */ + canvas["msImageSmoothingEnabled"] = false; /* IE */ + + var img = new Image(); + img.onload = function() { + canvas.drawImage(img, 8, 8, 8, 8, 0, 0, 32, 32); + }; + img.src = "data:image/png;base64," + fs.readFileSync(path.join(__dirname + "/../assets/skins/download/" + file), {encoding: "base64"}); + + ctx.addEventListener("click", (e) => { + setView(img.src); + }); + + list.appendChild(ctx); + }); + }); + break; +} + +// Set button action +if (button.set.length > 0) { + button.set[0].addEventListener("click", (e) => { + remote.getCurrentWindow().loadURL(path.join(`file://${__dirname}/skin_upload.hbs?url=test`)); + }); +} + +// Save button action +if (button.save.length > 0) { + button.save[0].addEventListener("click", (e) => { + axios({ + method: "get", + url: view.flat.src, + responseType: "stream", + adapter: require("axios/lib/adapters/http") + }).then((res) => { + var p = res.request.path.split("/")[2]; + if (p.split(".").length < 2) { + p = p + ".png"; + } + res.data.pipe(fs.createWriteStream(path.join(__dirname + `/../assets/skins/download/${p}`))); + message.classList.add("success"); + message.innerHTML = "Saved successfully"; + }); + }); } // Download button action -document.querySelectorAll("div.content > div.right > button#download")[0].addEventListener("click", (e) => { - ipcRenderer.send("download", { - url: view.flat.src, - properties: { - saveAs: true - } - }); +if (button.download.length > 0) { + button.download[0].addEventListener("click", (e) => { + ipcRenderer.send("download", { + url: view.flat.src, + properties: { + saveAs: true + } + }); - ipcRenderer.on("downloadResult", (event, arg) => { - var msg = document.querySelectorAll("div.content > p.message")[0]; - console.log(msg); - msg.classList.add("success"); - msg.innerHTML = "Downloaded successfully"; + ipcRenderer.on("downloadResult", (event, arg) => { + message.classList.add("success"); + message.innerHTML = "Downloaded successfully"; + }); }); -}); - -// Switch button action -btn.addEventListener("click", (e) => { - if (view.flat.style.display == "inline") { - view.flat.style.display = "none"; - view.mesh.style.display = "inline"; - btn.innerHTML = "Switch to 2D"; - } else { - view.flat.style.display = "inline"; - view.mesh.style.display = "none"; - btn.innerHTML = "Switch to 3D"; - } -}); +} // Back button action -document.querySelectorAll("div.content > div.right > button#main")[0].addEventListener("click", (e) => { +button.main[0].addEventListener("click", (e) => { remote.getCurrentWindow().loadURL(path.join(`file://${__dirname}/main.hbs`)); }); \ No newline at end of file