diff --git a/app/dist/assets/index-BK0TY0V3.js b/app/dist/assets/index-BK0TY0V3.js deleted file mode 100644 index a1c627f..0000000 --- a/app/dist/assets/index-BK0TY0V3.js +++ /dev/null @@ -1,6 +0,0 @@ -var Ft=Object.defineProperty;var Wt=(n,e,t)=>e in n?Ft(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var Oe=(n,e,t)=>(Wt(n,typeof e!="symbol"?e+"":e,t),t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))l(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const i of r.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&l(i)}).observe(document,{childList:!0,subtree:!0});function t(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function l(o){if(o.ep)return;o.ep=!0;const r=t(o);fetch(o.href,r)}})();var ot=(n=>(n[n.SECOND=1e3]="SECOND",n[n.MINUTE=6e4]="MINUTE",n[n.HALF_HOUR=18e5]="HALF_HOUR",n[n.HOUR=36e5]="HOUR",n[n.DAY=864e5]="DAY",n[n.WEEK=6048e5]="WEEK",n[n.MONTH=2592e6]="MONTH",n))(ot||{});class Re{static set(e,t,l,o){const r=new Date;r.setTime(r.getTime()+l*o);const i=`expires=${r.toUTCString()}`;document.cookie=`${e}=${t};${i};path=/`}static get(e){const t=`${e}=`,l=document.cookie.split(";");for(let o=0;o(n.rs3="rs3",n.osrs="osrs",n))(z||{}),he=(n=>(n.official="Official",n.runelite="RuneLite",n.hdos="HDOS",n))(he||{});const ut={rs3:["Official"],osrs:["Official","RuneLite","HDOS"]};class Ge{static parseTokenResponse(e){try{const t=JSON.parse(e),l=t.id_token.split(".");if(l.length!==3){const i=`Malformed id_token: ${l.length} sections, expected 3`;return X(i)}const o=JSON.parse(atob(l[0]));if(o.typ!=="JWT"){const i=`Bad id_token header: typ ${o.typ}, expected JWT`;return X(i)}const r=JSON.parse(atob(l[1]));return de({access_token:t.access_token,id_token:t.id_token,refresh_token:t.refresh_token,sub:r.sub,expiry:Date.now()+t.expires_in*1e3})}catch{return X("Unable to parse token response")}}static parseSessionResponse(e){try{const t=JSON.parse(e);return t.sessionId?de(t.sessionId):X("sessionId does not exist on parsed object")}catch{return X("Unable to parse session response")}}static decodeBolt(e){const t={};for(const l in e){const o=l,r=e[o];typeof r=="string"?t[o]=atob(r):Array.isArray(r)&&r.every(i=>typeof i=="string")?t[o]=r.map(i=>atob(i)):t[o]=r}return t}}var Ue=(n=>(n.Windows="windows",n.Linux="linux",n.MacOS="mac",n))(Ue||{});const L={env:Ge.decodeBolt(s()),platform:null,rs3DebInstalledHash:null,rs3ExeInstalledHash:null,rs3AppInstalledHash:null,osrsExeInstalledHash:null,osrsAppInstalledHash:null,runeLiteInstalledId:null,hdosInstalledVersion:null,isFlathub:!1,hasBoltPlugins:!1,pluginList:{}};class tt{static async makeLoginUrl(e){const t=new TextEncoder().encode(e.pkceCodeVerifier),l=await crypto.subtle.digest("SHA-256",t);let o="";const r=new Uint8Array(l);for(let a=0;aMath.round(r*(l-0)/255+0)).map(r=>t[r]).join("")}}const Te=class Te{static async openLoginWindow(e,t,l){if(Te.pendingLoginWindow!==null)return Te.pendingLoginWindow.window.focus();const o=tt.makeRandomState(),r=tt.makeRandomVerifier(),i=new TextEncoder().encode(r),a=await crypto.subtle.digest("SHA-256",i);let u="";const c=new Uint8Array(a);for(let g=0;g{if(e.expiry-Date.now()<3e4){const l=new URLSearchParams({grant_type:"refresh_token",client_id:L.env.clientid,refresh_token:e.refresh_token}),o=new XMLHttpRequest;o.onreadystatechange=()=>{if(o.readyState==4)if(o.status==200){const i=Ge.parseTokenResponse(o.response);i.ok?t(de(i.value)):t(X(0))}else t(X(o.status))},o.onerror=()=>{t(X(0))};const r=L.env.origin.concat("/oauth2/token");o.open("POST",r,!0),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),o.setRequestHeader("Accept","application/json"),o.send(l)}else t(de(e))})}static async getOAuthToken(e,t,l,o,r){const i=`${e}/oauth2/token`;return new Promise(a=>{const u=new XMLHttpRequest;u.onreadystatechange=()=>{if(u.readyState==4)if(u.status==200){const d=Ge.parseTokenResponse(u.response);return d.ok?a(de(d.value)):a(X(d.error))}else return a(X(`Error: from ${i}: ${u.status}: ${u.response}`))},u.open("POST",i,!0),u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.setRequestHeader("Accept","application/json");const c=new URLSearchParams({grant_type:"authorization_code",client_id:t,code:r,code_verifier:l,redirect_uri:o});u.send(c)})}static revokeOauthCreds(e){const t=`${L.env.origin}/oauth2/revoke`;return new Promise(l=>{const o=new XMLHttpRequest;o.open("POST",t,!0),o.onreadystatechange=()=>{o.readyState==4&&l(o.status)},o.setRequestHeader("Content-Type","application/x-www-form-urlencoded");const r=new URLSearchParams({token:e,client_id:L.env.clientid});o.send(r)})}static async getSessionId(e,t){const l=`${e}/sessions`;return new Promise(o=>{const r=new XMLHttpRequest;r.onreadystatechange=()=>{if(r.readyState==4)if(r.status==200){const a=Ge.parseSessionResponse(r.response);return a.ok?o(de(a.value)):o(X(a.error))}else X(`Error: from ${l}: ${r.status}: ${r.response}`)},r.open("POST",l,!0),r.setRequestHeader("Content-Type","application/json"),r.setRequestHeader("Accept","application/json");const i={idToken:t};r.send(JSON.stringify(i))})}static validateIdToken(e,t){const l=e.split(".");if(l.length!==3)return X(`Malformed id_token: ${l.length} sections, expected 3`);const o=JSON.parse(atob(l[0]));return o.typ!=="JWT"?X(`Bad id_token header: typ ${o.typ}, expected JWT`):JSON.parse(atob(l[1])).nonce!==t?X("Incorrect nonce in id_token"):de(void 0)}};Oe(Te,"pendingLoginWindow",null);let ae=Te;class Fe{static async buildSession(e,t){const l=await Fe.getUser(e.sub,e.access_token);if(!l.ok)return X(`Failed to fetch user. Status: ${l.error}`);const o=await Fe.getUserAccounts(t);return o.ok?de({user:l.value,accounts:o.value,tokens:e,session_id:t}):X(`Failed to fetch game accounts. Status: ${o.error}`)}static getUser(e,t){return new Promise(l=>{const o=`${L.env.api}/users/${e}/displayName`,r=new XMLHttpRequest;r.onreadystatechange=()=>{if(r.readyState==4)if(r.status==200){const i=JSON.parse(r.response);l(de(i))}else l(X(r.status))},r.open("GET",o,!0),r.setRequestHeader("Authorization","Bearer ".concat(t)),r.send()})}static getUserAccounts(e){const t=`${L.env.auth_api}/accounts`;return new Promise(l=>{const o=new XMLHttpRequest;o.onreadystatechange=async()=>{if(o.readyState==4)if(o.status==200){const r=JSON.parse(o.response);l(de(r))}else l(X(o.status))},o.open("GET",t,!0),o.setRequestHeader("Accept","application/json"),o.setRequestHeader("Authorization","Bearer ".concat(e)),o.send()})}}function E(){}function Vt(n,e){for(const t in e)n[t]=e[t];return n}function zt(n){return!!n&&(typeof n=="object"||typeof n=="function")&&typeof n.then=="function"}function At(n){return n()}function dt(){return Object.create(null)}function oe(n){n.forEach(At)}function Ve(n){return typeof n=="function"}function te(n,e){return n!=n?e==e:n!==e||n&&typeof n=="object"||typeof n=="function"}let Be;function Zt(n,e){return n===e?!0:(Be||(Be=document.createElement("a")),Be.href=e,n===Be.href)}function Yt(n){return Object.keys(n).length===0}function Dt(n,...e){if(n==null){for(const l of e)l(void 0);return E}const t=n.subscribe(...e);return t.unsubscribe?()=>t.unsubscribe():t}function fe(n){let e;return Dt(n,t=>e=t)(),e}function pe(n,e,t){n.$$.on_destroy.push(Dt(e,t))}function ze(n,e,t,l){if(n){const o=qt(n,e,t,l);return n[0](o)}}function qt(n,e,t,l){return n[1]&&l?Vt(t.ctx.slice(),n[1](l(e))):t.ctx}function Ze(n,e,t,l){if(n[2]&&l){const o=n[2](l(t));if(e.dirty===void 0)return o;if(typeof o=="object"){const r=[],i=Math.max(e.dirty.length,o.length);for(let a=0;a32){const e=[],t=n.ctx.length/32;for(let l=0;ln.removeEventListener(e,t,l)}function Qt(n){return function(e){e.target===this&&n.call(this,e)}}function w(n,e,t){t==null?n.removeAttribute(e):n.getAttribute(e)!==t&&n.setAttribute(e,t)}function en(n){return Array.from(n.childNodes)}function re(n,e){e=""+e,n.data!==e&&(n.data=e)}function ne(n,e){n.value=e??""}function me(n,e,t){for(let l=0;l{const o=n.$$.callbacks[e];if(o){const r=tn(e,t,{cancelable:l});return o.slice().forEach(i=>{i.call(n,r)}),!r.defaultPrevented}return!0}}const Ce=[],ge=[];let Ie=[];const ft=[],ln=Promise.resolve();let rt=!1;function on(){rt||(rt=!0,ln.then(at))}function He(n){Ie.push(n)}const nt=new Set;let ve=0;function at(){if(ve!==0)return;const n=Me;do{try{for(;ven.indexOf(l)===-1?e.push(l):t.push(l)),t.forEach(l=>l()),Ie=e}const Je=new Set;let ke;function Ae(){ke={r:0,c:[],p:ke}}function De(){ke.r||oe(ke.c),ke=ke.p}function A(n,e){n&&n.i&&(Je.delete(n),n.i(e))}function B(n,e,t,l){if(n&&n.o){if(Je.has(n))return;Je.add(n),ke.c.push(()=>{Je.delete(n),l&&(t&&n.d(1),l())}),n.o(e)}else l&&l()}function be(n,e){const t=e.token={};function l(o,r,i,a){if(e.token!==t)return;e.resolved=a;let u=e.ctx;i!==void 0&&(u=u.slice(),u[i]=a);const c=o&&(e.current=o)(u);let d=!1;e.block&&(e.blocks?e.blocks.forEach((f,_)=>{_!==r&&f&&(Ae(),B(f,1,1,()=>{e.blocks[_]===f&&(e.blocks[_]=null)}),De())}):e.block.d(1),c.c(),A(c,1),c.m(e.mount(),e.anchor),d=!0),e.block=c,e.blocks&&(e.blocks[r]=c),d&&at()}if(zt(n)){const o=Qe();if(n.then(r=>{_e(o),l(e.then,1,e.value,r),_e(null)},r=>{if(_e(o),l(e.catch,2,e.error,r),_e(null),!e.hasCatch)throw r}),e.current!==e.pending)return l(e.pending,0),!0}else{if(e.current!==e.then)return l(e.then,1,e.value,n),!0;e.resolved=n}}function et(n,e,t){const l=e.slice(),{resolved:o}=n;n.current===n.then&&(l[n.value]=o),n.current===n.catch&&(l[n.error]=o),n.block.p(l,t)}function ee(n){return(n==null?void 0:n.length)!==void 0?n:Array.from(n)}function cn(n,e){n.d(1),e.delete(n.key)}function un(n,e,t,l,o,r,i,a,u,c,d,f){let _=n.length,g=r.length,p=_;const v={};for(;p--;)v[n[p].key]=p;const h=[],$=new Map,R=new Map,D=[];for(p=g;p--;){const C=f(o,r,p),S=t(C);let T=i.get(S);T?l&&D.push(()=>T.p(C,e)):(T=c(S,C),T.c()),$.set(S,h[p]=T),S in v&&R.set(S,Math.abs(p-v[S]))}const H=new Set,x=new Set;function M(C){A(C,1),C.m(a,d),i.set(C.key,C),d=C.first,g--}for(;_&&g;){const C=h[g-1],S=n[_-1],T=C.key,j=S.key;C===S?(d=C.first,_--,g--):$.has(j)?!i.has(T)||H.has(T)?M(C):x.has(j)?_--:R.get(T)>R.get(j)?(x.add(T),M(C)):(H.add(j),_--):(u(S,i),_--)}for(;_--;){const C=n[_];$.has(C.key)||u(C,i)}for(;g;)M(h[g-1]);return oe(D),h}function Q(n){n&&n.c()}function Z(n,e,t){const{fragment:l,after_update:o}=n.$$;l&&l.m(e,t),He(()=>{const r=n.$$.on_mount.map(At).filter(Ve);n.$$.on_destroy?n.$$.on_destroy.push(...r):oe(r),n.$$.on_mount=[]}),o.forEach(He)}function Y(n,e){const t=n.$$;t.fragment!==null&&(an(t.after_update),oe(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function dn(n,e){n.$$.dirty[0]===-1&&(Ce.push(n),on(),n.$$.dirty.fill(0)),n.$$.dirty[e/31|0]|=1<{const p=g.length?g[0]:_;return c.ctx&&o(c.ctx[f],c.ctx[f]=p)&&(!c.skip_bound&&c.bound[f]&&c.bound[f](p),d&&dn(n,f)),_}):[],c.update(),d=!0,oe(c.before_update),c.fragment=l?l(c.ctx):!1,e.target){if(e.hydrate){const f=en(e.target);c.fragment&&c.fragment.l(f),f.forEach(b)}else c.fragment&&c.fragment.c();e.intro&&A(n.$$.fragment),Z(n,e.target,e.anchor),at()}_e(u)}class le{constructor(){Oe(this,"$$");Oe(this,"$$set")}$destroy(){Y(this,1),this.$destroy=E}$on(e,t){if(!Ve(t))return E;const l=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return l.push(t),()=>{const o=l.indexOf(t);o!==-1&&l.splice(o,1)}}$set(e){this.$$set&&!Yt(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const fn="4",$e=[];function We(n,e=E){let t;const l=new Set;function o(a){if(te(n,a)&&(n=a,t)){const u=!$e.length;for(const c of l)c[1](),$e.push(c,n);if(u){for(let c=0;c<$e.length;c+=2)$e[c][0]($e[c+1]);$e.length=0}}}function r(a){o(a(n))}function i(a,u=E){const c=[a,u];return l.add(c),l.size===1&&(t=e(o,r)||E),a(n),()=>{l.delete(c),l.size===0&&t&&(t(),t=null)}}return{set:o,update:r,subscribe:i}}var Ee=(n=>(n.info="info",n.warn="warn",n.error="error",n))(Ee||{});class pn{constructor(){Oe(this,"logs",We([]))}_addLog(e,t){this.logs.update(l=>(l.unshift({date:new Date,severity:e,content:t}),l))}info(e){this._addLog("info",e)}warn(e){this._addLog("warn",e)}error(e){this._addLog("error",e)}updateLogAtIndex(e,t){this.logs.update(l=>(l[e]&&(l[e].content=t),l))}}const I=new pn;function _n(n,e){let t=!1;return n.subscribe(l=>{t?e(l):t=!0})}const gn={use_dark_theme:!0,rs_plugin_loader:!1,flatpak_rich_presence:!1,runelite_use_custom_jar:!1,use_custom_rs_config_uri:!1,selected:{game:z.osrs,client:he.runelite,user_id:null},userDetails:{}};function hn(){const e=new URLSearchParams(window.location.search).get("config");function t(o){return typeof o=="object"&&typeof o.use_dark_theme=="boolean"&&typeof o.rs_plugin_loader=="boolean"&&typeof o.flatpak_rich_presence=="boolean"&&typeof o.runelite_use_custom_jar=="boolean"&&typeof o.selected=="object"&&Object.values(z).includes(o.selected.game)&&Object.values(he).includes(o.selected.client)&&(typeof o.selected.user_id=="string"||o.selected.user_id===null)&&typeof o.userDetails=="object"}const{config:l}=q;if(e)try{const o=JSON.parse(e);t(o)?l.set(o):(I.error("The config saved on disk is not the correct format. It has been restored to default."),q.configHasPendingChanges=!0)}catch{I.error("Unable to parse config, restoring to default"),q.configHasPendingChanges=!0}else q.configHasPendingChanges=!0;_n(q.config,()=>{q.configHasPendingChanges=!0})}const q={configHasPendingChanges:!1,config:We(gn),sessions:We([])};let st=!1;class J{static async login(e,t){const l=await Fe.buildSession(e,t);if(!l.ok)return X(l.error);const{config:o,sessions:r}=q,i=l.value;return J.findSession(e.sub)||(r.update(u=>(u.push(i),u)),o.update(u=>(u.selected.user_id=i.user.userId,u))),!fe(o).selected.user_id===null&&i.user.userId,de(i)}static async logout(e){const{sessions:t,config:l}=q;return t.update(o=>{const r=o.findIndex(i=>i.user.userId===e);return r>-1&&(ae.revokeOauthCreds(o[r].tokens.access_token),o.splice(r,1)),o}),l.update(o=>(typeof o.userDetails[e]<"u"&&delete o.userDetails[e],o.selected.user_id===e&&(o.selected.user_id=null),o)),fe(t)}static saveConfig(e=!0){if(st||e&&!q.configHasPendingChanges)return;st=!0;const t=new XMLHttpRequest;t.open("POST","/save-config",!0),t.onreadystatechange=()=>{t.readyState==4&&(I.info(`Save config status: '${t.responseText.trim()}'`),st=!1)},t.setRequestHeader("Content-Type","application/json");const l=fe(q.config);return t.send(JSON.stringify(l)),l}static async saveCredentials(){new Promise(e=>{const t=new XMLHttpRequest;t.open("POST","/save-credentials",!0),t.setRequestHeader("Content-Type","application/json"),t.onreadystatechange=()=>{t.readyState==4&&e(void 0)};const l=fe(q.sessions);t.send(JSON.stringify(l))})}static async openFilePicker(){return new Promise(e=>{const t=new XMLHttpRequest;t.onreadystatechange=()=>{if(t.readyState==4)return t.status==200?e(t.responseText):e(void 0)},t.open("GET","/jar-file-picker",!0),t.send()})}static findSession(e){return fe(q.sessions).find(l=>l.user.userId===e)}static findAccount(e,t){return e.find(l=>l.accountId==t)}}function mn(n,e,t){J.saveConfig();const l=(a,u)=>{const c=new XMLHttpRequest,d={},f=fe(q.config);a&&(d.hash=a),n&&(d.jx_session_id=n),e&&(d.jx_character_id=e),t&&(d.jx_display_name=t),f.rs_plugin_loader&&(d.plugin_loader="1"),f.use_custom_rs_config_uri&&f.rs_config_uri?d.config_uri=f.rs_config_uri:d.config_uri=L.env.default_config_uri,c.open("POST","/launch-rs3-deb?".concat(new URLSearchParams(d).toString()),!0),c.onreadystatechange=()=>{c.readyState==4&&(I.info(`Game launch status: '${c.responseText.trim()}'`),c.status==200&&a&&(L.rs3DebInstalledHash=a))},c.send(u)},o=new XMLHttpRequest,r=L.env.content_url,i=r.concat("dists/trusty/non-free/binary-amd64/Packages");o.open("GET",i,!0),o.onreadystatechange=()=>{if(o.readyState==4&&o.status==200){const a=Object.fromEntries(o.response.split(` -`).map(u=>u.split(": ")));if(!a.Filename||!a.Size){I.error(`Could not parse package data from URL: ${i}`),l();return}if(a.SHA256!==L.rs3DebInstalledHash){I.info("Downloading RS3 client...");const u=new XMLHttpRequest;u.open("GET",r.concat(a.Filename),!0),u.responseType="arraybuffer",u.onprogress=c=>{if(c.loaded){const d=(Math.round(1e3*c.loaded/c.total)/10).toFixed(1);I.updateLogAtIndex(0,`Downloading RS3 client... ${d}%`)}},u.onreadystatechange=()=>{u.readyState==4&&u.status==200&&l(a.SHA256,u.response)},u.onerror=()=>{I.error(`Error downloading game client: from ${i}: non-http error`),l()},u.send()}else I.info("Latest client is already installed"),l()}},o.onerror=()=>{I.error(`Error: from ${i}: non-http error`),l()},o.send()}function Gt(n,e,t,l){J.saveConfig();const o=l?"/launch-runelite-jar-configure?":"/launch-runelite-jar?",r=(u,c,d)=>{const f=new XMLHttpRequest,_={};u&&(_.id=u),d&&(_.jar_path=d),n&&(_.jx_session_id=n),e&&(_.jx_character_id=e),t&&(_.jx_display_name=t),fe(q.config).flatpak_rich_presence&&(_.flatpak_rich_presence=""),f.open(c?"POST":"GET",o.concat(new URLSearchParams(_).toString()),!0),f.onreadystatechange=()=>{f.readyState==4&&(I.info(`Game launch status: '${f.responseText.trim()}'`),f.status==200&&u&&(L.runeLiteInstalledId=u))},f.send(c)};if(fe(q.config).runelite_use_custom_jar){r(null,null,fe(q.config).runelite_custom_jar);return}const i=new XMLHttpRequest,a="https://api.github.com/repos/runelite/launcher/releases";i.open("GET",a,!0),i.onreadystatechange=()=>{if(i.readyState==4)if(i.status==200){const u=JSON.parse(i.responseText).map(c=>c.assets).flat().find(c=>c.name.toLowerCase()=="runelite.jar");if(u.id!=L.runeLiteInstalledId){I.info("Downloading RuneLite...");const c=new XMLHttpRequest;c.open("GET",u.browser_download_url,!0),c.responseType="arraybuffer",c.onreadystatechange=()=>{c.readyState==4&&(c.status==200?r(u.id,c.response):I.error(`Error downloading from ${u.url}: ${c.status}: ${c.responseText}`))},c.onprogress=d=>{if(d.loaded&&d.lengthComputable){const f=(Math.round(1e3*d.loaded/d.total)/10).toFixed(1);I.updateLogAtIndex(0,`Downloading RuneLite... ${f}%`)}},c.send()}else I.info("Latest JAR is already installed"),r()}else I.error(`Error from ${a}: ${i.status}: ${i.responseText}`)},i.send()}function bn(n,e,t){J.saveConfig();const l=(i,a)=>{const u=new XMLHttpRequest,c={};i&&(c.version=i),n&&(c.jx_session_id=n),e&&(c.jx_character_id=e),t&&(c.jx_display_name=t),u.open("POST","/launch-hdos-jar?".concat(new URLSearchParams(c).toString()),!0),u.onreadystatechange=()=>{u.readyState==4&&(I.info(`Game launch status: '${u.responseText.trim()}'`),u.status==200&&i&&(L.hdosInstalledVersion=i))},u.send(a)},o=new XMLHttpRequest,r="https://cdn.hdos.dev/client/getdown.txt";o.open("GET",r,!0),o.onreadystatechange=()=>{if(o.readyState==4)if(o.status==200){const i=o.responseText.match(/^launcher\.version *= *(.*?)$/m);if(i&&i.length>=2){const a=i[1];if(a!==L.hdosInstalledVersion){const u=`https://cdn.hdos.dev/launcher/v${a}/hdos-launcher.jar`;I.info("Downloading HDOS...");const c=new XMLHttpRequest;c.open("GET",u,!0),c.responseType="arraybuffer",c.onreadystatechange=()=>{if(c.readyState==4)if(c.status==200)l(a,c.response);else{const d=JSON.parse(o.responseText).map(f=>f.assets).flat().find(f=>f.name.toLowerCase()=="runelite.jar");I.error(`Error downloading from ${d.url}: ${c.status}: ${c.responseText}`)}},c.onprogress=d=>{if(d.loaded&&d.lengthComputable){const f=(Math.round(1e3*d.loaded/d.total)/10).toFixed(1);I.updateLogAtIndex(0,`Downloading HDOS... ${f}%`)}},c.send()}else I.info("Latest JAR is already installed"),l()}else I.info("Couldn't parse latest launcher version"),l()}else I.error(`Error from ${r}: ${o.status}: ${o.responseText}`)},o.send()}function Xe(){return new Promise((n,e)=>{const t=new XMLHttpRequest;t.open("GET","/list-game-clients",!0),t.onreadystatechange=()=>{if(t.readyState==4)if(t.status==200&&t.getResponseHeader("content-type")==="application/json"){const l=JSON.parse(t.responseText);n(l)}else e(`error (${t.responseText})`)},t.send()})}function kn(){const n=new XMLHttpRequest;n.open("POST","/save-plugin-config",!0),n.setRequestHeader("Content-Type","application/json"),n.onreadystatechange=()=>{n.readyState==4&&I.info(`Save-plugin-config status: ${n.responseText.trim()}`)},n.send(JSON.stringify(L.pluginList))}async function pt(n,e,t,l,o){J.saveConfig();const r=`${e?"osrs":L.env.provider}-${n?"win":"mac"}`;let i=n?e?L.osrsExeInstalledHash:L.rs3ExeInstalledHash:e?L.osrsAppInstalledHash:L.rs3AppInstalledHash;const a=async(C,S)=>{const T={};if(C&&(T.hash=C),t&&(T.jx_session_id=t),l&&(T.jx_character_id=l),o&&(T.jx_display_name=o),!e){const O=fe(q.config);O.rs_plugin_loader&&(T.plugin_loader="1"),T.config_uri=O.use_custom_rs_config_uri&&O.rs_config_uri?O.rs_config_uri:L.env.default_config_uri}const j=await fetch(`/launch-${e?"osrs":"rs3"}-${n?"exe":"app"}?${new URLSearchParams(T).toString()}`,{method:"POST",headers:{"Content-Type":"application/octet-stream"},body:await S});j.text().then(O=>I.info(`Game launch status: '${O.trim()}'`)),j.status==200&&C&&(i=C)},u=`${L.env.direct6_url}${r}/${r}.json`,c=await fetch(u,{method:"GET"}),d=await c.text();if(c.status!==200){I.error(`Error from ${u}: ${c.status}: ${d}`);return}const f=JSON.parse(atob(d.split(".")[1])).environments.production;if(i===f.id){I.info("Latest client is already installed"),a();return}I.info(`Downloading client version ${f.version}`);const _=`${L.env.direct6_url}${r}/catalog/${f.id}/catalog.json`,g=await fetch(_,{method:"GET"}),p=await g.text();if(g.status!==200){I.error(`Error from ${_}: ${g.status}: ${p}`);return}const v=JSON.parse(atob(p.split(".")[1])),h=v.metafile.replace(/^http:/i,"https:"),$=await fetch(h,{method:"GET"}),R=await $.text();if($.status!==200){I.error(`Error from ${h}: ${$.status}: ${R}`);return}const D=JSON.parse(atob(R.split(".")[1])),H=D.pieces.digests.map(C=>{const S=atob(C).split("").map(j=>j.charCodeAt(0).toString(16).padStart(2,"0")).join(""),T=v.config.remote.baseUrl.replace(/^http:/i,"https:").concat(v.config.remote.pieceFormat.replace("{SubString:0,2,{TargetDigest}}",S.substring(0,2)).replace("{TargetDigest}",S));return fetch(T,{method:"GET"}).then(j=>j.blob().then(O=>{const K=new DecompressionStream("gzip");return new Response(O.slice(6).stream().pipeThrough(K)).blob()}))});let x=0,M=null;for(let C=0;C{const S=new Blob(C).slice(x,x+M);a(D.id,S.arrayBuffer())})}const Ne=We();typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(fn);function wn(n){let e,t;const l=n[4].default,o=ze(l,n,n[3],null);return{c(){e=m("main"),o&&o.c(),w(e,"class","fixed top-0 h-screen w-screen bg-slate-100 text-xs text-slate-900 duration-200 sm:text-sm md:text-base dark:bg-slate-900 dark:text-slate-50"),W(e,"dark",n[0])},m(r,i){k(r,e,i),o&&o.m(e,null),t=!0},p(r,[i]){o&&o.p&&(!t||i&8)&&Ye(o,l,r,r[3],t?Ze(l,r[3],i,null):Ke(r[3]),null),(!t||i&1)&&W(e,"dark",r[0])},i(r){t||(A(o,r),t=!0)},o(r){B(o,r),t=!1},d(r){r&&b(e),o&&o.d(r)}}}function yn(n,e,t){let l,o,{$$slots:r={},$$scope:i}=e;const{config:a}=q;return pe(n,a,u=>t(2,o=u)),n.$$set=u=>{"$$scope"in u&&t(3,i=u.$$scope)},n.$$.update=()=>{n.$$.dirty&4&&t(0,l=o.use_dark_theme)},[l,a,o,i,r]}class Jt extends le{constructor(e){super(),se(this,e,yn,wn,te,{})}}function vn(n){let e;return{c(){e=m("div"),e.innerHTML='loading',w(e,"class","flex h-full items-center justify-center")},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function $n(n){let e,t;return e=new Jt({props:{$$slots:{default:[vn]},$$scope:{ctx:n}}}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},p(l,[o]){const r={};o&32&&(r.$$scope={dirty:o,ctx:l}),e.$set(r)},i(l){t||(A(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function Sn(n){const e=window.opener;L.env==null&&o("BoltEnv is not defined. Please close and re-open Bolt to try again.");async function t(i){const a=Re.get("auth_verifier");if(!a)return o("Verifier token has expired. Please try signing in again."),null;const{clientid:u,redirect:c}=L.env,d=await ae.getOAuthToken(L.env.origin,u,a,c,i);return d.ok?d.value:(o(`Fetching OAuth token failed. ${d.error}`),null)}async function l(i){const a=Re.get("auth_nonce"),u=ae.validateIdToken(i,a??"");if(!u.ok)return o(u.error),null;const c=await ae.getSessionId(L.env.auth_api,i);return c.ok?c.value:(o(`Unable to retreive session id. ${c.error}`),null)}function o(i){r({type:"authFailed",reason:i}),window.close()}function r(i){e.postMessage(i,window.location.origin)}return Bt(async()=>{const i=new URLSearchParams(window.location.search),a=i.get("code"),u=i.get("state"),c=i.get("id_token");if(c==null&&a&&u){const d=await t(a);if(!d)return o("tokens object is null.");r({type:"authTokenUpdate",tokens:d});const f=crypto.randomUUID();ae.navigateToAuthConsent(L.env.origin,d.id_token,f)}else if(c&&a&&u){const d=await l(c);if(!d)return o("sessionId is null");r({type:"authSessionUpdate",sessionId:d}),window.close()}else o("Authentication server did not response with the appropriate parameters. Please try again later.")}),nn(()=>{Re.remove("auth_verifier"),Re.remove("auth_nonce")}),[]}class Ln extends le{constructor(e){super(),se(this,e,Sn,$n,te,{})}}function _t(n){let e,t,l;return{c(){e=m("button"),e.innerHTML='Close',w(e,"class","absolute right-3 top-3 rounded-full bg-rose-500 p-[2px] shadow-lg duration-200 hover:rotate-90 hover:opacity-75")},m(o,r){k(o,e,r),t||(l=U(e,"click",n[2]),t=!0)},p:E,d(o){o&&b(e),t=!1,l()}}}function gt(n){let e;const t=n[7].default,l=ze(t,n,n[6],null);return{c(){l&&l.c()},m(o,r){l&&l.m(o,r),e=!0},p(o,r){l&&l.p&&(!e||r&64)&&Ye(l,t,o,o[6],e?Ze(t,o[6],r,null):Ke(o[6]),null)},i(o){e||(A(l,o),e=!0)},o(o){B(l,o),e=!1},d(o){l&&l.d(o)}}}function Cn(n){let e,t,l,o,r,i,a=n[1]&&_t(n),u=n[4]&>(n);return{c(){e=m("dialog"),a&&a.c(),t=P(),u&&u.c(),w(e,"class",l=n[0]+" backdrop max-h-[90%] max-w-[90%] overflow-auto rounded-xl text-inherit focus-visible:outline-none svelte-csux1e"),W(e,"backdrop:cursor-pointer",n[1])},m(c,d){k(c,e,d),a&&a.m(e,null),y(e,t),u&&u.m(e,null),n[8](e),o=!0,r||(i=[U(e,"keydown",n[9]),U(e,"mousedown",Qt(n[10]))],r=!0)},p(c,[d]){c[1]?a?a.p(c,d):(a=_t(c),a.c(),a.m(e,t)):a&&(a.d(1),a=null),c[4]?u?(u.p(c,d),d&16&&A(u,1)):(u=gt(c),u.c(),A(u,1),u.m(e,null)):u&&(Ae(),B(u,1,1,()=>{u=null}),De()),(!o||d&1&&l!==(l=c[0]+" backdrop max-h-[90%] max-w-[90%] overflow-auto rounded-xl text-inherit focus-visible:outline-none svelte-csux1e"))&&w(e,"class",l),(!o||d&3)&&W(e,"backdrop:cursor-pointer",c[1])},i(c){o||(A(u),o=!0)},o(c){B(u),o=!1},d(c){c&&b(e),a&&a.d(),u&&u.d(),n[8](null),r=!1,oe(i)}}}function Rn(n,e,t){let{$$slots:l={},$$scope:o}=e,{class:r=""}=e,{canSelfClose:i=!0}=e,a,u=!1;const c=sn();function d(){a.showModal(),t(4,u=!0)}function f(){c("close"),a.close(),t(4,u=!1)}function _(v){ge[v?"unshift":"push"](()=>{a=v,t(3,a)})}const g=v=>{v.key==="Escape"&&(v.preventDefault(),i&&f())},p=()=>{i&&f()};return n.$$set=v=>{"class"in v&&t(0,r=v.class),"canSelfClose"in v&&t(1,i=v.canSelfClose),"$$scope"in v&&t(6,o=v.$$scope)},[r,i,f,a,u,d,o,l,_,g,p]}class ct extends le{constructor(e){super(),se(this,e,Rn,Cn,te,{class:0,canSelfClose:1,open:5,close:2})}get open(){return this.$$.ctx[5]}get close(){return this.$$.ctx[2]}}function Tn(n){let e,t,l,o,r,i,a;return{c(){e=m("p"),e.textContent=`${atob("Qm9sdCBpcyBhbiB1bm9mZmljaWFsIHRoaXJkLXBhcnR5IGxhdW5jaGVyLiBJdCdzIGZyZWUgYW5kIG9wZW4tc291cmNlIHNvZnR3YXJlIGxpY2Vuc2VkIHVuZGVyIEFHUEwgMy4wLg==")}`,t=P(),l=m("p"),l.textContent=`${atob("SmFnZXggaXMgbm90IHJlc3BvbnNpYmxlIGZvciBhbnkgcHJvYmxlbXMgb3IgZGFtYWdlIGNhdXNlZCBieSB1c2luZyB0aGlzIHByb2R1Y3Qu")}`,o=P(),r=m("button"),r.textContent="I Understand",w(e,"class","p-2"),w(l,"class","p-2"),w(r,"class","m-5 rounded-lg border-2 border-blue-500 p-2 duration-200 hover:opacity-75")},m(u,c){k(u,e,c),k(u,t,c),k(u,l,c),k(u,o,c),k(u,r,c),i||(a=U(r,"click",n[2]),i=!0)},p:E,d(u){u&&(b(e),b(t),b(l),b(o),b(r)),i=!1,a()}}}function Pn(n){let e,t,l={canSelfClose:!1,class:"w-1/2 text-center",$$slots:{default:[Tn]},$$scope:{ctx:n}};return e=new ct({props:l}),n[3](e),{c(){Q(e.$$.fragment)},m(o,r){Z(e,o,r),t=!0},p(o,[r]){const i={};r&33&&(i.$$scope={dirty:r,ctx:o}),e.$set(i)},i(o){t||(A(e.$$.fragment,o),t=!0)},o(o){B(e.$$.fragment,o),t=!1},d(o){n[3](null),Y(e,o)}}}function In(n,e,t){let l;const{sessions:o}=q;pe(n,o,u=>t(4,l=u));let r;Bt(()=>{l.length==0&&r.open()});const i=()=>r.close();function a(u){ge[u?"unshift":"push"](()=>{r=u,t(0,r)})}return[r,o,i,a]}class Hn extends le{constructor(e){super(),se(this,e,In,Pn,te,{})}}function ht(n,e,t){const l=n.slice();return l[31]=e[t],l}function mt(n,e,t){const l=n.slice();return l[34]=e[t],l}function bt(n,e,t){const l=n.slice();return l[37]=e[t][0],l[29]=e[t][1],l}function kt(n,e,t){const l=n.slice();return l[31]=e[t],l}function xn(n){let e;return{c(){e=m("p"),e.textContent="error"},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function On(n){let e;function t(r,i){return r[30].length==0?Nn:En}let l=t(n),o=l(n);return{c(){o.c(),e=ce()},m(r,i){o.m(r,i),k(r,e,i)},p(r,i){l===(l=t(r))&&o?o.p(r,i):(o.d(1),o=l(r),o&&(o.c(),o.m(e.parentNode,e)))},d(r){r&&b(e),o.d(r)}}}function En(n){let e,t=ee(n[30]),l=[];for(let o=0;on[18].call(e))},m(f,_){k(f,e,_);for(let g=0;gl.parentNode,r.anchor=l},p(i,a){n=i,r.ctx=n,a[0]&256&&o!==(o=n[8])&&be(o,r)||et(r,n,a)},d(i){i&&(b(e),b(t),b(l)),r.block.d(i),r.token=null,r=null}}}function Dn(n){let e,t,l,o,r,i,a,u,c;function d(g,p){return p[0]&1&&(i=null),i==null&&(i=Object.entries(g[0].pluginList).length!==0),i?ts:es}let f=d(n,[-1,-1]),_=f(n);return{c(){e=m("button"),t=G("+"),l=P(),o=m("br"),r=P(),_.c(),a=ce(),w(e,"class","aspect-square w-8 rounded-lg border-2 border-blue-500 text-[20px] font-bold duration-200 enabled:hover:opacity-75 disabled:border-gray-500"),e.disabled=n[5]},m(g,p){k(g,e,p),y(e,t),k(g,l,p),k(g,o,p),k(g,r,p),_.m(g,p),k(g,a,p),u||(c=U(e,"click",n[11]),u=!0)},p(g,p){p[0]&32&&(e.disabled=g[5]),f===(f=d(g,p))&&_?_.p(g,p):(_.d(1),_=f(g),_&&(_.c(),_.m(a.parentNode,a)))},d(g){g&&(b(e),b(l),b(o),b(r),b(a)),_.d(g),u=!1,c()}}}function qn(n){let e;return{c(){e=m("p"),e.textContent="error"},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function Bn(n){let e,t,l,o,r,i,a,u,c,d,f;function _(h,$){return $[0]&259&&(e=null),$[0]&1&&(t=null),e==null&&(e=!!(h[29]&&h[29].main&&Object.keys(h[0].pluginList).includes(h[1]))),e?Xn:(t==null&&(t=Object.entries(h[0].pluginList).length===0),t?Jn:Gn)}let g=_(n,[-1,-1]),p=g(n),v={ctx:n,current:null,token:null,hasCatch:!0,pending:Kn,then:zn,catch:Vn,value:30};return be(f=n[3],v),{c(){p.c(),l=P(),o=m("br"),r=P(),i=m("br"),a=P(),u=m("hr"),c=P(),d=ce(),v.block.c(),w(u,"class","p-1 dark:border-slate-700")},m(h,$){p.m(h,$),k(h,l,$),k(h,o,$),k(h,r,$),k(h,i,$),k(h,a,$),k(h,u,$),k(h,c,$),k(h,d,$),v.block.m(h,v.anchor=$),v.mount=()=>d.parentNode,v.anchor=d},p(h,$){n=h,g===(g=_(n,$))&&p?p.p(n,$):(p.d(1),p=g(n),p&&(p.c(),p.m(l.parentNode,l))),v.ctx=n,$[0]&8&&f!==(f=n[3])&&be(f,v)||et(v,n,$)},d(h){h&&(b(l),b(o),b(r),b(i),b(a),b(u),b(c),b(d)),p.d(h),v.block.d(h),v.token=null,v=null}}}function Gn(n){let e;return{c(){e=m("p"),e.textContent="can't start plugin: does not appear to be configured"},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function Jn(n){let e;return{c(){e=m("p"),e.textContent="(no plugins installed)"},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function Xn(n){let e;function t(r,i){return r[9]?Wn:Fn}let l=t(n),o=l(n);return{c(){o.c(),e=ce()},m(r,i){o.m(r,i),k(r,e,i)},p(r,i){l===(l=t(r))&&o?o.p(r,i):(o.d(1),o=l(r),o&&(o.c(),o.m(e.parentNode,e)))},d(r){r&&b(e),o.d(r)}}}function Fn(n){let e;return{c(){e=m("p"),e.textContent="can't start plugin: no path is configured"},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function Wn(n){let e,t,l=n[29].name+"",o,r,i;function a(){return n[21](n[29])}return{c(){e=m("button"),t=G("Start "),o=G(l),w(e,"class","mx-auto mb-1 w-auto rounded-lg bg-emerald-500 p-2 font-bold text-black duration-200 hover:opacity-75")},m(u,c){k(u,e,c),y(e,t),y(e,o),r||(i=U(e,"click",a),r=!0)},p(u,c){n=u,c[0]&256&&l!==(l=n[29].name+"")&&re(o,l)},d(u){u&&b(e),r=!1,i()}}}function Vn(n){let e;return{c(){e=m("p"),e.textContent="error"},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function zn(n){let e,t=ee(n[30]),l=[];for(let o=0;o',i=P(),w(r,"class","bg-rose-500 rounded-sm shadow-lg hover:opacity-75")},m(d,f){k(d,e,f),y(e,l),y(e,o),y(e,r),y(e,i),a||(u=U(r,"click",c),a=!0)},p(d,f){n=d,f[0]&9&&t!==(t=(n[0].pluginList[n[34].id].name??n[34].id)+"")&&re(l,t)},d(d){d&&b(e),a=!1,u()}}}function $t(n){let e,t;function l(i,a){return a[0]&9&&(e=null),e==null&&(e=!!Object.keys(i[0].pluginList).includes(i[34].id)),e?Yn:Zn}let o=l(n,[-1,-1]),r=o(n);return{c(){r.c(),t=ce()},m(i,a){r.m(i,a),k(i,t,a)},p(i,a){o===(o=l(i,a))&&r?r.p(i,a):(r.d(1),r=o(i),r&&(r.c(),r.m(t.parentNode,t)))},d(i){i&&b(t),r.d(i)}}}function St(n){let e,t=n[31].uid===n[2]&&vt(n);return{c(){t&&t.c(),e=ce()},m(l,o){t&&t.m(l,o),k(l,e,o)},p(l,o){l[31].uid===l[2]?t?t.p(l,o):(t=vt(l),t.c(),t.m(e.parentNode,e)):t&&(t.d(1),t=null)},d(l){l&&b(e),t&&t.d(l)}}}function Kn(n){let e;return{c(){e=m("p"),e.textContent="loading..."},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function Qn(n){let e;return{c(){e=m("p"),e.textContent="loading..."},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function es(n){let e;return{c(){e=m("p"),e.textContent=`You have no plugins installed. Click the + button and select a plugin's bolt.json file - to add it.`},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function ts(n){let e=Object.keys(n[0].pluginList).includes(n[1])&&n[8]!==null,t,l=e&&Lt(n);return{c(){l&&l.c(),t=ce()},m(o,r){l&&l.m(o,r),k(o,t,r)},p(o,r){r[0]&259&&(e=Object.keys(o[0].pluginList).includes(o[1])&&o[8]!==null),e?l?l.p(o,r):(l=Lt(o),l.c(),l.m(t.parentNode,t)):l&&(l.d(1),l=null)},d(o){o&&b(t),l&&l.d(o)}}}function Lt(n){let e,t,l,o,r,i,a,u={ctx:n,current:null,token:null,hasCatch:!0,pending:ls,then:ss,catch:ns,value:29};return be(e=n[8],u),{c(){u.block.c(),t=P(),l=m("button"),l.textContent="Remove",o=P(),r=m("button"),r.textContent="Reload",w(l,"class","mx-auto mb-1 w-[min(144px,_25%)] rounded-lg p-2 font-bold text-black duration-200 enabled:bg-rose-500 enabled:hover:opacity-75 disabled:bg-gray-500"),w(r,"class","mx-auto mb-1 w-[min(144px,_25%)] rounded-lg p-2 font-bold text-black duration-200 enabled:bg-blue-500 enabled:hover:opacity-75 disabled:bg-gray-500")},m(c,d){u.block.m(c,u.anchor=d),u.mount=()=>t.parentNode,u.anchor=t,k(c,t,d),k(c,l,d),k(c,o,d),k(c,r,d),i||(a=[U(l,"click",n[19]),U(r,"click",n[20])],i=!0)},p(c,d){n=c,u.ctx=n,d[0]&256&&e!==(e=n[8])&&be(e,u)||et(u,n,d)},d(c){c&&(b(t),b(l),b(o),b(r)),u.block.d(c),u.token=null,u=null,i=!1,oe(a)}}}function ns(n){let e,t,l;return{c(){e=m("p"),e.textContent="error",t=P(),l=m("br")},m(o,r){k(o,e,r),k(o,t,r),k(o,l,r)},p:E,d(o){o&&(b(e),b(t),b(l))}}}function ss(n){let e,t=(n[29].name??je)+"",l,o,r,i=(n[29].description??"no description")+"",a,u,c,d;return{c(){e=m("p"),l=G(t),o=P(),r=m("p"),a=G(i),c=P(),d=m("br"),w(e,"class","pb-4 text-xl font-bold"),w(r,"class",u=n[29].description?null:"italic")},m(f,_){k(f,e,_),y(e,l),k(f,o,_),k(f,r,_),y(r,a),k(f,c,_),k(f,d,_)},p(f,_){_[0]&256&&t!==(t=(f[29].name??je)+"")&&re(l,t),_[0]&256&&i!==(i=(f[29].description??"no description")+"")&&re(a,i),_[0]&256&&u!==(u=f[29].description?null:"italic")&&w(r,"class",u)},d(f){f&&(b(e),b(o),b(r),b(c),b(d))}}}function ls(n){let e;return{c(){e=m("p"),e.textContent="loading..."},m(t,l){k(t,e,l)},p:E,d(t){t&&b(e)}}}function os(n){let e,t,l,o,r,i,a,u,c,d,f,_,g={ctx:n,current:null,token:null,hasCatch:!0,pending:Un,then:On,catch:xn,value:30};be(u=n[3],g);function p($,R){return $[0].hasBoltPlugins?jn:Mn}let v=p(n),h=v(n);return{c(){e=m("div"),t=m("button"),l=G("Manage Plugins"),r=P(),i=m("hr"),a=P(),g.block.c(),c=P(),d=m("div"),h.c(),w(t,"class",o="mx-auto mb-2 w-[95%] rounded-lg border-2 "+(n[6]?"border-blue-500 text-black dark:text-white":"border-black bg-blue-500 text-black")+" p-2 font-bold hover:opacity-75"),w(i,"class","p-1 dark:border-slate-700"),w(e,"class","left-0 float-left h-full w-[min(180px,_50%)] overflow-hidden border-r-2 border-slate-300 pt-2 dark:border-slate-800"),w(d,"class","h-full pt-10")},m($,R){k($,e,R),y(e,t),y(t,l),y(e,r),y(e,i),y(e,a),g.block.m(e,g.anchor=null),g.mount=()=>e,g.anchor=null,k($,c,R),k($,d,R),h.m(d,null),f||(_=U(t,"click",n[16]),f=!0)},p($,R){n=$,R[0]&64&&o!==(o="mx-auto mb-2 w-[95%] rounded-lg border-2 "+(n[6]?"border-blue-500 text-black dark:text-white":"border-black bg-blue-500 text-black")+" p-2 font-bold hover:opacity-75")&&w(t,"class",o),g.ctx=n,R[0]&8&&u!==(u=n[3])&&be(u,g)||et(g,n,R),v===(v=p(n))&&h?h.p(n,R):(h.d(1),h=v(n),h&&(h.c(),h.m(d,null)))},d($){$&&(b(e),b(c),b(d)),g.block.d(),g.token=null,g=null,h.d(),f=!1,_()}}}function rs(n){let e,t,l={class:"h-[90%] w-[90%] text-center",$$slots:{default:[os]},$$scope:{ctx:n}};return e=new ct({props:l}),n[23](e),e.$on("close",n[24]),{c(){Q(e.$$.fragment)},m(o,r){Z(e,o,r),t=!0},p(o,r){const i={};r[0]&1007|r[1]&2048&&(i.$$scope={dirty:r,ctx:o}),e.$set(i)},i(o){t||(A(e.$$.fragment,o),t=!0)},o(o){B(e.$$.fragment,o),t=!1},d(o){n[23](null),Y(e,o)}}}const lt="bolt.json",is="main.lua",je="(unnamed)",Ct="(new character)";function as(n,e,t){let l,o,r,i;pe(n,Ne,N=>t(3,i=N));let a;const u=L.platform==="windows"?"\\":"/",c=u.concat(lt);function d(){a.open()}const f=N=>new Promise((ie,V)=>{const ye=N.concat(N.endsWith(u)?lt:c);var ue=new XMLHttpRequest;ue.onreadystatechange=()=>{ue.readyState==4&&(ue.status==200?ie(JSON.parse(ue.responseText)):V(ue.responseText))},ue.open("GET","/read-json-file?".concat(new URLSearchParams({path:ye}).toString()),!0),ue.send()}),_=N=>{const V=L.pluginList[N];if(!V)return null;const ye=V.path;return ye?f(ye):null},g=(N,ie)=>{f(N).then(V=>{do t(1,R=crypto.randomUUID());while(Object.keys(L.pluginList).includes(R));t(0,L.pluginList[R]={name:V.name??je,path:N},L),t(7,x=!0)}).catch(V=>{console.error(`Config file '${ie}' couldn't be fetched, reason: ${V}`)})};let p=!1;const v=()=>{t(5,p=!0);var N=new XMLHttpRequest;N.onreadystatechange=()=>{if(N.readyState==4&&(t(5,p=!1),N.status==200))if(N.responseText.endsWith(c)){const ie=N.responseText.substring(0,N.responseText.length-lt.length);g(ie,N.responseText)}else console.log(`Selection '${N.responseText}' is not named bolt.json; ignored`)},N.open("GET","/json-file-picker",!0),N.send()};Ne.set(Xe());const h=(N,ie,V,ye)=>{const ue=L.platform==="windows"?V.replaceAll("\\","/"):V,Xt=ue.endsWith(u)?ue:ue.concat("/");var xe=new XMLHttpRequest;xe.onreadystatechange=()=>{xe.readyState==4&&(Ne.set(Xe()),I.info(`Start-plugin status: ${xe.statusText.trim()}`))},xe.open("GET","/start-plugin?".concat(new URLSearchParams({client:N,id:ie,path:Xt,main:ye}).toString()),!0),xe.send()},$=(N,ie)=>{var V=new XMLHttpRequest;V.onreadystatechange=()=>{V.readyState==4&&(Ne.set(Xe()),I.info(`Stop-plugin status: ${V.statusText.trim()}`))},V.open("GET","/stop-plugin?".concat(new URLSearchParams({client:N,uid:ie}).toString()),!0),V.send()};var R,D=!1,H;let x=!1;const M=()=>t(6,D=!1),C=N=>{t(2,H=N.uid),t(6,D=!0)};function S(){R=it(this),t(1,R),t(0,L)}const T=()=>{t(8,r=null),t(7,x=!0);let N=L.pluginList;delete N[R],t(0,L.pluginList=N,L)},j=()=>t(8,r=_(R)),O=N=>h(H,R,o,N.main??is),K=N=>{$(H,N.uid)};function F(N){ge[N?"unshift":"push"](()=>{a=N,t(4,a)})}const qe=()=>{x&&kn()};return n.$$.update=()=>{n.$$.dirty[0]&12&&i.then(N=>{N.some(ie=>ie.uid===H)||t(6,D=!1)}),n.$$.dirty[0]&3&&t(15,l=L.pluginList[R]),n.$$.dirty[0]&32768&&t(9,o=l?l.path:null),n.$$.dirty[0]&2&&t(8,r=_(R))},[L,R,H,i,a,p,D,x,r,o,_,v,h,$,d,l,M,C,S,T,j,O,K,F,qe]}class cs extends le{constructor(e){super(),se(this,e,as,rs,te,{open:14},null,[-1,-1])}get open(){return this.$$.ctx[14]}}function Rt(n,e,t){const l=n.slice();return l[12]=e[t],l}function Tt(n,e,t){const l=n.slice();return l[15]=e[t],l}function us(n){let e,t,l={};return e=new cs({props:l}),n[8](e),{c(){Q(e.$$.fragment)},m(o,r){Z(e,o,r),t=!0},p(o,r){const i={};e.$set(i)},i(o){t||(A(e.$$.fragment,o),t=!0)},o(o){B(e.$$.fragment,o),t=!1},d(o){n[8](null),Y(e,o)}}}function ds(n){let e,t,l;return{c(){e=m("button"),e.textContent="Plugin menu",e.disabled=!L.hasBoltPlugins,w(e,"title",L.hasBoltPlugins?null:"Coming soon..."),w(e,"class","w-52 rounded-lg p-2 font-bold text-black duration-200 enabled:bg-blue-500 enabled:hover:opacity-75 disabled:bg-gray-500")},m(o,r){k(o,e,r),t||(l=U(e,"click",n[11]),t=!0)},p:E,d(o){o&&b(e),t=!1,l()}}}function fs(n){let e,t,l,o,r,i,a=ee(ut[n[0].selected.game]),u=[];for(let c=0;cn[10].call(o)),w(e,"class","flex flex-col")},m(c,d){k(c,e,d),y(e,t),y(e,l),y(e,o);for(let f=0;ft(0,i=v));function c(v,h){if(!l)return I.warn("Please log in or select a user to play.");if(!o)return I.warn("Please select a character from the select menu.");const $=J.findSession(i.selected.user_id);if(!$)return I.warn("Unable to launch game, session was not found.");const{session_id:R}=$,D=J.findAccount($.accounts,o);if(!D)return I.warn("Unable to launch game, account was not found.");const{accountId:H,displayName:x}=D,M=L.platform===Ue.Windows,C=L.platform===Ue.Linux;switch(v){case z.osrs:switch(h){case he.official:pt(M,!0,R,H,x);break;case he.runelite:Gt(R,H,x,!1);break;case he.hdos:bn(R,H,x);break}break;case z.rs3:C?mn(R,H,x):pt(M,!1,R,H,x);break}}function d(v){const h=v.target.value;if(!l)return;const $=i.userDetails[l];$?($.account_id=h,Pe(u,i.userDetails[l]=$,i)):Pe(u,i.userDetails[l]={account_id:h},i)}function f(v){ge[v?"unshift":"push"](()=>{a=v,t(1,a)})}const _=()=>c(i.selected.game,i.selected.client);function g(){i.selected.client=it(this),u.set(i)}const p=()=>{a.open()};return n.$$.update=()=>{var v,h;n.$$.dirty&1&&t(7,l=i.selected.user_id),n.$$.dirty&129&&t(2,o=(v=i.userDetails[l??""])==null?void 0:v.account_id),n.$$.dirty&1&&t(3,r=((h=J.findSession(i.selected.user_id))==null?void 0:h.accounts)??[])},[i,a,o,r,u,c,d,l,f,_,g,p]}class ms extends le{constructor(e){super(),se(this,e,hs,gs,te,{})}}function xt(n,e,t){const l=n.slice();return l[1]=e[t].date,l[2]=e[t].severity,l[3]=e[t].content,l}function Ot(n){var u;let e,t=((u=n[1])==null?void 0:u.toLocaleTimeString())+"",l,o,r=n[3]+"",i,a;return{c(){e=m("li"),l=G(t),o=G(` - - `),i=G(r),a=P(),W(e,"text-rose-500",n[2]===Ee.error),W(e,"text-orange-700",n[2]===Ee.warn)},m(c,d){k(c,e,d),y(e,l),y(e,o),y(e,i),y(e,a)},p(c,d){var f;d&1&&t!==(t=((f=c[1])==null?void 0:f.toLocaleTimeString())+"")&&re(l,t),d&1&&r!==(r=c[3]+"")&&re(i,r),d&1&&W(e,"text-rose-500",c[2]===Ee.error),d&1&&W(e,"text-orange-700",c[2]===Ee.warn)},d(c){c&&b(e)}}}function bs(n){let e,t,l,o,r=ee(n[0]),i=[];for(let a=0;a',l=P(),o=m("ol");for(let a=0;a{"logs"in o&&t(0,l=o.logs)},[l]}class ws extends le{constructor(e){super(),se(this,e,ks,bs,te,{logs:0})}}function Et(n,e,t){const l=n.slice();return l[7]=e[t],l}function Nt(n,e){let t,l=e[7].user.displayName+"",o,r;return{key:n,first:null,c(){t=m("option"),o=G(l),t.__value=r=e[7].user.userId,ne(t,t.__value),w(t,"class","dark:bg-slate-900"),this.first=t},m(i,a){k(i,t,a),y(t,o)},p(i,a){e=i,a&2&&l!==(l=e[7].user.displayName+"")&&re(o,l),a&2&&r!==(r=e[7].user.userId)&&(t.__value=r,ne(t,t.__value))},d(i){i&&b(t)}}}function ys(n){let e,t,l=[],o=new Map,r,i,a,u,c,d,f,_,g,p=ee(n[1]);const v=h=>h[7].user.userId;for(let h=0;hn[4].call(e)),w(a,"class","mx-auto mr-2 rounded-lg bg-blue-500 p-2 font-bold text-black duration-200 hover:opacity-75"),w(c,"class","mx-auto rounded-lg border-2 border-blue-500 p-2 font-bold duration-200 hover:opacity-75"),c.disabled=f=!n[0].selected.user_id,w(i,"class","mt-5 flex")},m(h,$){k(h,e,$),y(e,t);for(let R=0;Rt(1,o=d)),pe(n,i,d=>t(0,l=d));function a(){l.selected.user_id=it(this),i.set(l)}return[l,o,r,i,a,()=>{const{origin:d,redirect:f,clientid:_}=L.env;ae.openLoginWindow(d,f,_)},async()=>{l.selected.user_id&&(await J.logout(l.selected.user_id),J.saveCredentials())}]}class $s extends le{constructor(e){super(),se(this,e,vs,ys,te,{})}}function Ss(n,{callback:e,ignore:t=[]}){const l=o=>{const r=t.some(i=>i.contains(o.target));n&&!n.contains(o.target)&&!o.defaultPrevented&&!r&&e()};return document.addEventListener("click",l,!0),document.addEventListener("contextmenu",l,!0),{destroy(){document.removeEventListener("click",l,!0),document.removeEventListener("contextmenu",l,!0)}}}const Ls=n=>({}),Ut=n=>({});function Mt(n){let e,t,l,o,r,i;const a=n[9].content,u=ze(a,n,n[8],Ut);return{c(){e=m("div"),u&&u.c(),w(e,"class",t="dropdown-color absolute z-20 rounded-lg border-2 "+n[1]+" "+n[2]+" svelte-xifudk")},m(c,d){k(c,e,d),u&&u.m(e,null),o=!0,r||(i=Kt(l=Ss.call(null,e,{callback:n[3],ignore:[n[5]]})),r=!0)},p(c,d){u&&u.p&&(!o||d&256)&&Ye(u,a,c,c[8],o?Ze(a,c[8],d,Ls):Ke(c[8]),Ut),(!o||d&6&&t!==(t="dropdown-color absolute z-20 rounded-lg border-2 "+c[1]+" "+c[2]+" svelte-xifudk"))&&w(e,"class",t),l&&Ve(l.update)&&d&32&&l.update.call(null,{callback:c[3],ignore:[c[5]]})},i(c){o||(A(u,c),o=!0)},o(c){B(u,c),o=!1},d(c){c&&b(e),u&&u.d(c),r=!1,i()}}}function Cs(n){let e,t,l,o,r,i,a;const u=n[9].default,c=ze(u,n,n[8],null);let d=n[4]&&Mt(n);return{c(){e=m("div"),t=m("button"),c&&c.c(),l=P(),d&&d.c(),w(e,"class",o="relative h-fit w-fit "+n[0]+" svelte-xifudk")},m(f,_){k(f,e,_),y(e,t),c&&c.m(t,null),n[10](t),y(e,l),d&&d.m(e,null),r=!0,i||(a=U(t,"click",n[6]),i=!0)},p(f,[_]){c&&c.p&&(!r||_&256)&&Ye(c,u,f,f[8],r?Ze(u,f[8],_,null):Ke(f[8]),null),f[4]?d?(d.p(f,_),_&16&&A(d,1)):(d=Mt(f),d.c(),A(d,1),d.m(e,null)):d&&(Ae(),B(d,1,1,()=>{d=null}),De()),(!r||_&1&&o!==(o="relative h-fit w-fit "+f[0]+" svelte-xifudk"))&&w(e,"class",o)},i(f){r||(A(c,f),A(d),r=!0)},o(f){B(c,f),B(d),r=!1},d(f){f&&b(e),c&&c.d(f),n[10](null),d&&d.d(),i=!1,a()}}}function Rs(n,e,t){let{$$slots:l={},$$scope:o}=e,{class:r=""}=e,{position:i="bottom"}=e,{align:a="start"}=e,u=!1,c;function d(){t(4,u=!0)}function f(){t(4,u=!1)}function _(){u?f():d()}function g(p){ge[p?"unshift":"push"](()=>{c=p,t(5,c)})}return n.$$set=p=>{"class"in p&&t(0,r=p.class),"position"in p&&t(1,i=p.position),"align"in p&&t(2,a=p.align),"$$scope"in p&&t(8,o=p.$$scope)},[r,i,a,f,u,c,_,d,o,l,g]}class Ts extends le{constructor(e){super(),se(this,e,Rs,Cs,te,{class:0,position:1,align:2,open:7,close:3})}get open(){return this.$$.ctx[7]}get close(){return this.$$.ctx[3]}}function Ps(n){let e,t,l;return{c(){e=m("button"),e.innerHTML=`
Browse app data - Browse App Data
`,w(e,"id","data_dir_button"),w(e,"class","p-2 hover:opacity-75")},m(o,r){k(o,e,r),t||(l=U(e,"click",n[1]),t=!0)},p:E,i:E,o:E,d(o){o&&b(e),t=!1,l()}}}function Is(n){function e(){var l=new XMLHttpRequest;l.open("GET","/browse-data"),l.onreadystatechange=()=>{l.readyState==4&&I.info(`Browse status: '${l.responseText.trim()}'`)},l.send()}return[e,()=>{e()}]}class Hs extends le{constructor(e){super(),se(this,e,Is,Ps,te,{})}}function xs(n){let e,t,l,o,r,i,a,u,c,d,f,_,g,p,v,h,$,R,D;return{c(){var H,x;e=m("button"),t=m("div"),t.innerHTML=`Configure RuneLite - Configure RuneLite`,o=P(),r=m("div"),i=m("label"),i.textContent="Use custom RuneLite JAR:",a=P(),u=m("input"),c=P(),d=m("div"),f=m("textarea"),g=P(),p=m("br"),v=P(),h=m("button"),$=G("Select File"),w(t,"class","flex"),e.disabled=l=!((H=n[0])!=null&&H.session_id)||!((x=n[3])!=null&&x.accountId),w(e,"class","p-2 pb-5 hover:opacity-75"),w(i,"for","use_custom_jar"),w(u,"type","checkbox"),w(u,"class","ml-2"),w(r,"class","mx-auto border-t-2 border-slate-300 p-2 pt-5 dark:border-slate-800"),w(f,"class","h-10 rounded border-2 border-slate-300 bg-slate-100 text-slate-950 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-50"),f.disabled=_=!n[1].runelite_use_custom_jar,w(h,"class","mt-1 rounded-lg border-2 border-blue-500 p-1 duration-200 hover:opacity-75"),h.disabled=n[2],w(d,"class","mx-auto p-2"),W(d,"opacity-25",!n[1].runelite_use_custom_jar)},m(H,x){k(H,e,x),y(e,t),k(H,o,x),k(H,r,x),y(r,i),y(r,a),y(r,u),u.checked=n[1].runelite_use_custom_jar,k(H,c,x),k(H,d,x),y(d,f),ne(f,n[1].runelite_custom_jar),y(d,g),y(d,p),y(d,v),y(d,h),y(h,$),R||(D=[U(e,"click",n[7]),U(u,"change",n[8]),U(f,"input",n[9]),U(h,"click",n[10])],R=!0)},p(H,[x]){var M,C;x&9&&l!==(l=!((M=H[0])!=null&&M.session_id)||!((C=H[3])!=null&&C.accountId))&&(e.disabled=l),x&2&&(u.checked=H[1].runelite_use_custom_jar),x&2&&_!==(_=!H[1].runelite_use_custom_jar)&&(f.disabled=_),x&2&&ne(f,H[1].runelite_custom_jar),x&4&&(h.disabled=H[2]),x&2&&W(d,"opacity-25",!H[1].runelite_use_custom_jar)},i:E,o:E,d(H){H&&(b(e),b(o),b(r),b(c),b(d)),R=!1,oe(D)}}}function Os(n,e,t){let l,o,r;const{config:i}=q;pe(n,i,p=>t(1,r=p));let a=!1;async function u(){t(2,a=!0),Pe(i,r.runelite_custom_jar=await J.openFilePicker(),r),console.log("done picking"),t(2,a=!1)}function c(){!(l!=null&&l.session_id)||!(o!=null&&o.accountId)||!(o!=null&&o.displayName)||Gt(l.session_id,o.accountId,o.displayName,!0)}const d=()=>c();function f(){r.runelite_use_custom_jar=this.checked,i.set(r)}function _(){r.runelite_custom_jar=this.value,i.set(r)}const g=()=>{u()};return n.$$.update=()=>{var p;n.$$.dirty&2&&t(0,l=J.findSession(r.selected.user_id)),n.$$.dirty&3&&t(3,o=J.findAccount((l==null?void 0:l.accounts)??[],(p=r.userDetails[r.selected.user_id??""])==null?void 0:p.account_id))},[l,r,a,o,i,u,c,d,f,_,g]}class Es extends le{constructor(e){super(),se(this,e,Os,xs,te,{})}}function Ns(n){let e,t,l,o,r,i;return{c(){e=m("div"),t=m("label"),t.textContent="Enable Bolt plugin loader:",l=P(),o=m("input"),w(t,"for","enable_plugins"),w(o,"type","checkbox"),w(o,"name","enable_plugins"),w(o,"id","enable_plugins"),w(o,"class","ml-2"),w(e,"class","mx-auto p-2")},m(a,u){k(a,e,u),y(e,t),y(e,l),y(e,o),o.checked=n[0].rs_plugin_loader,r||(i=U(o,"change",n[2]),r=!0)},p(a,u){u&1&&(o.checked=a[0].rs_plugin_loader)},d(a){a&&b(e),r=!1,i()}}}function Us(n){let e,t,l,o,r,i,a,u,c,d,f,_=L.hasBoltPlugins&&Ns(n);return{c(){_&&_.c(),e=P(),t=m("div"),l=m("label"),l.textContent="Use custom config URI:",o=P(),r=m("input"),i=P(),a=m("div"),u=m("textarea"),w(l,"for","use_custom_uri"),w(r,"type","checkbox"),w(r,"class","ml-2"),w(t,"class","mx-auto p-2"),w(u,"class","rounded border-2 border-slate-300 bg-slate-100 text-slate-950 disabled:opacity-50 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-50"),u.disabled=c=!n[0].use_custom_rs_config_uri,w(u,"rows","4"),w(u,"placeholder",L.env.default_config_uri),w(a,"class","p-2")},m(g,p){_&&_.m(g,p),k(g,e,p),k(g,t,p),y(t,l),y(t,o),y(t,r),r.checked=n[0].use_custom_rs_config_uri,k(g,i,p),k(g,a,p),y(a,u),ne(u,n[0].rs_config_uri),d||(f=[U(r,"change",n[3]),U(u,"input",n[4])],d=!0)},p(g,[p]){L.hasBoltPlugins&&_.p(g,p),p&1&&(r.checked=g[0].use_custom_rs_config_uri),p&1&&c!==(c=!g[0].use_custom_rs_config_uri)&&(u.disabled=c),p&1&&ne(u,g[0].rs_config_uri)},i:E,o:E,d(g){g&&(b(e),b(t),b(i),b(a)),_&&_.d(g),d=!1,oe(f)}}}function Ms(n,e,t){let l;const{config:o}=q;pe(n,o,u=>t(0,l=u));function r(){l.rs_plugin_loader=this.checked,o.set(l)}function i(){l.use_custom_rs_config_uri=this.checked,o.set(l)}function a(){l.rs_config_uri=this.value,o.set(l)}return[l,o,r,i,a]}class js extends le{constructor(e){super(),se(this,e,Ms,Us,te,{})}}function As(n){let e,t;return e=new js({}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},i(l){t||(A(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function Ds(n){let e,t;return e=new Es({}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},i(l){t||(A(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function qs(n){let e,t;return e=new Hs({}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},i(l){t||(A(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function Bs(n){let e,t,l,o,r,i,a,u,c,d,f,_,g,p,v,h,$,R,D,H;const x=[qs,Ds,As],M=[];function C(S,T){return S[1]==S[2].general?0:S[1]==S[2].osrs?1:S[1]==S[2].rs3?2:-1}return~(h=C(n))&&($=M[h]=x[h](n)),{c(){e=m("div"),t=m("div"),l=m("button"),o=G("General"),i=P(),a=m("button"),u=G("OSRS"),d=P(),f=m("button"),_=G("RS3"),p=P(),v=m("div"),$&&$.c(),w(l,"class",r=n[1]===n[2].general?Se:Le),w(a,"class",c=n[1]===n[2].osrs?Se:Le),w(f,"class",g=n[1]===n[2].rs3?Se:Le),w(t,"class","flex flex-col items-center gap-2 border-r-2 border-slate-300 pt-10 dark:border-slate-800"),w(v,"class","col-span-3 p-5 pt-10 text-center"),w(e,"class","grid h-full grid-cols-4")},m(S,T){k(S,e,T),y(e,t),y(t,l),y(l,o),y(t,i),y(t,a),y(a,u),y(t,d),y(t,f),y(f,_),y(e,p),y(e,v),~h&&M[h].m(v,null),R=!0,D||(H=[U(l,"click",n[4]),U(a,"click",n[5]),U(f,"click",n[6])],D=!0)},p(S,T){(!R||T&2&&r!==(r=S[1]===S[2].general?Se:Le))&&w(l,"class",r),(!R||T&2&&c!==(c=S[1]===S[2].osrs?Se:Le))&&w(a,"class",c),(!R||T&2&&g!==(g=S[1]===S[2].rs3?Se:Le))&&w(f,"class",g);let j=h;h=C(S),h!==j&&($&&(Ae(),B(M[j],1,1,()=>{M[j]=null}),De()),~h?($=M[h],$||($=M[h]=x[h](S),$.c()),A($,1),$.m(v,null)):$=null)},i(S){R||(A($),R=!0)},o(S){B($),R=!1},d(S){S&&b(e),~h&&M[h].d(),D=!1,oe(H)}}}function Gs(n){let e,t,l={class:"h-3/4 w-3/4",$$slots:{default:[Bs]},$$scope:{ctx:n}};return e=new ct({props:l}),n[7](e),{c(){Q(e.$$.fragment)},m(o,r){Z(e,o,r),t=!0},p(o,[r]){const i={};r&258&&(i.$$scope={dirty:r,ctx:o}),e.$set(i)},i(o){t||(A(e.$$.fragment,o),t=!0)},o(o){B(e.$$.fragment,o),t=!1},d(o){n[7](null),Y(e,o)}}}let Se="border-2 border-blue-500 bg-blue-500 hover:opacity-75 font-bold text-black duration-200 rounded-lg p-1 w-3/4",Le="border-2 border-blue-500 hover:opacity-75 duration-200 rounded-lg p-1 w-3/4";function Js(n,e,t){let l;function o(){l.open()}var r=(f=>(f[f.general=0]="general",f[f.osrs=1]="osrs",f[f.rs3=2]="rs3",f))(r||{});let i=1;const a=()=>{t(1,i=r.general)},u=()=>{t(1,i=r.osrs)},c=()=>{t(1,i=r.rs3)};function d(f){ge[f?"unshift":"push"](()=>{l=f,t(0,l)})}return[l,i,r,o,a,u,c,d]}class Xs extends le{constructor(e){super(),se(this,e,Js,Gs,te,{open:3})}get open(){return this.$$.ctx[3]}}function Fs(n){const e=n.slice(),t=J.findSession(e[1].selected.user_id??"");return e[11]=t,e}function Ws(n){let e,t,l;return{c(){e=m("button"),e.textContent="Login",w(e,"class","h-11 w-48 rounded-lg border-2 border-slate-300 bg-inherit p-2 text-center font-bold text-black duration-200 hover:opacity-75 dark:border-slate-800 dark:text-slate-50")},m(o,r){k(o,e,r),t||(l=U(e,"click",n[10]),t=!0)},p:E,i:E,o:E,d(o){o&&b(e),t=!1,l()}}}function Vs(n){let e,t;return e=new Ts({props:{align:"center",$$slots:{content:[Zs],default:[zs]},$$scope:{ctx:n}}}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},p(l,o){const r={};o&4098&&(r.$$scope={dirty:o,ctx:l}),e.$set(r)},i(l){t||(A(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function zs(n){var o;let e,t=(((o=n[11])==null?void 0:o.user.displayName)??"No user selected")+"",l;return{c(){e=m("button"),l=G(t),w(e,"class","h-11 w-48 rounded-lg border-2 border-slate-300 bg-inherit text-center font-bold text-black duration-200 hover:opacity-75 dark:border-slate-800 dark:text-slate-50")},m(r,i){k(r,e,i),y(e,l)},p(r,i){var a;i&2&&t!==(t=(((a=r[11])==null?void 0:a.user.displayName)??"No user selected")+"")&&re(l,t)},d(r){r&&b(e)}}}function Zs(n){let e,t,l;return t=new $s({}),{c(){e=m("div"),Q(t.$$.fragment),w(e,"slot","content"),w(e,"class","w-40")},m(o,r){k(o,e,r),Z(t,e,null),l=!0},p:E,i(o){l||(A(t.$$.fragment,o),l=!0)},o(o){B(t.$$.fragment,o),l=!1},d(o){o&&b(e),Y(t)}}}function Ys(n){let e,t,l,o,r,i,a,u,c,d,f,_,g,p,v,h,$,R,D={};e=new Xs({props:D}),n[5](e);const H=[Vs,Ws],x=[];function M(S,T){return S[2].length>0?0:1}function C(S,T){return T===0?Fs(S):S}return p=M(n),v=x[p]=H[p](C(n,p)),{c(){Q(e.$$.fragment),t=P(),l=m("div"),o=m("div"),r=m("button"),r.textContent="RS3",i=P(),a=m("button"),a.textContent="OSRS",u=P(),c=m("div"),d=m("button"),d.innerHTML='Change Theme',f=P(),_=m("button"),_.innerHTML='Settings',g=P(),v.c(),w(r,"class","mx-1 w-20 rounded-lg border-2 border-blue-500 p-2 duration-200 hover:opacity-75"),W(r,"text-black",n[1].selected.game===z.rs3),W(r,"bg-blue-500",n[1].selected.game===z.rs3),w(a,"class","mx-1 w-20 rounded-lg border-2 border-blue-500 bg-blue-500 p-2 text-black duration-200 hover:opacity-75"),W(a,"text-black",n[1].selected.game===z.osrs),W(a,"bg-blue-500",n[1].selected.game===z.osrs),w(o,"class","m-3 ml-9 font-bold"),w(d,"class","h-10 w-10 rounded-full bg-blue-500 text-center duration-200 hover:rotate-45 hover:opacity-75"),w(_,"class","h-10 w-10 rounded-full bg-blue-500 text-center duration-200 hover:rotate-45 hover:opacity-75"),w(c,"class","m-2 ml-auto flex gap-2"),w(l,"class","fixed top-0 flex h-16 w-screen border-b-2 border-slate-300 bg-slate-100 duration-200 dark:border-slate-800 dark:bg-slate-900")},m(S,T){Z(e,S,T),k(S,t,T),k(S,l,T),y(l,o),y(o,r),y(o,i),y(o,a),y(l,u),y(l,c),y(c,d),y(c,f),y(c,_),y(c,g),x[p].m(c,null),h=!0,$||(R=[U(r,"click",n[6]),U(a,"click",n[7]),U(d,"click",n[8]),U(_,"click",n[9])],$=!0)},p(S,[T]){const j={};e.$set(j),(!h||T&2)&&W(r,"text-black",S[1].selected.game===z.rs3),(!h||T&2)&&W(r,"bg-blue-500",S[1].selected.game===z.rs3),(!h||T&2)&&W(a,"text-black",S[1].selected.game===z.osrs),(!h||T&2)&&W(a,"bg-blue-500",S[1].selected.game===z.osrs);let O=p;p=M(S),p===O?x[p].p(C(S,p),T):(Ae(),B(x[O],1,1,()=>{x[O]=null}),De(),v=x[p],v?v.p(C(S,p),T):(v=x[p]=H[p](C(S,p)),v.c()),A(v,1),v.m(c,null))},i(S){h||(A(e.$$.fragment,S),A(v),h=!0)},o(S){B(e.$$.fragment,S),B(v),h=!1},d(S){S&&(b(t),b(l)),n[5](null),Y(e,S),x[p].d(),$=!1,oe(R)}}}function Ks(n,e,t){let l,o;const{config:r,sessions:i}=q;pe(n,r,p=>t(1,l=p)),pe(n,i,p=>t(2,o=p));let a;function u(p){ge[p?"unshift":"push"](()=>{a=p,t(0,a)})}return[a,l,o,r,i,u,()=>{Pe(r,l.selected.game=z.rs3,l)},()=>{Pe(r,l.selected.game=z.osrs,l)},()=>Pe(r,l.use_dark_theme=!l.use_dark_theme,l),()=>a.open(),()=>{const{origin:p,redirect:v,clientid:h}=L.env;ae.openLoginWindow(p,v,h)}]}class Qs extends le{constructor(e){super(),se(this,e,Ks,Ys,te,{})}}function el(n){let e,t,l,o,r,i,a,u,c,d,f,_,g;return e=new Hn({}),l=new Qs({}),u=new ms({}),_=new ws({props:{logs:n[0]}}),{c(){Q(e.$$.fragment),t=P(),Q(l.$$.fragment),o=P(),r=m("div"),i=m("div"),a=P(),Q(u.$$.fragment),c=P(),d=m("div"),f=P(),Q(_.$$.fragment),w(r,"class","mt-16 grid h-full grid-flow-col grid-cols-3")},m(p,v){Z(e,p,v),k(p,t,v),Z(l,p,v),k(p,o,v),k(p,r,v),y(r,i),y(r,a),Z(u,r,null),y(r,c),y(r,d),k(p,f,v),Z(_,p,v),g=!0},p(p,v){const h={};v&1&&(h.logs=p[0]),_.$set(h)},i(p){g||(A(e.$$.fragment,p),A(l.$$.fragment,p),A(u.$$.fragment,p),A(_.$$.fragment,p),g=!0)},o(p){B(e.$$.fragment,p),B(l.$$.fragment,p),B(u.$$.fragment,p),B(_.$$.fragment,p),g=!1},d(p){p&&(b(t),b(o),b(r),b(f)),Y(e,p),Y(l,p),Y(u),Y(_,p)}}}function tl(n){let e,t,l,o;return e=new Jt({props:{$$slots:{default:[el]},$$scope:{ctx:n}}}),{c(){Q(e.$$.fragment)},m(r,i){Z(e,r,i),t=!0,l||(o=U(window,"beforeunload",n[2]),l=!0)},p(r,[i]){const a={};i&9&&(a.$$scope={dirty:i,ctx:r}),e.$set(a)},i(r){t||(A(e.$$.fragment,r),t=!0)},o(r){B(e.$$.fragment,r),t=!1},d(r){Y(e,r),l=!1,o()}}}function nl(n,e,t){let l;const o=I.logs;return pe(n,o,i=>t(0,l=i)),[l,o,()=>J.saveConfig()]}class sl extends le{constructor(e){super(),se(this,e,nl,tl,te,{})}}const jt={target:document.getElementById("app")};window.opener||window.location.search.includes("&id_token")?new Ln(jt):(ll(),hn(),ol(),rl(),new sl(jt));function ll(){const n=new URLSearchParams(window.location.search);L.platform=n.get("platform"),L.isFlathub=n.get("flathub")==="1",L.rs3DebInstalledHash=n.get("rs3_deb_installed_hash"),L.rs3ExeInstalledHash=n.get("rs3_exe_installed_hash"),L.rs3AppInstalledHash=n.get("rs3_app_installed_hash"),L.osrsExeInstalledHash=n.get("osrs_exe_installed_hash"),L.osrsAppInstalledHash=n.get("osrs_app_installed_hash"),L.runeLiteInstalledId=n.get("runelite_installed_id"),L.hdosInstalledVersion=n.get("hdos_installed_version");const e=n.get("plugins");if(L.hasBoltPlugins=e!==null,e!==null)try{L.pluginList=JSON.parse(e)}catch{I.error("Unable to parse plugin list")}const t=n.get("credentials");if(t)try{const l=JSON.parse(t),o=l.every(r=>typeof r.session_id=="string"&&typeof r.tokens=="object"&&typeof r.accounts=="object"&&typeof r.user=="object");o?q.sessions.set(l):(q.sessions.set([]),J.saveCredentials(),I.warn("Credentials saved on disk are out of date. Please sign in again.")),q.sessions.set(o?l:[])}catch{q.sessions.set([]),J.saveCredentials(),I.error("Unable to parse saved credentials. Please sign in again.")}}function ol(){const{origin:n,origin_2fa:e}=L.env,t=[window.location.origin,n,e];let l=null;window.addEventListener("message",async o=>{var r;if(!t.includes(o.origin)){I.info(`discarding window message from origin ${o.origin}`);return}switch(o.data.type){case"authTokenUpdate":{l=o.data.tokens;break}case"authSessionUpdate":{if(l===null)return I.error("auth is null. Please try again.");const i=o.data.sessionId,a=await J.login(l,i);a.ok?I.info(`Added new user '${a.value.user.displayName}'`):I.error(`Unable to add new user. Please try again. ${a.error}`),J.saveCredentials(),ae.pendingLoginWindow=null,l=null;break}case"authFailed":{I.error(`Unable to authenticate: ${o.data.reason}`),ae.pendingLoginWindow=null,l=null;break}case"externalUrl":{const i=new XMLHttpRequest;i.onreadystatechange=()=>{i.readyState==4&&I.info(`External URL status: '${i.responseText.trim()}'`)},i.open("POST","/open-external-url",!0),i.send(o.data.url);break}case"gameClientListUpdate":Ne.set(Xe());break;default:{const i=((r=o.data)==null?void 0:r.type)??"no type provided";I.info(`Unknown message type: ${i}`);break}}})}async function rl(){const n=fe(q.sessions),e=[];for(const t of n){const l=await ae.refreshOAuthToken(t.tokens);if(!l.ok){l.error===0?I.error(`Unable to verify saved login, status: ${l.error}. Do you have an internet connection? Please relaunch Bolt to try again.`):(I.error(`Discarding expired login, status: ${l.error}. Please sign in again.`),e.push(t.tokens.sub));continue}const o=l.value;t.tokens=o;const r=await J.login(o,t.session_id);r.ok?I.info(`Signed into saved user '${r.value.user.displayName}'`):(I.error(`Unable to sign into saved user '${t.user.displayName}' - please sign in again. ${r.error}`),e.push(t.tokens.sub))}e.forEach(t=>{J.logout(t)}),q.sessions.set(n),J.saveCredentials()} diff --git a/app/dist/assets/index-DpEEoeII.js b/app/dist/assets/index-DpEEoeII.js new file mode 100644 index 0000000..de72d5f --- /dev/null +++ b/app/dist/assets/index-DpEEoeII.js @@ -0,0 +1,6 @@ +var Jt=Object.defineProperty;var Wt=(n,e,t)=>e in n?Jt(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var xe=(n,e,t)=>(Wt(n,typeof e!="symbol"?e+"":e,t),t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))l(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const i of r.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&l(i)}).observe(document,{childList:!0,subtree:!0});function t(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function l(o){if(o.ep)return;o.ep=!0;const r=t(o);fetch(o.href,r)}})();var st=(n=>(n[n.SECOND=1e3]="SECOND",n[n.MINUTE=6e4]="MINUTE",n[n.HALF_HOUR=18e5]="HALF_HOUR",n[n.HOUR=36e5]="HOUR",n[n.DAY=864e5]="DAY",n[n.WEEK=6048e5]="WEEK",n[n.MONTH=2592e6]="MONTH",n))(st||{});class Ce{static set(e,t,l,o){const r=new Date;r.setTime(r.getTime()+l*o);const i=`expires=${r.toUTCString()}`;document.cookie=`${e}=${t};${i};path=/`}static get(e){const t=`${e}=`,l=document.cookie.split(";");for(let o=0;o(n.rs3="rs3",n.osrs="osrs",n))(z||{}),he=(n=>(n.official="Official",n.runelite="RuneLite",n.hdos="HDOS",n))(he||{});const at={rs3:["Official"],osrs:["Official","RuneLite","HDOS"]};class qe{static parseTokenResponse(e){try{const t=JSON.parse(e),l=t.id_token.split(".");if(l.length!==3){const i=`Malformed id_token: ${l.length} sections, expected 3`;return F(i)}const o=JSON.parse(atob(l[0]));if(o.typ!=="JWT"){const i=`Bad id_token header: typ ${o.typ}, expected JWT`;return F(i)}const r=JSON.parse(atob(l[1]));return ce({access_token:t.access_token,id_token:t.id_token,refresh_token:t.refresh_token,sub:r.sub,expiry:Date.now()+t.expires_in*1e3})}catch{return F("Unable to parse token response")}}static parseSessionResponse(e){try{const t=JSON.parse(e);return t.sessionId?ce(t.sessionId):F("sessionId does not exist on parsed object")}catch{return F("Unable to parse session response")}}static decodeBolt(e){const t={};for(const l in e){const o=l,r=e[o];typeof r=="string"?t[o]=atob(r):Array.isArray(r)&&r.every(i=>typeof i=="string")?t[o]=r.map(i=>atob(i)):t[o]=r}return t}}var Ee=(n=>(n.Windows="windows",n.Linux="linux",n.MacOS="mac",n))(Ee||{});const C={env:qe.decodeBolt(s()),platform:null,rs3DebInstalledHash:null,rs3ExeInstalledHash:null,rs3AppInstalledHash:null,osrsExeInstalledHash:null,osrsAppInstalledHash:null,runeLiteInstalledId:null,hdosInstalledVersion:null,isFlathub:!1,hasBoltPlugins:!1,pluginList:{}};class Ke{static async makeLoginUrl(e){const t=new TextEncoder().encode(e.pkceCodeVerifier),l=await crypto.subtle.digest("SHA-256",t);let o="";const r=new Uint8Array(l);for(let a=0;aMath.round(r*(l-0)/255+0)).map(r=>t[r]).join("")}}const Re=class Re{static async openLoginWindow(e,t,l){if(Re.pendingLoginWindow!==null)return Re.pendingLoginWindow.window.focus();const o=Ke.makeRandomState(),r=Ke.makeRandomVerifier(),i=new TextEncoder().encode(r),a=await crypto.subtle.digest("SHA-256",i);let u="";const c=new Uint8Array(a);for(let g=0;g{if(e.expiry-Date.now()<3e4){const l=new URLSearchParams({grant_type:"refresh_token",client_id:C.env.clientid,refresh_token:e.refresh_token}),o=new XMLHttpRequest;o.onreadystatechange=()=>{if(o.readyState==4)if(o.status==200){const i=qe.parseTokenResponse(o.response);i.ok?t(ce(i.value)):t(F(0))}else t(F(o.status))},o.onerror=()=>{t(F(0))};const r=C.env.origin.concat("/oauth2/token");o.open("POST",r,!0),o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),o.setRequestHeader("Accept","application/json"),o.send(l)}else t(ce(e))})}static async getOAuthToken(e,t,l,o,r){const i=`${e}/oauth2/token`;return new Promise(a=>{const u=new XMLHttpRequest;u.onreadystatechange=()=>{if(u.readyState==4)if(u.status==200){const d=qe.parseTokenResponse(u.response);return d.ok?a(ce(d.value)):a(F(d.error))}else return a(F(`Error: from ${i}: ${u.status}: ${u.response}`))},u.open("POST",i,!0),u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.setRequestHeader("Accept","application/json");const c=new URLSearchParams({grant_type:"authorization_code",client_id:t,code:r,code_verifier:l,redirect_uri:o});u.send(c)})}static revokeOauthCreds(e){const t=`${C.env.origin}/oauth2/revoke`;return new Promise(l=>{const o=new XMLHttpRequest;o.open("POST",t,!0),o.onreadystatechange=()=>{o.readyState==4&&l(o.status)},o.setRequestHeader("Content-Type","application/x-www-form-urlencoded");const r=new URLSearchParams({token:e,client_id:C.env.clientid});o.send(r)})}static async getSessionId(e,t){const l=`${e}/sessions`;return new Promise(o=>{const r=new XMLHttpRequest;r.onreadystatechange=()=>{if(r.readyState==4)if(r.status==200){const a=qe.parseSessionResponse(r.response);return a.ok?o(ce(a.value)):o(F(a.error))}else F(`Error: from ${l}: ${r.status}: ${r.response}`)},r.open("POST",l,!0),r.setRequestHeader("Content-Type","application/json"),r.setRequestHeader("Accept","application/json");const i={idToken:t};r.send(JSON.stringify(i))})}static validateIdToken(e,t){const l=e.split(".");if(l.length!==3)return F(`Malformed id_token: ${l.length} sections, expected 3`);const o=JSON.parse(atob(l[0]));return o.typ!=="JWT"?F(`Bad id_token header: typ ${o.typ}, expected JWT`):JSON.parse(atob(l[1])).nonce!==t?F("Incorrect nonce in id_token"):ce(void 0)}};xe(Re,"pendingLoginWindow",null);let ie=Re;class Ge{static async buildSession(e,t){const l=await Ge.getUser(e.sub,e.access_token);if(!l.ok)return F(`Failed to fetch user. Status: ${l.error}`);const o=await Ge.getUserAccounts(t);return o.ok?ce({user:l.value,accounts:o.value,tokens:e,session_id:t}):F(`Failed to fetch game accounts. Status: ${o.error}`)}static getUser(e,t){return new Promise(l=>{const o=`${C.env.api}/users/${e}/displayName`,r=new XMLHttpRequest;r.onreadystatechange=()=>{if(r.readyState==4)if(r.status==200){const i=JSON.parse(r.response);l(ce(i))}else l(F(r.status))},r.open("GET",o,!0),r.setRequestHeader("Authorization","Bearer ".concat(t)),r.send()})}static getUserAccounts(e){const t=`${C.env.auth_api}/accounts`;return new Promise(l=>{const o=new XMLHttpRequest;o.onreadystatechange=async()=>{if(o.readyState==4)if(o.status==200){const r=JSON.parse(o.response);l(ce(r))}else l(F(o.status))},o.open("GET",t,!0),o.setRequestHeader("Accept","application/json"),o.setRequestHeader("Authorization","Bearer ".concat(e)),o.send()})}}function U(){}function Vt(n,e){for(const t in e)n[t]=e[t];return n}function zt(n){return!!n&&(typeof n=="object"||typeof n=="function")&&typeof n.then=="function"}function Mt(n){return n()}function ct(){return Object.create(null)}function oe(n){n.forEach(Mt)}function Je(n){return typeof n=="function"}function te(n,e){return n!=n?e==e:n!==e||n&&typeof n=="object"||typeof n=="function"}let De;function Zt(n,e){return n===e?!0:(De||(De=document.createElement("a")),De.href=e,n===De.href)}function Yt(n){return Object.keys(n).length===0}function jt(n,...e){if(n==null){for(const l of e)l(void 0);return U}const t=n.subscribe(...e);return t.unsubscribe?()=>t.unsubscribe():t}function ue(n){let e;return jt(n,t=>e=t)(),e}function de(n,e,t){n.$$.on_destroy.push(jt(e,t))}function We(n,e,t,l){if(n){const o=At(n,e,t,l);return n[0](o)}}function At(n,e,t,l){return n[1]&&l?Vt(t.ctx.slice(),n[1](l(e))):t.ctx}function Ve(n,e,t,l){if(n[2]&&l){const o=n[2](l(t));if(e.dirty===void 0)return o;if(typeof o=="object"){const r=[],i=Math.max(e.dirty.length,o.length);for(let a=0;a32){const e=[],t=n.ctx.length/32;for(let l=0;ln.removeEventListener(e,t,l)}function Qt(n){return function(e){e.target===this&&n.call(this,e)}}function m(n,e,t){t==null?n.removeAttribute(e):n.getAttribute(e)!==t&&n.setAttribute(e,t)}function en(n){return Array.from(n.childNodes)}function re(n,e){e=""+e,n.data!==e&&(n.data=e)}function ne(n,e){n.value=e??""}function me(n,e,t){for(let l=0;l{const o=n.$$.callbacks[e];if(o){const r=tn(e,t,{cancelable:l});return o.slice().forEach(i=>{i.call(n,r)}),!r.defaultPrevented}return!0}}const Le=[],ge=[];let Pe=[];const ut=[],ln=Promise.resolve();let lt=!1;function on(){lt||(lt=!0,ln.then(rt))}function Ie(n){Pe.push(n)}const Qe=new Set;let ye=0;function rt(){if(ye!==0)return;const n=Ue;do{try{for(;yen.indexOf(l)===-1?e.push(l):t.push(l)),t.forEach(l=>l()),Pe=e}const Be=new Set;let be;function Me(){be={r:0,c:[],p:be}}function je(){be.r||oe(be.c),be=be.p}function D(n,e){n&&n.i&&(Be.delete(n),n.i(e))}function B(n,e,t,l){if(n&&n.o){if(Be.has(n))return;Be.add(n),be.c.push(()=>{Be.delete(n),l&&(t&&n.d(1),l())}),n.o(e)}else l&&l()}function Xe(n,e){const t=e.token={};function l(o,r,i,a){if(e.token!==t)return;e.resolved=a;let u=e.ctx;i!==void 0&&(u=u.slice(),u[i]=a);const c=o&&(e.current=o)(u);let d=!1;e.block&&(e.blocks?e.blocks.forEach((f,_)=>{_!==r&&f&&(Me(),B(f,1,1,()=>{e.blocks[_]===f&&(e.blocks[_]=null)}),je())}):e.block.d(1),c.c(),D(c,1),c.m(e.mount(),e.anchor),d=!0),e.block=c,e.blocks&&(e.blocks[r]=c),d&&rt()}if(zt(n)){const o=Ye();if(n.then(r=>{_e(o),l(e.then,1,e.value,r),_e(null)},r=>{if(_e(o),l(e.catch,2,e.error,r),_e(null),!e.hasCatch)throw r}),e.current!==e.pending)return l(e.pending,0),!0}else{if(e.current!==e.then)return l(e.then,1,e.value,n),!0;e.resolved=n}}function qt(n,e,t){const l=e.slice(),{resolved:o}=n;n.current===n.then&&(l[n.value]=o),n.current===n.catch&&(l[n.error]=o),n.block.p(l,t)}function ee(n){return(n==null?void 0:n.length)!==void 0?n:Array.from(n)}function cn(n,e){n.d(1),e.delete(n.key)}function un(n,e,t,l,o,r,i,a,u,c,d,f){let _=n.length,g=r.length,p=_;const v={};for(;p--;)v[n[p].key]=p;const h=[],$=new Map,S=new Map,E=[];for(p=g;p--;){const R=f(o,r,p),L=t(R);let T=i.get(L);T?l&&E.push(()=>T.p(R,e)):(T=c(L,R),T.c()),$.set(L,h[p]=T),L in v&&S.set(L,Math.abs(p-v[L]))}const H=new Set,x=new Set;function j(R){D(R,1),R.m(a,d),i.set(R.key,R),d=R.first,g--}for(;_&&g;){const R=h[g-1],L=n[_-1],T=R.key,A=L.key;R===L?(d=R.first,_--,g--):$.has(A)?!i.has(T)||H.has(T)?j(R):x.has(A)?_--:S.get(T)>S.get(A)?(x.add(T),j(R)):(H.add(A),_--):(u(L,i),_--)}for(;_--;){const R=n[_];$.has(R.key)||u(R,i)}for(;g;)j(h[g-1]);return oe(E),h}function Q(n){n&&n.c()}function Z(n,e,t){const{fragment:l,after_update:o}=n.$$;l&&l.m(e,t),Ie(()=>{const r=n.$$.on_mount.map(Mt).filter(Je);n.$$.on_destroy?n.$$.on_destroy.push(...r):oe(r),n.$$.on_mount=[]}),o.forEach(Ie)}function Y(n,e){const t=n.$$;t.fragment!==null&&(an(t.after_update),oe(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function dn(n,e){n.$$.dirty[0]===-1&&(Le.push(n),on(),n.$$.dirty.fill(0)),n.$$.dirty[e/31|0]|=1<{const p=g.length?g[0]:_;return c.ctx&&o(c.ctx[f],c.ctx[f]=p)&&(!c.skip_bound&&c.bound[f]&&c.bound[f](p),d&&dn(n,f)),_}):[],c.update(),d=!0,oe(c.before_update),c.fragment=l?l(c.ctx):!1,e.target){if(e.hydrate){const f=en(e.target);c.fragment&&c.fragment.l(f),f.forEach(k)}else c.fragment&&c.fragment.c();e.intro&&D(n.$$.fragment),Z(n,e.target,e.anchor),rt()}_e(u)}class le{constructor(){xe(this,"$$");xe(this,"$$set")}$destroy(){Y(this,1),this.$destroy=U}$on(e,t){if(!Je(t))return U;const l=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return l.push(t),()=>{const o=l.indexOf(t);o!==-1&&l.splice(o,1)}}$set(e){this.$$set&&!Yt(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const fn="4",ve=[];function Fe(n,e=U){let t;const l=new Set;function o(a){if(te(n,a)&&(n=a,t)){const u=!ve.length;for(const c of l)c[1](),ve.push(c,n);if(u){for(let c=0;c{l.delete(c),l.size===0&&t&&(t(),t=null)}}return{set:o,update:r,subscribe:i}}var Oe=(n=>(n.info="info",n.warn="warn",n.error="error",n))(Oe||{});class pn{constructor(){xe(this,"logs",Fe([]))}_addLog(e,t){this.logs.update(l=>(l.unshift({date:new Date,severity:e,content:t}),l))}info(e){this._addLog("info",e)}warn(e){this._addLog("warn",e)}error(e){this._addLog("error",e)}updateLogAtIndex(e,t){this.logs.update(l=>(l[e]&&(l[e].content=t),l))}}const I=new pn;function _n(n,e){let t=!1;return n.subscribe(l=>{t?e(l):t=!0})}const gn={use_dark_theme:!0,rs_plugin_loader:!1,flatpak_rich_presence:!1,runelite_use_custom_jar:!1,use_custom_rs_config_uri:!1,selected:{game:z.osrs,client:he.runelite,user_id:null},userDetails:{}};function hn(){const e=new URLSearchParams(window.location.search).get("config");function t(o){return typeof o=="object"&&typeof o.use_dark_theme=="boolean"&&typeof o.rs_plugin_loader=="boolean"&&typeof o.flatpak_rich_presence=="boolean"&&typeof o.runelite_use_custom_jar=="boolean"&&typeof o.selected=="object"&&Object.values(z).includes(o.selected.game)&&Object.values(he).includes(o.selected.client)&&(typeof o.selected.user_id=="string"||o.selected.user_id===null)&&typeof o.userDetails=="object"}const{config:l}=q;if(e)try{const o=JSON.parse(e);t(o)?l.set(o):(I.error("The config saved on disk is not the correct format. It has been restored to default."),q.configHasPendingChanges=!0)}catch{I.error("Unable to parse config, restoring to default"),q.configHasPendingChanges=!0}else q.configHasPendingChanges=!0;_n(q.config,()=>{q.configHasPendingChanges=!0})}const q={configHasPendingChanges:!1,config:Fe(gn),sessions:Fe([])};let et=!1;class X{static async login(e,t){const l=await Ge.buildSession(e,t);if(!l.ok)return F(l.error);const{config:o,sessions:r}=q,i=l.value;return X.findSession(e.sub)||(r.update(u=>(u.push(i),u)),o.update(u=>(u.selected.user_id=i.user.userId,u))),!ue(o).selected.user_id===null&&i.user.userId,ce(i)}static async logout(e){const{sessions:t,config:l}=q;return t.update(o=>{const r=o.findIndex(i=>i.user.userId===e);return r>-1&&(ie.revokeOauthCreds(o[r].tokens.access_token),o.splice(r,1)),o}),l.update(o=>(typeof o.userDetails[e]<"u"&&delete o.userDetails[e],o.selected.user_id===e&&(o.selected.user_id=null),o)),ue(t)}static saveConfig(e=!0){if(et||e&&!q.configHasPendingChanges)return;et=!0;const t=new XMLHttpRequest;t.open("POST","/save-config",!0),t.onreadystatechange=()=>{t.readyState==4&&(I.info(`Save config status: '${t.responseText.trim()}'`),et=!1)},t.setRequestHeader("Content-Type","application/json");const l=ue(q.config);return t.send(JSON.stringify(l)),l}static async saveCredentials(){new Promise(e=>{const t=new XMLHttpRequest;t.open("POST","/save-credentials",!0),t.setRequestHeader("Content-Type","application/json"),t.onreadystatechange=()=>{t.readyState==4&&e(void 0)};const l=ue(q.sessions);t.send(JSON.stringify(l))})}static async openFilePicker(){return new Promise(e=>{const t=new XMLHttpRequest;t.onreadystatechange=()=>{if(t.readyState==4)return t.status==200?e(t.responseText):e(void 0)},t.open("GET","/jar-file-picker",!0),t.send()})}static findSession(e){return ue(q.sessions).find(l=>l.user.userId===e)}static findAccount(e,t){return e.find(l=>l.accountId==t)}}const Bt=Fe([]);typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(fn);function mn(n){let e,t;const l=n[4].default,o=We(l,n,n[3],null);return{c(){e=b("main"),o&&o.c(),m(e,"class","fixed top-0 h-screen w-screen bg-slate-100 text-xs text-slate-900 duration-200 sm:text-sm md:text-base dark:bg-slate-900 dark:text-slate-50"),W(e,"dark",n[0])},m(r,i){w(r,e,i),o&&o.m(e,null),t=!0},p(r,[i]){o&&o.p&&(!t||i&8)&&ze(o,l,r,r[3],t?Ve(l,r[3],i,null):Ze(r[3]),null),(!t||i&1)&&W(e,"dark",r[0])},i(r){t||(D(o,r),t=!0)},o(r){B(o,r),t=!1},d(r){r&&k(e),o&&o.d(r)}}}function bn(n,e,t){let l,o,{$$slots:r={},$$scope:i}=e;const{config:a}=q;return de(n,a,u=>t(2,o=u)),n.$$set=u=>{"$$scope"in u&&t(3,i=u.$$scope)},n.$$.update=()=>{n.$$.dirty&4&&t(0,l=o.use_dark_theme)},[l,a,o,i,r]}class Gt extends le{constructor(e){super(),se(this,e,bn,mn,te,{})}}function kn(n){let e;return{c(){e=b("div"),e.innerHTML='loading',m(e,"class","flex h-full items-center justify-center")},m(t,l){w(t,e,l)},p:U,d(t){t&&k(e)}}}function wn(n){let e,t;return e=new Gt({props:{$$slots:{default:[kn]},$$scope:{ctx:n}}}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},p(l,[o]){const r={};o&32&&(r.$$scope={dirty:o,ctx:l}),e.$set(r)},i(l){t||(D(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function yn(n){const e=window.opener;C.env==null&&o("BoltEnv is not defined. Please close and re-open Bolt to try again.");async function t(i){const a=Ce.get("auth_verifier");if(!a)return o("Verifier token has expired. Please try signing in again."),null;const{clientid:u,redirect:c}=C.env,d=await ie.getOAuthToken(C.env.origin,u,a,c,i);return d.ok?d.value:(o(`Fetching OAuth token failed. ${d.error}`),null)}async function l(i){const a=Ce.get("auth_nonce"),u=ie.validateIdToken(i,a??"");if(!u.ok)return o(u.error),null;const c=await ie.getSessionId(C.env.auth_api,i);return c.ok?c.value:(o(`Unable to retreive session id. ${c.error}`),null)}function o(i){r({type:"authFailed",reason:i}),window.close()}function r(i){e.postMessage(i,window.location.origin)}return Dt(async()=>{const i=new URLSearchParams(window.location.search),a=i.get("code"),u=i.get("state"),c=i.get("id_token");if(c==null&&a&&u){const d=await t(a);if(!d)return o("tokens object is null.");r({type:"authTokenUpdate",tokens:d});const f=crypto.randomUUID();ie.navigateToAuthConsent(C.env.origin,d.id_token,f)}else if(c&&a&&u){const d=await l(c);if(!d)return o("sessionId is null");r({type:"authSessionUpdate",sessionId:d}),window.close()}else o("Authentication server did not response with the appropriate parameters. Please try again later.")}),nn(()=>{Ce.remove("auth_verifier"),Ce.remove("auth_nonce")}),[]}class vn extends le{constructor(e){super(),se(this,e,yn,wn,te,{})}}function dt(n){let e,t,l;return{c(){e=b("button"),e.innerHTML='Close',m(e,"class","absolute right-3 top-3 rounded-full bg-rose-500 p-[2px] shadow-lg duration-200 hover:rotate-90 hover:opacity-75")},m(o,r){w(o,e,r),t||(l=M(e,"click",n[2]),t=!0)},p:U,d(o){o&&k(e),t=!1,l()}}}function ft(n){let e;const t=n[7].default,l=We(t,n,n[6],null);return{c(){l&&l.c()},m(o,r){l&&l.m(o,r),e=!0},p(o,r){l&&l.p&&(!e||r&64)&&ze(l,t,o,o[6],e?Ve(t,o[6],r,null):Ze(o[6]),null)},i(o){e||(D(l,o),e=!0)},o(o){B(l,o),e=!1},d(o){l&&l.d(o)}}}function $n(n){let e,t,l,o,r,i,a=n[1]&&dt(n),u=n[4]&&ft(n);return{c(){e=b("dialog"),a&&a.c(),t=P(),u&&u.c(),m(e,"class",l=n[0]+" backdrop max-h-[90%] max-w-[90%] overflow-auto rounded-xl text-inherit focus-visible:outline-none svelte-csux1e"),W(e,"backdrop:cursor-pointer",n[1])},m(c,d){w(c,e,d),a&&a.m(e,null),y(e,t),u&&u.m(e,null),n[8](e),o=!0,r||(i=[M(e,"keydown",n[9]),M(e,"mousedown",Qt(n[10]))],r=!0)},p(c,[d]){c[1]?a?a.p(c,d):(a=dt(c),a.c(),a.m(e,t)):a&&(a.d(1),a=null),c[4]?u?(u.p(c,d),d&16&&D(u,1)):(u=ft(c),u.c(),D(u,1),u.m(e,null)):u&&(Me(),B(u,1,1,()=>{u=null}),je()),(!o||d&1&&l!==(l=c[0]+" backdrop max-h-[90%] max-w-[90%] overflow-auto rounded-xl text-inherit focus-visible:outline-none svelte-csux1e"))&&m(e,"class",l),(!o||d&3)&&W(e,"backdrop:cursor-pointer",c[1])},i(c){o||(D(u),o=!0)},o(c){B(u),o=!1},d(c){c&&k(e),a&&a.d(),u&&u.d(),n[8](null),r=!1,oe(i)}}}function Sn(n,e,t){let{$$slots:l={},$$scope:o}=e,{class:r=""}=e,{canSelfClose:i=!0}=e,a,u=!1;const c=sn();function d(){a.showModal(),t(4,u=!0)}function f(){c("close"),a.close(),t(4,u=!1)}function _(v){ge[v?"unshift":"push"](()=>{a=v,t(3,a)})}const g=v=>{v.key==="Escape"&&(v.preventDefault(),i&&f())},p=()=>{i&&f()};return n.$$set=v=>{"class"in v&&t(0,r=v.class),"canSelfClose"in v&&t(1,i=v.canSelfClose),"$$scope"in v&&t(6,o=v.$$scope)},[r,i,f,a,u,d,o,l,_,g,p]}class it extends le{constructor(e){super(),se(this,e,Sn,$n,te,{class:0,canSelfClose:1,open:5,close:2})}get open(){return this.$$.ctx[5]}get close(){return this.$$.ctx[2]}}function Ln(n){let e,t,l,o,r,i,a;return{c(){e=b("p"),e.textContent=`${atob("Qm9sdCBpcyBhbiB1bm9mZmljaWFsIHRoaXJkLXBhcnR5IGxhdW5jaGVyLiBJdCdzIGZyZWUgYW5kIG9wZW4tc291cmNlIHNvZnR3YXJlIGxpY2Vuc2VkIHVuZGVyIEFHUEwgMy4wLg==")}`,t=P(),l=b("p"),l.textContent=`${atob("SmFnZXggaXMgbm90IHJlc3BvbnNpYmxlIGZvciBhbnkgcHJvYmxlbXMgb3IgZGFtYWdlIGNhdXNlZCBieSB1c2luZyB0aGlzIHByb2R1Y3Qu")}`,o=P(),r=b("button"),r.textContent="I Understand",m(e,"class","p-2"),m(l,"class","p-2"),m(r,"class","m-5 rounded-lg border-2 border-blue-500 p-2 duration-200 hover:opacity-75")},m(u,c){w(u,e,c),w(u,t,c),w(u,l,c),w(u,o,c),w(u,r,c),i||(a=M(r,"click",n[2]),i=!0)},p:U,d(u){u&&(k(e),k(t),k(l),k(o),k(r)),i=!1,a()}}}function Cn(n){let e,t,l={canSelfClose:!1,class:"w-1/2 text-center",$$slots:{default:[Ln]},$$scope:{ctx:n}};return e=new it({props:l}),n[3](e),{c(){Q(e.$$.fragment)},m(o,r){Z(e,o,r),t=!0},p(o,[r]){const i={};r&33&&(i.$$scope={dirty:r,ctx:o}),e.$set(i)},i(o){t||(D(e.$$.fragment,o),t=!0)},o(o){B(e.$$.fragment,o),t=!1},d(o){n[3](null),Y(e,o)}}}function Rn(n,e,t){let l;const{sessions:o}=q;de(n,o,u=>t(4,l=u));let r;Dt(()=>{l.length==0&&r.open()});const i=()=>r.close();function a(u){ge[u?"unshift":"push"](()=>{r=u,t(0,r)})}return[r,o,i,a]}class Tn extends le{constructor(e){super(),se(this,e,Rn,Cn,te,{})}}function Pn(n,e,t){X.saveConfig();const l=(a,u)=>{const c=new XMLHttpRequest,d={},f=ue(q.config);a&&(d.hash=a),n&&(d.jx_session_id=n),e&&(d.jx_character_id=e),t&&(d.jx_display_name=t),f.rs_plugin_loader&&(d.plugin_loader="1"),f.use_custom_rs_config_uri&&f.rs_config_uri?d.config_uri=f.rs_config_uri:d.config_uri=C.env.default_config_uri,c.open("POST","/launch-rs3-deb?".concat(new URLSearchParams(d).toString()),!0),c.onreadystatechange=()=>{c.readyState==4&&(I.info(`Game launch status: '${c.responseText.trim()}'`),c.status==200&&a&&(C.rs3DebInstalledHash=a))},c.send(u)},o=new XMLHttpRequest,r=C.env.content_url,i=r.concat("dists/trusty/non-free/binary-amd64/Packages");o.open("GET",i,!0),o.onreadystatechange=()=>{if(o.readyState==4&&o.status==200){const a=Object.fromEntries(o.response.split(` +`).map(u=>u.split(": ")));if(!a.Filename||!a.Size){I.error(`Could not parse package data from URL: ${i}`),l();return}if(a.SHA256!==C.rs3DebInstalledHash){I.info("Downloading RS3 client...");const u=new XMLHttpRequest;u.open("GET",r.concat(a.Filename),!0),u.responseType="arraybuffer",u.onprogress=c=>{if(c.loaded){const d=(Math.round(1e3*c.loaded/c.total)/10).toFixed(1);I.updateLogAtIndex(0,`Downloading RS3 client... ${d}%`)}},u.onreadystatechange=()=>{u.readyState==4&&u.status==200&&l(a.SHA256,u.response)},u.onerror=()=>{I.error(`Error downloading game client: from ${i}: non-http error`),l()},u.send()}else I.info("Latest client is already installed"),l()}},o.onerror=()=>{I.error(`Error: from ${i}: non-http error`),l()},o.send()}function Xt(n,e,t,l){X.saveConfig();const o=l?"/launch-runelite-jar-configure?":"/launch-runelite-jar?",r=(u,c,d)=>{const f=new XMLHttpRequest,_={};u&&(_.id=u),d&&(_.jar_path=d),n&&(_.jx_session_id=n),e&&(_.jx_character_id=e),t&&(_.jx_display_name=t),ue(q.config).flatpak_rich_presence&&(_.flatpak_rich_presence=""),f.open(c?"POST":"GET",o.concat(new URLSearchParams(_).toString()),!0),f.onreadystatechange=()=>{f.readyState==4&&(I.info(`Game launch status: '${f.responseText.trim()}'`),f.status==200&&u&&(C.runeLiteInstalledId=u))},f.send(c)};if(ue(q.config).runelite_use_custom_jar){r(null,null,ue(q.config).runelite_custom_jar);return}const i=new XMLHttpRequest,a="https://api.github.com/repos/runelite/launcher/releases";i.open("GET",a,!0),i.onreadystatechange=()=>{if(i.readyState==4)if(i.status==200){const u=JSON.parse(i.responseText).map(c=>c.assets).flat().find(c=>c.name.toLowerCase()=="runelite.jar");if(u.id!=C.runeLiteInstalledId){I.info("Downloading RuneLite...");const c=new XMLHttpRequest;c.open("GET",u.browser_download_url,!0),c.responseType="arraybuffer",c.onreadystatechange=()=>{c.readyState==4&&(c.status==200?r(u.id,c.response):I.error(`Error downloading from ${u.url}: ${c.status}: ${c.responseText}`))},c.onprogress=d=>{if(d.loaded&&d.lengthComputable){const f=(Math.round(1e3*d.loaded/d.total)/10).toFixed(1);I.updateLogAtIndex(0,`Downloading RuneLite... ${f}%`)}},c.send()}else I.info("Latest JAR is already installed"),r()}else I.error(`Error from ${a}: ${i.status}: ${i.responseText}`)},i.send()}function In(n,e,t){X.saveConfig();const l=(i,a)=>{const u=new XMLHttpRequest,c={};i&&(c.version=i),n&&(c.jx_session_id=n),e&&(c.jx_character_id=e),t&&(c.jx_display_name=t),u.open("POST","/launch-hdos-jar?".concat(new URLSearchParams(c).toString()),!0),u.onreadystatechange=()=>{u.readyState==4&&(I.info(`Game launch status: '${u.responseText.trim()}'`),u.status==200&&i&&(C.hdosInstalledVersion=i))},u.send(a)},o=new XMLHttpRequest,r="https://cdn.hdos.dev/client/getdown.txt";o.open("GET",r,!0),o.onreadystatechange=()=>{if(o.readyState==4)if(o.status==200){const i=o.responseText.match(/^launcher\.version *= *(.*?)$/m);if(i&&i.length>=2){const a=i[1];if(a!==C.hdosInstalledVersion){const u=`https://cdn.hdos.dev/launcher/v${a}/hdos-launcher.jar`;I.info("Downloading HDOS...");const c=new XMLHttpRequest;c.open("GET",u,!0),c.responseType="arraybuffer",c.onreadystatechange=()=>{if(c.readyState==4)if(c.status==200)l(a,c.response);else{const d=JSON.parse(o.responseText).map(f=>f.assets).flat().find(f=>f.name.toLowerCase()=="runelite.jar");I.error(`Error downloading from ${d.url}: ${c.status}: ${c.responseText}`)}},c.onprogress=d=>{if(d.loaded&&d.lengthComputable){const f=(Math.round(1e3*d.loaded/d.total)/10).toFixed(1);I.updateLogAtIndex(0,`Downloading HDOS... ${f}%`)}},c.send()}else I.info("Latest JAR is already installed"),l()}else I.info("Couldn't parse latest launcher version"),l()}else I.error(`Error from ${r}: ${o.status}: ${o.responseText}`)},o.send()}function tt(){const n=new XMLHttpRequest;n.open("GET","/list-game-clients",!0),n.onreadystatechange=()=>{n.readyState==4&&n.status!=200&&I.error(`Error requesting client list: ${n.status}: ${n.responseText}`)},n.send()}function Hn(){const n=new XMLHttpRequest;n.open("POST","/save-plugin-config",!0),n.setRequestHeader("Content-Type","application/json"),n.onreadystatechange=()=>{n.readyState==4&&I.info(`Save-plugin-config status: ${n.responseText.trim()}`)},n.send(JSON.stringify(C.pluginList))}async function pt(n,e,t,l,o){X.saveConfig();const r=`${e?"osrs":C.env.provider}-${n?"win":"mac"}`;let i=n?e?C.osrsExeInstalledHash:C.rs3ExeInstalledHash:e?C.osrsAppInstalledHash:C.rs3AppInstalledHash;const a=async(R,L)=>{const T={};if(R&&(T.hash=R),t&&(T.jx_session_id=t),l&&(T.jx_character_id=l),o&&(T.jx_display_name=o),!e){const O=ue(q.config);O.rs_plugin_loader&&(T.plugin_loader="1"),T.config_uri=O.use_custom_rs_config_uri&&O.rs_config_uri?O.rs_config_uri:C.env.default_config_uri}const A=await fetch(`/launch-${e?"osrs":"rs3"}-${n?"exe":"app"}?${new URLSearchParams(T).toString()}`,{method:"POST",headers:{"Content-Type":"application/octet-stream"},body:await L});A.text().then(O=>I.info(`Game launch status: '${O.trim()}'`)),A.status==200&&R&&(i=R)},u=`${C.env.direct6_url}${r}/${r}.json`,c=await fetch(u,{method:"GET"}),d=await c.text();if(c.status!==200){I.error(`Error from ${u}: ${c.status}: ${d}`);return}const f=JSON.parse(atob(d.split(".")[1])).environments.production;if(i===f.id){I.info("Latest client is already installed"),a();return}I.info(`Downloading client version ${f.version}`);const _=`${C.env.direct6_url}${r}/catalog/${f.id}/catalog.json`,g=await fetch(_,{method:"GET"}),p=await g.text();if(g.status!==200){I.error(`Error from ${_}: ${g.status}: ${p}`);return}const v=JSON.parse(atob(p.split(".")[1])),h=v.metafile.replace(/^http:/i,"https:"),$=await fetch(h,{method:"GET"}),S=await $.text();if($.status!==200){I.error(`Error from ${h}: ${$.status}: ${S}`);return}const E=JSON.parse(atob(S.split(".")[1])),H=E.pieces.digests.map(R=>{const L=atob(R).split("").map(A=>A.charCodeAt(0).toString(16).padStart(2,"0")).join(""),T=v.config.remote.baseUrl.replace(/^http:/i,"https:").concat(v.config.remote.pieceFormat.replace("{SubString:0,2,{TargetDigest}}",L.substring(0,2)).replace("{TargetDigest}",L));return fetch(T,{method:"GET"}).then(A=>A.blob().then(O=>{const K=new DecompressionStream("gzip");return new Response(O.slice(6).stream().pipeThrough(K)).blob()}))});let x=0,j=null;for(let R=0;R{const L=new Blob(R).slice(x,x+j);a(E.id,L.arrayBuffer())})}function _t(n,e,t){const l=n.slice();return l[30]=e[t],l}function gt(n,e,t){const l=n.slice();return l[33]=e[t],l}function ht(n,e,t){const l=n.slice();return l[36]=e[t][0],l[29]=e[t][1],l}function mt(n,e,t){const l=n.slice();return l[30]=e[t],l}function xn(n){let e,t=ee(n[3]),l=[];for(let o=0;on[18].call(e))},m(f,_){w(f,e,_);for(let g=0;gl.parentNode,r.anchor=l},p(i,a){n=i,r.ctx=n,a[0]&256&&o!==(o=n[8])&&Xe(o,r)||qt(r,n,a)},d(i){i&&(k(e),k(t),k(l)),r.block.d(i),r.token=null,r=null}}}function Mn(n){let e,t,l,o,r,i,a,u,c;function d(g,p){return p[0]&1&&(i=null),i==null&&(i=Object.entries(g[0].pluginList).length!==0),i?zn:Vn}let f=d(n,[-1,-1]),_=f(n);return{c(){e=b("button"),t=G("+"),l=P(),o=b("br"),r=P(),_.c(),a=pe(),m(e,"class","aspect-square w-8 rounded-lg border-2 border-blue-500 text-[20px] font-bold duration-200 enabled:hover:opacity-75 disabled:border-gray-500"),e.disabled=n[5]},m(g,p){w(g,e,p),y(e,t),w(g,l,p),w(g,o,p),w(g,r,p),_.m(g,p),w(g,a,p),u||(c=M(e,"click",n[11]),u=!0)},p(g,p){p[0]&32&&(e.disabled=g[5]),f===(f=d(g,p))&&_?_.p(g,p):(_.d(1),_=f(g),_&&(_.c(),_.m(a.parentNode,a)))},d(g){g&&(k(e),k(l),k(o),k(r),k(a)),_.d(g),u=!1,c()}}}function jn(n){let e;return{c(){e=b("p"),e.textContent="error"},m(t,l){w(t,e,l)},p:U,d(t){t&&k(e)}}}function An(n){let e,t,l,o,r,i,a,u,c,d;function f(h,$){return $[0]&259&&(e=null),$[0]&1&&(t=null),e==null&&(e=!!(h[29]&&h[29].main&&Object.keys(h[0].pluginList).includes(h[1]))),e?Bn:(t==null&&(t=Object.entries(h[0].pluginList).length===0),t?qn:Dn)}let _=f(n,[-1,-1]),g=_(n),p=ee(n[3]),v=[];for(let h=0;h',i=P(),m(r,"class","rounded-sm bg-rose-500 shadow-lg hover:opacity-75")},m(d,f){w(d,e,f),y(e,l),y(e,o),y(e,r),y(e,i),a||(u=M(r,"click",c),a=!0)},p(d,f){n=d,f[0]&9&&t!==(t=(n[0].pluginList[n[33].id].name??n[33].id)+"")&&re(l,t)},d(d){d&&k(e),a=!1,u()}}}function yt(n){let e,t;function l(i,a){return a[0]&9&&(e=null),e==null&&(e=!!Object.keys(i[0].pluginList).includes(i[33].id)),e?Jn:Fn}let o=l(n,[-1,-1]),r=o(n);return{c(){r.c(),t=pe()},m(i,a){r.m(i,a),w(i,t,a)},p(i,a){o===(o=l(i,a))&&r?r.p(i,a):(r.d(1),r=o(i),r&&(r.c(),r.m(t.parentNode,t)))},d(i){i&&k(t),r.d(i)}}}function vt(n){let e,t=n[30].uid===n[2]&&wt(n);return{c(){t&&t.c(),e=pe()},m(l,o){t&&t.m(l,o),w(l,e,o)},p(l,o){l[30].uid===l[2]?t?t.p(l,o):(t=wt(l),t.c(),t.m(e.parentNode,e)):t&&(t.d(1),t=null)},d(l){l&&k(e),t&&t.d(l)}}}function Wn(n){let e;return{c(){e=b("p"),e.textContent="loading..."},m(t,l){w(t,e,l)},p:U,d(t){t&&k(e)}}}function Vn(n){let e;return{c(){e=b("p"),e.textContent=`You have no plugins installed. Click the + button and select a plugin's bolt.json file + to add it.`},m(t,l){w(t,e,l)},p:U,d(t){t&&k(e)}}}function zn(n){let e=Object.keys(n[0].pluginList).includes(n[1])&&n[8]!==null,t,l=e&&$t(n);return{c(){l&&l.c(),t=pe()},m(o,r){l&&l.m(o,r),w(o,t,r)},p(o,r){r[0]&259&&(e=Object.keys(o[0].pluginList).includes(o[1])&&o[8]!==null),e?l?l.p(o,r):(l=$t(o),l.c(),l.m(t.parentNode,t)):l&&(l.d(1),l=null)},d(o){o&&k(t),l&&l.d(o)}}}function $t(n){let e,t,l,o,r,i,a,u={ctx:n,current:null,token:null,hasCatch:!0,pending:Kn,then:Yn,catch:Zn,value:29};return Xe(e=n[8],u),{c(){u.block.c(),t=P(),l=b("button"),l.textContent="Remove",o=P(),r=b("button"),r.textContent="Reload",m(l,"class","mx-auto mb-1 w-[min(144px,_25%)] rounded-lg p-2 font-bold text-black duration-200 enabled:bg-rose-500 enabled:hover:opacity-75 disabled:bg-gray-500"),m(r,"class","mx-auto mb-1 w-[min(144px,_25%)] rounded-lg p-2 font-bold text-black duration-200 enabled:bg-blue-500 enabled:hover:opacity-75 disabled:bg-gray-500")},m(c,d){u.block.m(c,u.anchor=d),u.mount=()=>t.parentNode,u.anchor=t,w(c,t,d),w(c,l,d),w(c,o,d),w(c,r,d),i||(a=[M(l,"click",n[19]),M(r,"click",n[20])],i=!0)},p(c,d){n=c,u.ctx=n,d[0]&256&&e!==(e=n[8])&&Xe(e,u)||qt(u,n,d)},d(c){c&&(k(t),k(l),k(o),k(r)),u.block.d(c),u.token=null,u=null,i=!1,oe(a)}}}function Zn(n){let e,t,l;return{c(){e=b("p"),e.textContent="error",t=P(),l=b("br")},m(o,r){w(o,e,r),w(o,t,r),w(o,l,r)},p:U,d(o){o&&(k(e),k(t),k(l))}}}function Yn(n){let e,t=(n[29].name??Ne)+"",l,o,r,i=(n[29].description??"no description")+"",a,u,c,d;return{c(){e=b("p"),l=G(t),o=P(),r=b("p"),a=G(i),c=P(),d=b("br"),m(e,"class","pb-4 text-xl font-bold"),m(r,"class",u=n[29].description?null:"italic")},m(f,_){w(f,e,_),y(e,l),w(f,o,_),w(f,r,_),y(r,a),w(f,c,_),w(f,d,_)},p(f,_){_[0]&256&&t!==(t=(f[29].name??Ne)+"")&&re(l,t),_[0]&256&&i!==(i=(f[29].description??"no description")+"")&&re(a,i),_[0]&256&&u!==(u=f[29].description?null:"italic")&&m(r,"class",u)},d(f){f&&(k(e),k(o),k(r),k(c),k(d))}}}function Kn(n){let e;return{c(){e=b("p"),e.textContent="loading..."},m(t,l){w(t,e,l)},p:U,d(t){t&&k(e)}}}function Qn(n){let e,t,l,o,r,i,a,u,c,d,f;function _(S,E){return S[3].length==0?On:xn}let g=_(n),p=g(n);function v(S,E){return S[0].hasBoltPlugins?Un:En}let h=v(n),$=h(n);return{c(){e=b("div"),t=b("button"),l=G("Manage Plugins"),r=P(),i=b("hr"),a=P(),p.c(),u=P(),c=b("div"),$.c(),m(t,"class",o="mx-auto mb-2 w-[95%] rounded-lg border-2 "+(n[6]?"border-blue-500 text-black dark:text-white":"border-black bg-blue-500 text-black")+" p-2 font-bold hover:opacity-75"),m(i,"class","p-1 dark:border-slate-700"),m(e,"class","left-0 float-left h-full w-[min(180px,_50%)] overflow-hidden border-r-2 border-slate-300 pt-2 dark:border-slate-800"),m(c,"class","h-full pt-10")},m(S,E){w(S,e,E),y(e,t),y(t,l),y(e,r),y(e,i),y(e,a),p.m(e,null),w(S,u,E),w(S,c,E),$.m(c,null),d||(f=M(t,"click",n[16]),d=!0)},p(S,E){E[0]&64&&o!==(o="mx-auto mb-2 w-[95%] rounded-lg border-2 "+(S[6]?"border-blue-500 text-black dark:text-white":"border-black bg-blue-500 text-black")+" p-2 font-bold hover:opacity-75")&&m(t,"class",o),g===(g=_(S))&&p?p.p(S,E):(p.d(1),p=g(S),p&&(p.c(),p.m(e,null))),h===(h=v(S))&&$?$.p(S,E):($.d(1),$=h(S),$&&($.c(),$.m(c,null)))},d(S){S&&(k(e),k(u),k(c)),p.d(),$.d(),d=!1,f()}}}function es(n){let e,t,l={class:"h-[90%] w-[90%] text-center",$$slots:{default:[Qn]},$$scope:{ctx:n}};return e=new it({props:l}),n[23](e),e.$on("close",n[24]),{c(){Q(e.$$.fragment)},m(o,r){Z(e,o,r),t=!0},p(o,r){const i={};r[0]&1007|r[1]&1024&&(i.$$scope={dirty:r,ctx:o}),e.$set(i)},i(o){t||(D(e.$$.fragment,o),t=!0)},o(o){B(e.$$.fragment,o),t=!1},d(o){n[23](null),Y(e,o)}}}const nt="bolt.json",ts="main.lua",Ne="(unnamed)",St="(new character)";function ns(n,e,t){let l,o,r,i;de(n,Bt,N=>t(3,i=N));let a;const u=C.platform==="windows"?"\\":"/",c=u.concat(nt);function d(){a.open()}const f=N=>new Promise((fe,V)=>{const we=N.concat(N.endsWith(u)?nt:c);var ae=new XMLHttpRequest;ae.onreadystatechange=()=>{ae.readyState==4&&(ae.status==200?fe(JSON.parse(ae.responseText)):V(ae.responseText))},ae.open("GET","/read-json-file?".concat(new URLSearchParams({path:we}).toString()),!0),ae.send()}),_=N=>{const V=C.pluginList[N];if(!V)return null;const we=V.path;return we?f(we):null},g=(N,fe)=>{f(N).then(V=>{do t(1,S=crypto.randomUUID());while(Object.keys(C.pluginList).includes(S));t(0,C.pluginList[S]={name:V.name??Ne,path:N},C),t(7,x=!0)}).catch(V=>{console.error(`Config file '${fe}' couldn't be fetched, reason: ${V}`)})};let p=!1;const v=()=>{t(5,p=!0);var N=new XMLHttpRequest;N.onreadystatechange=()=>{if(N.readyState==4&&(t(5,p=!1),N.status==200))if(N.responseText.endsWith(c)){const fe=N.responseText.substring(0,N.responseText.length-nt.length);g(fe,N.responseText)}else console.log(`Selection '${N.responseText}' is not named bolt.json; ignored`)},N.open("GET","/json-file-picker",!0),N.send()};tt();const h=(N,fe,V,we)=>{const ae=C.platform==="windows"?V.replaceAll("\\","/"):V,Ft=ae.endsWith(u)?ae:ae.concat("/");var He=new XMLHttpRequest;He.onreadystatechange=()=>{He.readyState==4&&(tt(),I.info(`Start-plugin status: ${He.statusText.trim()}`))},He.open("GET","/start-plugin?".concat(new URLSearchParams({client:N.toString(),id:fe,path:Ft,main:we}).toString()),!0),He.send()},$=(N,fe)=>{var V=new XMLHttpRequest;V.onreadystatechange=()=>{V.readyState==4&&(tt(),I.info(`Stop-plugin status: ${V.statusText.trim()}`))},V.open("GET","/stop-plugin?".concat(new URLSearchParams({client:N.toString(),uid:fe.toString()}).toString()),!0),V.send()};var S,E=!1,H;let x=!1;const j=()=>t(6,E=!1),R=N=>{t(2,H=N.uid),t(6,E=!0)};function L(){S=ot(this),t(1,S),t(0,C)}const T=()=>{t(8,r=null),t(7,x=!0);let N=C.pluginList;delete N[S],t(0,C.pluginList=N,C)},A=()=>t(8,r=_(S)),O=N=>h(H,S,o,N.main??ts),K=N=>{$(H,N.uid)};function J(N){ge[N?"unshift":"push"](()=>{a=N,t(4,a)})}const Ae=()=>{x&&Hn()};return n.$$.update=()=>{n.$$.dirty[0]&12&&(i.some(N=>N.uid===H)||t(6,E=!1)),n.$$.dirty[0]&3&&t(15,l=C.pluginList[S]),n.$$.dirty[0]&32768&&t(9,o=l?l.path:null),n.$$.dirty[0]&2&&t(8,r=_(S))},[C,S,H,i,a,p,E,x,r,o,_,v,h,$,d,l,j,R,L,T,A,O,K,J,Ae]}class ss extends le{constructor(e){super(),se(this,e,ns,es,te,{open:14},null,[-1,-1])}get open(){return this.$$.ctx[14]}}function Lt(n,e,t){const l=n.slice();return l[12]=e[t],l}function Ct(n,e,t){const l=n.slice();return l[15]=e[t],l}function ls(n){let e,t,l={};return e=new ss({props:l}),n[8](e),{c(){Q(e.$$.fragment)},m(o,r){Z(e,o,r),t=!0},p(o,r){const i={};e.$set(i)},i(o){t||(D(e.$$.fragment,o),t=!0)},o(o){B(e.$$.fragment,o),t=!1},d(o){n[8](null),Y(e,o)}}}function os(n){let e,t,l;return{c(){e=b("button"),e.textContent="Plugin menu",e.disabled=!C.hasBoltPlugins,m(e,"title",C.hasBoltPlugins?null:"Coming soon..."),m(e,"class","w-52 rounded-lg p-2 font-bold text-black duration-200 enabled:bg-blue-500 enabled:hover:opacity-75 disabled:bg-gray-500")},m(o,r){w(o,e,r),t||(l=M(e,"click",n[11]),t=!0)},p:U,d(o){o&&k(e),t=!1,l()}}}function rs(n){let e,t,l,o,r,i,a=ee(at[n[0].selected.game]),u=[];for(let c=0;cn[10].call(o)),m(e,"class","flex flex-col")},m(c,d){w(c,e,d),y(e,t),y(e,l),y(e,o);for(let f=0;ft(0,i=v));function c(v,h){if(!l)return I.warn("Please log in or select a user to play.");if(!o)return I.warn("Please select a character from the select menu.");const $=X.findSession(i.selected.user_id);if(!$)return I.warn("Unable to launch game, session was not found.");const{session_id:S}=$,E=X.findAccount($.accounts,o);if(!E)return I.warn("Unable to launch game, account was not found.");const{accountId:H,displayName:x}=E,j=C.platform===Ee.Windows,R=C.platform===Ee.Linux;switch(v){case z.osrs:switch(h){case he.official:pt(j,!0,S,H,x);break;case he.runelite:Xt(S,H,x,!1);break;case he.hdos:In(S,H,x);break}break;case z.rs3:R?Pn(S,H,x):pt(j,!1,S,H,x);break}}function d(v){const h=v.target.value;if(!l)return;const $=i.userDetails[l];$?($.account_id=h,Te(u,i.userDetails[l]=$,i)):Te(u,i.userDetails[l]={account_id:h},i)}function f(v){ge[v?"unshift":"push"](()=>{a=v,t(1,a)})}const _=()=>c(i.selected.game,i.selected.client);function g(){i.selected.client=ot(this),u.set(i)}const p=()=>{a.open()};return n.$$.update=()=>{var v,h;n.$$.dirty&1&&t(7,l=i.selected.user_id),n.$$.dirty&129&&t(2,o=(v=i.userDetails[l??""])==null?void 0:v.account_id),n.$$.dirty&1&&t(3,r=((h=X.findSession(i.selected.user_id))==null?void 0:h.accounts)??[])},[i,a,o,r,u,c,d,l,f,_,g,p]}class ds extends le{constructor(e){super(),se(this,e,us,cs,te,{})}}function It(n,e,t){const l=n.slice();return l[1]=e[t].date,l[2]=e[t].severity,l[3]=e[t].content,l}function Ht(n){var u;let e,t=((u=n[1])==null?void 0:u.toLocaleTimeString())+"",l,o,r=n[3]+"",i,a;return{c(){e=b("li"),l=G(t),o=G(` + - `),i=G(r),a=P(),W(e,"text-rose-500",n[2]===Oe.error),W(e,"text-orange-700",n[2]===Oe.warn)},m(c,d){w(c,e,d),y(e,l),y(e,o),y(e,i),y(e,a)},p(c,d){var f;d&1&&t!==(t=((f=c[1])==null?void 0:f.toLocaleTimeString())+"")&&re(l,t),d&1&&r!==(r=c[3]+"")&&re(i,r),d&1&&W(e,"text-rose-500",c[2]===Oe.error),d&1&&W(e,"text-orange-700",c[2]===Oe.warn)},d(c){c&&k(e)}}}function fs(n){let e,t,l,o,r=ee(n[0]),i=[];for(let a=0;a',l=P(),o=b("ol");for(let a=0;a{"logs"in o&&t(0,l=o.logs)},[l]}class _s extends le{constructor(e){super(),se(this,e,ps,fs,te,{logs:0})}}function xt(n,e,t){const l=n.slice();return l[7]=e[t],l}function Ot(n,e){let t,l=e[7].user.displayName+"",o,r;return{key:n,first:null,c(){t=b("option"),o=G(l),t.__value=r=e[7].user.userId,ne(t,t.__value),m(t,"class","dark:bg-slate-900"),this.first=t},m(i,a){w(i,t,a),y(t,o)},p(i,a){e=i,a&2&&l!==(l=e[7].user.displayName+"")&&re(o,l),a&2&&r!==(r=e[7].user.userId)&&(t.__value=r,ne(t,t.__value))},d(i){i&&k(t)}}}function gs(n){let e,t,l=[],o=new Map,r,i,a,u,c,d,f,_,g,p=ee(n[1]);const v=h=>h[7].user.userId;for(let h=0;hn[4].call(e)),m(a,"class","mx-auto mr-2 rounded-lg bg-blue-500 p-2 font-bold text-black duration-200 hover:opacity-75"),m(c,"class","mx-auto rounded-lg border-2 border-blue-500 p-2 font-bold duration-200 hover:opacity-75"),c.disabled=f=!n[0].selected.user_id,m(i,"class","mt-5 flex")},m(h,$){w(h,e,$),y(e,t);for(let S=0;St(1,o=d)),de(n,i,d=>t(0,l=d));function a(){l.selected.user_id=ot(this),i.set(l)}return[l,o,r,i,a,()=>{const{origin:d,redirect:f,clientid:_}=C.env;ie.openLoginWindow(d,f,_)},async()=>{l.selected.user_id&&(await X.logout(l.selected.user_id),X.saveCredentials())}]}class ms extends le{constructor(e){super(),se(this,e,hs,gs,te,{})}}function bs(n,{callback:e,ignore:t=[]}){const l=o=>{const r=t.some(i=>i.contains(o.target));n&&!n.contains(o.target)&&!o.defaultPrevented&&!r&&e()};return document.addEventListener("click",l,!0),document.addEventListener("contextmenu",l,!0),{destroy(){document.removeEventListener("click",l,!0),document.removeEventListener("contextmenu",l,!0)}}}const ks=n=>({}),Et=n=>({});function Ut(n){let e,t,l,o,r,i;const a=n[9].content,u=We(a,n,n[8],Et);return{c(){e=b("div"),u&&u.c(),m(e,"class",t="dropdown-color absolute z-20 rounded-lg border-2 "+n[1]+" "+n[2]+" svelte-xifudk")},m(c,d){w(c,e,d),u&&u.m(e,null),o=!0,r||(i=Kt(l=bs.call(null,e,{callback:n[3],ignore:[n[5]]})),r=!0)},p(c,d){u&&u.p&&(!o||d&256)&&ze(u,a,c,c[8],o?Ve(a,c[8],d,ks):Ze(c[8]),Et),(!o||d&6&&t!==(t="dropdown-color absolute z-20 rounded-lg border-2 "+c[1]+" "+c[2]+" svelte-xifudk"))&&m(e,"class",t),l&&Je(l.update)&&d&32&&l.update.call(null,{callback:c[3],ignore:[c[5]]})},i(c){o||(D(u,c),o=!0)},o(c){B(u,c),o=!1},d(c){c&&k(e),u&&u.d(c),r=!1,i()}}}function ws(n){let e,t,l,o,r,i,a;const u=n[9].default,c=We(u,n,n[8],null);let d=n[4]&&Ut(n);return{c(){e=b("div"),t=b("button"),c&&c.c(),l=P(),d&&d.c(),m(e,"class",o="relative h-fit w-fit "+n[0]+" svelte-xifudk")},m(f,_){w(f,e,_),y(e,t),c&&c.m(t,null),n[10](t),y(e,l),d&&d.m(e,null),r=!0,i||(a=M(t,"click",n[6]),i=!0)},p(f,[_]){c&&c.p&&(!r||_&256)&&ze(c,u,f,f[8],r?Ve(u,f[8],_,null):Ze(f[8]),null),f[4]?d?(d.p(f,_),_&16&&D(d,1)):(d=Ut(f),d.c(),D(d,1),d.m(e,null)):d&&(Me(),B(d,1,1,()=>{d=null}),je()),(!r||_&1&&o!==(o="relative h-fit w-fit "+f[0]+" svelte-xifudk"))&&m(e,"class",o)},i(f){r||(D(c,f),D(d),r=!0)},o(f){B(c,f),B(d),r=!1},d(f){f&&k(e),c&&c.d(f),n[10](null),d&&d.d(),i=!1,a()}}}function ys(n,e,t){let{$$slots:l={},$$scope:o}=e,{class:r=""}=e,{position:i="bottom"}=e,{align:a="start"}=e,u=!1,c;function d(){t(4,u=!0)}function f(){t(4,u=!1)}function _(){u?f():d()}function g(p){ge[p?"unshift":"push"](()=>{c=p,t(5,c)})}return n.$$set=p=>{"class"in p&&t(0,r=p.class),"position"in p&&t(1,i=p.position),"align"in p&&t(2,a=p.align),"$$scope"in p&&t(8,o=p.$$scope)},[r,i,a,f,u,c,_,d,o,l,g]}class vs extends le{constructor(e){super(),se(this,e,ys,ws,te,{class:0,position:1,align:2,open:7,close:3})}get open(){return this.$$.ctx[7]}get close(){return this.$$.ctx[3]}}function $s(n){let e,t,l;return{c(){e=b("button"),e.innerHTML=`
Browse app data + Browse App Data
`,m(e,"id","data_dir_button"),m(e,"class","p-2 hover:opacity-75")},m(o,r){w(o,e,r),t||(l=M(e,"click",n[1]),t=!0)},p:U,i:U,o:U,d(o){o&&k(e),t=!1,l()}}}function Ss(n){function e(){var l=new XMLHttpRequest;l.open("GET","/browse-data"),l.onreadystatechange=()=>{l.readyState==4&&I.info(`Browse status: '${l.responseText.trim()}'`)},l.send()}return[e,()=>{e()}]}class Ls extends le{constructor(e){super(),se(this,e,Ss,$s,te,{})}}function Cs(n){let e,t,l,o,r,i,a,u,c,d,f,_,g,p,v,h,$,S,E;return{c(){var H,x;e=b("button"),t=b("div"),t.innerHTML=`Configure RuneLite + Configure RuneLite`,o=P(),r=b("div"),i=b("label"),i.textContent="Use custom RuneLite JAR:",a=P(),u=b("input"),c=P(),d=b("div"),f=b("textarea"),g=P(),p=b("br"),v=P(),h=b("button"),$=G("Select File"),m(t,"class","flex"),e.disabled=l=!((H=n[0])!=null&&H.session_id)||!((x=n[3])!=null&&x.accountId),m(e,"class","p-2 pb-5 hover:opacity-75"),m(i,"for","use_custom_jar"),m(u,"type","checkbox"),m(u,"class","ml-2"),m(r,"class","mx-auto border-t-2 border-slate-300 p-2 pt-5 dark:border-slate-800"),m(f,"class","h-10 rounded border-2 border-slate-300 bg-slate-100 text-slate-950 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-50"),f.disabled=_=!n[1].runelite_use_custom_jar,m(h,"class","mt-1 rounded-lg border-2 border-blue-500 p-1 duration-200 hover:opacity-75"),h.disabled=n[2],m(d,"class","mx-auto p-2"),W(d,"opacity-25",!n[1].runelite_use_custom_jar)},m(H,x){w(H,e,x),y(e,t),w(H,o,x),w(H,r,x),y(r,i),y(r,a),y(r,u),u.checked=n[1].runelite_use_custom_jar,w(H,c,x),w(H,d,x),y(d,f),ne(f,n[1].runelite_custom_jar),y(d,g),y(d,p),y(d,v),y(d,h),y(h,$),S||(E=[M(e,"click",n[7]),M(u,"change",n[8]),M(f,"input",n[9]),M(h,"click",n[10])],S=!0)},p(H,[x]){var j,R;x&9&&l!==(l=!((j=H[0])!=null&&j.session_id)||!((R=H[3])!=null&&R.accountId))&&(e.disabled=l),x&2&&(u.checked=H[1].runelite_use_custom_jar),x&2&&_!==(_=!H[1].runelite_use_custom_jar)&&(f.disabled=_),x&2&&ne(f,H[1].runelite_custom_jar),x&4&&(h.disabled=H[2]),x&2&&W(d,"opacity-25",!H[1].runelite_use_custom_jar)},i:U,o:U,d(H){H&&(k(e),k(o),k(r),k(c),k(d)),S=!1,oe(E)}}}function Rs(n,e,t){let l,o,r;const{config:i}=q;de(n,i,p=>t(1,r=p));let a=!1;async function u(){t(2,a=!0),Te(i,r.runelite_custom_jar=await X.openFilePicker(),r),console.log("done picking"),t(2,a=!1)}function c(){!(l!=null&&l.session_id)||!(o!=null&&o.accountId)||!(o!=null&&o.displayName)||Xt(l.session_id,o.accountId,o.displayName,!0)}const d=()=>c();function f(){r.runelite_use_custom_jar=this.checked,i.set(r)}function _(){r.runelite_custom_jar=this.value,i.set(r)}const g=()=>{u()};return n.$$.update=()=>{var p;n.$$.dirty&2&&t(0,l=X.findSession(r.selected.user_id)),n.$$.dirty&3&&t(3,o=X.findAccount((l==null?void 0:l.accounts)??[],(p=r.userDetails[r.selected.user_id??""])==null?void 0:p.account_id))},[l,r,a,o,i,u,c,d,f,_,g]}class Ts extends le{constructor(e){super(),se(this,e,Rs,Cs,te,{})}}function Ps(n){let e,t,l,o,r,i;return{c(){e=b("div"),t=b("label"),t.textContent="Enable Bolt plugin loader:",l=P(),o=b("input"),m(t,"for","enable_plugins"),m(o,"type","checkbox"),m(o,"name","enable_plugins"),m(o,"id","enable_plugins"),m(o,"class","ml-2"),m(e,"class","mx-auto p-2")},m(a,u){w(a,e,u),y(e,t),y(e,l),y(e,o),o.checked=n[0].rs_plugin_loader,r||(i=M(o,"change",n[2]),r=!0)},p(a,u){u&1&&(o.checked=a[0].rs_plugin_loader)},d(a){a&&k(e),r=!1,i()}}}function Is(n){let e,t,l,o,r,i,a,u,c,d,f,_=C.hasBoltPlugins&&Ps(n);return{c(){_&&_.c(),e=P(),t=b("div"),l=b("label"),l.textContent="Use custom config URI:",o=P(),r=b("input"),i=P(),a=b("div"),u=b("textarea"),m(l,"for","use_custom_uri"),m(r,"type","checkbox"),m(r,"class","ml-2"),m(t,"class","mx-auto p-2"),m(u,"class","rounded border-2 border-slate-300 bg-slate-100 text-slate-950 disabled:opacity-50 dark:border-slate-800 dark:bg-slate-900 dark:text-slate-50"),u.disabled=c=!n[0].use_custom_rs_config_uri,m(u,"rows","4"),m(u,"placeholder",C.env.default_config_uri),m(a,"class","p-2")},m(g,p){_&&_.m(g,p),w(g,e,p),w(g,t,p),y(t,l),y(t,o),y(t,r),r.checked=n[0].use_custom_rs_config_uri,w(g,i,p),w(g,a,p),y(a,u),ne(u,n[0].rs_config_uri),d||(f=[M(r,"change",n[3]),M(u,"input",n[4])],d=!0)},p(g,[p]){C.hasBoltPlugins&&_.p(g,p),p&1&&(r.checked=g[0].use_custom_rs_config_uri),p&1&&c!==(c=!g[0].use_custom_rs_config_uri)&&(u.disabled=c),p&1&&ne(u,g[0].rs_config_uri)},i:U,o:U,d(g){g&&(k(e),k(t),k(i),k(a)),_&&_.d(g),d=!1,oe(f)}}}function Hs(n,e,t){let l;const{config:o}=q;de(n,o,u=>t(0,l=u));function r(){l.rs_plugin_loader=this.checked,o.set(l)}function i(){l.use_custom_rs_config_uri=this.checked,o.set(l)}function a(){l.rs_config_uri=this.value,o.set(l)}return[l,o,r,i,a]}class xs extends le{constructor(e){super(),se(this,e,Hs,Is,te,{})}}function Os(n){let e,t;return e=new xs({}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},i(l){t||(D(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function Es(n){let e,t;return e=new Ts({}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},i(l){t||(D(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function Us(n){let e,t;return e=new Ls({}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},i(l){t||(D(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function Ns(n){let e,t,l,o,r,i,a,u,c,d,f,_,g,p,v,h,$,S,E,H;const x=[Us,Es,Os],j=[];function R(L,T){return L[1]==L[2].general?0:L[1]==L[2].osrs?1:L[1]==L[2].rs3?2:-1}return~(h=R(n))&&($=j[h]=x[h](n)),{c(){e=b("div"),t=b("div"),l=b("button"),o=G("General"),i=P(),a=b("button"),u=G("OSRS"),d=P(),f=b("button"),_=G("RS3"),p=P(),v=b("div"),$&&$.c(),m(l,"class",r=n[1]===n[2].general?$e:Se),m(a,"class",c=n[1]===n[2].osrs?$e:Se),m(f,"class",g=n[1]===n[2].rs3?$e:Se),m(t,"class","flex flex-col items-center gap-2 border-r-2 border-slate-300 pt-10 dark:border-slate-800"),m(v,"class","col-span-3 p-5 pt-10 text-center"),m(e,"class","grid h-full grid-cols-4")},m(L,T){w(L,e,T),y(e,t),y(t,l),y(l,o),y(t,i),y(t,a),y(a,u),y(t,d),y(t,f),y(f,_),y(e,p),y(e,v),~h&&j[h].m(v,null),S=!0,E||(H=[M(l,"click",n[4]),M(a,"click",n[5]),M(f,"click",n[6])],E=!0)},p(L,T){(!S||T&2&&r!==(r=L[1]===L[2].general?$e:Se))&&m(l,"class",r),(!S||T&2&&c!==(c=L[1]===L[2].osrs?$e:Se))&&m(a,"class",c),(!S||T&2&&g!==(g=L[1]===L[2].rs3?$e:Se))&&m(f,"class",g);let A=h;h=R(L),h!==A&&($&&(Me(),B(j[A],1,1,()=>{j[A]=null}),je()),~h?($=j[h],$||($=j[h]=x[h](L),$.c()),D($,1),$.m(v,null)):$=null)},i(L){S||(D($),S=!0)},o(L){B($),S=!1},d(L){L&&k(e),~h&&j[h].d(),E=!1,oe(H)}}}function Ms(n){let e,t,l={class:"h-3/4 w-3/4",$$slots:{default:[Ns]},$$scope:{ctx:n}};return e=new it({props:l}),n[7](e),{c(){Q(e.$$.fragment)},m(o,r){Z(e,o,r),t=!0},p(o,[r]){const i={};r&258&&(i.$$scope={dirty:r,ctx:o}),e.$set(i)},i(o){t||(D(e.$$.fragment,o),t=!0)},o(o){B(e.$$.fragment,o),t=!1},d(o){n[7](null),Y(e,o)}}}let $e="border-2 border-blue-500 bg-blue-500 hover:opacity-75 font-bold text-black duration-200 rounded-lg p-1 w-3/4",Se="border-2 border-blue-500 hover:opacity-75 duration-200 rounded-lg p-1 w-3/4";function js(n,e,t){let l;function o(){l.open()}var r=(f=>(f[f.general=0]="general",f[f.osrs=1]="osrs",f[f.rs3=2]="rs3",f))(r||{});let i=1;const a=()=>{t(1,i=r.general)},u=()=>{t(1,i=r.osrs)},c=()=>{t(1,i=r.rs3)};function d(f){ge[f?"unshift":"push"](()=>{l=f,t(0,l)})}return[l,i,r,o,a,u,c,d]}class As extends le{constructor(e){super(),se(this,e,js,Ms,te,{open:3})}get open(){return this.$$.ctx[3]}}function Ds(n){const e=n.slice(),t=X.findSession(e[1].selected.user_id??"");return e[11]=t,e}function qs(n){let e,t,l;return{c(){e=b("button"),e.textContent="Login",m(e,"class","h-11 w-48 rounded-lg border-2 border-slate-300 bg-inherit p-2 text-center font-bold text-black duration-200 hover:opacity-75 dark:border-slate-800 dark:text-slate-50")},m(o,r){w(o,e,r),t||(l=M(e,"click",n[10]),t=!0)},p:U,i:U,o:U,d(o){o&&k(e),t=!1,l()}}}function Bs(n){let e,t;return e=new vs({props:{align:"center",$$slots:{content:[Xs],default:[Gs]},$$scope:{ctx:n}}}),{c(){Q(e.$$.fragment)},m(l,o){Z(e,l,o),t=!0},p(l,o){const r={};o&4098&&(r.$$scope={dirty:o,ctx:l}),e.$set(r)},i(l){t||(D(e.$$.fragment,l),t=!0)},o(l){B(e.$$.fragment,l),t=!1},d(l){Y(e,l)}}}function Gs(n){var o;let e,t=(((o=n[11])==null?void 0:o.user.displayName)??"No user selected")+"",l;return{c(){e=b("button"),l=G(t),m(e,"class","h-11 w-48 rounded-lg border-2 border-slate-300 bg-inherit text-center font-bold text-black duration-200 hover:opacity-75 dark:border-slate-800 dark:text-slate-50")},m(r,i){w(r,e,i),y(e,l)},p(r,i){var a;i&2&&t!==(t=(((a=r[11])==null?void 0:a.user.displayName)??"No user selected")+"")&&re(l,t)},d(r){r&&k(e)}}}function Xs(n){let e,t,l;return t=new ms({}),{c(){e=b("div"),Q(t.$$.fragment),m(e,"slot","content"),m(e,"class","w-40")},m(o,r){w(o,e,r),Z(t,e,null),l=!0},p:U,i(o){l||(D(t.$$.fragment,o),l=!0)},o(o){B(t.$$.fragment,o),l=!1},d(o){o&&k(e),Y(t)}}}function Fs(n){let e,t,l,o,r,i,a,u,c,d,f,_,g,p,v,h,$,S,E={};e=new As({props:E}),n[5](e);const H=[Bs,qs],x=[];function j(L,T){return L[2].length>0?0:1}function R(L,T){return T===0?Ds(L):L}return p=j(n),v=x[p]=H[p](R(n,p)),{c(){Q(e.$$.fragment),t=P(),l=b("div"),o=b("div"),r=b("button"),r.textContent="RS3",i=P(),a=b("button"),a.textContent="OSRS",u=P(),c=b("div"),d=b("button"),d.innerHTML='Change Theme',f=P(),_=b("button"),_.innerHTML='Settings',g=P(),v.c(),m(r,"class","mx-1 w-20 rounded-lg border-2 border-blue-500 p-2 duration-200 hover:opacity-75"),W(r,"text-black",n[1].selected.game===z.rs3),W(r,"bg-blue-500",n[1].selected.game===z.rs3),m(a,"class","mx-1 w-20 rounded-lg border-2 border-blue-500 bg-blue-500 p-2 text-black duration-200 hover:opacity-75"),W(a,"text-black",n[1].selected.game===z.osrs),W(a,"bg-blue-500",n[1].selected.game===z.osrs),m(o,"class","m-3 ml-9 font-bold"),m(d,"class","h-10 w-10 rounded-full bg-blue-500 text-center duration-200 hover:rotate-45 hover:opacity-75"),m(_,"class","h-10 w-10 rounded-full bg-blue-500 text-center duration-200 hover:rotate-45 hover:opacity-75"),m(c,"class","m-2 ml-auto flex gap-2"),m(l,"class","fixed top-0 flex h-16 w-screen border-b-2 border-slate-300 bg-slate-100 duration-200 dark:border-slate-800 dark:bg-slate-900")},m(L,T){Z(e,L,T),w(L,t,T),w(L,l,T),y(l,o),y(o,r),y(o,i),y(o,a),y(l,u),y(l,c),y(c,d),y(c,f),y(c,_),y(c,g),x[p].m(c,null),h=!0,$||(S=[M(r,"click",n[6]),M(a,"click",n[7]),M(d,"click",n[8]),M(_,"click",n[9])],$=!0)},p(L,[T]){const A={};e.$set(A),(!h||T&2)&&W(r,"text-black",L[1].selected.game===z.rs3),(!h||T&2)&&W(r,"bg-blue-500",L[1].selected.game===z.rs3),(!h||T&2)&&W(a,"text-black",L[1].selected.game===z.osrs),(!h||T&2)&&W(a,"bg-blue-500",L[1].selected.game===z.osrs);let O=p;p=j(L),p===O?x[p].p(R(L,p),T):(Me(),B(x[O],1,1,()=>{x[O]=null}),je(),v=x[p],v?v.p(R(L,p),T):(v=x[p]=H[p](R(L,p)),v.c()),D(v,1),v.m(c,null))},i(L){h||(D(e.$$.fragment,L),D(v),h=!0)},o(L){B(e.$$.fragment,L),B(v),h=!1},d(L){L&&(k(t),k(l)),n[5](null),Y(e,L),x[p].d(),$=!1,oe(S)}}}function Js(n,e,t){let l,o;const{config:r,sessions:i}=q;de(n,r,p=>t(1,l=p)),de(n,i,p=>t(2,o=p));let a;function u(p){ge[p?"unshift":"push"](()=>{a=p,t(0,a)})}return[a,l,o,r,i,u,()=>{Te(r,l.selected.game=z.rs3,l)},()=>{Te(r,l.selected.game=z.osrs,l)},()=>Te(r,l.use_dark_theme=!l.use_dark_theme,l),()=>a.open(),()=>{const{origin:p,redirect:v,clientid:h}=C.env;ie.openLoginWindow(p,v,h)}]}class Ws extends le{constructor(e){super(),se(this,e,Js,Fs,te,{})}}function Vs(n){let e,t,l,o,r,i,a,u,c,d,f,_,g;return e=new Tn({}),l=new Ws({}),u=new ds({}),_=new _s({props:{logs:n[0]}}),{c(){Q(e.$$.fragment),t=P(),Q(l.$$.fragment),o=P(),r=b("div"),i=b("div"),a=P(),Q(u.$$.fragment),c=P(),d=b("div"),f=P(),Q(_.$$.fragment),m(r,"class","mt-16 grid h-full grid-flow-col grid-cols-3")},m(p,v){Z(e,p,v),w(p,t,v),Z(l,p,v),w(p,o,v),w(p,r,v),y(r,i),y(r,a),Z(u,r,null),y(r,c),y(r,d),w(p,f,v),Z(_,p,v),g=!0},p(p,v){const h={};v&1&&(h.logs=p[0]),_.$set(h)},i(p){g||(D(e.$$.fragment,p),D(l.$$.fragment,p),D(u.$$.fragment,p),D(_.$$.fragment,p),g=!0)},o(p){B(e.$$.fragment,p),B(l.$$.fragment,p),B(u.$$.fragment,p),B(_.$$.fragment,p),g=!1},d(p){p&&(k(t),k(o),k(r),k(f)),Y(e,p),Y(l,p),Y(u),Y(_,p)}}}function zs(n){let e,t,l,o;return e=new Gt({props:{$$slots:{default:[Vs]},$$scope:{ctx:n}}}),{c(){Q(e.$$.fragment)},m(r,i){Z(e,r,i),t=!0,l||(o=M(window,"beforeunload",n[2]),l=!0)},p(r,[i]){const a={};i&9&&(a.$$scope={dirty:i,ctx:r}),e.$set(a)},i(r){t||(D(e.$$.fragment,r),t=!0)},o(r){B(e.$$.fragment,r),t=!1},d(r){Y(e,r),l=!1,o()}}}function Zs(n,e,t){let l;const o=I.logs;return de(n,o,i=>t(0,l=i)),[l,o,()=>X.saveConfig()]}class Ys extends le{constructor(e){super(),se(this,e,Zs,zs,te,{})}}const Nt={target:document.getElementById("app")};window.opener||window.location.search.includes("&id_token")?new vn(Nt):(Ks(),hn(),Qs(),el(),new Ys(Nt));function Ks(){const n=new URLSearchParams(window.location.search);C.platform=n.get("platform"),C.isFlathub=n.get("flathub")==="1",C.rs3DebInstalledHash=n.get("rs3_deb_installed_hash"),C.rs3ExeInstalledHash=n.get("rs3_exe_installed_hash"),C.rs3AppInstalledHash=n.get("rs3_app_installed_hash"),C.osrsExeInstalledHash=n.get("osrs_exe_installed_hash"),C.osrsAppInstalledHash=n.get("osrs_app_installed_hash"),C.runeLiteInstalledId=n.get("runelite_installed_id"),C.hdosInstalledVersion=n.get("hdos_installed_version");const e=n.get("plugins");if(C.hasBoltPlugins=e!==null,e!==null)try{C.pluginList=JSON.parse(e)}catch{I.error("Unable to parse plugin list")}const t=n.get("credentials");if(t)try{const l=JSON.parse(t),o=l.every(r=>typeof r.session_id=="string"&&typeof r.tokens=="object"&&typeof r.accounts=="object"&&typeof r.user=="object");o?q.sessions.set(l):(q.sessions.set([]),X.saveCredentials(),I.warn("Credentials saved on disk are out of date. Please sign in again.")),q.sessions.set(o?l:[])}catch{q.sessions.set([]),X.saveCredentials(),I.error("Unable to parse saved credentials. Please sign in again.")}}function Qs(){const{origin:n,origin_2fa:e}=C.env,t=[window.location.origin,n,e];let l=null;window.addEventListener("message",async o=>{var r;if(!t.includes(o.origin)){I.info(`discarding window message from origin ${o.origin}`);return}switch(o.data.type){case"authTokenUpdate":{l=o.data.tokens;break}case"authSessionUpdate":{if(l===null)return I.error("auth is null. Please try again.");const i=o.data.sessionId,a=await X.login(l,i);a.ok?I.info(`Added new user '${a.value.user.displayName}'`):I.error(`Unable to add new user. Please try again. ${a.error}`),X.saveCredentials(),ie.pendingLoginWindow=null,l=null;break}case"authFailed":{I.error(`Unable to authenticate: ${o.data.reason}`),ie.pendingLoginWindow=null,l=null;break}case"externalUrl":{const i=new XMLHttpRequest;i.onreadystatechange=()=>{i.readyState==4&&I.info(`External URL status: '${i.responseText.trim()}'`)},i.open("POST","/open-external-url",!0),i.send(o.data.url);break}case"gameClientList":console.log(o.data.clients),Bt.set(o.data.clients);break;default:{const i=((r=o.data)==null?void 0:r.type)??"no type provided";I.info(`Unknown message type: ${i}`);break}}})}async function el(){const n=ue(q.sessions),e=[];for(const t of n){const l=await ie.refreshOAuthToken(t.tokens);if(!l.ok){l.error===0?I.error(`Unable to verify saved login, status: ${l.error}. Do you have an internet connection? Please relaunch Bolt to try again.`):(I.error(`Discarding expired login, status: ${l.error}. Please sign in again.`),e.push(t.tokens.sub));continue}const o=l.value;t.tokens=o;const r=await X.login(o,t.session_id);r.ok?I.info(`Signed into saved user '${r.value.user.displayName}'`):(I.error(`Unable to sign into saved user '${t.user.displayName}' - please sign in again. ${r.error}`),e.push(t.tokens.sub))}e.forEach(t=>{X.logout(t)}),q.sessions.set(n),X.saveCredentials()} diff --git a/app/dist/index.html b/app/dist/index.html index 0deaa17..56fe15a 100644 --- a/app/dist/index.html +++ b/app/dist/index.html @@ -4,7 +4,7 @@ Bolt Launcher - + diff --git a/app/src/lib/Components/PluginModal.svelte b/app/src/lib/Components/PluginModal.svelte index 931f37e..7101192 100644 --- a/app/src/lib/Components/PluginModal.svelte +++ b/app/src/lib/Components/PluginModal.svelte @@ -1,10 +1,10 @@ @@ -169,31 +177,25 @@ Manage Plugins
- {#await $clientListPromise} -

loading...

- {:then clients} - {#if clients.length == 0} -

(start an RS3 game client with plugins enabled and it will be listed here.)

- {:else} - {#each clients as client} - -
- {/each} - {/if} - {:catch} -

error

- {/await} + {#if $clientList.length == 0} +

(start an RS3 game client with plugins enabled and it will be listed here.)

+ {:else} + {#each $clientList as client} + +
+ {/each} + {/if}
{#if bolt.hasBoltPlugins} @@ -286,33 +288,27 @@


- {#await $clientListPromise} -

loading...

- {:then clients} - {#each clients as client} - {#if client.uid === selectedClientId} - {#each client.plugins as activePlugin} - {#if Object.keys(bolt.pluginList).includes(activePlugin.id)} -

- {bolt.pluginList[activePlugin.id].name ?? activePlugin.id} - -

- {:else} -

{activePlugin.id}

- {/if} - {/each} - {/if} - {/each} - {:catch} -

error

- {/await} + {#each $clientList as client} + {#if client.uid === selectedClientId} + {#each client.plugins as activePlugin} + {#if Object.keys(bolt.pluginList).includes(activePlugin.id)} +

+ {bolt.pluginList[activePlugin.id].name ?? activePlugin.id} + +

+ {:else} +

{activePlugin.id}

+ {/if} + {/each} + {/if} + {/each} {:catch}

error

{/await} diff --git a/app/src/lib/Util/functions.ts b/app/src/lib/Util/functions.ts index 2f88cf9..9e7f908 100644 --- a/app/src/lib/Util/functions.ts +++ b/app/src/lib/Util/functions.ts @@ -1,7 +1,7 @@ import { BoltService } from '$lib/Services/BoltService'; import { bolt } from '$lib/State/Bolt'; import { GlobalState } from '$lib/State/GlobalState'; -import { type Direct6Token, type GameClient } from '$lib/Util/interfaces'; +import { type Direct6Token } from '$lib/Util/interfaces'; import { logger } from '$lib/Util/Logger'; import { get } from 'svelte/store'; @@ -254,22 +254,17 @@ export function launchHdos( xml.send(); } -export function getNewClientListPromise(): Promise { - return new Promise((resolve, reject) => { - const xml = new XMLHttpRequest(); - xml.open('GET', '/list-game-clients', true); - xml.onreadystatechange = () => { - if (xml.readyState == 4) { - if (xml.status == 200 && xml.getResponseHeader('content-type') === 'application/json') { - const dict = JSON.parse(xml.responseText); - resolve(dict); - } else { - reject(`error (${xml.responseText})`); - } +export function requestNewClientListPromise(): void { + const xml = new XMLHttpRequest(); + xml.open('GET', '/list-game-clients', true); + xml.onreadystatechange = () => { + if (xml.readyState == 4) { + if (xml.status != 200) { + logger.error(`Error requesting client list: ${xml.status}: ${xml.responseText}`); } - }; - xml.send(); - }); + } + }; + xml.send(); } // TODO: move to BoltService diff --git a/app/src/lib/Util/interfaces.ts b/app/src/lib/Util/interfaces.ts index e191b4a..a369054 100644 --- a/app/src/lib/Util/interfaces.ts +++ b/app/src/lib/Util/interfaces.ts @@ -38,12 +38,12 @@ export interface Direct6Token { // "id" is the UUID string of the installed plugin, uid uniquely identifies this specific instance of it export interface GameClientPlugin { id: string; - uid: string; + uid: number; } // connected game client for plugin management purposes export interface GameClient { - uid: string; + uid: number; identity?: string; plugins: GameClientPlugin[]; } @@ -83,7 +83,8 @@ interface ExternalUrlMessage { } interface GameClientListMessage { - type: 'gameClientListUpdate'; + type: 'gameClientList'; + clients: GameClient[]; } export type BoltMessage = diff --git a/app/src/lib/Util/store.ts b/app/src/lib/Util/store.ts index bad86c9..a5afa4c 100644 --- a/app/src/lib/Util/store.ts +++ b/app/src/lib/Util/store.ts @@ -1,5 +1,5 @@ import type { GameClient } from '$lib/Util/interfaces'; import { writable, type Writable } from 'svelte/store'; -// TODO: remove clientListPromise -export const clientListPromise: Writable> = writable(); +// TODO: remove clientList +export const clientList: Writable = writable([]); diff --git a/app/src/main.ts b/app/src/main.ts index b021041..036fe2e 100644 --- a/app/src/main.ts +++ b/app/src/main.ts @@ -4,10 +4,9 @@ import { type Session } from '$lib/Services/UserService'; import { Platform, bolt } from '$lib/State/Bolt'; import { GlobalState } from '$lib/State/GlobalState'; import { initConfig } from '$lib/Util/Config'; -import { getNewClientListPromise } from '$lib/Util/functions'; import { type BoltMessage } from '$lib/Util/interfaces'; import { logger } from '$lib/Util/Logger'; -import { clientListPromise } from '$lib/Util/store'; +import { clientList } from '$lib/Util/store'; import AuthApp from '@/AuthApp.svelte'; import BoltApp from '@/BoltApp.svelte'; import { get } from 'svelte/store'; @@ -132,8 +131,9 @@ function addMessageListeners(): void { xml.send(event.data.url); break; } - case 'gameClientListUpdate': - clientListPromise.set(getNewClientListPromise()); + case 'gameClientList': + console.log(event.data.clients); + clientList.set(event.data.clients); break; default: { const type = (event.data as { type: string | undefined })?.type ?? 'no type provided';