apiroyale
Version:
A Node.js library to interact with the Clash Royale API
2 lines (1 loc) • 20.3 kB
JavaScript
var ge=Object.create;var R=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames;var Pe=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var ye=(a,e)=>{for(var t in e)R(a,t,{get:e[t],enumerable:!0})},P=(a,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ae(e))!Re.call(a,r)&&r!==t&&R(a,r,{get:()=>e[r],enumerable:!(n=pe(e,r))||n.enumerable});return a},f=(a,e,t)=>(P(a,e,"default"),t&&P(t,e,"default")),Y=(a,e,t)=>(t=a!=null?ge(Pe(a)):{},P(e||!a||!a.__esModule?R(t,"default",{value:a,enumerable:!0}):t,a)),Ce=a=>P(R({},"__esModule",{value:!0}),a);var u={};ye(u,{APIDateToObject:()=>xe,APIRequest:()=>Q,ArenaManager:()=>C,BattleListManager:()=>x,ChallengeChainManager:()=>I,ChallengeManager:()=>v,ChestListManager:()=>L,ClanManager:()=>T,ClanWarLogManager:()=>b,ClientRoyale:()=>j,Collection:()=>m,Constants:()=>F,CurrentRiverRaceManager:()=>E,ErrorRoyale:()=>D,Errors:()=>c,GameModeManager:()=>w,ItemManager:()=>k,LadderTournamentManager:()=>S,LadderTournamentRankingManager:()=>M,LeagueSeasonManager:()=>K,LocationManager:()=>O,Manager:()=>l,PlayerManager:()=>q,Queue:()=>y,Response:()=>G,Rest:()=>z,RiverRaceLogEntryManager:()=>U,TournamentManager:()=>N,cast:()=>ve,dateObjectToAPIDate:()=>Ie,default:()=>Le});module.exports=Ce(u);var fe=Y(require("events"));var F=(s=>(s.acceptHeader="application/json",s.authorizationHeaderPrefix="Bearer ",s.baseURL="https://api.clashroyale.com/v1",s[s.defaultAbortTimeout=1e4]="defaultAbortTimeout",s[s.minClanNameLength=3]="minClanNameLength",s[s.minTournamentNameLength=3]="minTournamentNameLength",s))(F||{}),c={missingAfter:()=>"The next page isn't available",missingBefore:()=>"The previous page isn't available",missingQuery:()=>"You didn't provide any query",requestAborted:(a,e)=>`Request to path ${a} took more than ${e} milliseconds and was aborted before ending`,requestError:(a,e)=>`Request to ${a.href} failed with reason: ${e.message}`,restRateLimited:()=>"The rest is ratelimited so no other requests are allowed until you set the force option to true",tokenMissing:()=>"No token provided for the client",clanMaxMembersTooLow:()=>"The maximum number of members must be greater than or equal to the minimum and positive",clanMinMembersNotPositive:()=>"The minimum number of members must be a positive number",clanMinScoreNotPositive:()=>"The minimum score must be a positive number",clanNameSearchTooShort:()=>`The clan name must be at least ${3} characters long`,tournamentNameSearchTooShort:()=>`The tournament name must be at least ${3} characters long`},Z=F;var xe=a=>new Date(Number(a.slice(0,4)),Number(a.slice(4,6))-1,Number(a.slice(6,8)),Number(a.slice(9,11)),Number(a.slice(11,13)),Number(a.slice(13,15))),Ie=a=>a!=null?`${a.getFullYear()}${(a.getMonth()+1).toString().padStart(2,"0")}${a.getDate().toString().padStart(2,"0")}T${a.getHours().toString().padStart(2,"0")}${a.getMinutes().toString().padStart(2,"0")}${a.getSeconds().toString().padStart(2,"0")}.000Z`:"19691231T235959.000Z";function ve(a){}var X=Y(require("@discordjs/collection")),m=class extends X.default{array(){return[...this.values()]}clone(){return new m(this)}concat(...e){let t=this.clone();for(let n of e)for(let[r,i]of n)t.set(r,i);return t}difference(e){let t=new m;for(let[n,r]of e)this.has(n)||t.set(n,r);for(let[n,r]of this)e.has(n)||t.set(n,r);return t}equals(e){if(this===e)return!0;if(this.size!==e.size)return!1;for(let[t]of this)if(!e.has(t))return!1;return!0}filter(e,t){typeof t<"u"&&(e=e.bind(t));let n=new m;for(let[r,i]of this)e(i,r,this)&&n.set(r,i);return n}flatMap(e,t){return new m().concat(...this.map(e,t))}indexOf(e){return[...this.values()].indexOf(e)}intersect(e){let t=new m;for(let[n,r]of e)this.has(n)&&t.set(n,r);return t}mapValues(e,t){typeof t<"u"&&(e=e.bind(t));let n=new m;for(let[r,i]of this)n.set(r,e(i,r,this));return n}partition(e,t){typeof t<"u"&&(e=e.bind(t));let n=[new m,new m];for(let[r,i]of this)n[Number(!e(i,r,this))].set(r,i);return n}slice(e,t){return new m([...this.entries()].slice(e,t))}sorted(e){return new m(this).sort(e&&((t,n,r,i)=>e(t,n,r,i)))}toJSON(){return super.toJSON()}merge(){throw new Error("This method is not supported.")}};var y=class{constructor(){this.promises=[]}wait(){let e,t=this.promises.at(-1)?.promise??Promise.resolve(),n=new Promise(r=>{e=r});return this.promises.push({resolve:e,promise:n}),t}next(){this.promises.shift()?.resolve()}};var h=Z;var l=class extends m{constructor(e,t,...n){super(n);this.maxAges={};this.options=t,this.client=e}add(e,t,n={}){if(!(n.cache??this.client.cacheOptions.cache))return t;let r=this.get(e);if(this.maxAges[e]=n.maxAge,r===void 0)return this.set(e,t),this.options.addEvent&&this.client.emit(this.options.addEvent,t),t;let i={...r};for(let s in t)Object.prototype.hasOwnProperty.call(t,s)&&(r[s]=t[s]);return this.options.updateEvent&&this.client.emit(this.options.updateEvent,i,r),r}isOutdated(e){return this.maxAges[e]!==void 0&&Date.now()>this.maxAges[e]}remove(e){let t=this.get(e);if(t!==void 0)return this.delete(e),delete this.maxAges[e],this.options.removeEvent&&this.client.emit(this.options.removeEvent,t),t}},d=l;var C=class extends d{constructor(e,...t){super(e,{addEvent:"arenaAdd",removeEvent:"arenaRemove",updateEvent:"arenaUpdate"},...t.map(n=>[n.id,n]))}};var _=require("royale-api-types");var x=class extends d{constructor(e){super(e,{addEvent:"battleListAdd",updateEvent:"battleListUpdate",removeEvent:"battleListRemove"})}add(e,t,n){if(n?.cacheNested??this.client.cacheOptions.cacheNested)for(let r of t)this.client.gameModes.add(r.gameMode.id,r.gameMode,n),this.client.arenas.add(r.arena.id,r.arena,n);return super.add(e,t,n)}async fetch(e,t={}){let n=this.get(e);if(n&&t.force!==!0&&!this.isOutdated(e))return n;let r=await this.client.api.get(_.Routes.BattleLog(e));return this.add(e,r.data,{maxAge:r.maxAge,...t})}};var ee=require("royale-api-types");var I=class extends l{constructor(e,...t){super(e,{addEvent:"challengeChainAdd",removeEvent:"challengeChainRemove",updateEvent:"challengeChainUpdate"},...t.map(n=>[n.startTime,n]))}add(e,t,n){if(n?.cacheNested??this.client.cacheOptions.cacheNested)for(let r of t.challenges)this.client.challenges.add(r.id,r,n);return super.add(e,t,n)}async fetch(e){let t=this.last();if(t&&e.force!==!0&&!this.isOutdated(t.startTime))return this.array();let n=await this.client.api.get(ee.Routes.Challenges());for(let r of n.data)this.add(r.startTime,r,{maxAge:n.maxAge,...e});return n.data}};var v=class extends d{constructor(e,...t){super(e,{addEvent:"challengeAdd",removeEvent:"challengeRemove",updateEvent:"challengeUpdate"},...t.map(n=>[n.id,n]))}add(e,t,n){return(n?.cacheNested??this.client.cacheOptions.cacheNested)&&this.client.gameModes.add(t.gameMode.id,t.gameMode,n),super.add(e,t,n)}};var te=require("royale-api-types");var L=class extends d{constructor(e){super(e,{addEvent:"chestListAdd",updateEvent:"chestListUpdate",removeEvent:"chestListRemove"})}async fetch(e,t={}){let n=this.get(e);if(n&&t.force!==!0&&!this.isOutdated(e))return n;let r=await this.client.api.get(te.Routes.UpcomingChests(e));return this.add(e,r.data.items,{maxAge:r.maxAge,...t})}};var A=require("royale-api-types");var T=class extends l{constructor(e,...t){super(e,{addEvent:"clanAdd",removeEvent:"clanRemove",updateEvent:"clanUpdate"},...t.map(n=>[n.tag,n]))}add(e,t,n){if(n?.cacheNested??this.client.cacheOptions.cacheNested){if("memberList"in t)for(let r of t.memberList)this.client.players.add(r.tag,r,n);"location"in t&&this.client.locations.add(t.location.id,t.location,n)}return super.add(e,t,n)}async fetch(e,t={}){let n=this.get(e);if(n&&t.force!==!0&&"memberList"in n&&!this.isOutdated(e))return n;let r=await this.client.api.get(A.Routes.Clan(e));return this.add(r.data.tag,r.data,{maxAge:r.maxAge,...t})}async fetchMembers(e,t={}){let n={};t.limit!==void 0&&(n.limit=t.limit.toString()),t.after!==void 0&&(n.after=t.after),t.before!==void 0&&(n.before=t.before);let r=await this.client.api.get(A.Routes.ClanMembers(e),{query:n});for(let i of r.data.items)this.client.players.add(i.tag,i,{maxAge:r.maxAge,...t});return r.data}async fetchRankings(e,t){let n={};t.limit!==void 0&&(n.limit=t.limit.toString()),t.after!==void 0&&(n.after=t.after),t.before!==void 0&&(n.before=t.before);let r=await this.client.api.get(A.Routes.ClanRankings(e),{query:n});for(let i of r.data.items)this.add(i.tag,i,{maxAge:r.maxAge,...t});return r.data}async fetchWarRankings(e,t){let n={};t.limit!==void 0&&(n.limit=t.limit.toString()),t.after!==void 0&&(n.after=t.after),t.before!==void 0&&(n.before=t.before);let r=await this.client.api.get(A.Routes.ClanWarRankings(e),{query:n});for(let i of r.data.items)this.add(i.tag,i,{maxAge:r.maxAge,...t});return r.data}async search(e){let t={},n=!1;if(e.name!==void 0){if(e.name.length<h.minClanNameLength)throw new TypeError(c.clanNameSearchTooShort());t.name=e.name,n||=!0}if(e.minMembers!==void 0){if(e.minMembers<1)throw new TypeError(c.clanMinMembersNotPositive());t.minMembers=e.minMembers.toString(),n||=!0}if(e.maxMembers!==void 0){if(e.maxMembers<(e.minMembers??1))throw new TypeError(c.clanMaxMembersTooLow());t.maxMembers=e.maxMembers.toString(),n||=!0}if(e.minScore!==void 0){if(e.minScore<1)throw new TypeError(c.clanMinScoreNotPositive());t.minScore=e.minScore.toString(),n||=!0}if(!n)throw new TypeError(c.missingQuery());e.limit!==void 0&&(t.limit=e.limit.toString()),e.after!==void 0&&(t.after=e.after),e.before!==void 0&&(t.before=e.before);let r=await this.client.api.get(A.Routes.Clans(),{query:t});for(let i of r.data.items)this.add(i.tag,i,{maxAge:r.maxAge,...e});return r.data}};var b=class extends d{constructor(e){super(e,{addEvent:"clanWarLogAdd",updateEvent:"clanWarLogUpdate"})}fetch(e){throw new Error("The WarLog API endpoint has been temporarily disabled, possibilities to bring it back are being investigated.")}};var ne=require("royale-api-types");var E=class extends l{constructor(e,...t){super(e,{addEvent:"currentRiverRaceAdd",removeEvent:"currentRiverRaceRemove",updateEvent:"currentRiverRaceUpdate"},...t.map(n=>[n.clan.tag,n]))}add(e,t,n){if(n?.cacheNested??this.client.cacheOptions.cacheNested)for(let r of t.clans)this.client.clans.add(r.tag,r,n);return super.add(e,t,n)}async fetch(e,t={}){let n=this.get(e);if(n&&t.force!==!0&&!this.isOutdated(e))return n;let r=await this.client.api.get(ne.Routes.CurrentRiverRace(e));return this.add(e,r.data,{maxAge:r.maxAge,...t})}};var w=class extends d{constructor(e,...t){super(e,{addEvent:"gameModeAdd",removeEvent:"gameModeRemove",updateEvent:"gameModeUpdate"},...t.map(n=>[n.id,n]))}};var re=require("royale-api-types");var k=class extends l{constructor(e,...t){super(e,{addEvent:"itemAdd",removeEvent:"itemRemove",updateEvent:"itemUpdate"},...t.map(n=>[n.id,n]))}async fetch(e={}){let t={};e.limit!==void 0&&(t.limit=e.limit.toString()),e.after!==void 0&&(t.after=e.after),e.before!==void 0&&(t.before=e.before);let n=await this.client.api.get(re.Routes.Cards(),{query:t});for(let r of n.data.items)this.add(r.id,r,{maxAge:n.maxAge,...e});return n.data}};var ae=require("royale-api-types");var S=class extends l{constructor(e,...t){super(e,{addEvent:"ladderTournamentAdd",removeEvent:"ladderTournamentRemove",updateEvent:"ladderTournamentUpdate"},...t.map(n=>[n.tag,n]))}async fetch(e){let t=this.last();if(t&&e.force!==void 0&&!this.isOutdated(t.tag))return this.array();let n=await this.client.api.get(ae.Routes.GlobalTournaments());for(let r of n.data.items)this.add(r.tag,r,{maxAge:n.maxAge,...e});return n.data.items}};var ie=require("royale-api-types");var M=class extends d{constructor(e){super(e,{addEvent:"ladderTournamentRankingAdd",updateEvent:"ladderTournamentRankingUpdate",removeEvent:"ladderTournamentRankingRemove"})}add(e,t,n){return(n?.cacheNested??this.client.cacheOptions.cacheNested)&&this.client.clans.add(t.clan.tag,t.clan,n),super.add(e,t,n)}async fetch(e,t={}){let n={};t.limit!==void 0&&(n.limit=t.limit.toString()),t.after!==void 0&&(n.after=t.after),t.before!==void 0&&(n.before=t.before);let r=await this.client.api.get(ie.Routes.GlobalTournamentRankings(e),{query:n});for(let i of r.data.items)this.add(`${e}-${i.tag}`,i,{maxAge:r.maxAge,...t});return r.data}for(e){return this.filter((t,n)=>n.startsWith(e))}};var H=require("royale-api-types");var K=class extends l{constructor(e,...t){super(e,{addEvent:"leagueSeasonAdd",removeEvent:"leagueSeasonRemove",updateEvent:"leagueSeasonUpdate"},...t.map(n=>[n.id,n]))}async fetch(e={},t={}){if(typeof e=="string"){let i=this.get(e);if(i&&t.force!==!0&&!this.isOutdated(e))return i;let s=await this.client.api.get(H.Routes.Season(e));return this.add(s.data.id,s.data,{maxAge:s.maxAge,...t})}let n={};e.limit!==void 0&&(n.limit=e.limit.toString()),e.after!==void 0&&(n.after=e.after),e.before!==void 0&&(n.before=e.before);let r=await this.client.api.get(H.Routes.Seasons(),{query:n});for(let i of r.data.items)this.add(i.id,i,{maxAge:r.maxAge,...e});return r.data}};var W=require("royale-api-types");var O=class extends l{constructor(e,...t){super(e,{addEvent:"locationAdd",removeEvent:"locationRemove",updateEvent:"locationUpdate"},...t.map(n=>[n.id,n]))}async fetch(e={},t={}){if(typeof e=="number"){let i=this.get(e);if(i&&t.force!==!0&&!this.isOutdated(e))return i;let s=await this.client.api.get(W.Routes.Location(e));return this.add(s.data.id,s.data,{maxAge:s.maxAge})}let n={};e.limit!==void 0&&(n.limit=e.limit.toString()),e.after!==void 0&&(n.after=e.after),e.before!==void 0&&(n.before=e.before);let r=await this.client.api.get(W.Routes.Locations(),{query:n});for(let i of r.data.items)this.add(i.id,i,{maxAge:r.maxAge,...t});return r.data}};var V=require("royale-api-types");var q=class extends l{constructor(e,...t){super(e,{addEvent:"playerAdd",removeEvent:"playerRemove",updateEvent:"playerUpdate"},...t.map(n=>[n.tag,n]))}add(e,t,n){return(n?.cacheNested??this.client.cacheOptions.cacheNested)&&("clan"in t&&t.clan&&this.client.clans.add(t.clan.tag,t.clan,n),t.arena&&this.client.arenas.add(t.arena.id,t.arena,n),"currentFavouriteCard"in t&&t.currentFavouriteCard&&this.client.cards.add(t.currentFavouriteCard.id,t.currentFavouriteCard,n)),super.add(e,t,n)}async fetch(e,t={}){let n=this.get(e);if(n&&t.force!==!0&&"cards"in n&&!this.isOutdated(e))return n;let r=await this.client.api.get(V.Routes.Player(e));return this.add(r.data.tag,r.data,{maxAge:r.maxAge,...t})}async fetchRankings(e,t={}){let n={};t.limit!==void 0&&(n.limit=t.limit.toString()),t.after!==void 0&&(n.after=t.after),t.before!==void 0&&(n.before=t.before);let r=await this.client.api.get(V.Routes.PlayerRankings(e),{query:n});for(let i of r.data.items)this.add(i.tag,i,{maxAge:r.maxAge,...t});return r.data}async fetchSeasonRankings(e,t={}){let n={};t.limit!==void 0&&(n.limit=t.limit.toString()),t.after!==void 0&&(n.after=t.after),t.before!==void 0&&(n.before=t.before);let r=await this.client.api.get(V.Routes.TopPlayerRankings(e),{query:n});for(let i of r.data.items)this.add(i.tag,i,{maxAge:r.maxAge,...t});return r.data}};var oe=require("royale-api-types");var U=class extends d{constructor(e){super(e,{addEvent:"riverRaceLogEntryAdd",updateEvent:"riverRaceLogEntryUpdate",removeEvent:"riverRaceLogEntryRemove"})}async fetch(e,t={}){let n={};t.limit!==void 0&&(n.limit=t.limit.toString()),t.after!==void 0&&(n.after=t.after),t.before!==void 0&&(n.before=t.before);let r=await this.client.api.get(oe.Routes.RiverRaceLog(e),{query:n});for(let i of r.data.items)this.add(`${e}-${i.seasonId}-${i.sectionIndex}`,i,{maxAge:r.maxAge,...t});return r.data}for(e){return this.filter((t,n)=>n.startsWith(e))}};var B=require("royale-api-types");var N=class extends l{constructor(e,...t){super(e,{addEvent:"tournamentAdd",removeEvent:"tournamentRemove",updateEvent:"tournamentUpdate"},...t.map(n=>[n.tag,n]))}async fetch(e,t={}){let n=this.get(e);if(n&&t.force!==!0&&"membersList"in n&&!this.isOutdated(e))return n;let r=await this.client.api.get(B.Routes.Tournament(e));return this.add(r.data.tag,r.data,{maxAge:r.maxAge,...t})}async search(e){let t={},n=!1;if(e.name!==void 0){if(e.name.length<h.minTournamentNameLength)throw new TypeError(c.tournamentNameSearchTooShort());t.name=e.name,n||=!0}if(!n)throw new TypeError(c.missingQuery());e.limit!==void 0&&(t.limit=e.limit.toString()),e.after!==void 0&&(t.after=e.after),e.before!==void 0&&(t.before=e.before);let r=await this.client.api.get(B.Routes.Tournaments(),{query:t});for(let i of r.data.items)this.add(i.tag,i,{maxAge:r.maxAge,...e});return r.data}};var ce=require("process");var le=require("https"),$=require("url");var G=class{constructor(e,t){this.data=e||null,this.statusCode=t.statusCode,this.headers=t.headers,this.status=t.statusMessage}},se=G;var Q=class{constructor(e,t,{query:n,headers:r}={}){this.path=t,this.rest=e,this.query=new $.URLSearchParams(n),this.headers={Accept:h.acceptHeader,Authorization:`${h.authorizationHeaderPrefix} ${e.options.token}`,...r}}get url(){let e=new $.URL(this.rest.options.baseURL);return e.pathname+=this.path,e.search=this.query.toString(),e}send(){return this.rest.client?.emit("requestStart",this),new Promise((e,t)=>{this.make(e,t)})}make(e,t){let n="",{abortTimeout:r}=this.rest.options,i=setTimeout(()=>{s.destroy(new Error(c.requestAborted(this.path,r)))},r).unref(),s=(0,le.get)(this.url,{headers:this.headers},g=>{if([301,302].includes(g.statusCode)&&g.headers.location!=null){this.url.href=g.headers.location,this.url.search=this.query.toString();for(let p of["authorization","www-authenticate","cookie","cookie2"])delete this.headers[p];this.make(e,t);return}g.on("data",p=>{n+=p}),g.once("end",()=>{if(!g.complete)return;clearTimeout(i);let p=new se(n,g);e(p),this.rest.client?.emit("requestEnd",this,p)})});s.once("error",g=>{t(new Error(c.requestError(this.url,g)))}),s.end()}},de=Q;var D=class extends Error{constructor(e,t){let n=e.query.toString(),r;t.data!=null&&(r=JSON.parse(t.data).message),r==null&&(r=t.status);super(r);n&&(this.query=n),this.headers=e.headers,this.path=e.path,this.status=t.status,this.statusCode=t.statusCode}},J=D;var z=class{constructor(e,t={}){this.options={baseURL:h.baseURL,token:ce.env.CLASH_ROYALE_TOKEN,abortTimeout:h.defaultAbortTimeout};this.queue=new y;this.rateLimited=!1;if(this.client=e,t.token!==void 0&&(this.options.token=t.token),!this.options.token)throw new TypeError(c.tokenMissing());t.baseURL!==void 0&&(this.options.baseURL=t.baseURL),t.abortTimeout!==void 0&&(this.options.abortTimeout=t.abortTimeout)}async get(e,t){if(await this.queue.wait(),this.rateLimited&&t?.force!==!0)throw new Error(c.restRateLimited());let n=new de(this,e,t),r=await n.send(),i;if(r.statusCode===429)throw this.rateLimited=!0,this.queue.next(),new J(n,r);if(r.statusCode>=200&&r.statusCode<300)i=r.data!=null?JSON.parse(r.data):null;else if(r.statusCode>=300&&r.statusCode<400)i=null;else if(r.statusCode>=500&&t?.retry===!0)return this.queue.next(),this.get(e,{...t,retry:!1});let s=r.headers["cache-control"]?.match(/max-age=(\d+)/)?.[1];if(this.queue.next(),i!==void 0)return{data:i,maxAge:Date.now()+(s!==void 0?parseInt(s,10):0)};throw new J(n,r)}},me=z;var ue=me;var j=class extends fe.default{constructor(e={}){super();this.cacheOptions={cache:!0,cacheNested:!0};this.arenas=new C(this);this.battleLogs=new x(this);this.cards=new k(this);this.challenges=new v(this);this.challengeChains=new I(this);this.clans=new T(this);this.clanWarLogs=new b(this);this.currentRiverRaces=new E(this);this.gameModes=new w(this);this.globalTournamentRankings=new M(this);this.globalTournaments=new S(this);this.riverRaceLogs=new U(this);this.tournaments=new N(this);this.upcomingChests=new L(this);this.seasons=new K(this);this.locations=new O(this);this.players=new q(this);this.api=new ue(this,e),e.cache!==void 0&&(this.cacheOptions.cache=e.cache),e.cacheNested!==void 0&&(this.cacheOptions.cacheNested=e.cacheNested)}},he=j;f(u,require("royale-api-types"),module.exports);var Le=he;0&&(module.exports={APIDateToObject,APIRequest,ArenaManager,BattleListManager,ChallengeChainManager,ChallengeManager,ChestListManager,ClanManager,ClanWarLogManager,ClientRoyale,Collection,Constants,CurrentRiverRaceManager,ErrorRoyale,Errors,GameModeManager,ItemManager,LadderTournamentManager,LadderTournamentRankingManager,LeagueSeasonManager,LocationManager,Manager,PlayerManager,Queue,Response,Rest,RiverRaceLogEntryManager,TournamentManager,cast,dateObjectToAPIDate});