From 01176f1a8b67c631e0148b43b6ec655cb7d47b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20Fl=C3=B6tzinger?= Date: Sat, 7 Aug 2021 21:23:12 +0200 Subject: [PATCH 01/14] Add basic Vue.js example --- vue/.gitignore | 24 +++++++ vue/README.md | 94 ++++++++++++++++++++++++ vue/babel.config.js | 3 + vue/makeOpk.js | 48 +++++++++++++ vue/package.json | 66 +++++++++++++++++ vue/public/icons/IconMouseNormal.png | Bin 0 -> 5092 bytes vue/public/icons/IconMouseOver.png | Bin 0 -> 5225 bytes vue/public/icons/TaskbarIcon.png | Bin 0 -> 5225 bytes vue/public/icons/desktopIcon.ico | Bin 0 -> 19975 bytes vue/public/img/background.png | Bin 0 -> 5721 bytes vue/public/img/background.svg | 13 ++++ vue/public/img/cool_wolf.png | Bin 0 -> 11912 bytes vue/public/img/facebook.svg | 3 + vue/public/img/header_icon.svg | 12 ++++ vue/public/img/header_icons.svg | 28 ++++++++ vue/public/img/reddit.png | Bin 0 -> 742 bytes vue/public/img/reddit.svg | 9 +++ vue/public/img/twitter.svg | 3 + vue/public/index.html | 16 +++++ vue/public/manifest.json | 104 +++++++++++++++++++++++++++ vue/releases/.gitkeep | 0 vue/src/background/App.vue | 20 ++++++ vue/src/background/main.js | 12 ++++ vue/src/desktop/App.vue | 29 ++++++++ vue/src/desktop/main.js | 13 ++++ vue/src/in_game/App.vue | 20 ++++++ vue/src/in_game/main.js | 12 ++++ vue/src/plugins/appWindow.js | 27 +++++++ vue/src/plugins/vuetify.js | 35 +++++++++ vue/vue.config.js | 27 +++++++ 30 files changed, 618 insertions(+) create mode 100644 vue/.gitignore create mode 100755 vue/README.md create mode 100755 vue/babel.config.js create mode 100755 vue/makeOpk.js create mode 100755 vue/package.json create mode 100644 vue/public/icons/IconMouseNormal.png create mode 100644 vue/public/icons/IconMouseOver.png create mode 100644 vue/public/icons/TaskbarIcon.png create mode 100644 vue/public/icons/desktopIcon.ico create mode 100644 vue/public/img/background.png create mode 100644 vue/public/img/background.svg create mode 100644 vue/public/img/cool_wolf.png create mode 100644 vue/public/img/facebook.svg create mode 100644 vue/public/img/header_icon.svg create mode 100644 vue/public/img/header_icons.svg create mode 100644 vue/public/img/reddit.png create mode 100644 vue/public/img/reddit.svg create mode 100644 vue/public/img/twitter.svg create mode 100755 vue/public/index.html create mode 100755 vue/public/manifest.json create mode 100644 vue/releases/.gitkeep create mode 100755 vue/src/background/App.vue create mode 100755 vue/src/background/main.js create mode 100755 vue/src/desktop/App.vue create mode 100755 vue/src/desktop/main.js create mode 100755 vue/src/in_game/App.vue create mode 100755 vue/src/in_game/main.js create mode 100755 vue/src/plugins/appWindow.js create mode 100755 vue/src/plugins/vuetify.js create mode 100755 vue/vue.config.js diff --git a/vue/.gitignore b/vue/.gitignore new file mode 100644 index 00000000..9933932e --- /dev/null +++ b/vue/.gitignore @@ -0,0 +1,24 @@ +.DS_Store +node_modules +dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Overwolf packages +*.opk diff --git a/vue/README.md b/vue/README.md new file mode 100755 index 00000000..624fb9bb --- /dev/null +++ b/vue/README.md @@ -0,0 +1,94 @@ +# Sample - Vue.js +Example-Vue.js is an example app, meant to be used as a reference for developers who are new to Overwolf. +The app is meant to demonstrate some basic points and flows that are relevant when developing Overwolf apps: + +- Auto-launch when a game starts. +- Register to the overwolf.games.events API and receive real time events from the game. +- Define a custom hotkey to be used in-game. +- Communicate between the app windows according to our best practices. + + +## Setting up +In order to run the app, you must first complete several steps: +1. Download and install [NodeJS](https://nodejs.org/). +After installing, run the following commands in a terminal of your choice: +``` +node -v +npm -v +``` +If they run successfully, proceed to the next steps. + +2. Download and install the [Overwolf desktop client](https://download.overwolf.com/install/Download). + +3. Download the repository as a zip file and extract it. + +4. In your terminal, run the following commands: +``` +cd +npm install +npm run build +``` + +5. Open the Overwolf desktop client settings (by right-clicking the client and selecting +"Support" or by clicking on the wrench icon in the dock and going to the "Support" tab). + +6. Click on "Development options". + +7. In the opened window, click on "Load unpacked extension" and select the `vue/dist/` folder. +This will add the app to your dock. + +8. Click on the app's icon in your dock. + +## Building an .opk for distribution +When you run run ```npm run build``` in your terminal, an .opk is created in releases/ directory + +## Changing the version number quickly +We have included a webpack plugin that can change the .opk version quickly with just a command line argument. Simply add ```--env setVersion=1.0.1``` to your build command. +Example: +``` +npm run build --env setVersion=1.0.1 +``` + +This will change the app version both in package.json and app's manifest.json + +## What will you find inside? + +### public/ +All of the static resources used by the app, like icons, images and CSS + +##### public/manifest.json +This file defines all of the aspects of the app. +Read all about Overwolf's manifest.json mechanism [here](https://overwolf.github.io/docs/api/manifest-json#welcome-to-the-manifestjson-file). +In our manifest.json file, we have [```{ "start_window": "background" }```](https://overwolf.github.io/docs/api/manifest-json#start_window) defined. +This sets our [background](###windows/background) window as the app's starting point. +All of this app's windows' properties can be found under the [```windows```](https://overwolf.github.io/docs/api/manifest-json#window-data) object. +Please refer to the [dev site](https://overwolf.github.io/docs/api/manifest-json#welcome-to-the-manifestjson-file) to learn more about each property. + +#### src/ +Source .vue & .js files for the app + +##### src/background/ +This directory contains files of the background window, which serves as the application's starting point and window orchestrator. +The window's ```run()``` method detects whether a Fortnite game is currently running, decides which window to launch accordingly, and listens for changes. + +The background window has no visual representation, which can be gleaned from the empty background.html file or from the +[```{ is_background_page: true }```](https://overwolf.github.io/docs/api/manifest-json#is_background_page) +property the background window has in our manifest.json. + +##### src/in_game/ +The in_game window listens to [Info Events](https://overwolf.github.io/docs/api/overwolf-games-events#oninfoupdates2) and +[Game Events](https://overwolf.github.io/docs/api/overwolf-games-events#onnewevents) emitted by the game and +displays an ad. Furthermore, it defines the behavior for the show/hide hotkey. +Read all about hotkeys [here](https://overwolf.github.io/docs/topics/hotkeys-best-practices). + +##### src/desktop/ +This window serves a purely visual purpose and has no special logic. + +##### src/plugins/ +This directory contains .js files to include into the Vue.js app. + + +## Notes +Editing the author or app name in the manifest will prevent loading the app as an unpacked app. + +For any further information or questions, contact developers@overwolf.com diff --git a/vue/babel.config.js b/vue/babel.config.js new file mode 100755 index 00000000..4ab65571 --- /dev/null +++ b/vue/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ["@vue/cli-plugin-babel/preset"] +}; diff --git a/vue/makeOpk.js b/vue/makeOpk.js new file mode 100755 index 00000000..c19fc75a --- /dev/null +++ b/vue/makeOpk.js @@ -0,0 +1,48 @@ +require("semver"); +const path = require("path"), + fs = require("fs"), + zip = require("zip-a-folder"); + +function readFile(filePath) { + return new Promise(resolve => { + fs.readFile(filePath, (err, response) => { + try { + if (err) resolve(null); + else resolve(JSON.parse(response)); + } catch (e) { + resolve(null); + } + }); + }); +} + +function deleteFile(filePath) { return new Promise(resolve => { + fs.unlink(filePath, resolve); +})} + +async function makeOPK(suffix = "") { + const packagePath = path.resolve(__dirname, "./package.json"), + manifestPath = path.resolve(__dirname, "./public/manifest.json"), + dist = path.join(__dirname, "dist/"); + + const [pkg, manifest] = await Promise.all([ + readFile(packagePath), + readFile(manifestPath) + ]); + + if (!pkg) throw "could not read package.json"; + + if (!manifest) throw "could not read manifest.json"; + + const version = pkg.version, + name = manifest.meta.name, + opkPath = path.join( + __dirname, + `releases/${name}-${version}${suffix ? `.${suffix}` : ""}.opk` + ); + + await deleteFile(opkPath); + await zip.zip(dist, opkPath); +} + +makeOPK(); diff --git a/vue/package.json b/vue/package.json new file mode 100755 index 00000000..983d1639 --- /dev/null +++ b/vue/package.json @@ -0,0 +1,66 @@ +{ + "name": "example-vue", + "version": "1.0.0", + "description": "", + "repository": "https://github.com/overwolf/sample-app.git", + "license": "ISC", + "scripts": { + "build": "vue-cli-service build --mode=development", + "dev": "vue-cli-service build --watch --mode=development", + "serve": "vue-cli-service serve --mode=development" + }, + "devDependencies": { + "@fortawesome/fontawesome-free": "^5.15.3", + "@overwolf/overwolf-api-ts": "^1.3.0", + "@overwolf/types": "^3.6.0", + "@vue/cli-plugin-babel": "^4.5.13", + "@vue/cli-plugin-eslint": "^4.5.12", + "@vue/cli-plugin-router": "^4.5.12", + "@vue/cli-plugin-vuex": "^4.5.12", + "@vue/cli-service": "^4.5.13", + "@vue/eslint-config-prettier": "^6.0.0", + "axios": "^0.21.1", + "babel-eslint": "^10.1.0", + "eslint": "^6.7.2", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-vue": "^6.2.2", + "prettier": "^1.19.1", + "sass": "^1.32.11", + "sass-loader": "^8.0.0", + "semver": "^7.3.4", + "vue-cli-plugin-axios": "0.0.4", + "vue-cli-plugin-vuetify": "^2.0.9", + "vue-template-compiler": "^2.6.14", + "vuetify-loader": "^1.7.2", + "zip-a-folder": "^0.0.12" + }, + "dependencies": { + "core-js": "^3.11.0", + "vue": "^2.6.14", + "vue-router": "^3.5.2", + "vuetify": "^2.5.8", + "vuex": "^3.6.2", + "vuex-persist": "^3.1.3", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "moment": "^2.29.1" + }, + "eslintConfig": { + "globals": { + "overwolf": "readonly" + }, + "root": true, + "env": { + "node": true + }, + "extends": [ + "plugin:vue/essential", + "eslint:recommended", + "@vue/prettier" + ], + "parserOptions": { + "parser": "babel-eslint" + }, + "rules": {} + } +} diff --git a/vue/public/icons/IconMouseNormal.png b/vue/public/icons/IconMouseNormal.png new file mode 100644 index 0000000000000000000000000000000000000000..2be95acaa641a6e0bfb98039d3ca480d2e7896db GIT binary patch literal 5092 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 literal 0 HcmV?d00001 diff --git a/vue/public/icons/IconMouseOver.png b/vue/public/icons/IconMouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..e7af38c631b376b79e5b7b525c57e9ac28acea01 GIT binary patch literal 5225 zcmcgQX*d+#*LOBEBZe`yvLEJ>i9zv6?PlNz~`S345Qq(X~JPv(-GczYAzd%Z0h+iOC-p0&Ko*W$L;~#Ji zfQaGe_g)-rbP~N*CuPx;UUd{Md}0BJ31%HEM(r9LB=)bYbMW*)y!KDuFm|xY1=^vO6@K+ z{RSW*S?{Y7)R>3`o#|m?{_Mlw8r}R!(17qfb+|KRUBaMW{v&PYFIT~@m;?PbHGE$o z%D;oDkfSDxfdreknL=M-2dMR~S@PPRSw48AkYpLnfqJ3OYCFuknY z+by5G5tLS_<18Z+O6TH%_-a#F@4XAh+J;ZfW(64$zx|1c2OoO8?}^2mg>H>qeX+W6 zdQ@_Mid=n5sCXXU-EUF-q4ycYmk8~|(E zJUj=03kpEQjsswj3V=l5;7Pf=0EiUZn47po4F6yRC3qf-X~tK0KNW~q?d^9+4;vl| z81u2QX}y2Q_RWhISP2UoNiF50=KjtK4dPAN%1JkJd0^sv=$WMZ15W|XYxax<)sv0a z1O@FcgjWx|a=rLeFkcX3f8_n<)Tr;iAfJOv@2^Z8nH}v!%4&a%Tw;VzY(_8r4PRX1 zb`YFJ6Rfq@Vy_d-A;MS$!CVwzoq_rP*XF;Rrs&vVvxO57;Ak9*3!$g@a!2ZG?-VPG zf_wZY5CNLhQm8vnWhMLZC{zN_+_1bYnkOqLY#~KiyuCP0i8eC3_SccNL7TPpl^@e`m;J7x zTWd8@%H=0yt<`nFNja>nHbpjI$7+pgjnJQ>aM527c&3CXZ5mEesmG@_GL4vCQ<1Ie zu*}`XL)O| zcO4jxXCWo+3}YU@6lWDB#mY4V{BfkE76n=!u{ZfG}B z+3xCtoa^c0+_(a;IYX6@pjF3F7ZcZ_RNz@U>KqSPAecS8{E2!SD*PP$QsvAZgc;f> zE1x$#HW|!{e)#6NlI=(t_@DwdQCn}NXWfoXCfdbO%U^9uJ$Bp(G)0Pi z&pJ-d)QB6xB*LZ=Pz%C#$B1wsVlpTxw0KR@giBKR#cKqX)*x$jKa3JjSlzLRz*`DsrM0|+8 zLYCyDb)`?RI$I#qLt+sRyL!HFBu2$!Sub09X+d##$6!wk7iJ2(<2EF+#wpd}*h6y9 z`b;(v(orRScChMjWjWWeA5`~x{0~LaE4#Z68>Lv&ynB*g{MhMGb0cJVi??skpSr}E z7khhxE*8#(`tT2(WY)&lCRZ2(V;RYz<#{GE8!9Y^w0@etr1yJZFnkJBpA#Q?IF+*9 zOQ+YM+B!W{Kv1xd|1+jkk@8US*`4JDv4fErh9kuj2t&86TFoY*uK3R;La_bL)I00N zrwMke;%aK-z1s2Ll=YGLeAnxPLG152BsyE)NN=Pf?K5u@zox*y~+@}v{fqTgoyAT6b2Op}2{T|Dx zkE|F5 zJ=^P72Wf3;>xRU=w`y-O`0&igIyX_9i>O{5B;gS>N^M2!w#9wEj6(M6JImj;N#6W1 zE<3i=;n|I7hUZK^sXf_Y3VU-h;%eFJQrh4Sy~A@OGtA)=G@_ zO3y|ad;69W-9uq#+gbav8ckEBuKAR@rtAEKlNcJ*E2-Qq)Jk!UI(F{ecm9YyB1&DK zQ?@I-pMd;k^?%-y?F1nEMXYMr{-olMgG5`ukpV}guAe;ldQq7CngPxG=OCoLdE-N6 z=7u8K6F$$p(ML?92v_9`;rx#ww$;hw*3OERi#hX{?4}M>v*-=nToYe`hSGuiBsNU? zs1}C-)BByK%<6^~>`51rRAn_8ccSfn%|#D93`bguw64t>|9QF#Z$NV$wekDBDabnU zRpr#rN}L|Q^g{QQ=X*zG3VYFRku!nIac++5)3adf{bPOF)vBB2chBu0$HdLTYte=S zjen20b)cnf+w5IN5nWw+v~O<8uj}f*zpAWbEHd?Zg;A_tR!u^tZftb z1XOxn#SK|*;+#C76D5A_V|sMkBi40`K(;98bX~ZKv$Q)9r8RwE8L_TvZyAYUtI!eG z^bE#csX;@L+g_~V9U^zKrV%XSlo+id(d>r;c|VzYw)v+pSG5~S5lV#Yqc)Av zpTPEg!o4llr!P5sPQ0&QDW+26n=cCH1Z)%_PPZ<&9RDu6G1XV;;)3kLWaZC;lL7nM zOPi@M#7N}5CpJ;YnRK^?dK^3a?tmnqP6Rb1eC>Pd` zAqbEbH~8?yVXb2YhpbS4f8tf-E*!0?Ex7J6UtM)wd)FsbUg##S2-DmwNc@~bIm-S; z`pf(ce|)E&^jcrtj6dJitExb?hd6HFir}O5?-XM}Ip+beh zk@jnknibY%jaACHI|>f}n>}X@5%TWX!u0MH?dGn`i}%Zg{kwDXh?TvCYi48lx1@c1=^ zZU=`&+%IMNeQHg42h)382lK1OMZD(z2wlODwb>>$j?y6_<#kbg(h$FwsHm*2tQWWS zuOHEmej9d*TcAQq!}MMHTq&}y?cStis?nHQgXYx=C{DAFKJ7sUp`<z_JD zZ{aw1omyVi6dP_=Qa~<_b5o68iQYKJ&5w$Lb00WuPds<>L~zSL&&nwMSY?N@OdE!; z;xbJi>CuGJ=fOfS)B|_Y^L3ki&V%sg6I+)g$WmjkCFP)AK9iWH-uMoaKN zK%_N;Ilw;)7q1u^}|gv0e&DLBqWSK8LWBJk@Z zyqJGW-JJA9g=YS-c2_UGIIb=Q6V*&1AiJ>mUdXRc=zu-HmTTS=EY}i_-%Ngh=qn};pW-th?C=W5#rO>HkRcx80Q^wLT&D4`G1XI8m*1|dG`iw$#YrE(3$ zv@|u^K67PR1$u9}rU1A=re;#M1Ehl9^w0$hV7V}GJAVm;2@mvCh6HEH2e_@>cF3-K z)&sGYFoYZS*QZ=OF)vw6hI%Mb-cg`pAr1?2^3Izw@J!g7@a0`?sMqUbx4o~NXa&Ev7Q%w1|IVTimJmOJMi?JEC@8(iigfgqF*F{6Fi-gTZz*|0eYv-qR0tJlBD%(L{v53}D5pmi*O!kL{p zOy7`OOIrQkCiW|h(g|2$8A9|;5&o!w0j_cL2zTSgu9z4#r~z&Ggw65Xnq1^k|DsKR z>@(CHIDb}VQg++#&Uo3_NTQWtlNh~;tx1?YZK?cI=I7)U%_UL?>n^e1SAjJKks+K@ z>eZ&yNmnLQ@;n#SJd@^lj^VF@MdaU6v8wrj$b5R@HAteV5Ht+?n_1Tnbn6Y&uU4H!!?Oy*H6n+S+Y_wrjulx;~BJ%EZ+~B#xyBF||-!jH!d!Ysp2Gdt@LX1Or z?@706V-aP(G;i_clF*SPRnU`Al&o$k;Oc zf)E92K>x){bj8E^w13~OCi>fdJ}j1K zKwo1p!zlpG_WFw<-F0Gx*fw1MM~*Bu>7M0~ecgfd9wYC6jh>1Vib3s2_Uh-EIQ*nF zg|_EhS3t{j&1sttO)0qfb)9{8$!K%w1kkSEO)Z%C@0yjfc(HGk;_ znL%h|5L~618u4GYGGezKNRC3|R!VnY;QV4?5qG(Vnj_NwT!GHPDbQQNATIt>?Px4j zsJudGsRWm11s|7{v>rw)649KgH8sd7gmJ2GScAQ=57+Tekbt{DOy(GsSCARdrFsAU zp8|X(3vZXUjQ=tlGzb3{1jRe_p{Mr&@A!SP-w$q_PG;_XRi~S#&~*wMq4?TFDGT~8 zR26aD-fu$p@s~th!Khp3cSPGE7pCstve3Hsi4+n9r0C(=0$V#-N!D>hr33iC3*d4~ zIt-Rh8=T+NGqH(53 z;LyBjw!+Z!Ndd=P#;<};Wf*M4z4FM!G-zKl5hEY~**4iY<YMwKvZ9-?JhX#+E6Z^l0=P{~rUtVYjfv)~5{-De`;VT75}TQ&xQnZ= z2T+xt!}cBeHej?`0H>BZ$j`GnEr2|w#l{AHX%9mcZ$YB7_PciFw-)UkYMkl3E+Smw zsgo*w3G0L9>g&_oGMJ0-UNHutpgt=Pd{Bp8p{L*4%(sv)VRdRC^jzU*jv_I49aD&| zz4RZkcn_p-IxbC7=XaXccycK81Rr$~DjbJ$d+YyHfyC>1)U^-^yJZT!dmVZqaYW=@ z8m=&;*MUL%x98P_h6WB7p(MElz}60OnSuFr{y%KOk8pFp3m67G5lDhLeEs!*v{96y z$DY7&inaEX#$LK5A2nHqkm4Z!(Edm$l&=oj<&90a*xRu$fho)D9kY`}vqvbTT_xQ0 z-O$4i>WCM3E#LYK{LI9w3baCbGs^=k2-DN)O^3n^E$3#!nT;v=JY)EoxrRbfSIfI+ zMibxfVJ6RPUukZ9@GqqUqMn$??4MaGY1a{!$=I zO?oUXXo7+MDmjTRw8JYYaPHUzG bwy5CEXfP@?*ieu+;Q}@m4(6q%q}cxfd4@Ck literal 0 HcmV?d00001 diff --git a/vue/public/icons/TaskbarIcon.png b/vue/public/icons/TaskbarIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..e7af38c631b376b79e5b7b525c57e9ac28acea01 GIT binary patch literal 5225 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 bwy5CEXfP@?*ieu+;Q}@m4(6q%q}cxfd4@Ck literal 0 HcmV?d00001 diff --git a/vue/public/icons/desktopIcon.ico b/vue/public/icons/desktopIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..56b91ac3f0241d7bf0c104dce3b58a0b961e5ad0 GIT binary patch literal 19975 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 O5(XXts72n8m;Vm}Fg>yW literal 0 HcmV?d00001 diff --git a/vue/public/img/background.png b/vue/public/img/background.png new file mode 100644 index 0000000000000000000000000000000000000000..c6841de52e14a5bd63ece165e7739e4f069e0439 GIT binary patch literal 5721 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 literal 0 HcmV?d00001 diff --git a/vue/public/img/background.svg b/vue/public/img/background.svg new file mode 100644 index 00000000..565c6d90 --- /dev/null +++ b/vue/public/img/background.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/vue/public/img/cool_wolf.png b/vue/public/img/cool_wolf.png new file mode 100644 index 0000000000000000000000000000000000000000..4bed22a89cebd711b741ab7c669ffb37f7066d64 GIT binary patch literal 11912 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 B(=q@6 literal 0 HcmV?d00001 diff --git a/vue/public/img/facebook.svg b/vue/public/img/facebook.svg new file mode 100644 index 00000000..8ff3f5be --- /dev/null +++ b/vue/public/img/facebook.svg @@ -0,0 +1,3 @@ + + + diff --git a/vue/public/img/header_icon.svg b/vue/public/img/header_icon.svg new file mode 100644 index 00000000..da729b42 --- /dev/null +++ b/vue/public/img/header_icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/vue/public/img/header_icons.svg b/vue/public/img/header_icons.svg new file mode 100644 index 00000000..0edfa756 --- /dev/null +++ b/vue/public/img/header_icons.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vue/public/img/reddit.png b/vue/public/img/reddit.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8c5e462d14fe7518b51c57c3b26d51ccd303db GIT binary patch literal 742 zcmV71Q{00004XF*Lt006O% z3;baP00009a7bBm000XT000XT0n*)m`~Uy|7<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%hhNHvLWs=l}o$WJyFpR7gv;mQ6@hQ546g4{RsZE?g+KXw|A{o0N;djV{JbRJ4mA z+q7!oB+b0}f+xPkES**vA_gtm^oa{m!$48NMNJ4Hq9R40F6#L^&okqj%Y8OD&L95V zd(ZjbbM8Iw-a8XJDiVoAQznz~m5b?g`Zev-Y&P2sx5_^3H*`vU$mMdk2>3ObOt#Q= z!G8FLWIrTPh((=J9|-KQ`cWNLfIVR(bk$WK2>g*?k9AlD7BYly7ZzRDJ+J2aK(JNH zdR>Q&MJkoLKti8`b5>1_g&vrB9UedQB;J*SLOV?Rh4wqG^c@z^!*^>}`Oy%M$4}++ z`A!1PO8IK!4Eoy|A{vP9ApQye!f73UgSMcxuq27u^=JD3;IiX5_shwyhJ+0z3+RwL zGiY-*h@R~5u!JQRbcN%865T_KKOooS5t?TDmtiUFGw8_+Q@V}|J1$PQm= zngg)IcAHozC9&BJMpi&#Ynp1{bWJf_mtO}?*mDvuSo~|)pYh(dMl5VV!`p#i#F!wI z=kBKX<-XCsBrFsP=RD6l!w%$XEgN&BGB1Om{{!MD=47Ru + + + + + + + + diff --git a/vue/public/img/twitter.svg b/vue/public/img/twitter.svg new file mode 100644 index 00000000..0fd6d8a7 --- /dev/null +++ b/vue/public/img/twitter.svg @@ -0,0 +1,3 @@ + + + diff --git a/vue/public/index.html b/vue/public/index.html new file mode 100755 index 00000000..166ac25a --- /dev/null +++ b/vue/public/index.html @@ -0,0 +1,16 @@ + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + +
+ + + diff --git a/vue/public/manifest.json b/vue/public/manifest.json new file mode 100755 index 00000000..5a1e72e7 --- /dev/null +++ b/vue/public/manifest.json @@ -0,0 +1,104 @@ +{ + "manifest_version": 1, + "type": "WebApp", + "meta": { + "name": "Sample App", + "author": "Overwolf", + "version": "3.0.2", + "minimum-overwolf-version": "0.160.0", + "description": "An example app for developers new to Overwolf", + "dock_button_title": "Sample - Vue.js", + "icon": "icons/IconMouseOver.png", + "icon_gray": "icons/IconMouseNormal.png", + "launcher_icon": "icons/DesktopIcon.ico", + "window_icon": "icons/TaskbarIcon.png" + }, + "permissions": [ + "Hotkeys", + "GameInfo" + ], + "data": { + "start_window": "desktop", + "windows": { + "background": { + "file": "background.html", + "is_background_page": true + }, + "desktop": { + "file": "desktop.html", + "desktop_only": true, + "native_window": true, + "resizable": true, + "transparent": true, + "override_on_update": true, + "size": { + "width": 1212, + "height": 699 + } + }, + "in_game": { + "file": "in_game.html", + "in_game_only": true, + "focus_game_takeover": "ReleaseOnHidden", + "focus_game_takeover_release_hotkey": "showhide", + "resizable": false, + "transparent": true, + "override_on_update": true, + "size": { + "width": 1212, + "height": 699 + } + } + }, + "game_targeting": { + "type": "dedicated", + "game_ids": [ + 21216 + ] + }, + "game_events": [ + 21216 + ], + "launch_events": [ + { + "event": "GameLaunch", + "event_data": { + "game_ids": [ + 21216 + ] + }, + "start_minimized": false + } + ], + "hotkeys": { + "showhide": { + "title": "Show/Hide In-Game Window", + "action-type": "toggle", + "default": "Ctrl+F" + } + }, + "protocol_override_domains": { + "googlesyndication": "http" + }, + "externally_connectable": { + "matches": [ + "http://*.overwolf.com", + "https://*.overwolf.com", + "https://overwolf.github.io", + "https://*.google-analytics.com", + "http://*.google-analytics.com", + "https://www.googleapis.com", + "https://discord.gg/v5cfBTq", + "https://twitter.com/", + "https://www.facebook.com", + "https://www.reddit.com" + ] + }, + "force_browser": "user", + "developer": { + "enable_auto_refresh": true, + "reload_delay": 1000, + "filter": "*.*" + } + } +} diff --git a/vue/releases/.gitkeep b/vue/releases/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/vue/src/background/App.vue b/vue/src/background/App.vue new file mode 100755 index 00000000..035ca183 --- /dev/null +++ b/vue/src/background/App.vue @@ -0,0 +1,20 @@ + + + diff --git a/vue/src/background/main.js b/vue/src/background/main.js new file mode 100755 index 00000000..e919314e --- /dev/null +++ b/vue/src/background/main.js @@ -0,0 +1,12 @@ +import Vue from "vue"; +import App from "./App.vue"; +import vuetify from "../plugins/vuetify"; +import windowFunctions from "../plugins/appWindow"; + +Vue.use(windowFunctions); +Vue.config.productionTip = false; + +new Vue({ + vuetify, + render: h => h(App) +}).$mount("#app"); diff --git a/vue/src/desktop/App.vue b/vue/src/desktop/App.vue new file mode 100755 index 00000000..7ff08c17 --- /dev/null +++ b/vue/src/desktop/App.vue @@ -0,0 +1,29 @@ + + + diff --git a/vue/src/desktop/main.js b/vue/src/desktop/main.js new file mode 100755 index 00000000..3ea876d4 --- /dev/null +++ b/vue/src/desktop/main.js @@ -0,0 +1,13 @@ +import Vue from "vue"; +import App from "./App.vue"; +import vuetify from "../plugins/vuetify"; +import windowFunctions from "../plugins/appWindow"; + +Vue.use(windowFunctions); + +Vue.config.productionTip = false; + +new Vue({ + vuetify, + render: h => h(App) +}).$mount("#app"); diff --git a/vue/src/in_game/App.vue b/vue/src/in_game/App.vue new file mode 100755 index 00000000..63ed3479 --- /dev/null +++ b/vue/src/in_game/App.vue @@ -0,0 +1,20 @@ + + + diff --git a/vue/src/in_game/main.js b/vue/src/in_game/main.js new file mode 100755 index 00000000..e919314e --- /dev/null +++ b/vue/src/in_game/main.js @@ -0,0 +1,12 @@ +import Vue from "vue"; +import App from "./App.vue"; +import vuetify from "../plugins/vuetify"; +import windowFunctions from "../plugins/appWindow"; + +Vue.use(windowFunctions); +Vue.config.productionTip = false; + +new Vue({ + vuetify, + render: h => h(App) +}).$mount("#app"); diff --git a/vue/src/plugins/appWindow.js b/vue/src/plugins/appWindow.js new file mode 100755 index 00000000..1b3feea5 --- /dev/null +++ b/vue/src/plugins/appWindow.js @@ -0,0 +1,27 @@ +import { OWWindow } from "@overwolf/overwolf-api-ts/dist"; + +export default { + install(Vue) { + Vue.prototype.$mainWindow = new OWWindow("background"); + + Vue.prototype.$closeApp = function() { + this.$mainWindow.close(); + }; + Vue.prototype.$minimizeApp = function(windowName) { + let window = new OWWindow(windowName); + window.minimize(); + }; + Vue.prototype.$maximazeApp = function(windowName) { + let window = new OWWindow(windowName); + window.maximize(); + }; + Vue.prototype.$getWindowState = async function (windowName) { + let window = new OWWindow(windowName); + return await window.getWindowState(); + }; + Vue.prototype.$setDrag = async function(windowName, elem) { + let window = new OWWindow(windowName); + window.dragMove(elem); + }; + } +}; diff --git a/vue/src/plugins/vuetify.js b/vue/src/plugins/vuetify.js new file mode 100755 index 00000000..3cda4797 --- /dev/null +++ b/vue/src/plugins/vuetify.js @@ -0,0 +1,35 @@ +import "@fortawesome/fontawesome-free/css/all.css"; +import Vue from "vue"; +import Vuetify from "vuetify/lib/framework"; +import colors from "vuetify/es5/util/colors"; + +Vue.use(Vuetify); + +export default new Vuetify({ + icons: { + iconfont: "fa" + }, + theme: { + themes: { + light: { + primary: colors.purple, + secondary: colors.teal, + accent: colors.cyan, + error: colors.red, + warning: colors.orange, + info: colors.blue.base, + success: colors.green + }, + dark: { + primary: colors.purple, + secondary: colors.teal, + accent: colors.cyan, + error: colors.red, + warning: colors.orange, + info: colors.blue.base, + success: colors.green + } + }, + options: { customProperties: true } + } +}); diff --git a/vue/vue.config.js b/vue/vue.config.js new file mode 100755 index 00000000..935f5c7c --- /dev/null +++ b/vue/vue.config.js @@ -0,0 +1,27 @@ +module.exports = { + transpileDependencies: ["vuetify"], + pages: { + background: { + entry: "src/background/main.js", + template: "public/index.html", + filename: "background.html", + title: "Example - Background" + }, + desktop: { + entry: "src/desktop/main.js", + template: "public/index.html", + filename: "desktop.html", + title: "Example - Desktop" + }, + in_game: { + entry: "src/in_game/main.js", + template: "public/index.html", + filename: "in_game.html", + title: "Example - In game" + } + }, + productionSourceMap: false, + configureWebpack: { + devtool: false + } +}; From ce823cb638a57aa5e33829a832a4e4a374e8077e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20Fl=C3=B6tzinger?= Date: Tue, 10 Aug 2021 00:26:13 +0200 Subject: [PATCH 02/14] Implement background window. Fill desktop window with sample app. --- .gitignore | 8 + vue/package.json | 22 +-- vue/public/index.html | 6 +- vue/public/manifest.json | 2 +- vue/{public/img => src/assets}/background.svg | 0 vue/{public/img => src/assets}/cool_wolf.png | Bin .../img => src/assets}/header_icon.svg | 0 .../img => src/assets}/header_icons.svg | 0 vue/{public/img => src/assets}/reddit.png | Bin vue/src/background/App.vue | 49 ++++++- vue/src/components/.gitkeep | 0 vue/src/desktop/App.vue | 138 ++++++++++++++++-- vue/src/plugins/appWindow.js | 8 +- vue/src/plugins/consts.js | 28 ++++ vue/src/plugins/vuetify.js | 7 +- vue/src/sass/variables.scss | 5 + 16 files changed, 239 insertions(+), 34 deletions(-) create mode 100644 .gitignore rename vue/{public/img => src/assets}/background.svg (100%) rename vue/{public/img => src/assets}/cool_wolf.png (100%) rename vue/{public/img => src/assets}/header_icon.svg (100%) mode change 100644 => 100755 rename vue/{public/img => src/assets}/header_icons.svg (100%) rename vue/{public/img => src/assets}/reddit.png (100%) create mode 100755 vue/src/components/.gitkeep create mode 100755 vue/src/plugins/consts.js create mode 100755 vue/src/sass/variables.scss diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..7b14c75a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/vue/package.json b/vue/package.json index 983d1639..5c768fa5 100755 --- a/vue/package.json +++ b/vue/package.json @@ -10,40 +10,42 @@ "serve": "vue-cli-service serve --mode=development" }, "devDependencies": { - "@fortawesome/fontawesome-free": "^5.15.3", + "@mdi/font": "^5.9.55", + "@mdi/js": "^5.9.55", "@overwolf/overwolf-api-ts": "^1.3.0", "@overwolf/types": "^3.6.0", "@vue/cli-plugin-babel": "^4.5.13", - "@vue/cli-plugin-eslint": "^4.5.12", + "@vue/cli-plugin-eslint": "^3.1.1", "@vue/cli-plugin-router": "^4.5.12", "@vue/cli-plugin-vuex": "^4.5.12", - "@vue/cli-service": "^4.5.13", + "@vue/cli-service": "^3.12.1", "@vue/eslint-config-prettier": "^6.0.0", "axios": "^0.21.1", "babel-eslint": "^10.1.0", + "deepmerge": "^4.2.2", "eslint": "^6.7.2", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-vue": "^6.2.2", "prettier": "^1.19.1", - "sass": "^1.32.11", - "sass-loader": "^8.0.0", + "sass": "~1.32", + "sass-loader": "^8.0.2", "semver": "^7.3.4", "vue-cli-plugin-axios": "0.0.4", "vue-cli-plugin-vuetify": "^2.0.9", "vue-template-compiler": "^2.6.14", - "vuetify-loader": "^1.7.2", "zip-a-folder": "^0.0.12" }, "dependencies": { "core-js": "^3.11.0", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "moment": "^2.29.1", "vue": "^2.6.14", "vue-router": "^3.5.2", "vuetify": "^2.5.8", + "vuetify-loader": "^1.7.2", "vuex": "^3.6.2", - "vuex-persist": "^3.1.3", - "jwt-decode": "^3.1.2", - "lodash": "^4.17.21", - "moment": "^2.29.1" + "vuex-persist": "^3.1.3" }, "eslintConfig": { "globals": { diff --git a/vue/public/index.html b/vue/public/index.html index 166ac25a..509597a1 100755 --- a/vue/public/index.html +++ b/vue/public/index.html @@ -4,7 +4,11 @@ <%= htmlWebpackPlugin.options.title %> - +