auto-champion-select 1.8.7 → 1.8.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +59 -19
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -4,52 +4,52 @@
4
4
  * @name auto-champion-select
5
5
  * @link https://github.com/controlado/auto-champion-select#readme
6
6
  * @description Pick or ban automatically! 🐧
7
- * @version 1.8.7
7
+ * @version 1.8.9
8
8
  * @license GPL-3.0-or-later
9
9
  */
10
- import{request as f,sleep as g,linkEndpoint as $}from"https://cdn.jsdelivr.net/npm/balaclava-utils@latest";const wt="1.8.7",bt={enabled:!1},yt={enabled:!1,force:!1,champions:[432,235],positionsByChampionId:{235:["BOTTOM","UTILITY"],432:["UTILITY"]}},St={enabled:!1,force:!1,champions:[157,777,238,38]},Pt={controladoAutoAccept:bt,controladoPick:yt,controladoBan:St};function d(o){const t=Number(o);return Number.isSafeInteger(t)&&t>0?t:null}function nt(o,t=null){const e=[],n=new Set,i=Et(t);if(!Array.isArray(o))return e;for(const s of o){const r=d(s);r===null||n.has(r)||i&&!i.has(r)||(e.push(r),n.add(r))}return e}function Et(o){return o?new Set(Array.from(o,d).filter(t=>t!==null)):null}const E=[{value:"TOP",label:"Top",iconPath:"/fe/lol-parties/icon-position-top.png"},{value:"JUNGLE",label:"Jungle",iconPath:"/fe/lol-parties/icon-position-jungle.png"},{value:"MIDDLE",label:"Mid",iconPath:"/fe/lol-parties/icon-position-middle.png"},{value:"BOTTOM",label:"ADC",iconPath:"/fe/lol-parties/icon-position-bottom.png"},{value:"UTILITY",label:"Support",iconPath:"/fe/lol-parties/icon-position-utility.png"}],It=new Set(E.map(o=>o.value));function I(o){const t=String(o??"").toUpperCase();return It.has(t)?t:null}function M(o,t=null){const e={};if(!o||typeof o!="object"||Array.isArray(o))return e;const n=At(t);for(const[i,s]of Object.entries(o)){const r=d(i),a=String(r);if(r===null||n&&!n.has(a)||!Array.isArray(s))continue;const l=[],h=new Set;for(const A of s){const S=I(A);!S||h.has(S)||(l.push(S),h.add(S))}l.length>0&&(e[a]=l)}return e}function At(o){if(!o)return null;const t=new Set;for(const e of o){const n=d(e);n!==null&&t.add(String(n))}return t}function z(o){return E.find(t=>t.value===o)}function ot(o,t){var n;const e=d(t);return e===null?[]:((n=o==null?void 0:o.positionsByChampionId)==null?void 0:n[String(e)])||[]}function Ot(o,t,e){const n=ot(o,t);if(n.length===0)return!0;const i=I(e);return i!==null&&n.includes(i)}const U=new Set;function Tt(o,t){return Object.prototype.hasOwnProperty.call(o,t)}function O(o,t){return Tt(o,t)}function D(){if(!globalThis.DataStore)throw new Error("DataStore is not available");return globalThis.DataStore}function _t(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)}function x(o){if(o!==void 0)return JSON.parse(JSON.stringify(o))}function it(o){const t=Pt[o];if(!t)throw new Error(`Unknown auto-champion-select config key: ${o}`);return x(t)}function st(o,t,e={}){const n=it(o),i=_t(t)?x(t):{},s={...n,...i},r={enabled:s.enabled===!0};return O(n,"force")&&(r.force=s.force===!0),O(n,"champions")&&(r.champions=nt(s.champions,e.allowedChampionIds)),O(n,"positionsByChampionId")&&(r.positionsByChampionId=M(s.positionsByChampionId,e.selectedChampionIds||r.champions)),r}function rt(o,t,e={}){const n=t===void 0?it(o):t;return st(o,n,e)}function C(o,t={}){const n=D().get(o);return rt(o,n,t)}function kt(o,t,e={}){const n=D(),i=st(o,t,e);return n.set(o,i),i}function vt(o,t){return JSON.stringify(o)===JSON.stringify(t)}function Mt(o,t,e){U.has(o)||(U.add(o),console.warn(`auto-champion-select: Repaired ${o} in DataStore. The stored value used a different schema; plugins like reynbow/auto-champ-lock write this shape. Saved normalized config.`,{storedConfig:t,normalizedConfig:e}))}function at(o,t={}){const e=D(),n=e.get(o),i=rt(o,n,t);return(n===void 0||!vt(n,i))&&(n!==void 0&&Mt(o,n,i),e.set(o,i)),i}function N(o,t,e={}){const n=C(o,e),i=x(n),s=t(i)||i;return kt(o,s,e)}const u=Object.freeze({readyCheckAccept:"/lol-matchmaking/v1/ready-check/accept",gameflowPhase:"/lol-gameflow/v1/gameflow-phase",wallet:"/lol-inventory/v1/wallet",ownedChampions:"/lol-champions/v1/owned-champions-minimal",championSummary:"/lol-game-data/assets/v1/champion-summary.json",champSelectSession:"/lol-champ-select/v1/session",championIcon(o){return`/lol-game-data/assets/v1/champion-icons/${o}.png`},champSelectAction(o){return`/lol-champ-select/v1/session/actions/${o}`}}),Rt=1e3;function lt(o){let t=null;return function(){return t||(t=Promise.resolve().then(o).finally(()=>{t=null})),t}}function ct(o){const t=[],e=new Set;if(!Array.isArray(o))return t;for(const n of o){if(!n||typeof n!="object")continue;const i=d(n.id),s=typeof n.name=="string"?n.name:"";i===null||!s||e.has(s)||(t.push({...n,id:i,name:s,squarePortraitPath:n.squarePortraitPath||u.championIcon(i)}),e.add(s))}return t.sort((n,i)=>n.name.localeCompare(i.name)),t}async function Lt(){let o=await f("GET",u.ownedChampions);for(;!o.ok;)console.debug("auto-champion-select(owned-champions-minimal): Retrying..."),o=await f("GET",u.ownedChampions),await g(Rt);return ct(await o.json())}async function Bt(){const o=await f("GET",u.championSummary);return ct(await o.json())}const Dt=lt(Lt),xt=lt(Bt),G=300,m=Object.freeze({APPLIED:"applied",TRY_NEXT_CHAMPION:"try-next-champion",ABORT_ACTION:"abort-action"});function R(o){return Array.isArray(o)?o.flat():[]}function Nt(o){return R(o).filter(t=>t.type==="ban"&&t.completed===!0).map(t=>t.championId)}function q(o){return Array.isArray(o)?o:[]}function T(o){const t=new Set;for(const e of o){const n=d(e);n!==null&&t.add(n)}return t}function H(o){return o.type==="pick"?0:1}function Ft(){return{pickConfig:C("controladoPick"),banConfig:C("controladoBan")}}class $t{constructor(){this.session=null,this.actions=null,this.localPlayerCellId=null,this.teammateIntentChampionIds=new Set,this.localPlayerIntentChampionId=null,this.pickedChampionIds=new Set,this.bannedChampionIds=new Set,this.localPlayerAssignedPosition=null,this.watchTask=null,this.watchVersion=0,this.mounted=!1}mount(){this.mounted||(this.mounted=!0,this.watchVersion+=1,this.watchTask||(this.watchTask=this.watch()))}unmount(){this.mounted&&(this.mounted=!1,this.watchVersion+=1)}async watch(){try{for(;this.mounted;){const t=this.watchVersion;let e=!1;try{await this.refreshSessionState(),e=!0}catch(n){console.debug("auto-champion-select: Failed to update champion select",n)}if(!e||!this.mounted||t!==this.watchVersion){this.mounted&&t===this.watchVersion&&await g(G);continue}try{await this.runAutoSelectCycle()}catch(n){console.debug("auto-champion-select: Failed to run champion select cycle",n)}this.mounted&&t===this.watchVersion&&await g(G)}}finally{this.watchTask=null}}async refreshSessionState(){var s,r;const t=await f("GET",u.champSelectSession);if(!t.ok)throw new Error(`Session request failed with status ${t.status}`);this.session=await t.json(),this.actions=this.session.actions,this.localPlayerCellId=this.session.localPlayerCellId;const e=q(this.session.myTeam),n=q(this.session.theirTeam),i=e.find(a=>a.cellId===this.localPlayerCellId);this.localPlayerAssignedPosition=I(i==null?void 0:i.assignedPosition),this.localPlayerIntentChampionId=d(i==null?void 0:i.championPickIntent),this.pickedChampionIds=T([...e,...n].map(a=>a.championId)),this.bannedChampionIds=T([...((s=this.session.bans)==null?void 0:s.myTeamBans)||[],...((r=this.session.bans)==null?void 0:r.theirTeamBans)||[],...Nt(this.actions)]),this.teammateIntentChampionIds=T(e.map(a=>a.championPickIntent))}async runAutoSelectCycle(){const{pickConfig:t,banConfig:e}=Ft();if(!t.enabled&&!e.enabled)return;const n=this.getLocalPlayerActions();if(n.length===0){console.debug("auto-champion-select: No local player sub actions found, skipping..."),this.unmount();return}for(const i of n){if(!this.isActionAvailable(i))continue;const s=this.getConfigForActionType(i.type,{pickConfig:t,banConfig:e});if(s!=null&&s.enabled)for(const r of s.champions){const a=await this.attemptChampionForAction(i,r,s);if(a===m.APPLIED)break;if(a===m.ABORT_ACTION)return}}}getLocalPlayerActions(){return R(this.actions).filter(t=>this.isPendingLocalPlayerAction(t)).sort((t,e)=>H(t)-H(e))}isPendingLocalPlayerAction(t){return t.actorCellId===this.localPlayerCellId&&t.completed===!1}isActionAvailable(t){return t.type==="pick"||t.isInProgress===!0}getConfigForActionType(t,e){return t==="pick"?e.pickConfig:t==="ban"?e.banConfig:null}async attemptChampionForAction(t,e,n){const i=d(e);if(i===null||this.isChampionUnavailableForAction(t,i,n))return m.TRY_NEXT_CHAMPION;if(this.isPickIntentAlreadyApplied(t,i)||(console.debug(`auto-champion-select: Trying to ${t.type} ${i}...`),(await this.selectChampion(t.id,i)).ok))return m.APPLIED;console.debug(`auto-champion-select: Failed to ${t.type} ${i}, refreshing champ select state...`);const r=await this.refreshActionAfterFailedAttempt(t);return!r||!this.isActionAvailable(r)||!this.isChampionUnavailableForAction(r,i,n)?m.ABORT_ACTION:(console.debug(`auto-champion-select: ${i} is unavailable after refresh, trying next ${t.type}...`),m.TRY_NEXT_CHAMPION)}isPickIntentAlreadyApplied(t,e){return t.type==="pick"&&t.isInProgress!==!0&&(this.localPlayerIntentChampionId===e||d(t.championId)===e)}async refreshActionAfterFailedAttempt(t){try{await this.refreshSessionState()}catch(e){return console.debug("auto-champion-select: Failed to refresh champion select after select failure",e),null}return R(this.actions).find(e=>e.id===t.id&&e.actorCellId===t.actorCellId&&e.type===t.type&&e.completed===!1)||null}isChampionUnavailableForAction(t,e,n){if(t.type==="pick"&&!Ot(n,e,this.localPlayerAssignedPosition)){const i=ot(n,e);return this.localPlayerAssignedPosition?console.debug(`auto-champion-select: Picking ${e} but assigned position ${this.localPlayerAssignedPosition} is not in ${i.join(", ")}, skipping...`):console.debug(`auto-champion-select: Picking ${e} but no assigned position is available for ${i.join(", ")} restriction, skipping...`),!0}if(this.bannedChampionIds.has(e))return console.debug(`auto-champion-select: Banning ${e} but it's already banned, skipping...`),!0;if(t.type==="ban"&&this.teammateIntentChampionIds.has(e))if(n.force===!0)console.debug(`auto-champion-select: Banning ${e} but it's already picked, forcing...`);else return console.debug(`auto-champion-select: Banning ${e} but it's already picked, skipping...`),!0;if(t.type==="pick"&&this.pickedChampionIds.has(e))if(n.force===!0)console.debug(`auto-champion-select: Picking ${e} but it's already picked, forcing...`);else return console.debug(`auto-champion-select: Picking ${e} but it's already picked, skipping...`),!0;return!1}selectChampion(t,e){const n=u.champSelectAction(t);return f("PATCH",n,{body:{championId:e,completed:!0}})}}const p=Object.freeze({dropdown:"lol-uikit-framed-dropdown",dropdownOption:"lol-uikit-dropdown-option",radioInputOption:"lol-uikit-radio-input-option",scrollable:"lol-uikit-scrollable",socialRosterGroup:"lol-social-roster-group"}),c=Object.freeze({socialRoster:".lol-social-roster",champSelectButtons:".bottom-right-buttons",firstChampSelectSquareButton:"lol-social-chat-toggle-button, .missions-tracker-button-component, .champ-select-voice-button-wrapper",dropdownRoot:".ui-dropdown",dropdownCurrent:".ui-dropdown-current",dropdownCurrentContent:".ui-dropdown-current-content",dropdownOption:p.dropdownOption,dropdownOptionSelected:`${p.dropdownOption}[selected]`,dropdownOptionsContainer:".ui-dropdown-options-container",dropdownOptions:".ui-dropdown-options",dropdownScrollable:p.scrollable,socialRosterGroupArrow:".arrow",socialRosterGroupHeader:".group-header",socialRosterGroupLabel:"span"});function Y(){return document.querySelector(c.socialRoster)}function L(){return document.querySelector(c.champSelectButtons)}const zt=50,Ut=100,_=210,W="controlado-placeholder",j="controlado-search",dt="controlado-filter-icon",w="controlado-filter-icon--trash",ht="controlado-filter-input",ut="controlado-tag",pt="controlado-tag--search",Gt=`
11
- ${c.dropdownRoot} {
10
+ import{request as w,sleep as g,linkEndpoint as z}from"https://cdn.jsdelivr.net/npm/balaclava-utils@latest";const Pt="1.8.9",It={enabled:!1},kt={enabled:!1,force:!1,quickAction:!1,champions:[432,235],positionsByChampionId:{235:["BOTTOM","UTILITY"],432:["UTILITY"]}},Tt={enabled:!1,force:!1,quickAction:!1,champions:[157,777,238,38]},Ot={controladoAutoAccept:It,controladoPick:kt,controladoBan:Tt};function d(o){const t=Number(o);return Number.isSafeInteger(t)&&t>0?t:null}function at(o,t=null){const e=[],n=new Set,i=_t(t);if(!Array.isArray(o))return e;for(const s of o){const r=d(s);r===null||n.has(r)||i&&!i.has(r)||(e.push(r),n.add(r))}return e}function _t(o){return o?new Set(Array.from(o,d).filter(t=>t!==null)):null}const k=[{value:"TOP",label:"Top",iconPath:"/fe/lol-parties/icon-position-top.png"},{value:"JUNGLE",label:"Jungle",iconPath:"/fe/lol-parties/icon-position-jungle.png"},{value:"MIDDLE",label:"Mid",iconPath:"/fe/lol-parties/icon-position-middle.png"},{value:"BOTTOM",label:"ADC",iconPath:"/fe/lol-parties/icon-position-bottom.png"},{value:"UTILITY",label:"Support",iconPath:"/fe/lol-parties/icon-position-utility.png"}],vt=new Set(k.map(o=>o.value));function O(o){const t=String(o??"").toUpperCase();return vt.has(t)?t:null}function x(o,t=null){const e={};if(!o||typeof o!="object"||Array.isArray(o))return e;const n=Lt(t);for(const[i,s]of Object.entries(o)){const r=d(i),a=String(r);if(r===null||n&&!n.has(a)||!Array.isArray(s))continue;const c=[],h=new Set;for(const u of s){const C=O(u);!C||h.has(C)||(c.push(C),h.add(C))}c.length>0&&(e[a]=c)}return e}function Lt(o){if(!o)return null;const t=new Set;for(const e of o){const n=d(e);n!==null&&t.add(String(n))}return t}function U(o){return k.find(t=>t.value===o)}function ct(o,t){var n;const e=d(t);return e===null?[]:((n=o==null?void 0:o.positionsByChampionId)==null?void 0:n[String(e)])||[]}function Mt(o,t,e){const n=ct(o,t);if(n.length===0)return!0;const i=O(e);return i!==null&&n.includes(i)}const G=new Set;function Rt(o,t){return Object.prototype.hasOwnProperty.call(o,t)}function P(o,t){return Rt(o,t)}function $(){if(!globalThis.DataStore)throw new Error("DataStore is not available");return globalThis.DataStore}function xt(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)}function F(o){if(o!==void 0)return JSON.parse(JSON.stringify(o))}function lt(o){const t=Ot[o];if(!t)throw new Error(`Unknown auto-champion-select config key: ${o}`);return F(t)}function dt(o,t,e={}){const n=lt(o),i=xt(t)?F(t):{},s={...n,...i},r={enabled:s.enabled===!0};return P(n,"force")&&(r.force=s.force===!0),P(n,"quickAction")&&(r.quickAction=s.quickAction===!0),P(n,"champions")&&(r.champions=at(s.champions,e.allowedChampionIds)),P(n,"positionsByChampionId")&&(r.positionsByChampionId=x(s.positionsByChampionId,e.selectedChampionIds||r.champions)),r}function ht(o,t,e={}){const n=t===void 0?lt(o):t;return dt(o,n,e)}function b(o,t={}){const n=$().get(o);return ht(o,n,t)}function Bt(o,t,e={}){const n=$(),i=dt(o,t,e);return n.set(o,i),i}function Dt(o,t){return JSON.stringify(o)===JSON.stringify(t)}function Nt(o,t,e){G.has(o)||(G.add(o),console.warn(`auto-champion-select: Repaired ${o} in DataStore. The stored value used a different schema; plugins like reynbow/auto-champ-lock write this shape. Saved normalized config.`,{storedConfig:t,normalizedConfig:e}))}function ut(o,t={}){const e=$(),n=e.get(o),i=ht(o,n,t);return(n===void 0||!Dt(n,i))&&(n!==void 0&&Nt(o,n,i),e.set(o,i)),i}function T(o,t,e={}){const n=b(o,e),i=F(n),s=t(i)||i;return Bt(o,s,e)}const p=Object.freeze({readyCheckAccept:"/lol-matchmaking/v1/ready-check/accept",gameflowPhase:"/lol-gameflow/v1/gameflow-phase",wallet:"/lol-inventory/v1/wallet",ownedChampions:"/lol-champions/v1/owned-champions-minimal",championSummary:"/lol-game-data/assets/v1/champion-summary.json",champSelectSession:"/lol-champ-select/v1/session",championIcon(o){return`/lol-game-data/assets/v1/champion-icons/${o}.png`},champSelectAction(o){return`/lol-champ-select/v1/session/actions/${o}`}}),$t=1e3;function pt(o){let t=null;return function(){return t||(t=Promise.resolve().then(o).finally(()=>{t=null})),t}}function mt(o){const t=[],e=new Set;if(!Array.isArray(o))return t;for(const n of o){if(!n||typeof n!="object")continue;const i=d(n.id),s=typeof n.name=="string"?n.name:"";i===null||!s||e.has(s)||(t.push({...n,id:i,name:s,squarePortraitPath:n.squarePortraitPath||p.championIcon(i)}),e.add(s))}return t.sort((n,i)=>n.name.localeCompare(i.name)),t}async function Ft(){let o=await w("GET",p.ownedChampions);for(;!o.ok;)console.debug("auto-champion-select(owned-champions-minimal): Retrying..."),o=await w("GET",p.ownedChampions),await g($t);return mt(await o.json())}async function qt(){const o=await w("GET",p.championSummary);return mt(await o.json())}const zt=pt(Ft),Ut=pt(qt),Y=300,H=2e3,Gt=4e3,f=Object.freeze({APPLIED:"applied",TRY_NEXT_CHAMPION:"try-next-champion",ABORT_ACTION:"abort-action"});function B(o){return Array.isArray(o)?o.flat():[]}function Yt(o){return B(o).filter(t=>t.type==="ban"&&t.completed===!0).map(t=>t.championId)}function Q(o){return Array.isArray(o)?o:[]}function _(o){const t=new Set;for(const e of o){const n=d(e);n!==null&&t.add(n)}return t}function W(o){return o.type==="pick"?0:1}function j(){return{pickConfig:b("controladoPick"),banConfig:b("controladoBan")}}function Ht(o){return o.quickAction===!0}function Qt(){const o=Gt-H;return H+Math.floor(Math.random()*(o+1))}class Wt{constructor(){this.session=null,this.actions=null,this.localPlayerCellId=null,this.teammateIntentChampionIds=new Set,this.localPlayerIntentChampionId=null,this.pickedChampionIds=new Set,this.bannedChampionIds=new Set,this.localPlayerAssignedPosition=null,this.watchTask=null,this.watchVersion=0,this.mounted=!1}mount(){this.mounted||(this.mounted=!0,this.watchVersion+=1,this.watchTask||(this.watchTask=this.watch()))}unmount(){this.mounted&&(this.mounted=!1,this.watchVersion+=1)}async watch(){try{for(;this.mounted;){const t=this.watchVersion;let e=!1;try{await this.refreshSessionState(),e=!0}catch(n){console.debug("auto-champion-select: Failed to update champion select",n)}if(!e||!this.mounted||t!==this.watchVersion){this.mounted&&t===this.watchVersion&&await g(Y);continue}try{await this.runAutoSelectCycle()}catch(n){console.debug("auto-champion-select: Failed to run champion select cycle",n)}this.mounted&&t===this.watchVersion&&await g(Y)}}finally{this.watchTask=null}}async refreshSessionState(){var s,r;const t=await w("GET",p.champSelectSession);if(!t.ok)throw new Error(`Session request failed with status ${t.status}`);this.session=await t.json(),this.actions=this.session.actions,this.localPlayerCellId=this.session.localPlayerCellId;const e=Q(this.session.myTeam),n=Q(this.session.theirTeam),i=e.find(a=>a.cellId===this.localPlayerCellId);this.localPlayerAssignedPosition=O(i==null?void 0:i.assignedPosition),this.localPlayerIntentChampionId=d(i==null?void 0:i.championPickIntent),this.pickedChampionIds=_([...e,...n].map(a=>a.championId)),this.bannedChampionIds=_([...((s=this.session.bans)==null?void 0:s.myTeamBans)||[],...((r=this.session.bans)==null?void 0:r.theirTeamBans)||[],...Yt(this.actions)]),this.teammateIntentChampionIds=_(e.map(a=>a.championPickIntent))}async runAutoSelectCycle(){const{pickConfig:t,banConfig:e}=j();if(!t.enabled&&!e.enabled)return;const n=this.getLocalPlayerActions();if(n.length===0){console.debug("auto-champion-select: No local player sub actions found, skipping..."),this.unmount();return}for(const i of n){if(!this.isActionAvailable(i))continue;const s=this.getConfigForActionType(i.type,{pickConfig:t,banConfig:e});if(!(s!=null&&s.enabled))continue;let r=i,a=s,c=this.getAvailableChampionIdsForAction(r,a);if(c.length===0)continue;const h=c.find(u=>this.isPickIntentAlreadyApplied(r,u));if(h!==void 0)c=[h];else if(!Ht(a)){const u=await this.delayAndRefreshPendingAction(r);if(!u)return;r=u.action,a=u.config,c=u.championIds}for(const u of c){const C=await this.attemptChampionForAction(r,u,a);if(C===f.APPLIED)break;if(C===f.ABORT_ACTION)return}}}getLocalPlayerActions(){return B(this.actions).filter(t=>this.isPendingLocalPlayerAction(t)).sort((t,e)=>W(t)-W(e))}isPendingLocalPlayerAction(t){return t.actorCellId===this.localPlayerCellId&&t.completed===!1}isActionAvailable(t){return t.type==="pick"||t.isInProgress===!0}getConfigForActionType(t,e){return t==="pick"?e.pickConfig:t==="ban"?e.banConfig:null}getAvailableChampionIdsForAction(t,e){return e.champions.map(n=>d(n)).filter(n=>n!==null&&!this.isChampionUnavailableForAction(t,n,e))}async delayAndRefreshPendingAction(t){const e=Qt();console.debug(`auto-champion-select: Quick action is off, waiting ${e}ms before ${t.type}...`);const n=this.watchVersion;if(await g(e),!this.mounted||n!==this.watchVersion)return null;let i=null;try{await this.refreshSessionState(),i=this.findPendingAction(t)}catch(a){return console.debug("auto-champion-select: Failed to refresh champion select after action delay",a),null}if(!i||!this.isActionAvailable(i))return null;const s=this.getConfigForActionType(t.type,j());if(!(s!=null&&s.enabled))return null;const r=this.getAvailableChampionIdsForAction(i,s);return r.length===0?null:{action:i,config:s,championIds:r}}async attemptChampionForAction(t,e,n){const i=d(e);if(i===null||this.isChampionUnavailableForAction(t,i,n))return f.TRY_NEXT_CHAMPION;if(this.isPickIntentAlreadyApplied(t,i)||(console.debug(`auto-champion-select: Trying to ${t.type} ${i}...`),(await this.selectChampion(t.id,i)).ok))return f.APPLIED;console.debug(`auto-champion-select: Failed to ${t.type} ${i}, refreshing champ select state...`);const r=await this.refreshPendingAction(t);return!r||!this.isActionAvailable(r)||!this.isChampionUnavailableForAction(r,i,n)?f.ABORT_ACTION:(console.debug(`auto-champion-select: ${i} is unavailable after refresh, trying next ${t.type}...`),f.TRY_NEXT_CHAMPION)}isPickIntentAlreadyApplied(t,e){return t.type==="pick"&&t.isInProgress!==!0&&(this.localPlayerIntentChampionId===e||d(t.championId)===e)}async refreshPendingAction(t){try{await this.refreshSessionState()}catch(e){return console.debug("auto-champion-select: Failed to refresh champion select action",e),null}return this.findPendingAction(t)}findPendingAction(t){return B(this.actions).find(e=>e.id===t.id&&e.actorCellId===t.actorCellId&&e.type===t.type&&e.completed===!1)||null}isChampionUnavailableForAction(t,e,n){if(t.type==="pick"&&!Mt(n,e,this.localPlayerAssignedPosition)){const i=ct(n,e);return this.localPlayerAssignedPosition?console.debug(`auto-champion-select: Picking ${e} but assigned position ${this.localPlayerAssignedPosition} is not in ${i.join(", ")}, skipping...`):console.debug(`auto-champion-select: Picking ${e} but no assigned position is available for ${i.join(", ")} restriction, skipping...`),!0}if(this.bannedChampionIds.has(e))return console.debug(`auto-champion-select: Banning ${e} but it's already banned, skipping...`),!0;if(t.type==="ban"&&this.teammateIntentChampionIds.has(e))if(n.force===!0)console.debug(`auto-champion-select: Banning ${e} but it's already picked, forcing...`);else return console.debug(`auto-champion-select: Banning ${e} but it's already picked, skipping...`),!0;if(t.type==="pick"&&this.pickedChampionIds.has(e))if(n.force===!0)console.debug(`auto-champion-select: Picking ${e} but it's already picked, forcing...`);else return console.debug(`auto-champion-select: Picking ${e} but it's already picked, skipping...`),!0;return!1}selectChampion(t,e){const n=p.champSelectAction(t);return w("PATCH",n,{body:{championId:e,completed:!0}})}}const m=Object.freeze({dropdown:"lol-uikit-framed-dropdown",dropdownOption:"lol-uikit-dropdown-option",radioInputOption:"lol-uikit-radio-input-option",scrollable:"lol-uikit-scrollable",socialRosterGroup:"lol-social-roster-group"}),l=Object.freeze({socialRoster:".lol-social-roster",champSelectButtons:".bottom-right-buttons",firstChampSelectSquareButton:"lol-social-chat-toggle-button, .missions-tracker-button-component, .champ-select-voice-button-wrapper",dropdownRoot:".ui-dropdown",dropdownCurrent:".ui-dropdown-current",dropdownCurrentContent:".ui-dropdown-current-content",dropdownOption:m.dropdownOption,dropdownOptionSelected:`${m.dropdownOption}[selected]`,dropdownOptionsContainer:".ui-dropdown-options-container",dropdownOptions:".ui-dropdown-options",dropdownScrollable:m.scrollable,socialRosterGroupArrow:".arrow",socialRosterGroupHeader:".group-header",socialRosterGroupLabel:"span"});function V(){return document.querySelector(l.socialRoster)}function D(){return document.querySelector(l.champSelectButtons)}const jt=50,Vt=100,v=210,X="controlado-placeholder",K="controlado-search",L="controlado-quick-action",ft="controlado-filter-icon",y="controlado-filter-icon--trash",gt="controlado-filter-input",S="controlado-quick-action-toggle",Ct="controlado-quick-action-toggle--active",wt="controlado-tag",bt="controlado-tag--search",Xt=`url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='black' d='M13.1 2 4 13.2h6.7L9.9 22 20 9.8h-6.9L13.1 2z'/%3E%3C/svg%3E")`,J=`
11
+ ${l.dropdownRoot} {
12
12
  position: relative;
13
13
  }
14
14
 
15
15
  :host {
16
- --framed-dropdown-scrollable-max-height: ${_}px;
16
+ --framed-dropdown-scrollable-max-height: ${v}px;
17
17
  }
18
18
 
19
- :host ${c.dropdownRoot} dt${c.dropdownCurrent} {
19
+ :host ${l.dropdownRoot} dt${l.dropdownCurrent} {
20
20
  display: grid;
21
- grid-template-columns: minmax(0, 1fr) max-content;
21
+ grid-template-columns: minmax(0, 1fr) max-content max-content;
22
22
  align-items: center;
23
23
  column-gap: 8px;
24
24
  padding: 7px 8px 7px 10px;
25
25
  }
26
26
 
27
- :host ${c.dropdownRoot} dt${c.dropdownCurrent}::after {
27
+ :host ${l.dropdownRoot} dt${l.dropdownCurrent}::after {
28
28
  display: none;
29
29
  }
30
30
 
31
- :host ${c.dropdownRoot} dt${c.dropdownCurrent} ${c.dropdownCurrentContent} {
31
+ :host ${l.dropdownRoot} dt${l.dropdownCurrent} ${l.dropdownCurrentContent} {
32
32
  min-width: 0;
33
33
  padding: 0;
34
34
  text-align: left;
35
35
  }
36
36
 
37
- ${c.dropdownOptionsContainer} {
37
+ ${l.dropdownOptionsContainer} {
38
38
  position: absolute;
39
39
  top: auto;
40
40
  bottom: 100%;
41
- height: ${_}px;
41
+ height: ${v}px;
42
42
  overflow: hidden;
43
43
  transform-origin: bottom;
44
44
  transform: translateY(0);
45
45
  }
46
46
 
47
- ${c.dropdownOptions},
48
- ${c.dropdownScrollable} {
49
- height: ${_}px;
47
+ ${l.dropdownOptions},
48
+ ${l.dropdownScrollable} {
49
+ height: ${v}px;
50
50
  }
51
51
 
52
- .${dt} {
52
+ .${ft} {
53
53
  cursor: default;
54
54
  display: inline-block;
55
55
  flex: 0 0 auto;
@@ -62,14 +62,14 @@ import{request as f,sleep as g,linkEndpoint as $}from"https://cdn.jsdelivr.net/n
62
62
  -webkit-mask-size: 18px 18px;
63
63
  }
64
64
 
65
- .${w} {
65
+ .${y} {
66
66
  cursor: pointer;
67
67
  background-color: #c86e6e;
68
68
  -webkit-mask-image: url('/fe/lol-uikit/images/icon_delete.png');
69
69
  -webkit-mask-size: 12px 12px;
70
70
  }
71
71
 
72
- .${ht} {
72
+ .${gt} {
73
73
  flex: 0 0 auto;
74
74
  min-width: 0;
75
75
  width: auto;
@@ -83,7 +83,7 @@ import{request as f,sleep as g,linkEndpoint as $}from"https://cdn.jsdelivr.net/n
83
83
  font-weight: inherit;
84
84
  }
85
85
 
86
- .${ut} {
86
+ .${wt} {
87
87
  cursor: default;
88
88
  display: inline-flex;
89
89
  align-items: center;
@@ -101,7 +101,7 @@ import{request as f,sleep as g,linkEndpoint as $}from"https://cdn.jsdelivr.net/n
101
101
  box-shadow: inset 0 0 8px rgba(15, 30, 45, 0.6);
102
102
  }
103
103
 
104
- .${pt} {
104
+ .${bt} {
105
105
  border-color: #d7b46a;
106
106
  color: #f6e1b2;
107
107
  background: #1a232f;
@@ -110,7 +110,47 @@ import{request as f,sleep as g,linkEndpoint as $}from"https://cdn.jsdelivr.net/n
110
110
  box-sizing: border-box;
111
111
  justify-content: flex-start;
112
112
  justify-self: end;
113
+ order: 2;
113
114
  text-transform: none;
114
115
  font-weight: 500;
115
116
  }
116
- `;function V(o){const t=document.createElement(p.dropdownOption);return t.setAttribute("slot",p.dropdownOption),t.innerText=o,t}class qt{constructor(t,e,n,i={}){this.dropdownElement=t,this.placeholderText=e,this.searchPlaceholderText=i.searchPlaceholderText||"Search",this.onChampionSelected=n,this.placeholderOption=null}renderOptions(t){this.dropdownElement.replaceChildren(),this.placeholderOption=V(this.placeholderText),this.placeholderOption.setAttribute("selected","true"),this.hidePlaceholderOption(),this.dropdownElement.appendChild(this.placeholderOption);for(const e of t){const n=this.createChampionOption(e);this.dropdownElement.appendChild(n)}}createChampionOption(t){const e=V(t.name);return e.addEventListener("click",()=>{this.onChampionSelected(t.id),requestAnimationFrame(()=>this.reset())}),e}async waitForRender(){for(let t=0;t<zt;t++){const e=this.dropdownElement.shadowRoot;if(this.dropdownElement.isConnected&&(e!=null&&e.querySelector(c.dropdownCurrent)))return e;await g(Ut)}return null}ensureSearchPlaceholder(t){if(t.querySelector(`#${W}`))return;const e=t.querySelector(c.dropdownCurrent);e&&e.appendChild(this.createSearchPlaceholder())}createSearchPlaceholder(){const t=document.createElement("div");t.classList.add(ut,pt),t.id=W;const e=document.createElement("input");e.classList.add(ht),e.id=j,e.type="text",e.placeholder=this.searchPlaceholderText,e.setAttribute("aria-label",this.searchPlaceholderText),e.size=Math.max(this.searchPlaceholderText.length,1);const n=document.createElement("span");return n.classList.add(dt),n.addEventListener("click",()=>{n.classList.contains(w)&&this.clearSearch(e,n)}),e.addEventListener("input",i=>{this.ensureOpen(),this.filterOptions(i.target.value),n.classList.toggle(w,!!i.target.value)}),["pointerdown","click"].forEach(i=>{t.addEventListener(i,s=>s.stopPropagation()),n.addEventListener(i,s=>s.stopPropagation())}),["pointerdown","focusin"].forEach(i=>{e.addEventListener(i,s=>s.stopPropagation(),!0)}),t.appendChild(n),t.appendChild(e),t}clearSearch(t,e){t.value="",this.filterOptions(""),e.classList.toggle(w,!1)}filterOptions(t){const e=t.toLowerCase();this.dropdownElement.querySelectorAll(c.dropdownOption).forEach(i=>{if(i===this.placeholderOption){this.hidePlaceholderOption();return}(i.textContent??"").toLowerCase().includes(e)?i.style.display="":i.style.display="none"})}hidePlaceholderOption(){this.placeholderOption&&(this.placeholderOption.style.display="none")}reset(){var t;this.dropdownElement.querySelectorAll(c.dropdownOptionSelected).forEach(e=>{e.removeAttribute("selected")}),(t=this.placeholderOption)==null||t.setAttribute("selected","true"),this.withShadowRoot(e=>{var s;const n=e.querySelector(`#${j}`),i=e.querySelector(`.${w}`);n&&i?this.clearSearch(n,i):(n&&(n.value="",this.filterOptions("")),i&&i.classList.remove(w)),this.isOpen()&&((s=e.querySelector(c.dropdownCurrent))==null||s.click())})}isOpen(){return this.dropdownElement.classList.contains("active")}ensureOpen(){this.isOpen()||this.withShadowRoot(t=>{const e=t.querySelector(c.dropdownCurrent);e&&e.click()})}patchDropdownShadowDom(){this.withShadowRoot(t=>{this.ensureDropdownOpensUpward(t),this.injectDropdownSearchStyles(t)})}ensureDropdownOpensUpward(t){var e;(e=t.querySelector(c.dropdownRoot))==null||e.classList.add("opens-upward")}injectDropdownSearchStyles(t){if(t.querySelector("style[data-controlado='dropdown-tags']"))return;const e=document.createElement("style");e.dataset.controlado="dropdown-tags",e.textContent=Gt,t.appendChild(e)}withShadowRoot(t){const e=this.dropdownElement.shadowRoot;e&&t(e)}}const Ht=".champion-priority-selector__position-badge",Yt=".champion-priority-selector__position-option",Wt=".champion-priority-selector__remove",jt="✕",Vt=0,X=1,P=8,Xt=5,Kt=150,Jt="cubic-bezier(0.2, 0, 0, 1)";class K{constructor(t,e,n,i={}){this.element=this.createRootElement(),this.dropdownElement=this.createDropdownElement(),this.championDropdown=new qt(this.dropdownElement,t,a=>this.addChampion(a),{searchPlaceholderText:i.searchPlaceholderText});const{scrollElement:s,trackElement:r}=this.createSelectedChampionsScroll();this.scrollElement=s,this.trackElement=r,this.enablePositionRestrictions=i.enablePositionRestrictions===!0,this.positionMenuElement=this.enablePositionRestrictions?this.createPositionMenu():null,this.positionMenuChampionId=null,this.positionsByChampionId={},this.emptyElement=this.createEmptyState(t),this.element.append(this.dropdownElement,this.scrollElement),this.positionMenuElement&&this.element.appendChild(this.positionMenuElement),this.config=null,this.configKey=e,this.loadChampions=n,this.champions=[],this.championById=new Map,this.selectedChampionIds=[],this.iconButtons=new Map,this.dragState=null,this.handleWindowPointerMove=a=>this.moveDrag(a),this.handleWindowPointerUp=a=>this.finishDrag(a),this.handleWindowPointerCancel=a=>this.cancelDrag(a),this.handlePositionMenuOutsidePointerDown=a=>this.closePositionMenuOnOutsidePointerDown(a),this.handlePositionMenuKeyDown=a=>this.closePositionMenuOnKeyDown(a),this.setupInFlight=null,this.setupPending=!1}createRootElement(){const t=document.createElement("div");return t.classList.add("champion-priority-selector"),t}createDropdownElement(){const t=document.createElement(p.dropdown);return t.classList.add("dropdown-champions-default","dropdown-drop-up"),t}createSelectedChampionsScroll(){const t=document.createElement(p.scrollable);t.classList.add("champion-priority-selector__scroll"),t.setAttribute("direction","horizontal"),t.setAttribute("overflow-masks","disabled"),t.setAttribute("side-scroll-wheel","true");const e=document.createElement("div");return e.classList.add("champion-priority-selector__track"),t.appendChild(e),{scrollElement:t,trackElement:e}}createEmptyState(t){const e=document.createElement("div");e.classList.add("champion-priority-selector__empty");const n=document.createElement("span");n.innerText="No champions";const i=document.createElement("span"),s=t.replace(/^Add\s+/i,"").toLowerCase();return i.innerText=`Use dropdown to add ${s} option`,e.append(n,i),e}createPositionMenu(){const t=document.createElement("div");t.classList.add("champion-priority-selector__position-menu"),t.hidden=!0;for(const e of E)t.appendChild(this.createPositionOption(e));return t}createPositionOption(t){const e=document.createElement("button");e.classList.add("champion-priority-selector__position-option"),e.type="button",e.dataset.position=t.value,e.title=t.label,e.setAttribute("aria-label",t.label),e.setAttribute("aria-pressed","false"),e.addEventListener("pointerdown",i=>i.stopPropagation()),e.addEventListener("click",i=>{i.stopPropagation(),this.toggleChampionPosition(t.value)});const n=document.createElement("img");return n.src=t.iconPath,n.alt=t.label,n.draggable=!1,e.appendChild(n),e}async setup(){return this.setupPending=!0,this.setupInFlight||(this.setupInFlight=this.runSetupLoop()),this.setupInFlight}refresh(){return this.setup()}async runSetupLoop(){try{for(;this.setupPending;)this.setupPending=!1,await this.performSetup()}finally{this.setupInFlight=null}}async performSetup(){this.champions=await this.loadChampions(),this.championById=new Map(this.champions.map(n=>[n.id,n]));const t=this.getAllowedChampionIds();this.config=at(this.configKey,{allowedChampionIds:t}),this.selectedChampionIds=nt(this.config.champions,t),this.enablePositionRestrictions&&(this.positionsByChampionId=M(this.config.positionsByChampionId,this.selectedChampionIds)),this.championDropdown.renderOptions(this.champions),this.renderSelectedChampions();const e=await this.championDropdown.waitForRender();e&&(this.championDropdown.ensureSearchPlaceholder(e),this.championDropdown.patchDropdownShadowDom())}getAllowedChampionIds(){return new Set(this.championById.keys())}addChampion(t){const e=d(t);e===null||!this.championById.has(e)||this.selectedChampionIds.includes(e)||(this.selectedChampionIds.push(e),this.renderSelectedChampions(),this.saveConfig())}removeChampion(t){const e=d(t),n=this.selectedChampionIds.indexOf(e);e===null||n===-1||(this.selectedChampionIds.splice(n,1),this.positionMenuChampionId===e&&this.closePositionMenu(),this.enablePositionRestrictions&&delete this.positionsByChampionId[String(e)],this.renderSelectedChampions(),this.saveConfig())}moveChampionToIndex(t,e){const n=d(t),i=this.selectedChampionIds.indexOf(n);if(n===null||i===-1)return!1;const[s]=this.selectedChampionIds.splice(i,1),r=Math.max(0,Math.min(e,this.selectedChampionIds.length));return this.selectedChampionIds.splice(r,0,s),i!==r}syncPositionsByChampionId(){this.enablePositionRestrictions&&(this.positionsByChampionId=M(this.positionsByChampionId,this.selectedChampionIds))}saveConfig(){this.syncPositionsByChampionId();const t=this.getAllowedChampionIds();this.config=N(this.configKey,e=>(e.champions=[...this.selectedChampionIds],this.enablePositionRestrictions&&(e.positionsByChampionId={...this.positionsByChampionId}),e),{allowedChampionIds:t,selectedChampionIds:this.selectedChampionIds}),this.enablePositionRestrictions&&(this.positionsByChampionId=this.config.positionsByChampionId||{}),console.debug(this.configKey,this.config)}renderSelectedChampions(t=null,e=null){this.positionMenuChampionId!==null&&this.closePositionMenu();const n=new Set(this.selectedChampionIds);for(const[s,r]of this.iconButtons)n.has(s)||(r.remove(),this.iconButtons.delete(s));if(this.selectedChampionIds.length===0){this.trackElement.replaceChildren(this.emptyElement);return}this.emptyElement.remove();const i=this.selectedChampionIds.map((s,r)=>this.getIconButton(s,r)).filter(Boolean);this.trackElement.append(...i),t&&this.animateReorder(t,e)}getIconButton(t,e){const n=this.championById.get(t);if(!n)return null;let i=this.iconButtons.get(t);i||(i=this.createIconButton(n),this.iconButtons.set(t,i)),i.dataset.rank=String(e+1);const s=this.getChampionPositionTitleSuffix(t);i.title=`${e+1}. ${n.name}${s}`,i.setAttribute("aria-label",`${e+1}. ${n.name}${s}`);const r=i.querySelector("img");r.src=n.squarePortraitPath,r.alt=n.name;const a=i.querySelector(Wt);return a.setAttribute("aria-label",`Remove ${n.name}`),a.title=`Remove ${n.name}`,this.renderPositionBadge(i,t),i}createIconButton(t){const e=document.createElement("div");e.classList.add("champion-priority-selector__icon"),e.setAttribute("role","button"),e.tabIndex=0;const n=document.createElement("img");n.draggable=!1;const i=document.createElement("button");return i.classList.add("champion-priority-selector__remove"),i.type="button",i.dataset.icon=jt,i.addEventListener("pointerdown",s=>s.stopPropagation()),i.addEventListener("click",s=>{s.stopPropagation(),this.removeChampion(t.id)}),e.addEventListener("pointerdown",s=>this.startDrag(s,t.id)),e.addEventListener("auxclick",s=>this.removeChampionOnMiddleClick(s,t.id)),this.enablePositionRestrictions&&e.addEventListener("contextmenu",s=>this.openPositionMenu(s,t.id)),e.append(n,i),e}getChampionAllowedPositions(t){const e=d(t);return e===null?[]:this.positionsByChampionId[String(e)]||[]}getChampionAllowedPositionLabels(t){return this.getChampionAllowedPositions(t).map(e=>{var n;return(n=z(e))==null?void 0:n.label}).filter(Boolean)}getChampionPositionTitleSuffix(t){const e=this.getChampionAllowedPositionLabels(t);return e.length>0?` (${e.join(", ")})`:""}renderPositionBadge(t,e){var i;if((i=t.querySelector(Ht))==null||i.remove(),!this.enablePositionRestrictions)return;const n=this.createPositionBadge(e);n&&t.appendChild(n)}createPositionBadge(t){const e=this.getChampionAllowedPositions(t),n=this.getChampionAllowedPositionLabels(t),i=document.createElement("button");if(i.classList.add("champion-priority-selector__position-badge"),i.type="button",i.title=n.length>0?`${n.join(", ")}. Click to edit positions.`:"Any position. Click to restrict positions.",i.setAttribute("aria-label",i.title),i.addEventListener("pointerdown",a=>a.stopPropagation()),i.addEventListener("click",a=>this.openPositionMenu(a,t,i)),e.length===0)return i.classList.add("champion-priority-selector__position-badge--empty"),i.innerText="+",i;const s=z(e[0]);if(!s)return null;e.length>1&&(i.dataset.count=String(e.length));const r=document.createElement("img");return r.src=s.iconPath,r.alt=s.label,r.draggable=!1,i.appendChild(r),i}openPositionMenu(t,e,n=null){if(!this.enablePositionRestrictions||!this.positionMenuElement)return;const i=d(e);if(i===null||!this.selectedChampionIds.includes(i))return;t.preventDefault(),t.stopPropagation(),this.positionMenuChampionId=i,this.renderPositionMenu(),this.positionMenuElement.hidden=!1,this.positionMenuElement.style.left="0px",this.positionMenuElement.style.top="0px";const{left:s,top:r}=this.getPositionMenuCoordinates(t,n);this.positionMenuElement.style.left=`${s}px`,this.positionMenuElement.style.top=`${r}px`,document.addEventListener("pointerdown",this.handlePositionMenuOutsidePointerDown,!0),document.addEventListener("keydown",this.handlePositionMenuKeyDown,!0)}getPositionMenuCoordinates(t,e=null){const n=this.positionMenuElement.getBoundingClientRect();let i=t.clientX,s=t.clientY;if(e&&t.type==="click"&&t.detail===0){const l=e.getBoundingClientRect();i=l.left+l.width/2,s=l.bottom}const r=Math.min(Math.max(i,P),window.innerWidth-n.width-P),a=Math.min(Math.max(s,P),window.innerHeight-n.height-P);return{left:r,top:a}}renderPositionMenu(){if(!this.positionMenuElement||this.positionMenuChampionId===null)return;const t=new Set(this.getChampionAllowedPositions(this.positionMenuChampionId));this.positionMenuElement.querySelectorAll(Yt).forEach(e=>{const n=t.has(e.dataset.position);e.classList.toggle("champion-priority-selector__position-option--selected",n),e.setAttribute("aria-pressed",String(n))})}toggleChampionPosition(t){if(!this.enablePositionRestrictions||this.positionMenuChampionId===null)return;const e=I(t);if(!e)return;const n=String(this.positionMenuChampionId),i=new Set(this.positionsByChampionId[n]||[]);i.has(e)?i.delete(e):i.add(e);const s=E.map(l=>l.value).filter(l=>i.has(l));s.length>0?this.positionsByChampionId[n]=s:delete this.positionsByChampionId[n],this.renderPositionMenu();const r=this.iconButtons.get(this.positionMenuChampionId),a=this.selectedChampionIds.indexOf(this.positionMenuChampionId);r&&a!==-1&&this.getIconButton(this.positionMenuChampionId,a),this.saveConfig()}closePositionMenuOnOutsidePointerDown(t){var e;(e=this.positionMenuElement)!=null&&e.contains(t.target)||this.closePositionMenu()}closePositionMenuOnKeyDown(t){t.key==="Escape"&&this.closePositionMenu()}closePositionMenu(){this.positionMenuElement&&(this.positionMenuElement.hidden=!0,this.positionMenuChampionId=null,document.removeEventListener("pointerdown",this.handlePositionMenuOutsidePointerDown,!0),document.removeEventListener("keydown",this.handlePositionMenuKeyDown,!0))}startDrag(t,e){var i;if(t.button===X){t.preventDefault();return}if(t.button!==Vt)return;this.dragState&&this.clearDragState();const n=this.iconButtons.get(e);if(n){this.dragState={championId:e,pointerId:t.pointerId,startX:t.clientX,startY:t.clientY,active:!1,moved:!1};try{(i=n.setPointerCapture)==null||i.call(n,t.pointerId)}catch{}window.addEventListener("pointermove",this.handleWindowPointerMove),window.addEventListener("pointerup",this.handleWindowPointerUp),window.addEventListener("pointercancel",this.handleWindowPointerCancel)}}removeChampionOnMiddleClick(t,e){t.button===X&&(t.preventDefault(),t.stopPropagation(),this.removeChampion(e))}moveDrag(t){var h;if(!this.dragState||this.dragState.pointerId!==t.pointerId)return;const e=this.dragState.championId,n=t.clientX-this.dragState.startX,i=t.clientY-this.dragState.startY,s=Math.hypot(n,i);if(!this.dragState.active){if(s<Xt)return;this.dragState.active=!0,(h=this.iconButtons.get(e))==null||h.classList.add("champion-priority-selector__icon--dragging")}t.preventDefault();const r=this.getDropIndex(t.clientX,e),a=this.selectedChampionIds.indexOf(e);if(r===a||r===-1)return;const l=this.getIconPositions();this.moveChampionToIndex(e,r)&&(this.dragState.moved=!0,this.renderSelectedChampions(l,e))}finishDrag(t){if(!this.dragState||this.dragState.pointerId!==t.pointerId)return;const e=this.dragState.active,n=this.dragState.moved;this.clearDragState(),e&&n&&this.saveConfig()}cancelDrag(t){!this.dragState||this.dragState.pointerId!==t.pointerId||this.clearDragState()}clearDragState(){var i;if(!this.dragState)return;const{championId:t,pointerId:e}=this.dragState,n=this.iconButtons.get(t);n==null||n.classList.remove("champion-priority-selector__icon--dragging");try{(i=n==null?void 0:n.releasePointerCapture)==null||i.call(n,e)}catch{}window.removeEventListener("pointermove",this.handleWindowPointerMove),window.removeEventListener("pointerup",this.handleWindowPointerUp),window.removeEventListener("pointercancel",this.handleWindowPointerCancel),this.dragState=null}getDropIndex(t,e){const n=this.selectedChampionIds.filter(i=>i!==e);for(let i=0;i<n.length;i++){const s=this.iconButtons.get(n[i]);if(!s)continue;const r=s.getBoundingClientRect();if(t<r.left+r.width/2)return i}return n.length}getIconPositions(){const t=new Map;for(const e of this.selectedChampionIds){const n=this.iconButtons.get(e);n&&t.set(e,n.getBoundingClientRect())}return t}animateReorder(t,e){for(const n of this.selectedChampionIds){if(n===e)continue;const i=this.iconButtons.get(n),s=t.get(n);if(!i||!s||typeof i.animate!="function")continue;const r=i.getBoundingClientRect(),a=s.left-r.left,l=s.top-r.top;a===0&&l===0||i.animate([{transform:`translate(${a}px, ${l}px)`},{transform:"translate(0, 0)"}],{duration:Kt,easing:Jt})}}}const Qt=200,k="auto-select-champ-select-menu--collapsed",Zt="auto-select-champ-select-menu-button-wrapper--open";class v{constructor(t,e){this.element=document.createElement(p.radioInputOption),this.element.classList.add("lol-settings-voice-input-mode-option","auto-select-checkbox"),this.element.innerText=t,this.config=null,this.configKey=e,this.setupComplete=!1}setup(){this.syncFromConfig(),this.setupComplete||(this.element.addEventListener("click",()=>this.toggle()),this.setupComplete=!0)}syncFromConfig(){this.config=at(this.configKey),this.element.toggleAttribute("selected",this.config.enabled===!0)}toggle(){return console.debug("auto-champion-select: Toggling",this.configKey),this.config=N(this.configKey,t=>(t.enabled=!t.enabled,t)),this.element.toggleAttribute("selected",this.config.enabled===!0),this.config.enabled}}class te{constructor(t,e,n){this.element=document.createElement("div"),this.element.classList.add("auto-select-champ-select-menu",k),this.buttonWrapper=document.createElement("div"),this.buttonWrapper.classList.add("auto-select-champ-select-menu-button-wrapper"),this.headerElement=document.createElement("button"),this.headerElement.classList.add("auto-select-champ-select-menu__header"),this.headerElement.type="button",this.headerElement.setAttribute("aria-label",t),this.headerElement.setAttribute("aria-expanded","false"),this.headerElement.addEventListener("click",()=>this.toggle()),this.contentElement=document.createElement("div"),this.contentElement.classList.add("auto-select-champ-select-menu__content"),this.titleElement=document.createElement("div"),this.titleElement.classList.add("auto-select-champ-select-menu__title"),this.titleElement.textContent=t,this.buttonWrapper.append(this.headerElement,this.element),this.contentElement.appendChild(this.titleElement),this.element.appendChild(this.contentElement),this.returnControlsToSocialRoster=e,this.controlElements=n,this.boundCloseOnOutsideInteraction=i=>this.closeOnOutsideInteraction(i),this.buttonObserver=null,this.buttonMountFrame=null,this.buttonMountTask=null,this.hiddenStates=new WeakMap,this.mounted=!1}async mount(){return this.mounted?this.mountButton():(this.mounted=!0,this.controlElements.forEach(t=>{this.hiddenStates.set(t,t.classList.contains("hidden")),t.classList.remove("hidden"),this.contentElement.appendChild(t)}),this.observeButtonContainer(),document.addEventListener("pointerdown",this.boundCloseOnOutsideInteraction,!0),this.mountButton())}unmount(){return this.mounted?(this.mounted=!1,this.stopButtonMounting(),document.removeEventListener("pointerdown",this.boundCloseOnOutsideInteraction,!0),this.setOpen(!1),this.buttonWrapper.remove(),this.restoreHiddenStates(),this.returnControlsToSocialRoster()):this.returnControlsToSocialRoster()}stopButtonMounting(){var t;(t=this.buttonObserver)==null||t.disconnect(),this.buttonObserver=null,this.buttonMountFrame!==null&&(cancelAnimationFrame(this.buttonMountFrame),this.buttonMountFrame=null),this.buttonMountTask=null}restoreHiddenStates(){this.controlElements.forEach(t=>{t.classList.toggle("hidden",this.hiddenStates.get(t)===!0),this.hiddenStates.delete(t)})}isOpen(){return!this.element.classList.contains(k)}setOpen(t){this.element.classList.toggle(k,!t),this.buttonWrapper.classList.toggle(Zt,t),this.headerElement.setAttribute("aria-expanded",String(t))}toggle(){this.setOpen(!this.isOpen())}closeOnOutsideInteraction(t){if(!this.isOpen())return;(typeof t.composedPath=="function"?t.composedPath():[]).includes(this.buttonWrapper)||this.buttonWrapper.contains(t.target)||this.setOpen(!1)}observeButtonContainer(){this.buttonObserver=new MutationObserver(()=>this.scheduleMountButton()),this.buttonObserver.observe(document.body,{childList:!0,subtree:!0})}scheduleMountButton(){this.buttonMountFrame===null&&(this.buttonMountFrame=requestAnimationFrame(()=>{this.buttonMountFrame=null,this.mountButton()}))}mountButton(){return this.buttonMountTask||(this.buttonMountTask=this.appendButtonToContainer().finally(()=>{this.buttonMountTask=null})),this.buttonMountTask}async appendButtonToContainer(){let t=L();for(;this.mounted&&!t;)await g(Qt),t=L();if(!this.mounted||!t)return;const e=t.querySelector(c.firstChampSelectSquareButton);this.buttonWrapper.parentNode===t&&this.buttonWrapper.nextSibling===e||t.insertBefore(this.buttonWrapper,e)}}class ee{constructor(t,...e){this.element=document.createElement(p.socialRosterGroup),this.element.addEventListener("post-render",()=>this.onPostRender()),this.element.addEventListener("click",()=>this.onClick()),this.label=t,this.collapsibleElements=e,this.waitRender()}waitRender(){new MutationObserver((t,e)=>{if(this.element.querySelector(c.socialRosterGroupLabel)){const n=new Event("post-render");this.element.dispatchEvent(n),e.disconnect()}}).observe(this.element,{childList:!0})}onPostRender(){var t;this.element.querySelector(c.socialRosterGroupLabel).innerText=this.label,(t=this.element.querySelector(c.socialRosterGroupHeader))==null||t.removeAttribute("draggable")}onClick(){var t;this.collapsibleElements.forEach(e=>{e.closest(".auto-select-champ-select-menu")||e.classList.toggle("hidden")}),(t=this.element.querySelector(c.socialRosterGroupArrow))==null||t.toggleAttribute("open")}}function mt(o){var t,e;o&&((e=(t=globalThis.Toast)==null?void 0:t.success)==null||e.call(t,o))}function B(o){var t,e;o&&((e=(t=globalThis.Toast)==null?void 0:t.error)==null||e.call(t,o))}function ne(o,t){const e=globalThis.Toast;return typeof(e==null?void 0:e.promise)=="function"?e.promise(o,t):o}const y="Balaclava: Auto Champion Select";function oe(o){return typeof(o==null?void 0:o.then)=="function"}class F{constructor({id:t,name:e,legend:n,tags:i,group:s,callback:r,toasts:a}){this.id=t,this.name=e,this.legend=n,this.tags=i,this.group=s,this.perform=this.perform.bind(this),this.callback=r,this.toasts=a}perform(){try{const t=this.callback();if(oe(t))return ne(t,{loading:this.toasts.loading,success:this.toasts.success,error:this.toasts.error});const e=this.toasts.success||(t?this.toasts.on:this.toasts.off);mt(e)}catch(t){B(this.toasts.error),console.error(t)}}}class ft extends F{constructor(t,e,n){super({id:`${e}Switch`,name:()=>`Auto ${t} [${C(e).enabled?"ON":"OFF"}]`,legend:()=>C(e).enabled?"Turn OFF":"Turn ON",tags:[y,e,"switch"],group:y,callback:n,toasts:{on:`Auto ${t} is ON!`,off:`Auto ${t} is OFF!`,error:`Failed to toggle Auto ${t}. Check console.`}})}}function ie(o){return N(o,e=>(e.force=!e.force,e)).force}class gt extends F{constructor(t,e){super({id:`${e}ForceSwitch`,name:()=>`Force ${t} [${C(e).force?"ON":"OFF"}]`,legend:()=>`Ignore team intent and force ${t} the selected champion`,tags:[y,e,"force","switch"],group:y,callback:()=>ie(e),toasts:{on:`Force ${t} is ON!`,off:`Force ${t} is OFF!`,error:`Failed to toggle Force ${t}. Check console.`}})}}class se extends F{constructor(t){super({id:"RefreshDropdowns",name:()=>"Refresh Champions",legend:()=>"Normally champion selectors refresh automatically...",tags:[y,"refresh"],group:y,callback:t,toasts:{success:"Refreshed Champions!",error:"Failed to refresh Champions. Check console."}})}}class re extends ft{constructor(t){super("Pick","controladoPick",t)}}class ae extends ft{constructor(t){super("Ban","controladoBan",t)}}class le extends gt{constructor(){super("Pick","controladoPick")}}class ce extends gt{constructor(){super("Ban","controladoBan")}}function de(o){for(const t of o)CommandBar.addAction(t)}const he=200,ue=6e4,J=2e3,pe=".ready-check-root-element",me="#lol-uikit-layer-manager-wrapper > .modal",fe="Accepted ready check!",Q="Failed to accept ready check. Check console.",ge=".auto-select-champ-select-menu__header",b=Object.freeze({autoAccept:"controladoAutoAccept",pick:"controladoPick",ban:"controladoBan"});function Ct(){return C(b.autoAccept).enabled===!0}class Ce{constructor(t){this.isEnabled=t,this.observer=null,this.hiddenModal=null,this.hiddenModalStyles=new WeakMap,this.sync=this.sync.bind(this)}start(){this.observer||(this.observer=new MutationObserver(()=>this.sync()),this.observer.observe(document.body,{childList:!0,subtree:!0}),this.sync())}sync(){const t=we();if(!t){this.restore();return}if(!this.isEnabled()){this.restore();return}this.hide(t)}hide(t){this.hiddenModal!==t&&(this.restore(),this.hiddenModal=t,this.hiddenModalStyles.set(t,{display:t.style.getPropertyValue("display"),displayPriority:t.style.getPropertyPriority("display"),pointerEvents:t.style.getPropertyValue("pointer-events"),pointerEventsPriority:t.style.getPropertyPriority("pointer-events")}),t.style.setProperty("display","none","important"),t.style.setProperty("pointer-events","none","important"))}restore(){if(!this.hiddenModal)return;const t=this.hiddenModal,e=this.hiddenModalStyles.get(t);Z(t,"display",e==null?void 0:e.display,e==null?void 0:e.displayPriority),Z(t,"pointer-events",e==null?void 0:e.pointerEvents,e==null?void 0:e.pointerEventsPriority),this.hiddenModalStyles.delete(t),this.hiddenModal=null}}function we(){const o=document.querySelector(pe);return(o==null?void 0:o.closest(me))||null}function Z(o,t,e,n){e?o.style.setProperty(t,e,n||""):o.style.removeProperty(t)}async function be(o){function t(){return Ct()?!1:(o.restore(),!0)}if(t()||(console.debug(`auto-champion-select(auto-accept): Ready check detected, accepting in ${J}ms...`),await g(J),t()))return;let e=!1;try{e=await ye()}catch(n){throw o.restore(),B(Q),n}e?mt(fe):(o.restore(),B(Q))}async function ye(){const o=await f("POST",u.readyCheckAccept);return o.ok?(console.debug("auto-champion-select(auto-accept): Accepted ready check"),!0):(console.error("auto-champion-select(auto-accept): Failed to accept ready check",o),!1)}async function Se(o){const t=await f("GET",u.gameflowPhase),e=t.ok?await t.json():null;o.handleGameflowPhase(e)}function Pe({championSelect:o,champSelectControlsMenu:t,readyCheckModalSuppressor:e,setupChampionSelectors:n}){let i=0;return async function(l){const h=++i;try{await s(l,h)}catch(A){console.error("auto-champion-select: Failed to handle gameflow phase",A)}};async function s(a,l){a==="ReadyCheck"?be(e).catch(h=>{console.error("auto-champion-select(auto-accept): Failed to handle ready check",h)}):e.restore(),await r(a),l===i&&await n()}async function r(a){a==="ChampSelect"?(o.mount(),await t.mount()):(o.unmount(),await t.unmount())}}function Ee(){const o=new $t,t=new v("Accept",b.autoAccept),e=new v("Pick",b.pick),n=new K("Add pick",b.pick,Dt,{enablePositionRestrictions:!0}),i=new v("Ban",b.ban),s=new K("Add ban",b.ban,xt),r=Ie(n,s),a=Ae(t,e,i),l=new ee("Auto champion select",r,a);return{championSelect:o,autoAcceptToggle:t,pickToggle:e,banToggle:i,pickChampionSelector:n,banChampionSelector:s,selectorsContainer:r,checkboxesContainer:a,pluginSection:l,championSelectors:[n,s]}}function Ie(...o){const t=document.createElement("div");return t.append(...o.map(e=>e.element)),t}function Ae(...o){const t=document.createElement("div");return t.classList.add("auto-select-checkboxes-div"),t.append(...o.map(e=>e.element)),t}function Oe({pluginSection:o,checkboxesContainer:t,selectorsContainer:e}){let n=null,i=0,s=()=>!1;async function r(a){let l=Y();for(;!l;){if(s()||a!==i)return;await g(he),l=Y()}s()||a!==i||l.append(o.element,t,e)}return{setIsChampSelectControlsMounted(a){s=a},returnControlsToSocialRoster(){if(n)return n;const a=++i;return n=r(a).catch(l=>console.error("auto-champion-select: Failed to return controls to social roster",l)).finally(()=>{n=null}),n}}}function Te({autoAcceptToggle:o,pickToggle:t,banToggle:e,readyCheckModalSuppressor:n}){o.setup(),o.element.addEventListener("click",()=>n.sync()),t.setup(),e.setup()}async function _e(o){await Promise.all(o.map(t=>t.setup()))}async function ke(o){await Promise.all(o.map(t=>t.refresh()))}function ve(){const o=Ee(),t=new Ce(Ct),e=Oe(o),n=new te("Auto Champion Select",e.returnControlsToSocialRoster,[o.checkboxesContainer,o.selectorsContainer]);e.setIsChampSelectControlsMounted(()=>n.mounted);const i={...o,champSelectControlsMenu:n,readyCheckModalSuppressor:t,setupToggles:()=>Te({...o,readyCheckModalSuppressor:t}),setupChampionSelectors:()=>_e(o.championSelectors),refreshChampionSelectors:()=>ke(o.championSelectors),refreshPickChampionSelector:async()=>{await o.pickChampionSelector.refresh()}};return i.handleGameflowPhase=Pe(i),i}function Me(o){$(u.gameflowPhase,t=>{o.handleGameflowPhase(t.data)}),$(u.wallet,async t=>{if(t.eventType==="Update"){console.debug("auto-champion-select(wallet): Refreshing champion selectors...");try{await o.refreshPickChampionSelector()}catch(e){console.error("auto-champion-select(wallet): Failed to refresh champion selectors",e)}}})}function Re({pickToggle:o,banToggle:t,refreshChampionSelectors:e}){de([new re(()=>o.toggle()),new ae(()=>t.toggle()),new le,new ce,new se(e)])}function Le(o){let t=null,e=null;function n(){e==null||e.disconnect(),e=null,t!==null&&(cancelAnimationFrame(t),t=null)}const i=setTimeout(()=>{n()},ue);function s(){if(!(L()!==null))return;clearTimeout(i),n(),document.querySelector(ge)!==null||o.handleGameflowPhase("ChampSelect")}e=new MutationObserver(()=>{t===null&&(t=requestAnimationFrame(()=>{t=null,s()}))}),e.observe(document.body,{childList:!0,subtree:!0}),s()}async function Be(){const o=ve();o.setupToggles(),o.readyCheckModalSuppressor.start(),Re(o),Me(o),await Se(o),Le(o),console.debug(`auto-champion-select(${wt}): Report bugs to Balaclava#1912`)}let tt=!1;function et(){tt||(tt=!0,Be().catch(o=>console.error("auto-champion-select: Failed to initialize",o)))}document.readyState==="loading"?window.addEventListener("load",et,{once:!0}):et();export{et as load};
117
+
118
+ .${S} {
119
+ appearance: none;
120
+ display: inline-grid;
121
+ place-items: center;
122
+ width: 18px;
123
+ height: 18px;
124
+ padding: 0;
125
+ border: 0;
126
+ background: transparent;
127
+ box-sizing: border-box;
128
+ cursor: pointer;
129
+ justify-self: end;
130
+ order: 1;
131
+ outline: none;
132
+ }
133
+
134
+ .${S}::before {
135
+ content: "";
136
+ display: block;
137
+ width: 16px;
138
+ height: 16px;
139
+ background-color: #785a28;
140
+ -webkit-mask-image: ${Xt};
141
+ -webkit-mask-repeat: no-repeat;
142
+ -webkit-mask-position: center;
143
+ -webkit-mask-size: 16px 16px;
144
+ filter: drop-shadow(0 0 1px #010a13);
145
+ }
146
+
147
+ .${S}:hover::before,
148
+ .${S}:focus::before {
149
+ background-color: #c8aa6e;
150
+ }
151
+
152
+ .${Ct}::before {
153
+ background-color: #f0e6d2;
154
+ filter: drop-shadow(0 0 3px rgba(200, 170, 110, 0.75));
155
+ }
156
+ `;function Z(o){const t=document.createElement(m.dropdownOption);return t.setAttribute("slot",m.dropdownOption),t.innerText=o,t}class Kt{constructor(t,e,n,i={}){this.dropdownElement=t,this.placeholderText=e,this.searchPlaceholderText=i.searchPlaceholderText||"Search",this.quickActionLabel=i.quickActionLabel||"Pick/ban instantly",this.isQuickActionEnabled=typeof i.isQuickActionEnabled=="function"?i.isQuickActionEnabled:null,this.onQuickActionToggle=typeof i.onQuickActionToggle=="function"?i.onQuickActionToggle:null,this.onChampionSelected=n,this.placeholderOption=null}renderOptions(t){this.dropdownElement.replaceChildren(),this.placeholderOption=Z(this.placeholderText),this.placeholderOption.setAttribute("selected","true"),this.hidePlaceholderOption(),this.dropdownElement.appendChild(this.placeholderOption);for(const e of t){const n=this.createChampionOption(e);this.dropdownElement.appendChild(n)}}createChampionOption(t){const e=Z(t.name);return e.addEventListener("click",()=>{this.onChampionSelected(t.id),requestAnimationFrame(()=>this.reset())}),e}async waitForRender(){for(let t=0;t<jt;t++){const e=this.dropdownElement.shadowRoot;if(this.dropdownElement.isConnected&&(e!=null&&e.querySelector(l.dropdownCurrent)))return e;await g(Vt)}return null}ensureSearchPlaceholder(t){if(t.querySelector(`#${X}`))return;const e=t.querySelector(l.dropdownCurrent);e&&e.appendChild(this.createSearchPlaceholder())}ensureQuickActionToggle(t){if(!this.isQuickActionAvailable()||t.querySelector(`#${L}`)){this.syncQuickActionToggle(t);return}const e=t.querySelector(l.dropdownCurrent);e&&(e.appendChild(this.createQuickActionToggle()),this.syncQuickActionToggle(t))}createSearchPlaceholder(){const t=document.createElement("div");t.classList.add(wt,bt),t.id=X;const e=document.createElement("input");e.classList.add(gt),e.id=K,e.type="text",e.placeholder=this.searchPlaceholderText,e.setAttribute("aria-label",this.searchPlaceholderText),e.size=Math.max(this.searchPlaceholderText.length,1);const n=document.createElement("span");return n.classList.add(ft),n.addEventListener("click",()=>{n.classList.contains(y)&&this.clearSearch(e,n)}),e.addEventListener("input",i=>{this.ensureOpen(),this.filterOptions(i.target.value),n.classList.toggle(y,!!i.target.value)}),["pointerdown","click"].forEach(i=>{t.addEventListener(i,s=>s.stopPropagation()),n.addEventListener(i,s=>s.stopPropagation())}),["pointerdown","focusin"].forEach(i=>{e.addEventListener(i,s=>s.stopPropagation(),!0)}),t.appendChild(n),t.appendChild(e),t}createQuickActionToggle(){const t=document.createElement("button");return t.classList.add(S),t.id=L,t.type="button",t.title=this.quickActionLabel,t.setAttribute("aria-label",this.quickActionLabel),t.setAttribute("aria-pressed","false"),["pointerdown","click"].forEach(e=>{t.addEventListener(e,n=>{n.preventDefault(),n.stopPropagation()})}),t.addEventListener("click",()=>{var e;(e=this.onQuickActionToggle)==null||e.call(this),this.syncQuickActionToggle()}),t}isQuickActionAvailable(){return!!(this.isQuickActionEnabled&&this.onQuickActionToggle)}syncQuickActionToggle(t=this.dropdownElement.shadowRoot){if(!this.isQuickActionAvailable()||!t)return;const e=t.querySelector(`#${L}`);if(!e)return;const n=this.isQuickActionEnabled()===!0;e.classList.toggle(Ct,n),e.setAttribute("aria-pressed",String(n)),e.title=this.quickActionLabel,e.setAttribute("aria-label",this.quickActionLabel)}clearSearch(t,e){t.value="",this.filterOptions(""),e.classList.toggle(y,!1)}filterOptions(t){const e=t.toLowerCase();this.dropdownElement.querySelectorAll(l.dropdownOption).forEach(i=>{if(i===this.placeholderOption){this.hidePlaceholderOption();return}(i.textContent??"").toLowerCase().includes(e)?i.style.display="":i.style.display="none"})}hidePlaceholderOption(){this.placeholderOption&&(this.placeholderOption.style.display="none")}reset(){var t;this.dropdownElement.querySelectorAll(l.dropdownOptionSelected).forEach(e=>{e.removeAttribute("selected")}),(t=this.placeholderOption)==null||t.setAttribute("selected","true"),this.withShadowRoot(e=>{var s;const n=e.querySelector(`#${K}`),i=e.querySelector(`.${y}`);n&&i?this.clearSearch(n,i):(n&&(n.value="",this.filterOptions("")),i&&i.classList.remove(y)),this.isOpen()&&((s=e.querySelector(l.dropdownCurrent))==null||s.click())})}isOpen(){return this.dropdownElement.classList.contains("active")}ensureOpen(){this.isOpen()||this.withShadowRoot(t=>{const e=t.querySelector(l.dropdownCurrent);e&&e.click()})}patchDropdownShadowDom(){this.withShadowRoot(t=>{this.ensureDropdownOpensUpward(t),this.injectDropdownSearchStyles(t)})}ensureDropdownOpensUpward(t){var e;(e=t.querySelector(l.dropdownRoot))==null||e.classList.add("opens-upward")}injectDropdownSearchStyles(t){const e=t.querySelector("style[data-controlado='dropdown-tags']");if(e){e.textContent=J;return}const n=document.createElement("style");n.dataset.controlado="dropdown-tags",n.textContent=J,t.appendChild(n)}withShadowRoot(t){const e=this.dropdownElement.shadowRoot;e&&t(e)}}const Jt=".champion-priority-selector__position-badge",Zt=".champion-priority-selector__position-option",te=".champion-priority-selector__remove",ee="✕",ne=0,tt=1,I=8,oe=5,ie=150,se="cubic-bezier(0.2, 0, 0, 1)";class et{constructor(t,e,n,i={}){this.element=this.createRootElement(),this.dropdownElement=this.createDropdownElement(),this.championDropdown=new Kt(this.dropdownElement,t,a=>this.addChampion(a),{quickActionLabel:i.quickActionLabel,searchPlaceholderText:i.searchPlaceholderText,isQuickActionEnabled:()=>this.isQuickActionEnabled(),onQuickActionToggle:()=>this.toggleQuickAction()});const{scrollElement:s,trackElement:r}=this.createSelectedChampionsScroll();this.scrollElement=s,this.trackElement=r,this.enablePositionRestrictions=i.enablePositionRestrictions===!0,this.positionMenuElement=this.enablePositionRestrictions?this.createPositionMenu():null,this.positionMenuChampionId=null,this.positionsByChampionId={},this.emptyElement=this.createEmptyState(t),this.element.append(this.dropdownElement,this.scrollElement),this.positionMenuElement&&this.element.appendChild(this.positionMenuElement),this.config=null,this.configKey=e,this.quickAction=!1,this.loadChampions=n,this.champions=[],this.championById=new Map,this.selectedChampionIds=[],this.iconButtons=new Map,this.dragState=null,this.handleWindowPointerMove=a=>this.moveDrag(a),this.handleWindowPointerUp=a=>this.finishDrag(a),this.handleWindowPointerCancel=a=>this.cancelDrag(a),this.handlePositionMenuOutsidePointerDown=a=>this.closePositionMenuOnOutsidePointerDown(a),this.handlePositionMenuKeyDown=a=>this.closePositionMenuOnKeyDown(a),this.setupInFlight=null,this.setupPending=!1}createRootElement(){const t=document.createElement("div");return t.classList.add("champion-priority-selector"),t}createDropdownElement(){const t=document.createElement(m.dropdown);return t.classList.add("dropdown-champions-default","dropdown-drop-up"),t}createSelectedChampionsScroll(){const t=document.createElement(m.scrollable);t.classList.add("champion-priority-selector__scroll"),t.setAttribute("direction","horizontal"),t.setAttribute("overflow-masks","disabled"),t.setAttribute("side-scroll-wheel","true");const e=document.createElement("div");return e.classList.add("champion-priority-selector__track"),t.appendChild(e),{scrollElement:t,trackElement:e}}createEmptyState(t){const e=document.createElement("div");e.classList.add("champion-priority-selector__empty");const n=document.createElement("span");n.innerText="No champions";const i=document.createElement("span"),s=t.replace(/^Add\s+/i,"").toLowerCase();return i.innerText=`Use dropdown to add ${s} option`,e.append(n,i),e}createPositionMenu(){const t=document.createElement("div");t.classList.add("champion-priority-selector__position-menu"),t.hidden=!0;for(const e of k)t.appendChild(this.createPositionOption(e));return t}createPositionOption(t){const e=document.createElement("button");e.classList.add("champion-priority-selector__position-option"),e.type="button",e.dataset.position=t.value,e.title=t.label,e.setAttribute("aria-label",t.label),e.setAttribute("aria-pressed","false"),e.addEventListener("pointerdown",i=>i.stopPropagation()),e.addEventListener("click",i=>{i.stopPropagation(),this.toggleChampionPosition(t.value)});const n=document.createElement("img");return n.src=t.iconPath,n.alt=t.label,n.draggable=!1,e.appendChild(n),e}async setup(){return this.setupPending=!0,this.setupInFlight||(this.setupInFlight=this.runSetupLoop()),this.setupInFlight}refresh(){return this.setup()}async runSetupLoop(){try{for(;this.setupPending;)this.setupPending=!1,await this.performSetup()}finally{this.setupInFlight=null}}async performSetup(){this.champions=await this.loadChampions(),this.championById=new Map(this.champions.map(n=>[n.id,n]));const t=this.getAllowedChampionIds();this.config=ut(this.configKey,{allowedChampionIds:t}),this.quickAction=this.config.quickAction===!0,this.selectedChampionIds=at(this.config.champions,t),this.enablePositionRestrictions&&(this.positionsByChampionId=x(this.config.positionsByChampionId,this.selectedChampionIds)),this.championDropdown.renderOptions(this.champions),this.renderSelectedChampions();const e=await this.championDropdown.waitForRender();e&&(this.championDropdown.ensureSearchPlaceholder(e),this.championDropdown.ensureQuickActionToggle(e),this.championDropdown.patchDropdownShadowDom())}getAllowedChampionIds(){return new Set(this.championById.keys())}isQuickActionEnabled(){return this.quickAction===!0}toggleQuickAction(){const t=this.getAllowedChampionIds();return this.config=T(this.configKey,e=>(e.quickAction=e.quickAction!==!0,e),{allowedChampionIds:t,selectedChampionIds:this.selectedChampionIds}),this.quickAction=this.config.quickAction===!0,this.championDropdown.syncQuickActionToggle(),this.quickAction}addChampion(t){const e=d(t);e===null||!this.championById.has(e)||this.selectedChampionIds.includes(e)||(this.selectedChampionIds.push(e),this.renderSelectedChampions(),this.saveConfig())}removeChampion(t){const e=d(t),n=this.selectedChampionIds.indexOf(e);e===null||n===-1||(this.selectedChampionIds.splice(n,1),this.positionMenuChampionId===e&&this.closePositionMenu(),this.enablePositionRestrictions&&delete this.positionsByChampionId[String(e)],this.renderSelectedChampions(),this.saveConfig())}moveChampionToIndex(t,e){const n=d(t),i=this.selectedChampionIds.indexOf(n);if(n===null||i===-1)return!1;const[s]=this.selectedChampionIds.splice(i,1),r=Math.max(0,Math.min(e,this.selectedChampionIds.length));return this.selectedChampionIds.splice(r,0,s),i!==r}syncPositionsByChampionId(){this.enablePositionRestrictions&&(this.positionsByChampionId=x(this.positionsByChampionId,this.selectedChampionIds))}saveConfig(){this.syncPositionsByChampionId();const t=this.getAllowedChampionIds();this.config=T(this.configKey,e=>(e.champions=[...this.selectedChampionIds],this.enablePositionRestrictions&&(e.positionsByChampionId={...this.positionsByChampionId}),e),{allowedChampionIds:t,selectedChampionIds:this.selectedChampionIds}),this.enablePositionRestrictions&&(this.positionsByChampionId=this.config.positionsByChampionId||{}),console.debug(this.configKey,this.config)}renderSelectedChampions(t=null,e=null){this.positionMenuChampionId!==null&&this.closePositionMenu();const n=new Set(this.selectedChampionIds);for(const[s,r]of this.iconButtons)n.has(s)||(r.remove(),this.iconButtons.delete(s));if(this.selectedChampionIds.length===0){this.trackElement.replaceChildren(this.emptyElement);return}this.emptyElement.remove();const i=this.selectedChampionIds.map((s,r)=>this.getIconButton(s,r)).filter(Boolean);this.trackElement.append(...i),t&&this.animateReorder(t,e)}getIconButton(t,e){const n=this.championById.get(t);if(!n)return null;let i=this.iconButtons.get(t);i||(i=this.createIconButton(n),this.iconButtons.set(t,i)),i.dataset.rank=String(e+1);const s=this.getChampionPositionTitleSuffix(t);i.title=`${e+1}. ${n.name}${s}`,i.setAttribute("aria-label",`${e+1}. ${n.name}${s}`);const r=i.querySelector("img");r.src=n.squarePortraitPath,r.alt=n.name;const a=i.querySelector(te);return a.setAttribute("aria-label",`Remove ${n.name}`),a.title=`Remove ${n.name}`,this.renderPositionBadge(i,t),i}createIconButton(t){const e=document.createElement("div");e.classList.add("champion-priority-selector__icon"),e.setAttribute("role","button"),e.tabIndex=0;const n=document.createElement("img");n.draggable=!1;const i=document.createElement("button");return i.classList.add("champion-priority-selector__remove"),i.type="button",i.dataset.icon=ee,i.addEventListener("pointerdown",s=>s.stopPropagation()),i.addEventListener("click",s=>{s.stopPropagation(),this.removeChampion(t.id)}),e.addEventListener("pointerdown",s=>this.startDrag(s,t.id)),e.addEventListener("auxclick",s=>this.removeChampionOnMiddleClick(s,t.id)),this.enablePositionRestrictions&&e.addEventListener("contextmenu",s=>this.openPositionMenu(s,t.id)),e.append(n,i),e}getChampionAllowedPositions(t){const e=d(t);return e===null?[]:this.positionsByChampionId[String(e)]||[]}getChampionAllowedPositionLabels(t){return this.getChampionAllowedPositions(t).map(e=>{var n;return(n=U(e))==null?void 0:n.label}).filter(Boolean)}getChampionPositionTitleSuffix(t){const e=this.getChampionAllowedPositionLabels(t);return e.length>0?` (${e.join(", ")})`:""}renderPositionBadge(t,e){var i;if((i=t.querySelector(Jt))==null||i.remove(),!this.enablePositionRestrictions)return;const n=this.createPositionBadge(e);n&&t.appendChild(n)}createPositionBadge(t){const e=this.getChampionAllowedPositions(t),n=this.getChampionAllowedPositionLabels(t),i=document.createElement("button");if(i.classList.add("champion-priority-selector__position-badge"),i.type="button",i.title=n.length>0?`${n.join(", ")}. Click to edit positions.`:"Any position. Click to restrict positions.",i.setAttribute("aria-label",i.title),i.addEventListener("pointerdown",a=>a.stopPropagation()),i.addEventListener("click",a=>this.openPositionMenu(a,t,i)),e.length===0)return i.classList.add("champion-priority-selector__position-badge--empty"),i.innerText="+",i;const s=U(e[0]);if(!s)return null;e.length>1&&(i.dataset.count=String(e.length));const r=document.createElement("img");return r.src=s.iconPath,r.alt=s.label,r.draggable=!1,i.appendChild(r),i}openPositionMenu(t,e,n=null){if(!this.enablePositionRestrictions||!this.positionMenuElement)return;const i=d(e);if(i===null||!this.selectedChampionIds.includes(i))return;t.preventDefault(),t.stopPropagation(),this.positionMenuChampionId=i,this.renderPositionMenu(),this.positionMenuElement.hidden=!1,this.positionMenuElement.style.left="0px",this.positionMenuElement.style.top="0px";const{left:s,top:r}=this.getPositionMenuCoordinates(t,n);this.positionMenuElement.style.left=`${s}px`,this.positionMenuElement.style.top=`${r}px`,document.addEventListener("pointerdown",this.handlePositionMenuOutsidePointerDown,!0),document.addEventListener("keydown",this.handlePositionMenuKeyDown,!0)}getPositionMenuCoordinates(t,e=null){const n=this.positionMenuElement.getBoundingClientRect();let i=t.clientX,s=t.clientY;if(e&&t.type==="click"&&t.detail===0){const c=e.getBoundingClientRect();i=c.left+c.width/2,s=c.bottom}const r=Math.min(Math.max(i,I),window.innerWidth-n.width-I),a=Math.min(Math.max(s,I),window.innerHeight-n.height-I);return{left:r,top:a}}renderPositionMenu(){if(!this.positionMenuElement||this.positionMenuChampionId===null)return;const t=new Set(this.getChampionAllowedPositions(this.positionMenuChampionId));this.positionMenuElement.querySelectorAll(Zt).forEach(e=>{const n=t.has(e.dataset.position);e.classList.toggle("champion-priority-selector__position-option--selected",n),e.setAttribute("aria-pressed",String(n))})}toggleChampionPosition(t){if(!this.enablePositionRestrictions||this.positionMenuChampionId===null)return;const e=O(t);if(!e)return;const n=String(this.positionMenuChampionId),i=new Set(this.positionsByChampionId[n]||[]);i.has(e)?i.delete(e):i.add(e);const s=k.map(c=>c.value).filter(c=>i.has(c));s.length>0?this.positionsByChampionId[n]=s:delete this.positionsByChampionId[n],this.renderPositionMenu();const r=this.iconButtons.get(this.positionMenuChampionId),a=this.selectedChampionIds.indexOf(this.positionMenuChampionId);r&&a!==-1&&this.getIconButton(this.positionMenuChampionId,a),this.saveConfig()}closePositionMenuOnOutsidePointerDown(t){var e;(e=this.positionMenuElement)!=null&&e.contains(t.target)||this.closePositionMenu()}closePositionMenuOnKeyDown(t){t.key==="Escape"&&this.closePositionMenu()}closePositionMenu(){this.positionMenuElement&&(this.positionMenuElement.hidden=!0,this.positionMenuChampionId=null,document.removeEventListener("pointerdown",this.handlePositionMenuOutsidePointerDown,!0),document.removeEventListener("keydown",this.handlePositionMenuKeyDown,!0))}startDrag(t,e){var i;if(t.button===tt){t.preventDefault();return}if(t.button!==ne)return;this.dragState&&this.clearDragState();const n=this.iconButtons.get(e);if(n){this.dragState={championId:e,pointerId:t.pointerId,startX:t.clientX,startY:t.clientY,active:!1,moved:!1};try{(i=n.setPointerCapture)==null||i.call(n,t.pointerId)}catch{}window.addEventListener("pointermove",this.handleWindowPointerMove),window.addEventListener("pointerup",this.handleWindowPointerUp),window.addEventListener("pointercancel",this.handleWindowPointerCancel)}}removeChampionOnMiddleClick(t,e){t.button===tt&&(t.preventDefault(),t.stopPropagation(),this.removeChampion(e))}moveDrag(t){var h;if(!this.dragState||this.dragState.pointerId!==t.pointerId)return;const e=this.dragState.championId,n=t.clientX-this.dragState.startX,i=t.clientY-this.dragState.startY,s=Math.hypot(n,i);if(!this.dragState.active){if(s<oe)return;this.dragState.active=!0,(h=this.iconButtons.get(e))==null||h.classList.add("champion-priority-selector__icon--dragging")}t.preventDefault();const r=this.getDropIndex(t.clientX,e),a=this.selectedChampionIds.indexOf(e);if(r===a||r===-1)return;const c=this.getIconPositions();this.moveChampionToIndex(e,r)&&(this.dragState.moved=!0,this.renderSelectedChampions(c,e))}finishDrag(t){if(!this.dragState||this.dragState.pointerId!==t.pointerId)return;const e=this.dragState.active,n=this.dragState.moved;this.clearDragState(),e&&n&&this.saveConfig()}cancelDrag(t){!this.dragState||this.dragState.pointerId!==t.pointerId||this.clearDragState()}clearDragState(){var i;if(!this.dragState)return;const{championId:t,pointerId:e}=this.dragState,n=this.iconButtons.get(t);n==null||n.classList.remove("champion-priority-selector__icon--dragging");try{(i=n==null?void 0:n.releasePointerCapture)==null||i.call(n,e)}catch{}window.removeEventListener("pointermove",this.handleWindowPointerMove),window.removeEventListener("pointerup",this.handleWindowPointerUp),window.removeEventListener("pointercancel",this.handleWindowPointerCancel),this.dragState=null}getDropIndex(t,e){const n=this.selectedChampionIds.filter(i=>i!==e);for(let i=0;i<n.length;i++){const s=this.iconButtons.get(n[i]);if(!s)continue;const r=s.getBoundingClientRect();if(t<r.left+r.width/2)return i}return n.length}getIconPositions(){const t=new Map;for(const e of this.selectedChampionIds){const n=this.iconButtons.get(e);n&&t.set(e,n.getBoundingClientRect())}return t}animateReorder(t,e){for(const n of this.selectedChampionIds){if(n===e)continue;const i=this.iconButtons.get(n),s=t.get(n);if(!i||!s||typeof i.animate!="function")continue;const r=i.getBoundingClientRect(),a=s.left-r.left,c=s.top-r.top;a===0&&c===0||i.animate([{transform:`translate(${a}px, ${c}px)`},{transform:"translate(0, 0)"}],{duration:ie,easing:se})}}}const re=200,M="auto-select-champ-select-menu--collapsed",ae="auto-select-champ-select-menu-button-wrapper--open";class R{constructor(t,e){this.element=document.createElement(m.radioInputOption),this.element.classList.add("lol-settings-voice-input-mode-option","auto-select-checkbox"),this.element.innerText=t,this.config=null,this.configKey=e,this.setupComplete=!1}setup(){this.syncFromConfig(),this.setupComplete||(this.element.addEventListener("click",()=>this.toggle()),this.setupComplete=!0)}syncFromConfig(){this.config=ut(this.configKey),this.element.toggleAttribute("selected",this.config.enabled===!0)}toggle(){return console.debug("auto-champion-select: Toggling",this.configKey),this.config=T(this.configKey,t=>(t.enabled=!t.enabled,t)),this.element.toggleAttribute("selected",this.config.enabled===!0),this.config.enabled}}class ce{constructor(t,e,n){this.element=document.createElement("div"),this.element.classList.add("auto-select-champ-select-menu",M),this.buttonWrapper=document.createElement("div"),this.buttonWrapper.classList.add("auto-select-champ-select-menu-button-wrapper"),this.headerElement=document.createElement("button"),this.headerElement.classList.add("auto-select-champ-select-menu__header"),this.headerElement.type="button",this.headerElement.setAttribute("aria-label",t),this.headerElement.setAttribute("aria-expanded","false"),this.headerElement.addEventListener("click",()=>this.toggle()),this.contentElement=document.createElement("div"),this.contentElement.classList.add("auto-select-champ-select-menu__content"),this.titleElement=document.createElement("div"),this.titleElement.classList.add("auto-select-champ-select-menu__title"),this.titleElement.textContent=t,this.buttonWrapper.append(this.headerElement,this.element),this.contentElement.appendChild(this.titleElement),this.element.appendChild(this.contentElement),this.returnControlsToSocialRoster=e,this.controlElements=n,this.boundCloseOnOutsideInteraction=i=>this.closeOnOutsideInteraction(i),this.buttonObserver=null,this.buttonMountFrame=null,this.buttonMountTask=null,this.hiddenStates=new WeakMap,this.mounted=!1}async mount(){return this.mounted?this.mountButton():(this.mounted=!0,this.controlElements.forEach(t=>{this.hiddenStates.set(t,t.classList.contains("hidden")),t.classList.remove("hidden"),this.contentElement.appendChild(t)}),this.observeButtonContainer(),document.addEventListener("pointerdown",this.boundCloseOnOutsideInteraction,!0),this.mountButton())}unmount(){return this.mounted?(this.mounted=!1,this.stopButtonMounting(),document.removeEventListener("pointerdown",this.boundCloseOnOutsideInteraction,!0),this.setOpen(!1),this.buttonWrapper.remove(),this.restoreHiddenStates(),this.returnControlsToSocialRoster()):this.returnControlsToSocialRoster()}stopButtonMounting(){var t;(t=this.buttonObserver)==null||t.disconnect(),this.buttonObserver=null,this.buttonMountFrame!==null&&(cancelAnimationFrame(this.buttonMountFrame),this.buttonMountFrame=null),this.buttonMountTask=null}restoreHiddenStates(){this.controlElements.forEach(t=>{t.classList.toggle("hidden",this.hiddenStates.get(t)===!0),this.hiddenStates.delete(t)})}isOpen(){return!this.element.classList.contains(M)}setOpen(t){this.element.classList.toggle(M,!t),this.buttonWrapper.classList.toggle(ae,t),this.headerElement.setAttribute("aria-expanded",String(t))}toggle(){this.setOpen(!this.isOpen())}closeOnOutsideInteraction(t){if(!this.isOpen())return;(typeof t.composedPath=="function"?t.composedPath():[]).includes(this.buttonWrapper)||this.buttonWrapper.contains(t.target)||this.setOpen(!1)}observeButtonContainer(){this.buttonObserver=new MutationObserver(()=>this.scheduleMountButton()),this.buttonObserver.observe(document.body,{childList:!0,subtree:!0})}scheduleMountButton(){this.buttonMountFrame===null&&(this.buttonMountFrame=requestAnimationFrame(()=>{this.buttonMountFrame=null,this.mountButton()}))}mountButton(){return this.buttonMountTask||(this.buttonMountTask=this.appendButtonToContainer().finally(()=>{this.buttonMountTask=null})),this.buttonMountTask}async appendButtonToContainer(){let t=D();for(;this.mounted&&!t;)await g(re),t=D();if(!this.mounted||!t)return;const e=t.querySelector(l.firstChampSelectSquareButton);this.buttonWrapper.parentNode===t&&this.buttonWrapper.nextSibling===e||t.insertBefore(this.buttonWrapper,e)}}class le{constructor(t,...e){this.element=document.createElement(m.socialRosterGroup),this.element.addEventListener("post-render",()=>this.onPostRender()),this.element.addEventListener("click",()=>this.onClick()),this.label=t,this.collapsibleElements=e,this.waitRender()}waitRender(){new MutationObserver((t,e)=>{if(this.element.querySelector(l.socialRosterGroupLabel)){const n=new Event("post-render");this.element.dispatchEvent(n),e.disconnect()}}).observe(this.element,{childList:!0})}onPostRender(){var t;this.element.querySelector(l.socialRosterGroupLabel).innerText=this.label,(t=this.element.querySelector(l.socialRosterGroupHeader))==null||t.removeAttribute("draggable")}onClick(){var t;this.collapsibleElements.forEach(e=>{e.closest(".auto-select-champ-select-menu")||e.classList.toggle("hidden")}),(t=this.element.querySelector(l.socialRosterGroupArrow))==null||t.toggleAttribute("open")}}function yt(o){var t,e;o&&((e=(t=globalThis.Toast)==null?void 0:t.success)==null||e.call(t,o))}function N(o){var t,e;o&&((e=(t=globalThis.Toast)==null?void 0:t.error)==null||e.call(t,o))}function de(o,t){const e=globalThis.Toast;return typeof(e==null?void 0:e.promise)=="function"?e.promise(o,t):o}const E="Balaclava: Auto Champion Select";function he(o){return typeof(o==null?void 0:o.then)=="function"}class q{constructor({id:t,name:e,legend:n,tags:i,group:s,callback:r,toasts:a}){this.id=t,this.name=e,this.legend=n,this.tags=i,this.group=s,this.perform=this.perform.bind(this),this.callback=r,this.toasts=a}perform(){try{const t=this.callback();if(he(t))return de(t,{loading:this.toasts.loading,success:this.toasts.success,error:this.toasts.error});const e=this.toasts.success||(t?this.toasts.on:this.toasts.off);yt(e)}catch(t){N(this.toasts.error),console.error(t)}}}class At extends q{constructor(t,e,n){super({id:`${e}Switch`,name:()=>`Auto ${t} [${b(e).enabled?"ON":"OFF"}]`,legend:()=>b(e).enabled?"Turn OFF":"Turn ON",tags:[E,e,"switch"],group:E,callback:n,toasts:{on:`Auto ${t} is ON!`,off:`Auto ${t} is OFF!`,error:`Failed to toggle Auto ${t}. Check console.`}})}}function ue(o){return T(o,e=>(e.force=!e.force,e)).force}class Et extends q{constructor(t,e){super({id:`${e}ForceSwitch`,name:()=>`Force ${t} [${b(e).force?"ON":"OFF"}]`,legend:()=>`Ignore team intent and force ${t} the selected champion`,tags:[E,e,"force","switch"],group:E,callback:()=>ue(e),toasts:{on:`Force ${t} is ON!`,off:`Force ${t} is OFF!`,error:`Failed to toggle Force ${t}. Check console.`}})}}class pe extends q{constructor(t){super({id:"RefreshDropdowns",name:()=>"Refresh Champions",legend:()=>"Normally champion selectors refresh automatically...",tags:[E,"refresh"],group:E,callback:t,toasts:{success:"Refreshed Champions!",error:"Failed to refresh Champions. Check console."}})}}class me extends At{constructor(t){super("Pick","controladoPick",t)}}class fe extends At{constructor(t){super("Ban","controladoBan",t)}}class ge extends Et{constructor(){super("Pick","controladoPick")}}class Ce extends Et{constructor(){super("Ban","controladoBan")}}function we(o){for(const t of o)CommandBar.addAction(t)}const be=200,ye=6e4,nt=2e3,Ae=".ready-check-root-element",Ee="#lol-uikit-layer-manager-wrapper > .modal",Se="Accepted ready check!",ot="Failed to accept ready check. Check console.",Pe=".auto-select-champ-select-menu__header",A=Object.freeze({autoAccept:"controladoAutoAccept",pick:"controladoPick",ban:"controladoBan"});function St(){return b(A.autoAccept).enabled===!0}class Ie{constructor(t){this.isEnabled=t,this.observer=null,this.hiddenModal=null,this.hiddenModalStyles=new WeakMap,this.sync=this.sync.bind(this)}start(){this.observer||(this.observer=new MutationObserver(()=>this.sync()),this.observer.observe(document.body,{childList:!0,subtree:!0}),this.sync())}sync(){const t=ke();if(!t){this.restore();return}if(!this.isEnabled()){this.restore();return}this.hide(t)}hide(t){this.hiddenModal!==t&&(this.restore(),this.hiddenModal=t,this.hiddenModalStyles.set(t,{display:t.style.getPropertyValue("display"),displayPriority:t.style.getPropertyPriority("display"),pointerEvents:t.style.getPropertyValue("pointer-events"),pointerEventsPriority:t.style.getPropertyPriority("pointer-events")}),t.style.setProperty("display","none","important"),t.style.setProperty("pointer-events","none","important"))}restore(){if(!this.hiddenModal)return;const t=this.hiddenModal,e=this.hiddenModalStyles.get(t);it(t,"display",e==null?void 0:e.display,e==null?void 0:e.displayPriority),it(t,"pointer-events",e==null?void 0:e.pointerEvents,e==null?void 0:e.pointerEventsPriority),this.hiddenModalStyles.delete(t),this.hiddenModal=null}}function ke(){const o=document.querySelector(Ae);return(o==null?void 0:o.closest(Ee))||null}function it(o,t,e,n){e?o.style.setProperty(t,e,n||""):o.style.removeProperty(t)}async function Te(o){function t(){return St()?!1:(o.restore(),!0)}if(t()||(console.debug(`auto-champion-select(auto-accept): Ready check detected, accepting in ${nt}ms...`),await g(nt),t()))return;let e=!1;try{e=await Oe()}catch(n){throw o.restore(),N(ot),n}e?yt(Se):(o.restore(),N(ot))}async function Oe(){const o=await w("POST",p.readyCheckAccept);return o.ok?(console.debug("auto-champion-select(auto-accept): Accepted ready check"),!0):(console.error("auto-champion-select(auto-accept): Failed to accept ready check",o),!1)}async function _e(o){const t=await w("GET",p.gameflowPhase),e=t.ok?await t.json():null;o.handleGameflowPhase(e)}function ve({championSelect:o,champSelectControlsMenu:t,readyCheckModalSuppressor:e,setupChampionSelectors:n}){let i=0;return async function(c){const h=++i;try{await s(c,h)}catch(u){console.error("auto-champion-select: Failed to handle gameflow phase",u)}};async function s(a,c){a==="ReadyCheck"?Te(e).catch(h=>{console.error("auto-champion-select(auto-accept): Failed to handle ready check",h)}):e.restore(),await r(a),c===i&&await n()}async function r(a){a==="ChampSelect"?(o.mount(),await t.mount()):(o.unmount(),await t.unmount())}}function Le(){const o=new Wt,t=new R("Accept",A.autoAccept),e=new R("Pick",A.pick),n=new et("Add pick",A.pick,zt,{enablePositionRestrictions:!0,quickActionLabel:"Pick instantly"}),i=new R("Ban",A.ban),s=new et("Add ban",A.ban,Ut,{quickActionLabel:"Ban instantly"}),r=Me(n,s),a=Re(t,e,i),c=new le("Auto champion select",r,a);return{championSelect:o,autoAcceptToggle:t,pickToggle:e,banToggle:i,pickChampionSelector:n,banChampionSelector:s,selectorsContainer:r,checkboxesContainer:a,pluginSection:c,championSelectors:[n,s]}}function Me(...o){const t=document.createElement("div");return t.append(...o.map(e=>e.element)),t}function Re(...o){const t=document.createElement("div");return t.classList.add("auto-select-checkboxes-div"),t.append(...o.map(e=>e.element)),t}function xe({pluginSection:o,checkboxesContainer:t,selectorsContainer:e}){let n=null,i=0,s=()=>!1;async function r(a){let c=V();for(;!c;){if(s()||a!==i)return;await g(be),c=V()}s()||a!==i||c.append(o.element,t,e)}return{setIsChampSelectControlsMounted(a){s=a},returnControlsToSocialRoster(){if(n)return n;const a=++i;return n=r(a).catch(c=>console.error("auto-champion-select: Failed to return controls to social roster",c)).finally(()=>{n=null}),n}}}function Be({autoAcceptToggle:o,pickToggle:t,banToggle:e,readyCheckModalSuppressor:n}){o.setup(),o.element.addEventListener("click",()=>n.sync()),t.setup(),e.setup()}async function De(o){await Promise.all(o.map(t=>t.setup()))}async function Ne(o){await Promise.all(o.map(t=>t.refresh()))}function $e(){const o=Le(),t=new Ie(St),e=xe(o),n=new ce("Auto Champion Select",e.returnControlsToSocialRoster,[o.checkboxesContainer,o.selectorsContainer]);e.setIsChampSelectControlsMounted(()=>n.mounted);const i={...o,champSelectControlsMenu:n,readyCheckModalSuppressor:t,setupToggles:()=>Be({...o,readyCheckModalSuppressor:t}),setupChampionSelectors:()=>De(o.championSelectors),refreshChampionSelectors:()=>Ne(o.championSelectors),refreshPickChampionSelector:async()=>{await o.pickChampionSelector.refresh()}};return i.handleGameflowPhase=ve(i),i}function Fe(o){z(p.gameflowPhase,t=>{o.handleGameflowPhase(t.data)}),z(p.wallet,async t=>{if(t.eventType==="Update"){console.debug("auto-champion-select(wallet): Refreshing champion selectors...");try{await o.refreshPickChampionSelector()}catch(e){console.error("auto-champion-select(wallet): Failed to refresh champion selectors",e)}}})}function qe({pickToggle:o,banToggle:t,refreshChampionSelectors:e}){we([new me(()=>o.toggle()),new fe(()=>t.toggle()),new ge,new Ce,new pe(e)])}function ze(o){let t=null,e=null;function n(){e==null||e.disconnect(),e=null,t!==null&&(cancelAnimationFrame(t),t=null)}const i=setTimeout(()=>{n()},ye);function s(){if(!(D()!==null))return;clearTimeout(i),n(),document.querySelector(Pe)!==null||o.handleGameflowPhase("ChampSelect")}e=new MutationObserver(()=>{t===null&&(t=requestAnimationFrame(()=>{t=null,s()}))}),e.observe(document.body,{childList:!0,subtree:!0}),s()}async function Ue(){const o=$e();o.setupToggles(),o.readyCheckModalSuppressor.start(),qe(o),Fe(o),await _e(o),ze(o),console.debug(`auto-champion-select(${Pt}): Report bugs to Balaclava#1912`)}let st=!1;function rt(){st||(st=!0,Ue().catch(o=>console.error("auto-champion-select: Failed to initialize",o)))}document.readyState==="loading"?window.addEventListener("load",rt,{once:!0}):rt();export{rt as load};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auto-champion-select",
3
- "version": "1.8.7",
3
+ "version": "1.8.9",
4
4
  "description": "Pick or ban automatically! 🐧",
5
5
  "author": "balaclava",
6
6
  "repository": {