clashofclans.js 2.8.2 → 3.0.0-dev.29c3270

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.
@@ -1,11 +1,33 @@
1
1
  /// <reference types="node" />
2
+ import { EventEmitter } from 'node:events';
2
3
  import { ClanSearchOptions, SearchOptions, ClientOptions, LoginOptions, OverrideOptions } from '../types';
3
- import { EVENTS, CWL_ROUNDS } from '../util/Constants';
4
+ import { CWLRounds, ClientEvents } from '../util/Constants';
4
5
  import { RESTManager } from '../rest/RESTManager';
5
- import { EventManager } from './EventManager';
6
- import { EventEmitter } from 'events';
7
6
  import { Util } from '../util/Util';
8
7
  import { Clan, ClanMember, ClanWar, ClanWarLog, League, Location, Player, WarLeague, RankedClan, RankedPlayer, Label, SeasonRankedPlayer, GoldPassSeason, ClanWarLeagueGroup } from '../struct';
8
+ interface IClientEvents {
9
+ [ClientEvents.Error]: [error: unknown];
10
+ [ClientEvents.Debug]: [path: string, status: string, message: string];
11
+ }
12
+ export interface Client {
13
+ emit: (<K extends keyof IClientEvents>(event: K, ...args: IClientEvents[K]) => boolean) & (<S extends string | symbol>(event: Exclude<S, keyof IClientEvents>, ...args: any[]) => boolean);
14
+ off: (<K extends keyof IClientEvents>(event: K, listener: (...args: IClientEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof IClientEvents>, listener: (...args: any[]) => void) => this);
15
+ on: (<K extends keyof IClientEvents>(event: K, listener: (...args: IClientEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof IClientEvents>, listener: (...args: any[]) => void) => this);
16
+ once: (<K extends keyof IClientEvents>(event: K, listener: (...args: IClientEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof IClientEvents>, listener: (...args: any[]) => void) => this);
17
+ removeAllListeners: (<K extends keyof IClientEvents>(event?: K) => this) & (<S extends string | symbol>(event?: Exclude<S, keyof IClientEvents>) => this);
18
+ /**
19
+ * Emitted for general debugging information.
20
+ * @public
21
+ * @event
22
+ */
23
+ debug: string;
24
+ /**
25
+ * Emitted when the client encounters an error.
26
+ * @public
27
+ * @event
28
+ */
29
+ error: string;
30
+ }
9
31
  /**
10
32
  * Represents Clash of Clans API Client.
11
33
  * ```js
@@ -14,15 +36,11 @@ import { Clan, ClanMember, ClanWar, ClanWarLog, League, Location, Player, WarLea
14
36
  * ```
15
37
  */
16
38
  export declare class Client extends EventEmitter {
17
- /** Event Manager for the client. */
18
- events: EventManager;
19
39
  /** REST Handler of the client. */
20
40
  rest: RESTManager;
21
41
  constructor(options?: ClientOptions);
22
42
  /** Contains various general-purpose utility methods. */
23
43
  get util(): typeof Util;
24
- /** Whether the API is in maintenance break. */
25
- get inMaintenance(): boolean;
26
44
  /**
27
45
  * Initialize the client to create keys.
28
46
  * @example
@@ -57,7 +75,7 @@ export declare class Client extends EventEmitter {
57
75
  */
58
76
  getCurrentWar(clanTag: string | {
59
77
  clanTag: string;
60
- round?: keyof typeof CWL_ROUNDS;
78
+ round?: keyof typeof CWLRounds;
61
79
  }, options?: OverrideOptions): Promise<ClanWar | null>;
62
80
  /**
63
81
  * Get info about currently running CWL round.
@@ -72,7 +90,7 @@ export declare class Client extends EventEmitter {
72
90
  */
73
91
  getLeagueWar(clanTag: string | {
74
92
  clanTag: string;
75
- round?: keyof typeof CWL_ROUNDS;
93
+ round?: keyof typeof CWLRounds;
76
94
  }, options?: OverrideOptions): Promise<ClanWar | null>;
77
95
  /** Returns active wars (last 2) of the CWL group. */
78
96
  getLeagueWars(clanTag: string, options?: OverrideOptions): Promise<ClanWar[]>;
@@ -131,68 +149,5 @@ export declare class Client extends EventEmitter {
131
149
  getPlayerLabels(options?: SearchOptions): Promise<Label[]>;
132
150
  /** Get info about gold pass season. */
133
151
  getGoldPassSeason(options?: OverrideOptions): Promise<GoldPassSeason>;
134
- /**
135
- * Emits when a new season starts.
136
- *
137
- * **Parameters**
138
- *
139
- * | Name | Type | Description |
140
- * | :--: | :------: | :-------------------: |
141
- * | `id` | `string` | Id of the new season. |
142
- * @public
143
- * @event
144
- */
145
- private static newSeasonStart;
146
- /**
147
- * Emits when maintenance break starts in the API.
148
- * @public
149
- * @event
150
- */
151
- private static maintenanceStart;
152
- /**
153
- * Emits when maintenance break ends in the API.
154
- *
155
- * **Parameters**
156
- *
157
- * | Name | Type | Description |
158
- * | :--------: | :------: | :------------------------------------------------: |
159
- * | `duration` | `number` | Duration of the maintenance break in milliseconds. |
160
- * @public
161
- * @event
162
- */
163
- private static maintenanceEnd;
164
- /** @internal */
165
- on<K extends keyof ClientEvents>(event: K, listeners: (...args: ClientEvents[K]) => void): this;
166
- /** @internal */
167
- on<S extends keyof CustomEvents>(event: Exclude<S, keyof ClientEvents>, listeners: (...args: CustomEvents[S]) => void): this;
168
- /** @internal */ on<S extends string | symbol>(event: Exclude<S, keyof ClientEvents>, listeners: (...args: any[]) => void): this;
169
- /** @internal */
170
- once<K extends keyof ClientEvents>(event: K, listeners: (...args: ClientEvents[K]) => void): this;
171
- /** @internal */
172
- once<S extends keyof CustomEvents>(event: Exclude<S, keyof ClientEvents>, listeners: (...args: CustomEvents[S]) => void): this;
173
- /** @internal */ once<S extends string | symbol>(event: Exclude<S, keyof ClientEvents>, listeners: (...args: any[]) => void): this;
174
- /** @internal */
175
- emit<K extends keyof ClientEvents>(event: K, ...args: ClientEvents[K]): boolean;
176
- /** @internal */
177
- emit<S extends keyof CustomEvents>(event: Exclude<S, keyof ClientEvents>, ...args: CustomEvents[S]): this;
178
- /** @internal */ emit<S extends string | symbol>(event: Exclude<S, keyof ClientEvents>, ...args: any[]): boolean;
179
- }
180
- interface ClientEvents {
181
- [EVENTS.NEW_SEASON_START]: [id: string];
182
- [EVENTS.MAINTENANCE_START]: [];
183
- [EVENTS.MAINTENANCE_END]: [duration: number];
184
- [EVENTS.CLAN_LOOP_START]: [];
185
- [EVENTS.CLAN_LOOP_END]: [];
186
- [EVENTS.PLAYER_LOOP_START]: [];
187
- [EVENTS.PLAYER_LOOP_END]: [];
188
- [EVENTS.WAR_LOOP_START]: [];
189
- [EVENTS.WAR_LOOP_END]: [];
190
- [EVENTS.ERROR]: [error: unknown];
191
- [EVENTS.DEBUG]: [path: string, status: string, message: string];
192
- }
193
- interface CustomEvents {
194
- [key: `clan${string}`]: [oldClan: Clan, newClan: Clan];
195
- [key: `war${string}`]: [oldWar: ClanWar, newWar: ClanWar];
196
- [key: `player${string}`]: [oldPlayer: Player, newPlayer: Player];
197
152
  }
198
153
  export {};
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Client = void 0;
4
+ const node_events_1 = require("node:events");
4
5
  const Constants_1 = require("../util/Constants");
5
6
  const HTTPError_1 = require("../rest/HTTPError");
6
7
  const RESTManager_1 = require("../rest/RESTManager");
7
- const EventManager_1 = require("./EventManager");
8
- const events_1 = require("events");
9
8
  const Util_1 = require("../util/Util");
10
9
  const struct_1 = require("../struct");
11
10
  /**
@@ -15,21 +14,17 @@ const struct_1 = require("../struct");
15
14
  * const client = new Client({ keys: ['***'] });
16
15
  * ```
17
16
  */
18
- class Client extends events_1.EventEmitter {
17
+ class Client extends node_events_1.EventEmitter {
19
18
  constructor(options) {
20
19
  super();
21
- this.rest = new RESTManager_1.RESTManager({ ...options, rejectIfNotValid: true });
22
- this.events = new EventManager_1.EventManager(this);
20
+ this.rest = new RESTManager_1.RESTManager({ ...options, rejectIfNotValid: true })
21
+ .on(Constants_1.RestEvents.Debug, this.emit.bind(this, Constants_1.RestEvents.Debug))
22
+ .on(Constants_1.RestEvents.Error, this.emit.bind(this, Constants_1.RestEvents.Error));
23
23
  }
24
24
  /** Contains various general-purpose utility methods. */
25
25
  get util() {
26
26
  return Util_1.Util;
27
27
  }
28
- /** Whether the API is in maintenance break. */
29
- get inMaintenance() {
30
- // @ts-expect-error
31
- return this.events._inMaintenance;
32
- }
33
28
  /**
34
29
  * Initialize the client to create keys.
35
30
  * @example
@@ -39,11 +34,11 @@ class Client extends events_1.EventEmitter {
39
34
  * ```
40
35
  */
41
36
  login(options) {
42
- return this.rest.handler.init(options);
37
+ return this.rest.requestHandler.init(options);
43
38
  }
44
39
  /** Set Clash of Clans API keys. */
45
40
  setKeys(keys) {
46
- this.rest.handler.setKeys(keys);
41
+ this.rest.requestHandler.setKeys(keys);
47
42
  return this;
48
43
  }
49
44
  /** Search clans by name and/or filtering parameters or get clans by their tags (fetches in parallel). */
@@ -116,7 +111,7 @@ class Client extends events_1.EventEmitter {
116
111
  */
117
112
  async getLeagueWar(clanTag, options) {
118
113
  const args = typeof clanTag === 'string' ? { clanTag } : { clanTag: clanTag.clanTag, round: clanTag.round };
119
- const state = (args.round && Constants_1.CWL_ROUNDS[args.round]) ?? 'inWar'; // eslint-disable-line
114
+ const state = (args.round && Constants_1.CWLRounds[args.round]) ?? 'inWar'; // eslint-disable-line
120
115
  const data = await this.getClanWarLeagueGroup(args.clanTag, options);
121
116
  const rounds = data.rounds.filter((round) => !round.warTags.includes('#0'));
122
117
  if (!rounds.length)
@@ -128,7 +123,7 @@ class Client extends events_1.EventEmitter {
128
123
  .flat()
129
124
  .reverse();
130
125
  const wars = await this.util.allSettled(warTags.map((warTag) => this.getClanWarLeagueRound({ warTag, clanTag: args.clanTag }, { ...options, ignoreRateLimit: true })));
131
- if (args.round && args.round in Constants_1.CWL_ROUNDS) {
126
+ if (args.round && args.round in Constants_1.CWLRounds) {
132
127
  return wars.find((war) => war.clan.tag === args.clanTag && war.state === state) ?? null;
133
128
  }
134
129
  return (wars.find((war) => war.clan.tag === args.clanTag && war.state === state) ??
@@ -147,7 +142,7 @@ class Client extends events_1.EventEmitter {
147
142
  return [await this.getClanWar(clanTag, options)];
148
143
  }
149
144
  try {
150
- return this.getLeagueWars(clanTag, options);
145
+ return await this.getLeagueWars(clanTag, options);
151
146
  }
152
147
  catch (e) {
153
148
  if (e instanceof HTTPError_1.HTTPError && [404].includes(e.status)) {
@@ -196,12 +191,12 @@ class Client extends events_1.EventEmitter {
196
191
  }
197
192
  /** Get Legend League season Ids. */
198
193
  async getLeagueSeasons(options) {
199
- const { data } = await this.rest.getLeagueSeasons(Constants_1.LEGEND_LEAGUE_ID, options);
194
+ const { data } = await this.rest.getLeagueSeasons(Constants_1.LegendLeagueId, options);
200
195
  return data.items.map((league) => league.id);
201
196
  }
202
197
  /** Get Legend League season rankings by season Id. */
203
198
  async getSeasonRankings(seasonId, options) {
204
- const { data } = await this.rest.getSeasonRankings(Constants_1.LEGEND_LEAGUE_ID, seasonId, options);
199
+ const { data } = await this.rest.getSeasonRankings(Constants_1.LegendLeagueId, seasonId, options);
205
200
  return data.items.map((entry) => new struct_1.SeasonRankedPlayer(this, entry));
206
201
  }
207
202
  /** Get list of Clan War Leagues. */
@@ -0,0 +1,156 @@
1
+ import { Clan, ClanWar, Player } from '../struct';
2
+ import { ClientOptions } from '../types';
3
+ import { PollingEvents } from '../util/Constants';
4
+ import { Client } from './Client';
5
+ /**
6
+ * Represents Clash of Clans Polling Event Client.
7
+ * ```js
8
+ * const { PollingClient } = require('clashofclans.js');
9
+ * const client = new PollingClient({ keys: ['***'] });
10
+ * ```
11
+ */
12
+ export declare class PollingClient extends Client {
13
+ private readonly _clanTags;
14
+ private readonly _playerTags;
15
+ private readonly _warTags;
16
+ private readonly _clans;
17
+ private readonly _players;
18
+ private readonly _wars;
19
+ private readonly _pollingEvents;
20
+ inMaintenance: boolean;
21
+ private _maintenanceStartTime;
22
+ constructor(options?: ClientOptions);
23
+ /** Initialize the PollingEvent Manager to start pulling the data by polling api. */
24
+ init(): Promise<string[]>;
25
+ /** Add clan tags to clan polling events. */
26
+ addClans(tags: string[] | string): this;
27
+ /** Delete clan tags from clan polling events. */
28
+ deleteClans(tags: string[] | string): this;
29
+ /** Add player tags for player polling events. */
30
+ addPlayers(tags: string[] | string): this;
31
+ /** Delete player tags from player polling events. */
32
+ deletePlayers(tags: string[] | string): this;
33
+ /** Add clan tags for war polling events. */
34
+ addWars(tags: string[] | string): this;
35
+ /** Delete clan tags from war polling events. */
36
+ deleteWars(tags: string[] | string): this;
37
+ /**
38
+ * Set your own custom clan polling event.
39
+ *
40
+ * In order to emit the custom polling event, you must have this filter function that returns a boolean.
41
+ *
42
+ * @example
43
+ * ```js
44
+ * client.addClans(['#2PP', '#8QU8J9LP']);
45
+ *
46
+ * client.setClanEvent({
47
+ * name: 'clanMemberUpdate',
48
+ * filter: (oldClan, newClan) => {
49
+ * return oldClan.memberCount !== newClan.memberCount;
50
+ * }
51
+ * });
52
+ *
53
+ * client.on('clanMemberUpdate', (oldClan, newClan) => {
54
+ * console.log(oldClan.memberCount, newClan.memberCount);
55
+ * });
56
+ *
57
+ * (async function () {
58
+ * await client.init();
59
+ * })();
60
+ * ```
61
+ * @returns
62
+ */
63
+ setClanEvent(event: {
64
+ name: string;
65
+ filter: (oldClan: Clan, newClan: Clan) => boolean;
66
+ }): this;
67
+ /**
68
+ * Set your own custom war event.
69
+ *
70
+ * In order to emit the custom event, you must have this filter function that returns a boolean.
71
+ */
72
+ setWarEvent(event: {
73
+ name: string;
74
+ filter: (oldWar: ClanWar, newWar: ClanWar) => boolean;
75
+ }): this;
76
+ /**
77
+ * Set your own custom player event.
78
+ *
79
+ * In order to emit the custom event, you must have this filter function that returns a boolean.
80
+ */
81
+ setPlayerEvent(event: {
82
+ name: string;
83
+ filter: (oldPlayer: Player, newPlayer: Player) => boolean;
84
+ }): this;
85
+ private maintenanceHandler;
86
+ private seasonEndHandler;
87
+ private clanUpdateHandler;
88
+ private playerUpdateHandler;
89
+ private warUpdateHandler;
90
+ private runClanUpdate;
91
+ private runPlayerUpdate;
92
+ private runWarUpdate;
93
+ }
94
+ export interface PollingClient {
95
+ emit: (<K extends keyof IPollingEvents>(event: K, ...args: IPollingEvents[K]) => boolean) & (<S extends string | symbol>(event: Exclude<S, keyof IPollingEvents>, ...args: any[]) => boolean);
96
+ off: (<K extends keyof IPollingEvents>(event: K, listener: (...args: IPollingEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof IPollingEvents>, listener: (...args: any[]) => void) => this);
97
+ on: (<K extends keyof IPollingEvents>(event: K, listener: (...args: IPollingEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof IPollingEvents>, listener: (...args: any[]) => void) => this);
98
+ once: (<K extends keyof IPollingEvents>(event: K, listener: (...args: IPollingEvents[K]) => void) => this) & (<S extends string | symbol>(event: Exclude<S, keyof IPollingEvents>, listener: (...args: any[]) => void) => this);
99
+ removeAllListeners: (<K extends keyof IPollingEvents>(event?: K) => this) & (<S extends string | symbol>(event?: Exclude<S, keyof IPollingEvents>) => this);
100
+ /**
101
+ * Emits when a new season starts.
102
+ *
103
+ * **Parameters**
104
+ *
105
+ * | Name | Type | Description |
106
+ * | :--: | :------: | :-------------------: |
107
+ * | `id` | `string` | Id of the new season. |
108
+ * @public
109
+ * @event
110
+ */
111
+ newSeasonStart: string;
112
+ /**
113
+ * Emits when maintenance break starts in the API.
114
+ * @public
115
+ * @event
116
+ */
117
+ maintenanceStart: string;
118
+ /**
119
+ * Emits when maintenance break ends in the API.
120
+ *
121
+ * **Parameters**
122
+ *
123
+ * | Name | Type | Description |
124
+ * | :--------: | :------: | :------------------------------------------------: |
125
+ * | `duration` | `number` | Duration of the maintenance break in milliseconds. |
126
+ * @public
127
+ * @event
128
+ */
129
+ maintenanceEnd: string;
130
+ /**
131
+ * Emitted for general debugging information.
132
+ * @public
133
+ * @event
134
+ */
135
+ debug: string;
136
+ /**
137
+ * Emitted when the client encounters an error.
138
+ * @public
139
+ * @event
140
+ */
141
+ error: string;
142
+ }
143
+ interface IPollingEvents {
144
+ [PollingEvents.ClanLoopStart]: [];
145
+ [PollingEvents.ClanLoopEnd]: [];
146
+ [PollingEvents.PlayerLoopStart]: [];
147
+ [PollingEvents.PlayerLoopEnd]: [];
148
+ [PollingEvents.WarLoopStart]: [];
149
+ [PollingEvents.WarLoopEnd]: [];
150
+ [PollingEvents.NewSeasonStart]: [id: string];
151
+ [PollingEvents.MaintenanceStart]: [];
152
+ [PollingEvents.MaintenanceEnd]: [duration: number];
153
+ [PollingEvents.Error]: [error: unknown];
154
+ [PollingEvents.Debug]: [path: string, status: string, message: string];
155
+ }
156
+ export {};