From 7d7fcf2bf25a113d83bb1179fbaa52edc43988bb Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Fri, 22 Mar 2024 08:39:00 -0400 Subject: [PATCH] Staring phaser work (#14) * some working code * reworked backend js for modules * add backend files back * fixing menu.js * minor fix from service * fixing test file --------- Co-authored-by: Ale Kennedy --- app/services/ui/website/.DS_Store | Bin 0 -> 6148 bytes app/services/ui/website/assets/.DS_Store | Bin 0 -> 6148 bytes .../{scripts/frontend => }/assets/Dice.png | Bin .../{scripts/frontend => }/assets/betbtn.png | Bin .../frontend => }/assets/connectbtn.png | Bin .../{scripts/frontend => }/assets/five.png | Bin .../{scripts/frontend => }/assets/four.png | Bin .../frontend => }/assets/greenbackground.png | Bin 19626 -> 19293 bytes .../{scripts/frontend => }/assets/joinbtn.png | Bin .../{scripts/frontend => }/assets/liarbtn.png | Bin .../{scripts/frontend => }/assets/newbtn.png | Bin .../{scripts/frontend => }/assets/one.png | Bin .../{scripts/frontend => }/assets/six.png | Bin .../{scripts/frontend => }/assets/three.png | Bin .../{scripts/frontend => }/assets/two.png | Bin app/services/ui/website/index.html | 9 +- .../ui/website/scripts/backend/app.js | 65 +++++------ .../ui/website/scripts/backend/backend.js | 21 ++++ .../ui/website/scripts/backend/engine.js | 65 ++++++----- .../ui/website/scripts/backend/init.js | 34 ------ .../ui/website/scripts/backend/wallet.js | 103 ++++++++---------- .../ui/website/scripts/frontend/game.js | 13 +-- .../ui/website/scripts/frontend/menu.js | 29 +++-- business/data/dbtest/dbtest.go | 12 +- foundation/validate/errors.go | 2 +- 25 files changed, 163 insertions(+), 190 deletions(-) create mode 100644 app/services/ui/website/.DS_Store create mode 100644 app/services/ui/website/assets/.DS_Store rename app/services/ui/website/{scripts/frontend => }/assets/Dice.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/betbtn.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/connectbtn.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/five.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/four.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/greenbackground.png (50%) rename app/services/ui/website/{scripts/frontend => }/assets/joinbtn.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/liarbtn.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/newbtn.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/one.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/six.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/three.png (100%) rename app/services/ui/website/{scripts/frontend => }/assets/two.png (100%) create mode 100644 app/services/ui/website/scripts/backend/backend.js delete mode 100644 app/services/ui/website/scripts/backend/init.js diff --git a/app/services/ui/website/.DS_Store b/app/services/ui/website/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c0c4eaf4b035c16fea87526c5f12dd79ca4eaad8 GIT binary patch literal 6148 zcmeHK!AiqG5S?wSO({YT3OxqA7ED_yh?h|74;aydN==%e!I&*gY7eE5v;L4@;`cbS zyAewD;z6X$l$kf3o!KxiWw!$WVmJ@G04)HpPzfsyG~WoVlWs`GM5>5F?U6$kEV5~k z$Y3Lz1OJf$dUw0vLx!IS*5BWIFiqktcbpGVsn&LO>sH-rT6f-~TzI*k&$FRFyPKLHPs2>rdV0ZXSdDS3ypNuH1%^8DIvOfvsi09C%i9Ydhq|m;q+sw+ztvV51Vc1`Cbq=s=@J z0K^)Gm7q_v1l8CEU4w;2TtN}K6j7H7Ghzr`j&a-Mxdsc3x*UWVK7@I)FcXSUPsjaj zl@7wy$d(yk2G$v%*$<^f_y76N^S?@B!wfJ3+sS~ajl9tidoy?IMwfKg+Nk%aB$QWZ m{3=05UB#G7S8*Fv3C3-55M6_XMvS2F9|1)J8)o278TbT7V^X#N literal 0 HcmV?d00001 diff --git a/app/services/ui/website/assets/.DS_Store b/app/services/ui/website/assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T05J!oQ1w{r2utFpQ z2Be7yib`{oqSCt{ML{7TMIaPI$vuISpw4}7-SytwKW0tNS}afYx4&I}d!PO76WE@& zvoV+YcEh(22t>-#!qgrDk*I+{mYrQL4p5r?3?2jjeB)5U6gZ4*vYg(ez)s>H;G?8j*nwpwOq#8m~T|-A3fmEiT z;2LTOxH??jP3{L-2xRH7x8otop?%gUG|5-h14Ht}s#1OZ0QnGz9u)=L`eG>_3RGVL zF#tu?SDfcS0rz||Owr(51@O`%V{j;YQ!|hi_@uAsMWOhiV6foeVAWuRDv6ATsq5(I zz|`O{I9vtbPzeYjQaq?C#DJ}Uq%TF8Vgt}*Z$FARiKxIA?cqrZr06Ru3b__c!k~p} z`~t~@c_kP$3`@ZBaS4E_tEzutB?gV6cvA@2uM9UPP`;uNy!oD>2p&Ydz9LlxgT;9S z5-5rWcrq4CRPgjb`{2o>Kq5v#MFFk{<6B7Z{!GL? zAriy@RgZZ}ARj(eAhIwI3?B=%FR)nHg)+tjd}cV`69=sSR}=sZ{(_$eIRNVz;)m5& zw8sXJ0?BCX=P3XRG$CU>C|HaETn(;Qv1zfvWLEE()!rdieb*3jt=- ze8!N-jwBMnz{G-qn*6^RDX2kT@c`B6vowYYtC>N$*%KuQWKX4~sj(w9ZlJ|j z3Zk&`$=#Eo)#oHFyw(jAArWilDA>c)w_Btx?!Ml&`?892;{N_68_t3uW#V0|jpTadp|I1MAmeqZ1McR&hUR?zB;j zT?>3fdwPfT=j3Z76m@3SLbHfvT3ILXt_?%C!}sNFOdy52_itO!OaEm9f=sdA7)rB- zWnLV!Nx#_FU2VaLk&$E<{r)Hqc~B$s*UVO}vYvLS6yTVjzgCpzj5wf6PiJ?JUbwD~ z9XQ>fqw|73XE=eQd477(PsO_gYEU$jtHc)AW!GOWW2|?&3D>=I``S8IqFHj)3psI4 z*zJzF1NrTo{S7%8dl^d>c>PRW^+L=lbO!4ldUZWYafnjt7b{2|`GxBJ;hxvvC)@tD z3w-ojyIv+0OX1ztI5}2WF`}$%rPu}2(_NKkFK6YP2%&HSlLYFY?_6V5j_znk^Q=m_ zS{!d>#;VduxPUX_jU-zux7e@CY%Y>99O%4?l2{O}kQ||#s@$`$VAq|@xMpg zW@oS5pdNizo|T=uHIUy90hf{6b$HP3nemy8;aw4&Q=4mY14)q*&8okWf)|BV^fo?n|GproLuYmF)Uu zT1>5=StTNm^VX{~S4pVS7!}xNndLWe>e?aan<%Wsx(2#irq0CQyH52Q%+5-{1`0t;fRp+g)p>0pDTuSC9n$O!{lTmw zjZa@S-PaeY+>gS~$c=ogC@RS^kKD^39~z|@WxlRon|pl5j)JGzCxbfI-d|(3Ws9vF z**1>Tdp^ZMT!kdTLGn6Q24~P3j`f0EIti49YlpOt8OJ%fT}NTl@vKZmWce;!Qk6C)M2l&dH*%j!EO$vkfDBXeTJZ=iBI-kHgWS1onc^J$QTGU$ z2M1YIAj1&|QE#mEA-1)xK@NH_3U!3(Ha+3mt+TLfv^nHNxeGr{`Y(!=hl?G@mg7gJ z9&Z=Q*ES7rDv}*WX4){+6?6=l%{dw2(@n}&3^1XeDCmFuAV!Pu_LTx<$r#jaj)PKJC$7PUJ~ zs9ko4?VZq_h3)lmsBYf726{(yi%jqxE`Cu!OFJ^sYd0OL z5L)_?bMA4^k3T(WFUjtW)pGF3)9c&?`mInp9bwz&JbhvaVQ;lvwkB8c7s|lk?jb>1 zJb(8*7U7M*cXj&W43t}|g|F|RT$>i425;FsS^wgFz@zHtx=h{%Vv3ZMislWx~WymI{y6U%PUI>a& zQRDH|*Fn#iPl*`@QiEq!uwkLf<~^Y3+jm)R1ErfZnUT0|j(@iNWdV2BhJxVV3+{@w ze+U3s=SnaJmP$n~9ssqV*5$kv=#Sl+i1CLRIs~K8`82s@1>s09+lQFQk?2ID}=0;so~w?yw- z^LhIBecyU*yb7Ww`AjW%##p+9`^s|Zk|#34NrKgjf4VNZWB#XTI4@@-#%SOuBfXk& zCUgpz1LO~Rxa@V@FI)Du`TF3y!#nhnRwQDt%f(29y_DQNw$j+s&Q4~x%yGKv^ha09 zmTLpSm4utU-_6KOPn5Z(O`J(>ymL$-^K4q{cy4bily=Ni@Jp{ZL8+%F;yy~y4onKh zP^6k|9?s^^(TAi3!wbZe4Jo|dL2jlWsgZX{Fg{Xw5ZNV7ae4@zIevR1sLlB8k9S z$_Wc=FBwc13{7tEB>5})D#4hr<${5YHfx;EdO^<09*U4;cNl}U>dlTInVYwUSjzw@ zzp(Q2`aqXtiPPtY| zZL5-rNx&3qSpE330ZY)-v(~^A*s5hqxQE?^UUu5hGV8SJq1>6Nc52~WhW>X8%ug<9 zJL`m{RGD&#G^5BcZTCJhEmz#R}^Ci?3#k*^hy{ zB(DvhA;DqmYqtJiKq`zpe>DHyDsV{_k{yie8vVn+7O_@}UC($i^*C_<=yJhE`W9U$ zR-~OK(|l%j`FCpqSdpNSM&D23kNMvZvFFOZhtf=oGYdY{nS;BSmpWl5t{Ch#HJt&t z=N}D1GhVE8+e)4$Jv$SEEjH0C zq5iJkp&emElEishSG4`GO&qDc-2`KmOeg$8Snszyd;HYhBc+HmwEm>eN}+(mY7l68frm#& z(HjN}F=x9+ifuW{`t=yxyP|l}fJ-TB?mTb8##-U?cb7=95vd;ncv8VJ!a-L0&sk`P z{?f*nD(aaF8vz~f({nN7`IlJ;5KlIKqjNK^Hpj;b|C8gM6>Lj#@butySKUOR6|=Xn z{ig^7R~JIu*nHiLWKVeHL?YCzAvb-GN&7wI?pKDE9! zh#g5RyKDn;F(XsUtY2yo9~(OCuvTS^-q=M0FgxR<`n>7ayuEnPq8fAQHY%y7LGwx# z)peaAAgfN!x8>*AvPF))@$NLI*8bSN_@AP_R|hz5d?Hm3HWy|JjlSyD9k``J7guzj zQo4O397>D&nOu90>{5P1h+Y1#ubrDP&z?%hRIxAb*9R`vR@w*i>Cl_L#|m9gVBMjI zKTMuQAD%8fz(UY`EdYQ&Eq0Y#u3_ zoB$ZRVTG6YjOWpzs)8wZwS=6;T#QdylC_+>6YBjvsc^B`{Bsk&)mrgW9(`aCOd_DODzhg(`KFRkmNK$Q&hYryYvrE|n*yZ|U}P zAEj`%Y)kLkqJbZUtm)}KZj6ZLjLOrs-FuTcc^*2<_({(Bt)E6oMbY}z28RV>>qjhH z>S}IO?$yK{9OTsPgyIfKvwQV}yn+i0dynb#=MI4$7r?V|v>{qOS2@1L4TXIY5eDe4 zqQqC4*b=LsO$WbgXbHV47{tHr6oUN{t0NKfcT zp_Aib3@~tZ`;(lS@c{Ruz`1>LPRIw8D&_`%DEG_*-gxcLp`Eq??026!> z1JVzCJRU0hj#qkb(4w&i%sv6+;(6Md9E zF2|w|0x>CD}5iAxc_z}pAVzu9vjm;yN{gu7vGu_&Hw-a literal 19626 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 Testing Metamask Wallet - + - - - - + +

Testing Metamask Wallet

-

diff --git a/app/services/ui/website/scripts/backend/app.js b/app/services/ui/website/scripts/backend/app.js index bd1af5a5..cd3408f5 100644 --- a/app/services/ui/website/scripts/backend/app.js +++ b/app/services/ui/website/scripts/backend/app.js @@ -1,73 +1,74 @@ +import Engine from './engine.js'; +import Wallet from './wallet.js'; + class App { - engine; + #engine; // ------------------------------------------------------------------------- constructor(url) { - this.engine = new Engine(url); + this.#engine = new Engine(url); } // ------------------------------------------------------------------------- - init() { + Init() { // Make sure 'this' is the object and not the html element // when these methods are executed by the event listener. - this.handlerGameConnect = this.handlerGameConnect.bind(this); - this.handlerGameTables = this.handlerGameTables.bind(this); + this.handlerGameConnect = this.#handlerGameConnect.bind(this); + this.handlerGameTables = this.#handlerGameTables.bind(this); - $("#gameConnect").click(this.handlerGameConnect); - $("#gameTables").click(this.handlerGameTables); + $('#gameConnect').click(this.handlerGameConnect); + $('#gameTables').click(this.handlerGameTables); } // ------------------------------------------------------------------------- - async handlerGameConnect() { - const err = await this.gameConnect(); + async #handlerGameConnect() { + const err = await this.#gameConnect(); if (err != null) { - $("#error").text(err); + $('#error').text(err); return; } // For now display the token. - $("#error").text(this.engine.token); + $('#error').text(this.#engine.token); } - async handlerGameTables() { - const [tables, err] = await this.engine.tables(); + async #handlerGameTables() { + const [tables, err] = await this.#engine.Tables(); if (err != null) { - $("#error").text(err); + $('#error').text(err); return; } - $("#error").text(JSON.stringify(tables)); + $('#error').text(JSON.stringify(tables)); } // ------------------------------------------------------------------------- // gameConnect does everything to connect the browser to the wallet and // to the game engine. - async gameConnect() { - + async #gameConnect() { // Get configuration information from the game engine. - var [cfg, err] = await this.engine.config(); + var [cfg, err] = await this.#engine.Config(); if (err != null) { return err; } // Ask the user's wallet if it's talking to the same blockchain as // the game engine. - var [_, err] = await Wallet.switchChain(cfg.chainId); + var [_, err] = await Wallet.SwitchChain(cfg.chainId); if (err != null) { - // The blockchain does not exist in the user's wallet so // let's try to help them. - var [_, err] = await Wallet.addEthereumChain(cfg.chainId, cfg.network); + var [_, err] = await Wallet.AddEthereumChain(cfg.chainId, cfg.network); if (err != null) { return err; } // Try one more time to switch the wallet. - var [_, err] = await Wallet.switchChain(cfg.chainId); + var [_, err] = await Wallet.SwitchChain(cfg.chainId); if (err != null) { return err; } @@ -75,7 +76,7 @@ class App { // Request permission to use the wallet. The user will select an // account to use. - var [rp, err] = await Wallet.requestPermissions(); + var [rp, err] = await Wallet.RequestPermissions(); if (err != null) { return err; } @@ -96,13 +97,13 @@ class App { const dateTime = currentDateTime(); // Sign the arbitrary data. - var [sig, err] = await Wallet.personalSign(address, cfg.chainId, dateTime); + var [sig, err] = await Wallet.PersonalSign(address, cfg.chainId, dateTime); if (err != null) { return err; } // Connect to the game engine to get a token for game play. - var err = await this.engine.connect(address, cfg.chainId, dateTime, sig); + var err = await this.#engine.Connect(address, cfg.chainId, dateTime, sig); if (err != null) { return err; } @@ -111,17 +112,19 @@ class App { } } +export default App; + // ============================================================================= function currentDateTime() { const dt = new Date(); - - const year = dt.getUTCFullYear(); - const month = String(dt.getUTCMonth() + 1).padStart(2, '0'); // Month (0-indexed) - const day = String(dt.getUTCDate()).padStart(2, '0'); - const hours = String(dt.getUTCHours()).padStart(2, '0'); + + const year = dt.getUTCFullYear(); + const month = String(dt.getUTCMonth() + 1).padStart(2, '0'); // Month (0-indexed) + const day = String(dt.getUTCDate()).padStart(2, '0'); + const hours = String(dt.getUTCHours()).padStart(2, '0'); const minutes = String(dt.getUTCMinutes()).padStart(2, '0'); const seconds = String(dt.getUTCSeconds()).padStart(2, '0'); return `${year}${month}${day}${hours}${minutes}${seconds}`; -} \ No newline at end of file +} diff --git a/app/services/ui/website/scripts/backend/backend.js b/app/services/ui/website/scripts/backend/backend.js new file mode 100644 index 00000000..a0217b27 --- /dev/null +++ b/app/services/ui/website/scripts/backend/backend.js @@ -0,0 +1,21 @@ +import App from './app.js'; + +const app = new App('http://0.0.0.0:3000'); + +const sdk = new MetaMaskSDK.MetaMaskSDK({ + dappMetadata: { + name: 'Pure JS example', + url: window.location.host, + }, + logging: { + sdk: false, + }, +}); + +$.ajaxSetup({ + contentType: 'application/json; charset=utf-8', +}); + +window.onload = function () { + app.Init(); +}; diff --git a/app/services/ui/website/scripts/backend/engine.js b/app/services/ui/website/scripts/backend/engine.js index 718136cf..8cb973e8 100644 --- a/app/services/ui/website/scripts/backend/engine.js +++ b/app/services/ui/website/scripts/backend/engine.js @@ -1,71 +1,80 @@ class Engine { - url; - token; + #url; + #token; // ------------------------------------------------------------------------- constructor(url) { - this.url = url; + this.#url = url; } // ------------------------------------------------------------------------- - async isConnected() { - return (token != null) ? true : false; + async #isConnected() { + return this.#token != null ? true : false; } - async config() { + async Config() { try { const result = await $.ajax({ - type: "get", - url: `${this.url}/v1/game/config` + type: 'get', + url: `${this.#url}/v1/game/config`, }); return [result, null]; - } - - catch (e) { + } catch (e) { return [null, parseError(e)]; } } - async connect(address, chainId, dateTime, sigature) { + async Connect(address, chainId, dateTime, sigature) { try { - this.token = null; + this.#token = null; const result = await $.ajax({ - type: "post", - url: `${this.url}/v1/game/connect`, - data: `{"address":"${address}","chainId":${chainId},"dateTime":"${dateTime}","sig":"${sigature}"}` + type: 'post', + url: `${this.#url}/v1/game/connect`, + data: `{"address":"${address}","chainId":${chainId},"dateTime":"${dateTime}","sig":"${sigature}"}`, }); - this.token = result.token; + this.#token = result.token; return null; - } - - catch (e) { + } catch (e) { return [null, parseError(e)]; } } - async tables() { + async Tables() { try { if (!this.isConnected) { - return [null, "not connected to game engine"]; + return [null, 'not connected to game engine']; } const tables = await $.ajax({ - type: "get", - url: `${this.url}/v1/game/tables`, - headers: { "Authorization": "Bearer " + this.token } + type: 'get', + url: `${this.#url}/v1/game/tables`, + headers: {Authorization: 'Bearer ' + this.#token}, }); return [tables, null]; - } - - catch (e) { + } catch (e) { return [null, parseError(e)]; } } } + +export default Engine; + +// ============================================================================= + +function parseError(e) { + switch (true) { + case 'responseJSON' in e: + return e.responseJSON.error; + case 'responseText' in e: + return e.responseText; + } + + return 'no error field identified'; +} diff --git a/app/services/ui/website/scripts/backend/init.js b/app/services/ui/website/scripts/backend/init.js deleted file mode 100644 index fe9a2be9..00000000 --- a/app/services/ui/website/scripts/backend/init.js +++ /dev/null @@ -1,34 +0,0 @@ -const app = new App("http://0.0.0.0:3000"); - -const sdk = new MetaMaskSDK.MetaMaskSDK({ - dappMetadata: { - name: "Pure JS example", - url: window.location.host, - }, - logging: { - sdk: false, - } -}); - -$.ajaxSetup({ - contentType: "application/json; charset=utf-8", -}); - -window.onload = function () { - app.init(); -} - -// ============================================================================= - -function parseError(e) { - switch (true) { - case ('responseJSON' in e): - return e.responseJSON.error; - case ('message' in e): - return e.message; - case ('responseText' in e): - return e.responseText; - } - - return "no error field identified"; -} \ No newline at end of file diff --git a/app/services/ui/website/scripts/backend/wallet.js b/app/services/ui/website/scripts/backend/wallet.js index 47015c95..2bcfeced 100644 --- a/app/services/ui/website/scripts/backend/wallet.js +++ b/app/services/ui/website/scripts/backend/wallet.js @@ -1,136 +1,127 @@ class Wallet { - static async switchChain(chainId) { + static async SwitchChain(chainId) { try { const result = await ethereum.request({ method: 'wallet_switchEthereumChain', params: [ { - "chainId": '0x' + chainId.toString(16) - } + chainId: '0x' + chainId.toString(16), + }, ], }); return [result, null]; - } - - catch (e) { + } catch (e) { return [null, parseError(e)]; } } - static async addEthereumChain(chainId, network) { + static async AddEthereumChain(chainId, network) { try { const result = await ethereum.request({ method: 'wallet_addEthereumChain', params: [ { chainId: '0x' + chainId.toString(16), - chainName: "Liars Dice Local", - rpcUrls: [ - cfg.network, - ], + chainName: 'Liars Dice Local', + rpcUrls: [cfg.network], iconUrls: [], nativeCurrency: { - "name": "Ethereum", - "symbol": "ETH", - "decimals": 18 + name: 'Ethereum', + symbol: 'ETH', + decimals: 18, }, - blockExplorerUrls: [ - network - ] - } + blockExplorerUrls: [network], + }, ], }); return [result, null]; - } - - catch (e) { + } catch (e) { return [null, parseError(e)]; } } - static async requestPermissions() { + static async RequestPermissions() { try { const result = await ethereum.request({ method: 'wallet_requestPermissions', params: [ { - "eth_accounts": {} - } + eth_accounts: {}, + }, ], }); return [result, null]; - } - - catch (e) { + } catch (e) { return [null, parseError(e)]; } } - static async personalSign(address, chainId, dateTime) { + static async PersonalSign(address, chainId, dateTime) { const data = `{"address":"${address}","chainId":${chainId},"dateTime":"${dateTime}"}`; try { const signature = await ethereum.request({ method: 'personal_sign', - params: [ - hexer(data), - address - ], + params: [hexer(data), address], }); return [signature, null]; - } - - catch (e) { + } catch (e) { return [null, parseError(e)]; } } } +export default Wallet; + // ============================================================================= +function parseError(e) { + switch (true) { + case 'message' in e: + return e.message; + } + + return 'no error field identified'; +} + function hexer(input) { const utf8 = toUTF8Array(input); - const hex = utf8.map(n => n.toString(16)); + const hex = utf8.map((n) => n.toString(16)); return '0x' + hex.join(''); } function toUTF8Array(str) { var utf8 = []; - for (var i=0; i < str.length; i++) { + for (var i = 0; i < str.length; i++) { var charcode = str.charCodeAt(i); if (charcode < 0x80) { utf8.push(charcode); - } - else if (charcode < 0x800) { - utf8.push(0xc0 | (charcode >> 6), - 0x80 | (charcode & 0x3f)); - } - else if (charcode < 0xd800 || charcode >= 0xe000) { - utf8.push(0xe0 | (charcode >> 12), - 0x80 | ((charcode>>6) & 0x3f), - 0x80 | (charcode & 0x3f)); - } - else { + } else if (charcode < 0x800) { + utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f)); + } else if (charcode < 0xd800 || charcode >= 0xe000) { + utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f)); + } else { // Surrogate pair. i++; - + // UTF-16 encodes 0x10000-0x10FFFF by // subtracting 0x10000 and splitting the // 20 bits of 0x0-0xFFFFF into two halves - charcode = 0x10000 + (((charcode & 0x3ff)<<10) - | (str.charCodeAt(i) & 0x3ff)); - utf8.push(0xf0 | (charcode >>18), - 0x80 | ((charcode>>12) & 0x3f), - 0x80 | ((charcode>>6) & 0x3f), - 0x80 | (charcode & 0x3f)); + charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)); + utf8.push( + 0xf0 | (charcode >> 18), + 0x80 | ((charcode >> 12) & 0x3f), + 0x80 | ((charcode >> 6) & 0x3f), + 0x80 | (charcode & 0x3f) + ); } } return utf8; -} \ No newline at end of file +} diff --git a/app/services/ui/website/scripts/frontend/game.js b/app/services/ui/website/scripts/frontend/game.js index 4207012f..5ccc369e 100644 --- a/app/services/ui/website/scripts/frontend/game.js +++ b/app/services/ui/website/scripts/frontend/game.js @@ -13,11 +13,11 @@ class GameScene extends Phaser.Scene { this.load.image('five', './assets/five.png'); this.load.image('six', './assets/six.png'); } - + create() { // Create UI elements using Phaser objects const backgroundImage = this.add.image(0, 0, 'background_image'); - const connectButton = this.add.image(x, y, 'button_image'); + const connectButton = this.add.image(10, 10, 'button_image'); connectButton.setInteractive(); connectButton.on('pointerdown', () => { // Call your connect function to interact with MetaMask @@ -28,12 +28,5 @@ class GameScene extends Phaser.Scene { // Add other UI elements here } } - -const config = { - type: Phaser.AUTO, - width: 800, - height: 600, - scene: [GameScene], -}; -const game = new Phaser.Game(config); \ No newline at end of file +export default GameScene; \ No newline at end of file diff --git a/app/services/ui/website/scripts/frontend/menu.js b/app/services/ui/website/scripts/frontend/menu.js index 98e423f0..66bb1746 100644 --- a/app/services/ui/website/scripts/frontend/menu.js +++ b/app/services/ui/website/scripts/frontend/menu.js @@ -2,36 +2,35 @@ // Find other games or start a new game class MenuScene extends Phaser.Scene { constructor() { - super({ key: 'menu' }); + super({key: 'menu'}); } preload() { // Load assets for your menu UI (images, fonts) - this.load.image('background_image', './assets/greenbackground.png'); - this.load.image('dice_image', './assets/Dice.png'); - this.load.image('connect_button', './assets/connectbtn.png'); - this.load.image('joingame_button', './assets/joinbtn.png'); - this.load.image('newgame_button', './assets/newbtn.png'); + this.load.image('background_image', '/assets/greenbackground.png'); + this.load.image('dice_image', '/assets/Dice.png'); + this.load.image('connect_button', '/assets/connectbtn.png'); + this.load.image('joingame_button', '/assets/joinbtn.png'); + this.load.image('newgame_button', '/assets/newbtn.png'); } create() { // Create and position menu UI elements - const backgroundImage = this.add.image(0, 0, 'background_image'); - backgroundImage.setScale(0.5); // Adjust image scale if needed + const backgroundImage = this.add.image(400, 300, 'background_image'); + backgroundImage.setScale(0.4); // Adjust image scale if needed - const connectButton = this.add.image(400, 400, 'connect_button'); + const connectButton = this.add.image(400, 300, 'connect_button'); connectButton.setInteractive(); - const joinButton = this.add.image(400, 400, 'joingame_button'); + const joinButton = this.add.image(250, 400, 'joingame_button'); joinButton.setInteractive(); - const newGameButton = this.add.image(400, 400, 'newgame_button'); + const newGameButton = this.add.image(550, 400, 'newgame_button'); newGameButton.setInteractive(); - // Handle button click to start the game - startButton.on('pointerdown', () => { + connectButton.on('pointerdown', () => { this.scene.start('game'); // Start the game scene }); } } - -export default MenuScene; \ No newline at end of file + +export default MenuScene; diff --git a/business/data/dbtest/dbtest.go b/business/data/dbtest/dbtest.go index a889674e..eaa3941d 100644 --- a/business/data/dbtest/dbtest.go +++ b/business/data/dbtest/dbtest.go @@ -48,11 +48,9 @@ func StopDB(c *docker.Container) { type Test struct { DB *sqlx.DB Log *logger.Logger + Auth *auth.Auth Teardown func() t *testing.T - V1 struct { - Auth *auth.Auth - } } // NewTest creates a test database inside a Docker container. It creates the @@ -144,13 +142,9 @@ func NewTest(t *testing.T, c *docker.Container, testName string) *Test { test := Test{ DB: db, Log: log, + Auth: a, Teardown: teardown, t: t, - V1: struct { - Auth *auth.Auth - }{ - Auth: a, - }, } return &test @@ -167,7 +161,7 @@ func (test *Test) TokenV1(address string) string { }, } - token, err := test.V1.Auth.GenerateToken(kid, claims) + token, err := test.Auth.GenerateToken(kid, claims) if err != nil { test.t.Fatal(err) } diff --git a/foundation/validate/errors.go b/foundation/validate/errors.go index 2bfb1e45..3d74fa34 100644 --- a/foundation/validate/errors.go +++ b/foundation/validate/errors.go @@ -35,7 +35,7 @@ func (fe FieldErrors) Error() string { // Fields returns the fields that failed validation func (fe FieldErrors) Fields() map[string]string { - m := make(map[string]string) + m := make(map[string]string, len(fe)) for _, fld := range fe { m[fld.Field] = fld.Err }