clashofclans.js 2.8.0-dev.53b06d3 → 2.8.0-dev.a3d3797

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,8 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import { ClanSearchOptions, SearchOptions, ClientOptions, LoginOptions, OverrideOptions } from '../types';
3
- import { Events, CWLRounds } from '../util/Constants';
3
+ import { CWLRounds } from '../util/Constants';
4
4
  import { RESTManager } from '../rest/RESTManager';
5
- import { EventManager } from './EventManager';
6
5
  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';
@@ -14,15 +13,11 @@ import { Clan, ClanMember, ClanWar, ClanWarLog, League, Location, Player, WarLea
14
13
  * ```
15
14
  */
16
15
  export declare class Client extends EventEmitter {
17
- /** Event Manager for the client. */
18
- events: EventManager;
19
16
  /** REST Handler of the client. */
20
17
  rest: RESTManager;
21
18
  constructor(options?: ClientOptions);
22
19
  /** Contains various general-purpose utility methods. */
23
20
  get util(): typeof Util;
24
- /** Whether the API is in maintenance break. */
25
- get inMaintenance(): boolean;
26
21
  /**
27
22
  * Initialize the client to create keys.
28
23
  * @example
@@ -131,68 +126,4 @@ export declare class Client extends EventEmitter {
131
126
  getPlayerLabels(options?: SearchOptions): Promise<Label[]>;
132
127
  /** Get info about gold pass season. */
133
128
  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.NewSeasonStart]: [id: string];
182
- [Events.MaintenanceStart]: [];
183
- [Events.MaintenanceEnd]: [duration: number];
184
- [Events.ClanLoopStart]: [];
185
- [Events.ClanLoopEnd]: [];
186
- [Events.PlayerLoopStart]: [];
187
- [Events.PlayerLoopEnd]: [];
188
- [Events.WarLoopStart]: [];
189
- [Events.WarLoopEnd]: [];
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
129
  }
198
- export {};
@@ -4,7 +4,6 @@ exports.Client = void 0;
4
4
  const Constants_1 = require("../util/Constants");
5
5
  const HTTPError_1 = require("../rest/HTTPError");
6
6
  const RESTManager_1 = require("../rest/RESTManager");
7
- const EventManager_1 = require("./EventManager");
8
7
  const events_1 = require("events");
9
8
  const Util_1 = require("../util/Util");
10
9
  const struct_1 = require("../struct");
@@ -19,17 +18,11 @@ class Client extends events_1.EventEmitter {
19
18
  constructor(options) {
20
19
  super();
21
20
  this.rest = new RESTManager_1.RESTManager({ ...options, rejectIfNotValid: true });
22
- this.events = new EventManager_1.EventManager(this);
23
21
  }
24
22
  /** Contains various general-purpose utility methods. */
25
23
  get util() {
26
24
  return Util_1.Util;
27
25
  }
28
- /** Whether the API is in maintenance break. */
29
- get inMaintenance() {
30
- // @ts-expect-error
31
- return this.events._inMaintenance;
32
- }
33
26
  /**
34
27
  * Initialize the client to create keys.
35
28
  * @example
@@ -131,7 +124,7 @@ class Client extends events_1.EventEmitter {
131
124
  if (args.round && args.round in Constants_1.CWLRounds) {
132
125
  return wars.find((war) => war.clan.tag === args.clanTag && war.state === state) ?? null;
133
126
  }
134
- return wars.find((war) => war.clan.tag === args.clanTag && war.state === state) ?? wars.at(0) ?? null;
127
+ return wars.find((war) => war.clan.tag === args.clanTag) ?? null;
135
128
  }
136
129
  /** Returns active wars (last 2) of the CWL group. */
137
130
  async getLeagueWars(clanTag, options) {
@@ -1,42 +1,42 @@
1
1
  import { Clan, ClanWar, Player } from '../struct';
2
- import { Client } from './Client';
3
- /** Represents Event Manager of the {@link Client}. */
4
- export declare class EventManager {
5
- private readonly client;
2
+ import { PollingClient } from './PollingClient';
3
+ /** Represents PollingEvent Manager of the {@link PollingClient}. */
4
+ export declare class PollingEventManager {
5
+ private readonly pollingClient;
6
6
  private readonly _clanTags;
7
7
  private readonly _playerTags;
8
8
  private readonly _warTags;
9
9
  private readonly _clans;
10
10
  private readonly _players;
11
11
  private readonly _wars;
12
- private readonly _events;
12
+ private readonly _pollingEvents;
13
13
  private _inMaintenance;
14
14
  private _maintenanceStartTime;
15
- constructor(client: Client);
16
- /** Initialize the Event Manager to start pulling. */
15
+ constructor(pollingClient: PollingClient);
16
+ /** Initialize the PollingEvent Manager to start pulling the data by polling api. */
17
17
  init(): Promise<string[]>;
18
- /** Add clan tags to clan events. */
18
+ /** Add clan tags to clan polling events. */
19
19
  addClans(tags: string[] | string): this;
20
- /** Delete clan tags from clan events. */
20
+ /** Delete clan tags from clan polling events. */
21
21
  deleteClans(tags: string[] | string): this;
22
- /** Add player tags for player events. */
22
+ /** Add player tags for player polling events. */
23
23
  addPlayers(tags: string[] | string): this;
24
- /** Delete player tags from player events. */
24
+ /** Delete player tags from player polling events. */
25
25
  deletePlayers(tags: string[] | string): this;
26
- /** Add clan tags for war events. */
26
+ /** Add clan tags for war polling events. */
27
27
  addWars(tags: string[] | string): this;
28
- /** Delete clan tags from war events. */
28
+ /** Delete clan tags from war polling events. */
29
29
  deleteWars(tags: string[] | string): this;
30
30
  /**
31
- * Set your own custom clan event.
31
+ * Set your own custom clan polling event.
32
32
  *
33
- * In order to emit the custom event, you must have this filter function that returns a boolean.
33
+ * In order to emit the custom polling event, you must have this filter function that returns a boolean.
34
34
  *
35
35
  * @example
36
36
  * ```js
37
- * client.events.addClans(['#2PP', '#8QU8J9LP']);
37
+ * client.pollingEvents.addClans(['#2PP', '#8QU8J9LP']);
38
38
  *
39
- * client.events.setClanEvent({
39
+ * client.pollingEvents.setClanEvent({
40
40
  * name: 'clanMemberUpdate',
41
41
  * filter: (oldClan, newClan) => {
42
42
  * return oldClan.memberCount !== newClan.memberCount;
@@ -48,7 +48,7 @@ export declare class EventManager {
48
48
  * });
49
49
  *
50
50
  * (async function () {
51
- * await client.events.init();
51
+ * await client.pollingEvents.init();
52
52
  * })();
53
53
  * ```
54
54
  * @returns
@@ -1,20 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventManager = void 0;
3
+ exports.PollingEventManager = void 0;
4
4
  const HTTPError_1 = require("../rest/HTTPError");
5
5
  const Constants_1 = require("../util/Constants");
6
6
  const Util_1 = require("../util/Util");
7
- /** Represents Event Manager of the {@link Client}. */
8
- class EventManager {
9
- constructor(client) {
10
- this.client = client;
7
+ /** Represents PollingEvent Manager of the {@link PollingClient}. */
8
+ class PollingEventManager {
9
+ constructor(pollingClient) {
10
+ this.pollingClient = pollingClient;
11
11
  this._clanTags = new Set();
12
12
  this._playerTags = new Set();
13
13
  this._warTags = new Set();
14
14
  this._clans = new Map();
15
15
  this._players = new Map();
16
16
  this._wars = new Map();
17
- this._events = {
17
+ this._pollingEvents = {
18
18
  clans: [],
19
19
  wars: [],
20
20
  players: []
@@ -22,58 +22,58 @@ class EventManager {
22
22
  this._inMaintenance = Boolean(false);
23
23
  this._maintenanceStartTime = null;
24
24
  }
25
- /** Initialize the Event Manager to start pulling. */
25
+ /** Initialize the PollingEvent Manager to start pulling the data by polling api. */
26
26
  async init() {
27
27
  this.seasonEndHandler();
28
28
  this.maintenanceHandler();
29
29
  this.clanUpdateHandler();
30
30
  this.playerUpdateHandler();
31
31
  this.warUpdateHandler();
32
- return Promise.resolve(this.client.eventNames());
32
+ return Promise.resolve(this.pollingClient.eventNames());
33
33
  }
34
- /** Add clan tags to clan events. */
34
+ /** Add clan tags to clan polling events. */
35
35
  addClans(tags) {
36
36
  for (const tag of Array.isArray(tags) ? tags : [tags]) {
37
- this._clanTags.add(this.client.util.formatTag(tag));
37
+ this._clanTags.add(this.pollingClient.util.formatTag(tag));
38
38
  }
39
39
  return this;
40
40
  }
41
- /** Delete clan tags from clan events. */
41
+ /** Delete clan tags from clan polling events. */
42
42
  deleteClans(tags) {
43
43
  for (const tag of Array.isArray(tags) ? tags : [tags]) {
44
- const key = this.client.util.formatTag(tag);
44
+ const key = this.pollingClient.util.formatTag(tag);
45
45
  this._clans.delete(key);
46
46
  this._clanTags.delete(key);
47
47
  }
48
48
  return this;
49
49
  }
50
- /** Add player tags for player events. */
50
+ /** Add player tags for player polling events. */
51
51
  addPlayers(tags) {
52
52
  for (const tag of Array.isArray(tags) ? tags : [tags]) {
53
- this._playerTags.add(this.client.util.formatTag(tag));
53
+ this._playerTags.add(this.pollingClient.util.formatTag(tag));
54
54
  }
55
55
  return this;
56
56
  }
57
- /** Delete player tags from player events. */
57
+ /** Delete player tags from player polling events. */
58
58
  deletePlayers(tags) {
59
59
  for (const tag of Array.isArray(tags) ? tags : [tags]) {
60
- const key = this.client.util.formatTag(tag);
60
+ const key = this.pollingClient.util.formatTag(tag);
61
61
  this._players.delete(key);
62
62
  this._playerTags.delete(key);
63
63
  }
64
64
  return this;
65
65
  }
66
- /** Add clan tags for war events. */
66
+ /** Add clan tags for war polling events. */
67
67
  addWars(tags) {
68
68
  for (const tag of Array.isArray(tags) ? tags : [tags]) {
69
- this._warTags.add(this.client.util.formatTag(tag));
69
+ this._warTags.add(this.pollingClient.util.formatTag(tag));
70
70
  }
71
71
  return this;
72
72
  }
73
- /** Delete clan tags from war events. */
73
+ /** Delete clan tags from war polling events. */
74
74
  deleteWars(tags) {
75
75
  for (const tag of Array.isArray(tags) ? tags : [tags]) {
76
- const key = this.client.util.formatTag(tag);
76
+ const key = this.pollingClient.util.formatTag(tag);
77
77
  this._wars.delete(`${key}:${1}`);
78
78
  this._wars.delete(`${key}:${2}`);
79
79
  this._warTags.delete(key);
@@ -81,15 +81,15 @@ class EventManager {
81
81
  return this;
82
82
  }
83
83
  /**
84
- * Set your own custom clan event.
84
+ * Set your own custom clan polling event.
85
85
  *
86
- * In order to emit the custom event, you must have this filter function that returns a boolean.
86
+ * In order to emit the custom polling event, you must have this filter function that returns a boolean.
87
87
  *
88
88
  * @example
89
89
  * ```js
90
- * client.events.addClans(['#2PP', '#8QU8J9LP']);
90
+ * client.pollingEvents.addClans(['#2PP', '#8QU8J9LP']);
91
91
  *
92
- * client.events.setClanEvent({
92
+ * client.pollingEvents.setClanEvent({
93
93
  * name: 'clanMemberUpdate',
94
94
  * filter: (oldClan, newClan) => {
95
95
  * return oldClan.memberCount !== newClan.memberCount;
@@ -101,7 +101,7 @@ class EventManager {
101
101
  * });
102
102
  *
103
103
  * (async function () {
104
- * await client.events.init();
104
+ * await client.pollingEvents.init();
105
105
  * })();
106
106
  * ```
107
107
  * @returns
@@ -111,7 +111,7 @@ class EventManager {
111
111
  throw new Error('Event name is required.');
112
112
  if (typeof event.filter !== 'function')
113
113
  throw new Error('Filter function is required.');
114
- this._events.clans.push(event);
114
+ this._pollingEvents.clans.push(event);
115
115
  return this;
116
116
  }
117
117
  /**
@@ -124,7 +124,7 @@ class EventManager {
124
124
  throw new Error('Event name is required.');
125
125
  if (typeof event.filter !== 'function')
126
126
  throw new Error('Filter function is required.');
127
- this._events.wars.push(event);
127
+ this._pollingEvents.wars.push(event);
128
128
  return this;
129
129
  }
130
130
  /**
@@ -137,25 +137,25 @@ class EventManager {
137
137
  throw new Error('Event name is required.');
138
138
  if (typeof event.filter !== 'function')
139
139
  throw new Error('Filter function is required.');
140
- this._events.players.push(event);
140
+ this._pollingEvents.players.push(event);
141
141
  return this;
142
142
  }
143
143
  async maintenanceHandler() {
144
144
  setTimeout(this.maintenanceHandler.bind(this), 10000).unref();
145
145
  try {
146
- const res = await this.client.rest.getClans({ maxMembers: Math.floor(Math.random() * 40) + 10, limit: 1 });
146
+ const res = await this.pollingClient.rest.getClans({ maxMembers: Math.floor(Math.random() * 40) + 10, limit: 1 });
147
147
  if (res.status === 200 && this._inMaintenance) {
148
148
  this._inMaintenance = Boolean(false);
149
149
  const duration = Date.now() - this._maintenanceStartTime.getTime();
150
150
  this._maintenanceStartTime = null;
151
- this.client.emit(Constants_1.Events.MaintenanceEnd, duration);
151
+ this.pollingClient.emit(Constants_1.PollingEvents.MaintenanceEnd, duration);
152
152
  }
153
153
  }
154
154
  catch (error) {
155
155
  if (error instanceof HTTPError_1.HTTPError && error.status === 503 && !this._inMaintenance) {
156
156
  this._inMaintenance = Boolean(true);
157
157
  this._maintenanceStartTime = new Date();
158
- this.client.emit(Constants_1.Events.MaintenanceStart);
158
+ this.pollingClient.emit(Constants_1.PollingEvents.MaintenanceStart);
159
159
  }
160
160
  }
161
161
  }
@@ -167,48 +167,48 @@ class EventManager {
167
167
  }
168
168
  else if (end > 0) {
169
169
  setTimeout(() => {
170
- this.client.emit(Constants_1.Events.NewSeasonStart, Util_1.Util.getSeasonId());
170
+ this.pollingClient.emit(Constants_1.PollingEvents.NewSeasonStart, Util_1.Util.getSeasonId());
171
171
  }, end + 100).unref();
172
172
  }
173
173
  }
174
174
  async clanUpdateHandler() {
175
- this.client.emit(Constants_1.Events.ClanLoopStart);
175
+ this.pollingClient.emit(Constants_1.PollingEvents.ClanLoopStart);
176
176
  for (const tag of this._clanTags)
177
177
  await this.runClanUpdate(tag);
178
- this.client.emit(Constants_1.Events.ClanLoopEnd);
178
+ this.pollingClient.emit(Constants_1.PollingEvents.ClanLoopEnd);
179
179
  setTimeout(this.clanUpdateHandler.bind(this), 10000);
180
180
  }
181
181
  async playerUpdateHandler() {
182
- this.client.emit(Constants_1.Events.PlayerLoopStart);
182
+ this.pollingClient.emit(Constants_1.PollingEvents.PlayerLoopStart);
183
183
  for (const tag of this._playerTags)
184
184
  await this.runPlayerUpdate(tag);
185
- this.client.emit(Constants_1.Events.PlayerLoopEnd);
185
+ this.pollingClient.emit(Constants_1.PollingEvents.PlayerLoopEnd);
186
186
  setTimeout(this.playerUpdateHandler.bind(this), 10000);
187
187
  }
188
188
  async warUpdateHandler() {
189
- this.client.emit(Constants_1.Events.WarLoopStart);
189
+ this.pollingClient.emit(Constants_1.PollingEvents.WarLoopStart);
190
190
  for (const tag of this._warTags)
191
191
  await this.runWarUpdate(tag);
192
- this.client.emit(Constants_1.Events.WarLoopEnd);
192
+ this.pollingClient.emit(Constants_1.PollingEvents.WarLoopEnd);
193
193
  setTimeout(this.warUpdateHandler.bind(this), 10000);
194
194
  }
195
195
  async runClanUpdate(tag) {
196
196
  if (this._inMaintenance)
197
197
  return null;
198
- const clan = await this.client.getClan(tag).catch(() => null);
198
+ const clan = await this.pollingClient.getClan(tag).catch(() => null);
199
199
  if (!clan)
200
200
  return null;
201
201
  const cached = this._clans.get(clan.tag);
202
202
  if (!cached)
203
203
  return this._clans.set(clan.tag, clan);
204
- for (const { name, filter } of this._events.clans) {
204
+ for (const { name, filter } of this._pollingEvents.clans) {
205
205
  try {
206
206
  if (!(await filter(cached, clan)))
207
207
  continue;
208
- this.client.emit(name, cached, clan);
208
+ this.pollingClient.emit(name, cached, clan);
209
209
  }
210
210
  catch (error) {
211
- this.client.emit(Constants_1.Events.Error, error);
211
+ this.pollingClient.emit(Constants_1.PollingEvents.Error, error);
212
212
  }
213
213
  }
214
214
  return this._clans.set(clan.tag, clan);
@@ -216,20 +216,20 @@ class EventManager {
216
216
  async runPlayerUpdate(tag) {
217
217
  if (this._inMaintenance)
218
218
  return null;
219
- const player = await this.client.getPlayer(tag).catch(() => null);
219
+ const player = await this.pollingClient.getPlayer(tag).catch(() => null);
220
220
  if (!player)
221
221
  return null;
222
222
  const cached = this._players.get(player.tag);
223
223
  if (!cached)
224
224
  return this._players.set(player.tag, player);
225
- for (const { name, filter } of this._events.players) {
225
+ for (const { name, filter } of this._pollingEvents.players) {
226
226
  try {
227
227
  if (!(await filter(cached, player)))
228
228
  continue;
229
- this.client.emit(name, cached, player);
229
+ this.pollingClient.emit(name, cached, player);
230
230
  }
231
231
  catch (error) {
232
- this.client.emit(Constants_1.Events.Error, error);
232
+ this.pollingClient.emit(Constants_1.PollingEvents.Error, error);
233
233
  }
234
234
  }
235
235
  return this._players.set(player.tag, player);
@@ -237,7 +237,7 @@ class EventManager {
237
237
  async runWarUpdate(tag) {
238
238
  if (this._inMaintenance)
239
239
  return null;
240
- const clanWars = await this.client.getWars(tag).catch(() => null);
240
+ const clanWars = await this.pollingClient.getWars(tag).catch(() => null);
241
241
  if (!clanWars?.length)
242
242
  return null;
243
243
  clanWars.forEach(async (war, index) => {
@@ -245,28 +245,28 @@ class EventManager {
245
245
  const cached = this._wars.get(key);
246
246
  if (!cached)
247
247
  return this._wars.set(key, war);
248
- for (const { name, filter } of this._events.wars) {
248
+ for (const { name, filter } of this._pollingEvents.wars) {
249
249
  try {
250
250
  if (!(await filter(cached, war)))
251
251
  continue;
252
- this.client.emit(name, cached, war);
252
+ this.pollingClient.emit(name, cached, war);
253
253
  }
254
254
  catch (error) {
255
- this.client.emit(Constants_1.Events.Error, error);
255
+ this.pollingClient.emit(Constants_1.PollingEvents.Error, error);
256
256
  }
257
257
  }
258
258
  // check for war end
259
259
  if (index === 1 && cached.warTag !== war.warTag) {
260
- const data = await this.client.getLeagueWar({ clanTag: tag, round: 'PreviousRound' }).catch(() => null);
260
+ const data = await this.pollingClient.getLeagueWar({ clanTag: tag, round: 'PreviousRound' }).catch(() => null);
261
261
  if (data && data.warTag === cached.warTag) {
262
- for (const { name, filter } of this._events.wars) {
262
+ for (const { name, filter } of this._pollingEvents.wars) {
263
263
  try {
264
264
  if (!(await filter(cached, data)))
265
265
  continue;
266
- this.client.emit(name, cached, data);
266
+ this.pollingClient.emit(name, cached, data);
267
267
  }
268
268
  catch (error) {
269
- this.client.emit(Constants_1.Events.Error, error);
269
+ this.pollingClient.emit(Constants_1.PollingEvents.Error, error);
270
270
  }
271
271
  }
272
272
  }
@@ -275,4 +275,4 @@ class EventManager {
275
275
  });
276
276
  }
277
277
  }
278
- exports.EventManager = EventManager;
278
+ exports.PollingEventManager = PollingEventManager;
@@ -0,0 +1,83 @@
1
+ import { Clan, ClanWar, Player } from '../struct';
2
+ import { ClientOptions } from '../types';
3
+ import { PollingEvents } from '../util/Constants';
4
+ import { Client } from './Client';
5
+ import { PollingEventManager } from './EventManager';
6
+ /**
7
+ * Represents Clash of Clans Polling Event Client.
8
+ * ```js
9
+ * const { PollingClient } = require('clashofclans.js');
10
+ * const client = new PollingClient({ keys: ['***'] });
11
+ * ```
12
+ */
13
+ export declare class PollingClient extends Client {
14
+ /** Polling Event Manager for the client. */
15
+ pollingEvents: PollingEventManager;
16
+ constructor(options?: ClientOptions);
17
+ /** Whether the API is in maintenance break. */
18
+ get inMaintenance(): any;
19
+ /**
20
+ * Emits when a new season starts.
21
+ *
22
+ * **Parameters**
23
+ *
24
+ * | Name | Type | Description |
25
+ * | :--: | :------: | :-------------------: |
26
+ * | `id` | `string` | Id of the new season. |
27
+ * @public
28
+ * @event
29
+ */
30
+ private static newSeasonStart;
31
+ /**
32
+ * Emits when maintenance break starts in the API.
33
+ * @public
34
+ * @event
35
+ */
36
+ private static maintenanceStart;
37
+ /**
38
+ * Emits when maintenance break ends in the API.
39
+ *
40
+ * **Parameters**
41
+ *
42
+ * | Name | Type | Description |
43
+ * | :--------: | :------: | :------------------------------------------------: |
44
+ * | `duration` | `number` | Duration of the maintenance break in milliseconds. |
45
+ * @public
46
+ * @event
47
+ */
48
+ private static maintenanceEnd;
49
+ /** @internal */
50
+ on<K extends keyof ClientPollingEvents>(event: K, listeners: (...args: ClientPollingEvents[K]) => void): this;
51
+ /** @internal */
52
+ on<S extends keyof CustomEvents>(event: Exclude<S, keyof ClientPollingEvents>, listeners: (...args: CustomEvents[S]) => void): this;
53
+ /** @internal */ on<S extends string | symbol>(event: Exclude<S, keyof ClientPollingEvents>, listeners: (...args: any[]) => void): this;
54
+ /** @internal */
55
+ once<K extends keyof ClientPollingEvents>(event: K, listeners: (...args: ClientPollingEvents[K]) => void): this;
56
+ /** @internal */
57
+ once<S extends keyof CustomEvents>(event: Exclude<S, keyof ClientPollingEvents>, listeners: (...args: CustomEvents[S]) => void): this;
58
+ /** @internal */ once<S extends string | symbol>(event: Exclude<S, keyof ClientPollingEvents>, listeners: (...args: any[]) => void): this;
59
+ /** @internal */
60
+ emit<K extends keyof ClientPollingEvents>(event: K, ...args: ClientPollingEvents[K]): boolean;
61
+ /** @internal */
62
+ emit<S extends keyof CustomEvents>(event: Exclude<S, keyof ClientPollingEvents>, ...args: CustomEvents[S]): this;
63
+ /** @internal */ emit<S extends string | symbol>(event: Exclude<S, keyof ClientPollingEvents>, ...args: any[]): boolean;
64
+ }
65
+ interface ClientPollingEvents {
66
+ [PollingEvents.NewSeasonStart]: [id: string];
67
+ [PollingEvents.MaintenanceStart]: [];
68
+ [PollingEvents.MaintenanceEnd]: [duration: number];
69
+ [PollingEvents.ClanLoopStart]: [];
70
+ [PollingEvents.ClanLoopEnd]: [];
71
+ [PollingEvents.PlayerLoopStart]: [];
72
+ [PollingEvents.PlayerLoopEnd]: [];
73
+ [PollingEvents.WarLoopStart]: [];
74
+ [PollingEvents.WarLoopEnd]: [];
75
+ [PollingEvents.Error]: [error: unknown];
76
+ [PollingEvents.Debug]: [path: string, status: string, message: string];
77
+ }
78
+ interface CustomEvents {
79
+ [key: `clan${string}`]: [oldClan: Clan, newClan: Clan];
80
+ [key: `war${string}`]: [oldWar: ClanWar, newWar: ClanWar];
81
+ [key: `player${string}`]: [oldPlayer: Player, newPlayer: Player];
82
+ }
83
+ export {};
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PollingClient = void 0;
4
+ const Constants_1 = require("../util/Constants");
5
+ const Client_1 = require("./Client");
6
+ const EventManager_1 = require("./EventManager");
7
+ /**
8
+ * Represents Clash of Clans Polling Event Client.
9
+ * ```js
10
+ * const { PollingClient } = require('clashofclans.js');
11
+ * const client = new PollingClient({ keys: ['***'] });
12
+ * ```
13
+ */
14
+ class PollingClient extends Client_1.Client {
15
+ constructor(options) {
16
+ super(options);
17
+ this.pollingEvents = new EventManager_1.PollingEventManager(this);
18
+ }
19
+ /** Whether the API is in maintenance break. */
20
+ get inMaintenance() {
21
+ // @ts-expect-error
22
+ return this.events._inMaintenance;
23
+ }
24
+ }
25
+ exports.PollingClient = PollingClient;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './client/Client';
2
+ export * from './client/PollingClient';
2
3
  export * from './rest/RESTManager';
3
4
  export * from './rest/RequestHandler';
4
5
  export * from './rest/HTTPError';
package/dist/index.js CHANGED
@@ -11,6 +11,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  __exportStar(require("./client/Client"), exports);
14
+ __exportStar(require("./client/PollingClient"), exports);
14
15
  __exportStar(require("./rest/RESTManager"), exports);
15
16
  __exportStar(require("./rest/RequestHandler"), exports);
16
17
  __exportStar(require("./rest/HTTPError"), exports);
package/dist/index.mjs CHANGED
@@ -25,8 +25,6 @@ export const DarkElixirTroops = mod.DarkElixirTroops;
25
25
  export const DevSiteAPIBaseURL = mod.DevSiteAPIBaseURL;
26
26
  export const ElixirSpells = mod.ElixirSpells;
27
27
  export const ElixirTroops = mod.ElixirTroops;
28
- export const EventManager = mod.EventManager;
29
- export const Events = mod.Events;
30
28
  export const FriendlyWarPreparationTimes = mod.FriendlyWarPreparationTimes;
31
29
  export const GoldPassSeason = mod.GoldPassSeason;
32
30
  export const HTTPError = mod.HTTPError;
@@ -44,6 +42,9 @@ export const Location = mod.Location;
44
42
  export const NotInWarError = mod.NotInWarError;
45
43
  export const Player = mod.Player;
46
44
  export const PlayerClan = mod.PlayerClan;
45
+ export const PollingClient = mod.PollingClient;
46
+ export const PollingEventManager = mod.PollingEventManager;
47
+ export const PollingEvents = mod.PollingEvents;
47
48
  export const PrivateWarLogError = mod.PrivateWarLogError;
48
49
  export const QueueThrottler = mod.QueueThrottler;
49
50
  export const RESTManager = mod.RESTManager;
@@ -7,6 +7,7 @@ import type { Player } from './Player';
7
7
  import { Location } from './Location';
8
8
  import { Label } from './Label';
9
9
  import { Badge } from './Badge';
10
+ import { ClanCapital } from './ClanCapital';
10
11
  /** Represents a Clan. */
11
12
  export declare class Clan {
12
13
  client: Client;
@@ -54,6 +55,8 @@ export declare class Clan {
54
55
  memberCount: number;
55
56
  /** An array of {@link Label} that the clan has. */
56
57
  labels: Label[];
58
+ /** The clan's Clan Capital information */
59
+ clanCapital: ClanCapital | null;
57
60
  /**
58
61
  * List of clan members.
59
62
  * - This property returns empty array for {@link Client.getClans} method.
@@ -7,6 +7,7 @@ const WarLeague_1 = require("./WarLeague");
7
7
  const Location_1 = require("./Location");
8
8
  const Label_1 = require("./Label");
9
9
  const Badge_1 = require("./Badge");
10
+ const ClanCapital_1 = require("./ClanCapital");
10
11
  /** Represents a Clan. */
11
12
  class Clan {
12
13
  constructor(client, data) {
@@ -33,6 +34,7 @@ class Clan {
33
34
  this.warLeague = data.warLeague ? new WarLeague_1.WarLeague(data.warLeague) : null;
34
35
  this.memberCount = data.members;
35
36
  this.labels = data.labels.map((label) => new Label_1.Label(label));
37
+ this.clanCapital = Object.keys(data.clanCapital).length > 0 ? new ClanCapital_1.ClanCapital(data.clanCapital) : null;
36
38
  this.members = data.memberList?.map((mem) => new ClanMember_1.ClanMember(this.client, mem)) ?? []; // eslint-disable-line
37
39
  }
38
40
  /** Get {@link Player} info for every Player in the clan. */
@@ -0,0 +1,12 @@
1
+ import { APIClanCapital } from '../types';
2
+ export declare class ClanCapital {
3
+ /** The clan capital hall level */
4
+ capitalHallLevel: number | null;
5
+ /** The clan capital districts */
6
+ districts: {
7
+ id: number;
8
+ name: string;
9
+ districtHallLevel: number;
10
+ }[] | null;
11
+ constructor(data: APIClanCapital);
12
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClanCapital = void 0;
4
+ class ClanCapital {
5
+ constructor(data) {
6
+ this.capitalHallLevel = data.capitalHallLevel ?? null;
7
+ this.districts = data.districts ? data.districts : null;
8
+ }
9
+ }
10
+ exports.ClanCapital = ClanCapital;
@@ -41,6 +41,8 @@ export declare class Player {
41
41
  donations: number;
42
42
  /** The player's donation received count for this season. */
43
43
  received: number;
44
+ /** The player's total Clan Capital contribution */
45
+ clanCapitalContributions: number;
44
46
  /** The player's role in the clan or `null` if not in a clan. */
45
47
  role: 'member' | 'elder' | 'coLeader' | 'leader' | null;
46
48
  /** Whether the player has selected that they are opted in. This will be `null` if the player is not in a clan. */
@@ -28,6 +28,7 @@ class Player {
28
28
  this.versusBattleWins = data.versusBattleWins ?? null;
29
29
  this.donations = data.donations;
30
30
  this.received = data.donationsReceived;
31
+ this.clanCapitalContributions = data.clanCapitalContributions;
31
32
  // @ts-expect-error
32
33
  this.role = data.role?.replace('admin', 'elder') ?? null;
33
34
  this.warOptedIn = data.warPreference ? data.warPreference === 'in' : null;
@@ -57,6 +57,7 @@ export interface APIClan {
57
57
  members: number;
58
58
  labels: APILabel[];
59
59
  memberList: APIClanMember[];
60
+ clanCapital: APIClanCapital;
60
61
  }
61
62
  export interface APIClanMember {
62
63
  name: string;
@@ -71,6 +72,14 @@ export interface APIClanMember {
71
72
  donations: number;
72
73
  donationsReceived: number;
73
74
  }
75
+ export interface APIClanCapital {
76
+ capitalHallLevel?: number;
77
+ districts?: {
78
+ id: number;
79
+ name: string;
80
+ districtHallLevel: number;
81
+ }[];
82
+ }
74
83
  /** /clans/{clanTag}/members */
75
84
  export interface APIClanMemberList {
76
85
  items: APIClanMember[];
@@ -179,6 +188,7 @@ export interface APIPlayer {
179
188
  versusBattleWinCount?: number;
180
189
  donations: number;
181
190
  donationsReceived: number;
191
+ clanCapitalContributions: number;
182
192
  role?: string;
183
193
  warPreference?: 'in' | 'out';
184
194
  clan?: APIPlayerClan;
@@ -23,7 +23,7 @@ export declare const LegendLeagueId = 29000022;
23
23
  export declare const Leagues: number[];
24
24
  export declare const WarLeagues: number[];
25
25
  export declare const FriendlyWarPreparationTimes: readonly [number, number, number, number, number, number, number, number, number, number, number, number];
26
- export declare const Events: {
26
+ export declare const PollingEvents: {
27
27
  readonly NewSeasonStart: "newSeasonStart";
28
28
  readonly ClanLoopStart: "clanLoopStart";
29
29
  readonly ClanLoopEnd: "clanLoopEnd";
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.RawData = exports.CWLRounds = exports.Events = exports.FriendlyWarPreparationTimes = exports.WarLeagues = exports.Leagues = exports.LegendLeagueId = exports.UnrankedLeagueData = exports.HeroPets = exports.Heroes = exports.BuilderTroops = exports.Spells = exports.DarkElixirSpells = exports.ElixirSpells = exports.SuperTroops = exports.SiegeMachines = exports.HomeTroops = exports.DarkElixirTroops = exports.ElixirTroops = exports.DevSiteAPIBaseURL = exports.APIBaseURL = void 0;
6
+ exports.RawData = exports.CWLRounds = exports.PollingEvents = exports.FriendlyWarPreparationTimes = exports.WarLeagues = exports.Leagues = exports.LegendLeagueId = exports.UnrankedLeagueData = exports.HeroPets = exports.Heroes = exports.BuilderTroops = exports.Spells = exports.DarkElixirSpells = exports.ElixirSpells = exports.SuperTroops = exports.SiegeMachines = exports.HomeTroops = exports.DarkElixirTroops = exports.ElixirTroops = exports.DevSiteAPIBaseURL = exports.APIBaseURL = void 0;
7
7
  const raw_json_1 = __importDefault(require("../util/raw.json"));
8
8
  exports.APIBaseURL = 'https://api.clashofclans.com/v1';
9
9
  exports.DevSiteAPIBaseURL = 'https://developer.clashofclans.com/api';
@@ -121,7 +121,7 @@ exports.FriendlyWarPreparationTimes = [
121
121
  1000 * 60 * 15,
122
122
  1000 * 60 * 5
123
123
  ];
124
- exports.Events = {
124
+ exports.PollingEvents = {
125
125
  NewSeasonStart: 'newSeasonStart',
126
126
  ClanLoopStart: 'clanLoopStart',
127
127
  ClanLoopEnd: 'clanLoopEnd',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clashofclans.js",
3
- "version": "2.8.0-dev.53b06d3",
3
+ "version": "2.8.0-dev.a3d3797",
4
4
  "description": "JavaScript library for interacting with the Clash of Clans API",
5
5
  "author": "SUVAJIT <suvajit.me@gmail.com>",
6
6
  "license": "MIT",