@eso-status/forum-message 2.0.0-dev.2 → 2.0.0-dev.21

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.
package/README.md CHANGED
@@ -53,7 +53,7 @@ const esoStatusRawDataList: EsoStatusRawData[] = await ForumMessage.getData(Foru
53
53
  status: 'planned',
54
54
  rawSlug: 'PC/Mac: NA and EU megaservers for',
55
55
  rawDate: 'September 3, 4:00AM EDT (8:00 UTC) – 9:00AM EDT (13:00 UTC)',
56
- dates: [ Moment<2024-09-03T08:00:00Z>, Moment<2024-09-03T13:00:00Z> ]
56
+ dates: [ '2024-09-03T08:00:00Z', '2024-09-03T13:00:00Z' ]
57
57
  },
58
58
  {
59
59
  source: 'https://forums.elderscrollsonline.com',
@@ -65,7 +65,7 @@ const esoStatusRawDataList: EsoStatusRawData[] = await ForumMessage.getData(Foru
65
65
  status: 'planned',
66
66
  rawSlug: 'PC/Mac: NA and EU megaservers for',
67
67
  rawDate: 'September 3, 4:00AM EDT (8:00 UTC) – 9:00AM EDT (13:00 UTC)',
68
- dates: [ Moment<2024-09-03T08:00:00Z>, Moment<2024-09-03T13:00:00Z> ]
68
+ dates: [ '2024-09-03T08:00:00Z', '2024-09-03T13:00:00Z' ]
69
69
  },
70
70
  {
71
71
  source: 'https://forums.elderscrollsonline.com',
@@ -77,7 +77,7 @@ const esoStatusRawDataList: EsoStatusRawData[] = await ForumMessage.getData(Foru
77
77
  status: 'planned',
78
78
  rawSlug: 'Xbox: NA and EU megaservers for',
79
79
  rawDate: 'September 4, 6:00AM EDT (10:00 UTC) - 12:00PM EDT (16:00 UTC)',
80
- dates: [ Moment<2024-09-04T10:00:00Z>, Moment<2024-09-04T16:00:00Z> ]
80
+ dates: [ '2024-09-04T10:00:00Z', '2024-09-04T16:00:00Z' ]
81
81
  },
82
82
  {
83
83
  source: 'https://forums.elderscrollsonline.com',
@@ -89,7 +89,7 @@ const esoStatusRawDataList: EsoStatusRawData[] = await ForumMessage.getData(Foru
89
89
  status: 'planned',
90
90
  rawSlug: 'Xbox: NA and EU megaservers for',
91
91
  rawDate: 'September 4, 6:00AM EDT (10:00 UTC) - 12:00PM EDT (16:00 UTC)',
92
- dates: [ Moment<2024-09-04T10:00:00Z>, Moment<2024-09-04T16:00:00Z> ]
92
+ dates: [ '2024-09-04T10:00:00Z', '2024-09-04T16:00:00Z' ]
93
93
  },
94
94
  {
95
95
  source: 'https://forums.elderscrollsonline.com',
@@ -101,7 +101,7 @@ const esoStatusRawDataList: EsoStatusRawData[] = await ForumMessage.getData(Foru
101
101
  status: 'planned',
102
102
  rawSlug: 'PlayStation®: NA and EU megaservers for',
103
103
  rawDate: 'September 4, 6:00AM EDT (10:00 UTC) - 12:00PM EDT (16:00 UTC)',
104
- dates: [ Moment<2024-09-04T10:00:00Z>, Moment<2024-09-04T16:00:00Z> ]
104
+ dates: [ '2024-09-04T10:00:00Z', '2024-09-04T16:00:00Z' ]
105
105
  },
106
106
  {
107
107
  source: 'https://forums.elderscrollsonline.com',
@@ -113,7 +113,7 @@ const esoStatusRawDataList: EsoStatusRawData[] = await ForumMessage.getData(Foru
113
113
  status: 'planned',
114
114
  rawSlug: 'PlayStation®: NA and EU megaservers for',
115
115
  rawDate: 'September 4, 6:00AM EDT (10:00 UTC) - 12:00PM EDT (16:00 UTC)',
116
- dates: [ Moment<2024-09-04T10:00:00Z>, Moment<2024-09-04T16:00:00Z> ]
116
+ dates: [ '2024-09-04T10:00:00Z', '2024-09-04T16:00:00Z' ]
117
117
  },
118
118
  {
119
119
  source: 'https://forums.elderscrollsonline.com',
@@ -125,7 +125,7 @@ const esoStatusRawDataList: EsoStatusRawData[] = await ForumMessage.getData(Foru
125
125
  status: 'planned',
126
126
  rawSlug: 'ESO Store and Account System for',
127
127
  rawDate: 'September 4, 10:00AM EDT (14:00 UTC) - 12:00PM EDT (16:00 UTC)',
128
- dates: [ Moment<2024-09-04T14:00:00Z>, Moment<2024-09-04T16:00:00Z> ]
128
+ dates: [ '2024-09-04T14:00:00Z', '2024-09-04T16:00:00Z' ]
129
129
  },
130
130
  {
131
131
  source: 'https://forums.elderscrollsonline.com',
@@ -137,7 +137,7 @@ const esoStatusRawDataList: EsoStatusRawData[] = await ForumMessage.getData(Foru
137
137
  status: 'planned',
138
138
  rawSlug: 'ESO Store and Account System for',
139
139
  rawDate: 'September 4, 10:00AM EDT (14:00 UTC) - 12:00PM EDT (16:00 UTC)',
140
- dates: [ Moment<2024-09-04T14:00:00Z>, Moment<2024-09-04T16:00:00Z> ]
140
+ dates: [ '2024-09-04T14:00:00Z', '2024-09-04T16:00:00Z' ]
141
141
  },
142
142
  {
143
143
  source: 'https://forums.elderscrollsonline.com/en/categories/pts',
@@ -148,9 +148,9 @@ const esoStatusRawDataList: EsoStatusRawData[] = await ForumMessage.getData(Foru
148
148
  zone: 'pts',
149
149
  status: 'planned',
150
150
  rawSlug: 'PTS',
151
- rawDate: 'Thursday at 9:00AM EDT (13:00 UTC).',
151
+ rawDate: 'Thursday at 9:00AM EDT (13:00 UTC)',
152
152
  rawStatus: 'We will be performing maintenance',
153
- dates: [ Moment<2024-09-05T13:00:00Z> ]
153
+ dates: [ '2024-09-05T13:00:00Z' ]
154
154
  }
155
155
  ]
156
156
  ```
package/lib/connector.js CHANGED
@@ -6,6 +6,16 @@ const raw_1 = require("./raw");
6
6
  * Class for retrieving information from announcements
7
7
  */
8
8
  class Connector {
9
+ url;
10
+ remoteContent;
11
+ /**
12
+ * List of raw data from announcements
13
+ */
14
+ raw = [];
15
+ /**
16
+ * List of information from announcements
17
+ */
18
+ rawEsoStatus = [];
9
19
  /**
10
20
  * @param url URL used as the source to retrieve announcements
11
21
  * @param remoteContent Content of the source retrieved via URL
@@ -13,14 +23,6 @@ class Connector {
13
23
  constructor(url, remoteContent) {
14
24
  this.url = url;
15
25
  this.remoteContent = remoteContent;
16
- /**
17
- * List of raw data from announcements
18
- */
19
- this.raw = [];
20
- /**
21
- * List of information from announcements
22
- */
23
- this.rawEsoStatus = [];
24
26
  this.getMessages();
25
27
  this.replace();
26
28
  this.split();
@@ -41,16 +43,16 @@ class Connector {
41
43
  */
42
44
  static async getRemoteContent(url) {
43
45
  const response = await axios_1.default.get(url);
44
- return response?.status === 200 && !!response?.data
45
- ? String(response?.data)
46
- : '';
46
+ return response.status === 200 && !!response.data ? response.data : '';
47
47
  }
48
48
  /**
49
49
  * Method for retrieving raw announcements for all announcement levels
50
50
  * @private
51
51
  */
52
52
  getMessages() {
53
- ['WarningMessage', 'AlertMessage'].forEach((type) => this.getMessagesByType(type));
53
+ ['AlertMessage', 'WarningMessage'].forEach((type) => {
54
+ this.getMessagesByType(type);
55
+ });
54
56
  }
55
57
  /**
56
58
  * Method for retrieving raw announcements based on the announcement level
@@ -71,10 +73,42 @@ class Connector {
71
73
  * @private
72
74
  */
73
75
  replace() {
74
- this.raw = this.raw.map((raw) => {
76
+ const list = [];
77
+ this.raw.forEach((raw) => {
78
+ raw.split('<br').forEach((line) => {
79
+ const split = line.split('/>');
80
+ list.push(split.join(''));
81
+ });
82
+ });
83
+ this.raw = list.map((raw) => {
75
84
  let initialRaw = raw;
76
- initialRaw = initialRaw.replace(/<br\/>\n/g, '<br>');
77
- return initialRaw.replace('. ', '.');
85
+ initialRaw = initialRaw.replace(' 。', '');
86
+ initialRaw = initialRaw.replaceAll('\n', '');
87
+ initialRaw = initialRaw.replaceAll('<br/>\n', '<br>');
88
+ initialRaw = initialRaw.replace(' Thank you for your patience!', '');
89
+ initialRaw = initialRaw.replace(' Thank you for your patience.', '');
90
+ initialRaw = initialRaw.replace(' We will update as new information becomes available.', '');
91
+ initialRaw = initialRaw.replace(' If you continue to experience difficulties at login, please restart your client. Thank you for your patience!', '');
92
+ initialRaw = initialRaw.replace(' ', ' ');
93
+ if (initialRaw.includes('\t')) {
94
+ const split = initialRaw.split('\t');
95
+ if (split[0] === ' ') {
96
+ return split[1];
97
+ }
98
+ if (split[0].includes('•')) {
99
+ return `• ${split[1]}`;
100
+ }
101
+ }
102
+ if (initialRaw.endsWith(' ')) {
103
+ initialRaw = initialRaw.substring(0, initialRaw.length - 1);
104
+ }
105
+ if (initialRaw.includes('. Please check here for status updates: <a href')) {
106
+ return initialRaw.split(' Please check here for status updates: <a href')[0];
107
+ }
108
+ if (initialRaw.includes(' <a href')) {
109
+ return initialRaw.split(' <a href')[0];
110
+ }
111
+ return initialRaw;
78
112
  });
79
113
  }
80
114
  /**
@@ -96,8 +130,12 @@ class Connector {
96
130
  filter() {
97
131
  this.raw = this.raw.filter((raw) => {
98
132
  return (!raw.includes('Maintenance for the week of ') &&
133
+ !raw.includes('Mantenimiento de la semana del ') &&
99
134
  !raw.includes('• PC/Mac: No maintenance – ') &&
100
- raw !== '');
135
+ !raw.includes('hora peninsular') &&
136
+ raw !== '' &&
137
+ !raw.startsWith('<') &&
138
+ !raw.endsWith('>'));
101
139
  });
102
140
  }
103
141
  /**
@@ -105,7 +143,9 @@ class Connector {
105
143
  * @private
106
144
  */
107
145
  fetch() {
108
- this.raw.forEach((raw) => this.fetchEach(raw));
146
+ this.raw.forEach((raw) => {
147
+ this.fetchEach(raw);
148
+ });
109
149
  }
110
150
  /**
111
151
  * Method for retrieving the information contained in an announcement
@@ -1,4 +1,3 @@
1
- import { Moment } from 'moment';
2
1
  /**
3
2
  * Class for identifying and formatting the date contained in an announcement
4
3
  */
@@ -9,9 +8,9 @@ export default class DateFormatter {
9
8
  */
10
9
  rawDate: string;
11
10
  /**
12
- * List of dates formatted correctly contained in the announcement
11
+ * List of dates formatted correctly contained in the announcement (ISO 8601)
13
12
  */
14
- dates: Moment[];
13
+ dates: string[];
15
14
  /**
16
15
  * @param raw Raw data of the announcement
17
16
  */
@@ -34,7 +33,7 @@ export default class DateFormatter {
34
33
  */
35
34
  private getRawSpecialDate;
36
35
  /**
37
- * Method for generating the list of correctly formatted dates for case #1
36
+ * Method for generating the list of correctly formatted dates for case #1 (ISO 8601)
38
37
  * @private
39
38
  */
40
39
  private formatClassic;
@@ -69,7 +68,7 @@ export default class DateFormatter {
69
68
  */
70
69
  private getRawClassicMinute2;
71
70
  /**
72
- * Method for generating the correctly formatted date in case #2
71
+ * Method for generating the correctly formatted date in case #2 (ISO 8601)
73
72
  * @private
74
73
  */
75
74
  private formatSpecial;
@@ -85,7 +84,7 @@ export default class DateFormatter {
85
84
  */
86
85
  private getRawSpecialMinute;
87
86
  /**
88
- * Method for formatting a date correctly
87
+ * Method for formatting a date correctly (ISO 8601)
89
88
  * @param year
90
89
  * @param month
91
90
  * @param day
@@ -93,5 +92,5 @@ export default class DateFormatter {
93
92
  * @param minute
94
93
  * @private
95
94
  */
96
- private static generateMoment;
95
+ private static generateDate;
97
96
  }
@@ -5,6 +5,15 @@ const moment = require("moment");
5
5
  * Class for identifying and formatting the date contained in an announcement
6
6
  */
7
7
  class DateFormatter {
8
+ raw;
9
+ /**
10
+ * Raw date data contained in the announcement
11
+ */
12
+ rawDate;
13
+ /**
14
+ * List of dates formatted correctly contained in the announcement (ISO 8601)
15
+ */
16
+ dates;
8
17
  /**
9
18
  * @param raw Raw data of the announcement
10
19
  */
@@ -48,16 +57,16 @@ class DateFormatter {
48
57
  */
49
58
  getRawSpecialDate() {
50
59
  const split = this.raw.split('on the PTS on ');
51
- return split.length === 2 ? split[1] : '';
60
+ return split.length === 2 ? split[1].split('.')[0] : '';
52
61
  }
53
62
  /**
54
- * Method for generating the list of correctly formatted dates for case #1
63
+ * Method for generating the list of correctly formatted dates for case #1 (ISO 8601)
55
64
  * @private
56
65
  */
57
66
  formatClassic() {
58
67
  return [
59
- DateFormatter.generateMoment(moment().get('years'), moment().month(this.getRawClassicMouth()).get('months'), this.getRawClassicDay(), this.getRawHour(), this.getRawClassicMinute1()),
60
- DateFormatter.generateMoment(moment().get('years'), moment().month(this.getRawClassicMouth()).get('months'), this.getRawClassicDay(), this.getRawClassicHour2(), this.getRawClassicMinute2()),
68
+ DateFormatter.generateDate(moment().get('years'), moment().month(this.getRawClassicMouth()).get('months'), this.getRawClassicDay(), this.getRawHour(), this.getRawClassicMinute1()),
69
+ DateFormatter.generateDate(moment().get('years'), moment().month(this.getRawClassicMouth()).get('months'), this.getRawClassicDay(), this.getRawClassicHour2(), this.getRawClassicMinute2()),
61
70
  ];
62
71
  }
63
72
  /**
@@ -79,37 +88,47 @@ class DateFormatter {
79
88
  * @private
80
89
  */
81
90
  getRawHour() {
82
- return Number(this.rawDate.split('(')[1].split(':')[0]);
91
+ return Number(this.rawDate
92
+ .split(' UTC')[0]
93
+ .split(' ')
94
+ .pop()
95
+ .split(':')[0]
96
+ .replace('(', ''));
83
97
  }
84
98
  /**
85
99
  * Method for retrieving the minute number of the start time for case #1
86
100
  * @private
87
101
  */
88
102
  getRawClassicMinute1() {
89
- return Number(this.rawDate.split('(')[1].split(':')[1].split(' ')[0]);
103
+ return Number(this.rawDate.split(' UTC')[0].split(':').pop());
90
104
  }
91
105
  /**
92
106
  * Method for retrieving the end hour number in case #1
93
107
  * @private
94
108
  */
95
109
  getRawClassicHour2() {
96
- return Number(this.rawDate.split('(')[2].split(':')[0]);
110
+ return Number(this.rawDate
111
+ .split(' UTC')[1]
112
+ .split(' ')
113
+ .pop()
114
+ .split(':')[0]
115
+ .replace('(', ''));
97
116
  }
98
117
  /**
99
118
  * Method for retrieving the minute number of the end time in case #1
100
119
  * @private
101
120
  */
102
121
  getRawClassicMinute2() {
103
- return Number(this.rawDate.split('(')[2].split(':')[1].split(' ')[0]);
122
+ return Number(this.rawDate.split(' UTC')[1].split(':').pop());
104
123
  }
105
124
  /**
106
- * Method for generating the correctly formatted date in case #2
125
+ * Method for generating the correctly formatted date in case #2 (ISO 8601)
107
126
  * @private
108
127
  */
109
128
  formatSpecial() {
110
129
  const date = this.getSpecialDate();
111
130
  return [
112
- DateFormatter.generateMoment(date.get('years'), date.get('months'), date.get('dates'), this.getRawHour(), this.getRawSpecialMinute()),
131
+ DateFormatter.generateDate(date.get('years'), date.get('months'), date.get('dates'), this.getRawHour(), this.getRawSpecialMinute()),
113
132
  ];
114
133
  }
115
134
  /**
@@ -136,7 +155,7 @@ class DateFormatter {
136
155
  return Number(this.rawDate.split(':')[2].split(' ')[0]);
137
156
  }
138
157
  /**
139
- * Method for formatting a date correctly
158
+ * Method for formatting a date correctly (ISO 8601)
140
159
  * @param year
141
160
  * @param month
142
161
  * @param day
@@ -144,7 +163,7 @@ class DateFormatter {
144
163
  * @param minute
145
164
  * @private
146
165
  */
147
- static generateMoment(year, month, day, hour, minute) {
166
+ static generateDate(year, month, day, hour, minute) {
148
167
  return moment()
149
168
  .utc()
150
169
  .set('years', year)
@@ -154,7 +173,8 @@ class DateFormatter {
154
173
  .set('minutes', minute)
155
174
  .set('seconds', 0)
156
175
  .set('milliseconds', 0)
157
- .utcOffset(0);
176
+ .utcOffset(0)
177
+ .toISOString();
158
178
  }
159
179
  }
160
180
  exports.default = DateFormatter;
@@ -6,95 +6,121 @@ const slug_match_1 = require("./slug.match");
6
6
  * Class for identifying the list of slugs contained in an announcement
7
7
  */
8
8
  class SlugIdentifier {
9
+ raw;
10
+ /**
11
+ * List of slug information found in the announcement
12
+ */
13
+ slugMatches;
14
+ /**
15
+ * List of slugs to check for presence in the announcement
16
+ * @private
17
+ */
18
+ slugList = [
19
+ types_1.ServerPcEuSlug,
20
+ types_1.ServerPcNaSlug,
21
+ types_1.ServerPcPtsSlug,
22
+ types_1.ServerPsEuSlug,
23
+ types_1.ServerPsNaSlug,
24
+ types_1.ServerXboxEuSlug,
25
+ types_1.ServerXboxNaSlug,
26
+ types_1.ServiceStoreEsoSlug,
27
+ types_1.ServiceSystemAccountSlug,
28
+ types_1.ServiceWebSiteSlug,
29
+ ];
30
+ /**
31
+ * List of indicators proving that the announcement pertains to the slug server_pc_eu
32
+ * @private
33
+ */
34
+ ServerPcEuMatchesList = [
35
+ 'PC/Mac: EU megaserver for',
36
+ 'PC/Mac: NA and EU megaservers for',
37
+ '] EU megaservers for',
38
+ '• EU megaservers for',
39
+ ];
40
+ /**
41
+ * List of indicators proving that the announcement pertains to the slug server_pc_na
42
+ * @private
43
+ */
44
+ ServerPcNaMatchesList = [
45
+ 'PC/Mac: NA megaserver for',
46
+ 'PC/Mac: NA and EU megaservers for',
47
+ '] NA megaservers for',
48
+ '• NA megaservers for',
49
+ 'North American PC/Mac megaserver',
50
+ ];
51
+ /**
52
+ * List of indicators proving that the announcement pertains to the slug server_pc_pts
53
+ * @private
54
+ */
55
+ ServerPcPtsMatchesList = ['PTS'];
56
+ /**
57
+ * List of indicators proving that the announcement pertains to the slug server_ps_eu
58
+ * @private
59
+ */
60
+ ServerPsEuMatchesList = [
61
+ 'PlayStation®: NA and EU megaservers for',
62
+ 'The PlayStation™ Network',
63
+ '] EU megaservers for',
64
+ '• EU megaservers for',
65
+ ];
66
+ /**
67
+ * List of indicators proving that the announcement pertains to the slug server_ps_na
68
+ * @private
69
+ */
70
+ ServerPsNaMatchesList = [
71
+ 'PlayStation®: NA and EU megaservers for',
72
+ 'The PlayStation™ Network',
73
+ '] NA megaservers for',
74
+ '• NA megaservers for',
75
+ 'North American PlayStation® megaserver',
76
+ ];
77
+ /**
78
+ * List of indicators proving that the announcement pertains to the slug server_xbox_eu
79
+ * @private
80
+ */
81
+ ServerXboxEuMatchesList = [
82
+ 'Xbox: NA and EU megaservers for',
83
+ 'Xbox: EU megaserver for',
84
+ '] EU megaservers for',
85
+ '• EU megaservers for',
86
+ 'Xbox Live™',
87
+ ];
88
+ /**
89
+ * List of indicators proving that the announcement pertains to the slug server_xbox_na
90
+ * @private
91
+ */
92
+ ServerXboxNaMatchesList = [
93
+ 'Xbox: NA and EU megaservers for',
94
+ '] NA megaservers for',
95
+ '• NA megaservers for',
96
+ 'Xbox Live™',
97
+ ];
98
+ /**
99
+ * List of indicators proving that the announcement pertains to the slug service_store_eso
100
+ * @private
101
+ */
102
+ ServiceStoreEsoMatchesList = ['ESO Store and Account System for'];
103
+ /**
104
+ * List of indicators proving that the announcement pertains to the slug service_system_account
105
+ * @private
106
+ */
107
+ ServiceSystemAccountMatchesList = ['ESO Store and Account System for'];
108
+ /**
109
+ * List of indicators proving that the announcement pertains to the slug service_web_site
110
+ * @private
111
+ */
112
+ ServiceWebSiteMatchesList = [
113
+ 'ESO Website for',
114
+ ];
9
115
  /**
10
116
  * @param raw Raw data of the announcement
11
117
  */
12
118
  constructor(raw) {
13
119
  this.raw = raw;
14
- /**
15
- * List of slugs to check for presence in the announcement
16
- * @private
17
- */
18
- this.slugList = [
19
- types_1.ServerPcEuSlug,
20
- types_1.ServerPcNaSlug,
21
- types_1.ServerPcPtsSlug,
22
- types_1.ServerPsEuSlug,
23
- types_1.ServerPsNaSlug,
24
- types_1.ServerXboxEuSlug,
25
- types_1.ServerXboxNaSlug,
26
- types_1.ServiceStoreEsoSlug,
27
- types_1.ServiceSystemAccountSlug,
28
- types_1.ServiceWebSiteSlug,
29
- ];
30
- /**
31
- * List of indicators proving that the announcement pertains to the slug server_pc_eu
32
- * @private
33
- */
34
- this.ServerPcEuMatchesList = [
35
- 'PC/Mac: EU megaserver for',
36
- 'PC/Mac: NA and EU megaservers for',
37
- ];
38
- /**
39
- * List of indicators proving that the announcement pertains to the slug server_pc_na
40
- * @private
41
- */
42
- this.ServerPcNaMatchesList = [
43
- 'PC/Mac: NA megaserver for',
44
- 'PC/Mac: NA and EU megaservers for',
45
- ];
46
- /**
47
- * List of indicators proving that the announcement pertains to the slug server_pc_pts
48
- * @private
49
- */
50
- this.ServerPcPtsMatchesList = ['PTS'];
51
- /**
52
- * List of indicators proving that the announcement pertains to the slug server_ps_eu
53
- * @private
54
- */
55
- this.ServerPsEuMatchesList = [
56
- 'PlayStation®: NA and EU megaservers for',
57
- ];
58
- /**
59
- * List of indicators proving that the announcement pertains to the slug server_ps_na
60
- * @private
61
- */
62
- this.ServerPsNaMatchesList = [
63
- 'PlayStation®: NA and EU megaservers for',
64
- ];
65
- /**
66
- * List of indicators proving that the announcement pertains to the slug server_xbox_eu
67
- * @private
68
- */
69
- this.ServerXboxEuMatchesList = [
70
- 'Xbox: NA and EU megaservers for',
71
- ];
72
- /**
73
- * List of indicators proving that the announcement pertains to the slug server_xbox_na
74
- * @private
75
- */
76
- this.ServerXboxNaMatchesList = [
77
- 'Xbox: NA and EU megaservers for',
78
- ];
79
- /**
80
- * List of indicators proving that the announcement pertains to the slug service_store_eso
81
- * @private
82
- */
83
- this.ServiceStoreEsoMatchesList = ['ESO Store and Account System for'];
84
- /**
85
- * List of indicators proving that the announcement pertains to the slug service_system_account
86
- * @private
87
- */
88
- this.ServiceSystemAccountMatchesList = ['ESO Store and Account System for'];
89
- /**
90
- * List of indicators proving that the announcement pertains to the slug service_web_site
91
- * @private
92
- */
93
- this.ServiceWebSiteMatchesList = [
94
- 'ESO Website for',
95
- ];
96
120
  this.slugMatches = [];
97
- this.slugList.forEach((slug) => this.identify(slug));
121
+ this.slugList.forEach((slug) => {
122
+ this.identify(slug);
123
+ });
98
124
  }
99
125
  /**
100
126
  * Method for retrieving the list of indicators for a slug to test
@@ -102,7 +128,8 @@ class SlugIdentifier {
102
128
  * @private
103
129
  */
104
130
  getMatchList(slug) {
105
- return this[SlugIdentifier.getMatchListName(slug)];
131
+ const key = SlugIdentifier.getMatchListName(slug);
132
+ return this[key];
106
133
  }
107
134
  /**
108
135
  * Method for retrieving the name of the list of indicators for a slug to test
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  * Class for retrieving information about a slug found in an announcement
5
5
  */
6
6
  class SlugMatch {
7
+ rawSlug;
8
+ slug;
7
9
  /**
8
10
  * @param rawSlug Data used to identify the presence of the slug in the announcement
9
11
  * @param slug Slug found in the announcement
@@ -8,11 +8,11 @@ export default class StatusIdentifier {
8
8
  /**
9
9
  * Data used to identify the presence of the status in the announcement
10
10
  */
11
- rawStatus: RemoteRawStatus;
11
+ rawStatus: RemoteRawStatus | null;
12
12
  /**
13
13
  * Status found in the announcement
14
14
  */
15
- status: Status;
15
+ status: Status | null;
16
16
  /**
17
17
  * List of statuses to check for presence in the announcement
18
18
  * @private
@@ -33,6 +33,11 @@ export default class StatusIdentifier {
33
33
  * @private
34
34
  */
35
35
  private readonly plannedMatchesList;
36
+ /**
37
+ * List of indicators proving that the announcement pertains to the status issues
38
+ * @private
39
+ */
40
+ private readonly issuesMatchesList;
36
41
  /**
37
42
  * @param raw Raw data of the announcement
38
43
  */
@@ -5,42 +5,68 @@ const types_1 = require("@eso-status/types");
5
5
  * Class for identifying the status contained in an announcement
6
6
  */
7
7
  class StatusIdentifier {
8
+ raw;
9
+ /**
10
+ * Data used to identify the presence of the status in the announcement
11
+ */
12
+ rawStatus;
13
+ /**
14
+ * Status found in the announcement
15
+ */
16
+ status;
17
+ /**
18
+ * List of statuses to check for presence in the announcement
19
+ * @private
20
+ */
21
+ statusList = [
22
+ types_1.UpStatus,
23
+ types_1.DownStatus,
24
+ types_1.PlannedStatus,
25
+ types_1.IssuesStatus,
26
+ ];
27
+ /**
28
+ * List of indicators proving that the announcement pertains to the status up
29
+ * @private
30
+ */
31
+ upMatchesList = [
32
+ '[COMPLETE]',
33
+ 'now available',
34
+ 'complete',
35
+ 'been resolved',
36
+ ];
37
+ /**
38
+ * List of indicators proving that the announcement pertains to the status down
39
+ * @private
40
+ */
41
+ downMatchesList = [
42
+ '[EXTENDED]',
43
+ '[IN PROGRESS]',
44
+ 'unavailable',
45
+ ];
46
+ /**
47
+ * List of indicators proving that the announcement pertains to the status planned
48
+ * @private
49
+ */
50
+ plannedMatchesList = [
51
+ 'We will be performing maintenance',
52
+ 'will be taken offline for maintenance',
53
+ ];
54
+ /**
55
+ * List of indicators proving that the announcement pertains to the status issues
56
+ * @private
57
+ */
58
+ issuesMatchesList = [
59
+ 'is currently experiencing a service interruption',
60
+ 'currently investigating',
61
+ ];
8
62
  /**
9
63
  * @param raw Raw data of the announcement
10
64
  */
11
65
  constructor(raw) {
12
66
  this.raw = raw;
13
- /**
14
- * List of statuses to check for presence in the announcement
15
- * @private
16
- */
17
- this.statusList = [types_1.UpStatus, types_1.DownStatus, types_1.PlannedStatus];
18
- /**
19
- * List of indicators proving that the announcement pertains to the status up
20
- * @private
21
- */
22
- this.upMatchesList = [
23
- '[COMPLETE]',
24
- 'now available',
25
- 'complete',
26
- ];
27
- /**
28
- * List of indicators proving that the announcement pertains to the status down
29
- * @private
30
- */
31
- this.downMatchesList = [
32
- '[EXTENDED]',
33
- '[IN PROGRESS]',
34
- 'unavailable',
35
- ];
36
- /**
37
- * List of indicators proving that the announcement pertains to the status planned
38
- * @private
39
- */
40
- this.plannedMatchesList = [
41
- 'We will be performing maintenance',
42
- ];
43
- this.statusList.forEach((status) => this.identify(status));
67
+ this.statusList.forEach((status) => {
68
+ this.identify(status);
69
+ });
44
70
  this.default();
45
71
  }
46
72
  /**
@@ -77,9 +103,7 @@ class StatusIdentifier {
77
103
  * @private
78
104
  */
79
105
  default() {
80
- if (!this.status) {
81
- this.status = types_1.PlannedStatus;
82
- }
106
+ this.status ??= types_1.PlannedStatus;
83
107
  }
84
108
  }
85
109
  exports.default = StatusIdentifier;
package/lib/index.js CHANGED
@@ -5,6 +5,8 @@ const connector_1 = require("./connector");
5
5
  /**
6
6
  * Class for retrieving announcement information
7
7
  */
8
+ /* eslint-disable @typescript-eslint/no-extraneous-class */
9
+ /* eslint-disable @typescript-eslint/unified-signatures */
8
10
  class ForumMessage {
9
11
  /**
10
12
  * Method for retrieving announcement information
@@ -16,4 +18,6 @@ class ForumMessage {
16
18
  }
17
19
  }
18
20
  exports.default = ForumMessage;
21
+ /* eslint-enable @typescript-eslint/no-extraneous-class */
22
+ /* eslint-enable @typescript-eslint/unified-signatures */
19
23
  //# sourceMappingURL=index.js.map
package/lib/raw.d.ts CHANGED
@@ -4,8 +4,8 @@ import { EsoStatusRawData } from './interface/esoStatusRawData.interface';
4
4
  * Class containing announcement information
5
5
  */
6
6
  export default class Raw {
7
- private url;
8
- private raw;
7
+ private readonly url;
8
+ private readonly raw;
9
9
  /**
10
10
  * Status identification class
11
11
  * @private
@@ -20,7 +20,7 @@ export default class Raw {
20
20
  * Class for identifying the list of slugs
21
21
  * @private
22
22
  */
23
- private slugsIdentifier;
23
+ private readonly slugsIdentifier;
24
24
  /**
25
25
  * List of information about slugs found in the announcement
26
26
  */
package/lib/raw.js CHANGED
@@ -7,6 +7,27 @@ const slug_identifier_1 = require("./identifier/slug.identifier");
7
7
  * Class containing announcement information
8
8
  */
9
9
  class Raw {
10
+ url;
11
+ raw;
12
+ /**
13
+ * Status identification class
14
+ * @private
15
+ */
16
+ statusIdentifier;
17
+ /**
18
+ * Class for identifying and formatting the date(s)
19
+ * @private
20
+ */
21
+ dateFormatter;
22
+ /**
23
+ * Class for identifying the list of slugs
24
+ * @private
25
+ */
26
+ slugsIdentifier;
27
+ /**
28
+ * List of information about slugs found in the announcement
29
+ */
30
+ matches = [];
10
31
  /**
11
32
  * @param url URL used as the source to retrieve announcements
12
33
  * @param raw Raw data of the announcement
@@ -14,10 +35,6 @@ class Raw {
14
35
  constructor(url, raw) {
15
36
  this.url = url;
16
37
  this.raw = raw;
17
- /**
18
- * List of information about slugs found in the announcement
19
- */
20
- this.matches = [];
21
38
  this.statusIdentifier = new status_identifier_1.default(this.raw);
22
39
  this.dateFormatter = new date_formatter_1.default(this.raw);
23
40
  this.slugsIdentifier = new slug_identifier_1.default(this.raw);
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Different statuses of announcements indicating that the announcement refers to a service/server that is not functioning properly
3
+ */
4
+ export type RemoteIssuesRawStatus = 'is currently experiencing a service interruption' | 'currently investigating';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=remoteIssuesRawStatus.type.js.map
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Different statuses of announcements indicating that the announcement refers to a service/server that will be undergoing maintenance soon
3
3
  */
4
- export type RemotePlannedRawStatus = 'We will be performing maintenance';
4
+ export type RemotePlannedRawStatus = 'We will be performing maintenance' | 'will be taken offline for maintenance';
@@ -5,7 +5,9 @@ import { RemoteServerPsEuRawSlug } from './remoteServerPsEuRawSlug.type';
5
5
  import { RemoteServerXboxEuRawSlug } from './remoteServerXboxEuRawSlug.type';
6
6
  import { RemoteServiceStoreEsoRawSlug } from './remoteServiceStoreEsoRawSlug.type';
7
7
  import { RemoteServiceWebSiteRawSlug } from './remoteServiceWebSiteRawSlug.type';
8
+ import { RemoteServerXboxNaRawSlug } from './remoteServerXboxNaRawSlug.type';
9
+ import { RemoteServerPsNaRawSlug } from './remoteServerPsNaRawSlug.type';
8
10
  /**
9
11
  * Different slugs of announcements
10
12
  */
11
- export type RemoteRawSlug = RemoteServerPcEuRawSlug | RemoteServerPcNaRawSlug | RemoteServerPcPtsRawSlug | RemoteServerPsEuRawSlug | RemoteServerXboxEuRawSlug | RemoteServiceStoreEsoRawSlug | RemoteServiceWebSiteRawSlug;
13
+ export type RemoteRawSlug = RemoteServerPcEuRawSlug | RemoteServerPcNaRawSlug | RemoteServerPcPtsRawSlug | RemoteServerPsEuRawSlug | RemoteServerPsNaRawSlug | RemoteServerXboxEuRawSlug | RemoteServerXboxNaRawSlug | RemoteServiceStoreEsoRawSlug | RemoteServiceWebSiteRawSlug;
@@ -1,7 +1,8 @@
1
1
  import { RemoteUpRawStatus } from './remoteUpRawStatus.type';
2
2
  import { RemoteDownRawStatus } from './remoteDownRawStatus.type';
3
3
  import { RemotePlannedRawStatus } from './remotePlannedRawStatus.type';
4
+ import { RemoteIssuesRawStatus } from './remoteIssuesRawStatus.type';
4
5
  /**
5
6
  * Different statuses of announcements
6
7
  */
7
- export type RemoteRawStatus = RemoteUpRawStatus | RemoteDownRawStatus | RemotePlannedRawStatus;
8
+ export type RemoteRawStatus = RemoteUpRawStatus | RemoteDownRawStatus | RemotePlannedRawStatus | RemoteIssuesRawStatus;
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Different slugs of announcements concerning the European PC/Mac Megaserver
3
3
  */
4
- export type RemoteServerPcEuRawSlug = 'PC/Mac: EU megaserver for' | 'PC/Mac: NA and EU megaservers for';
4
+ export type RemoteServerPcEuRawSlug = 'PC/Mac: EU megaserver for' | 'PC/Mac: NA and EU megaservers for' | '] EU megaservers for' | '• EU megaservers for';
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Different slugs of announcements concerning the North American PC/Mac Megaserver
3
3
  */
4
- export type RemoteServerPcNaRawSlug = 'PC/Mac: NA megaserver for' | 'PC/Mac: NA and EU megaservers for';
4
+ export type RemoteServerPcNaRawSlug = 'PC/Mac: NA megaserver for' | 'PC/Mac: NA and EU megaservers for' | '] NA megaservers for' | '• NA megaservers for' | 'North American PC/Mac megaserver';
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Different slugs of announcements concerning the European PlayStation® Megaserver
3
3
  */
4
- export type RemoteServerPsEuRawSlug = 'PlayStation®: NA and EU megaservers for';
4
+ export type RemoteServerPsEuRawSlug = 'PlayStation®: NA and EU megaservers for' | 'The PlayStation™ Network' | '] EU megaservers for' | '• EU megaservers for';
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Different slugs of announcements concerning the North American PlayStation® Megaserver
3
3
  */
4
- export type RemoteServerPsNaRawSlug = 'PlayStation®: NA and EU megaservers for';
4
+ export type RemoteServerPsNaRawSlug = 'PlayStation®: NA and EU megaservers for' | 'The PlayStation™ Network' | '] NA megaservers for' | '• NA megaservers for' | 'North American PlayStation® megaserver';
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Different slugs of announcements concerning the European Xbox Megaserver
3
3
  */
4
- export type RemoteServerXboxEuRawSlug = 'Xbox: NA and EU megaservers for';
4
+ export type RemoteServerXboxEuRawSlug = 'Xbox: NA and EU megaservers for' | 'Xbox: EU megaserver for' | '] EU megaservers for' | '• EU megaservers for' | 'Xbox Live™';
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Different slugs of announcements concerning the North American Xbox Megaserver
3
3
  */
4
- export type RemoteServerXboxNaRawSlug = 'Xbox: NA and EU megaservers for';
4
+ export type RemoteServerXboxNaRawSlug = 'Xbox: NA and EU megaservers for' | '] NA megaservers for' | '• NA megaservers for' | 'Xbox Live™';
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Different statuses of announcements indicating that the announcement refers to an accessible service/server
3
3
  */
4
- export type RemoteUpRawStatus = '[COMPLETE]' | 'now available' | 'complete';
4
+ export type RemoteUpRawStatus = '[COMPLETE]' | 'now available' | 'complete' | 'been resolved';
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@eso-status/forum-message",
3
- "version": "2.0.0-dev.2",
3
+ "version": "2.0.0-dev.21",
4
4
  "description": "Library for retrieving and formatting data, available at https://forums.elderscrollsonline.com or https://forums.elderscrollsonline.com/en/categories/pts",
5
- "author": "@dov118 <contact@dov118.dev> (https://dov118.dev)",
5
+ "author": "@dov118 <contact.dov118.dev@gmail.com> (https://dov118.dev)",
6
6
  "main": "lib/index.js",
7
7
  "license": "MIT",
8
8
  "engineStrict": true,
@@ -19,6 +19,8 @@
19
19
  "lib/type/messageType.type.js",
20
20
  "lib/type/remoteDownRawStatus.type.d.ts",
21
21
  "lib/type/remoteDownRawStatus.type.js",
22
+ "lib/type/remoteIssuesRawStatus.type.d.ts",
23
+ "lib/type/remoteIssuesRawStatus.type.js",
22
24
  "lib/type/remotePlannedRawStatus.type.d.ts",
23
25
  "lib/type/remotePlannedRawStatus.type.js",
24
26
  "lib/type/remoteRawSlug.type.d.ts",
@@ -63,7 +65,7 @@
63
65
  "README.md"
64
66
  ],
65
67
  "engines": {
66
- "node": "^18.18.0 || ^20.0.0"
68
+ "node": "^20.19.0 || ^22.13.0 || >=24"
67
69
  },
68
70
  "bugs": {
69
71
  "url": "https://github.com/eso-status/forum-message/issues"
@@ -80,32 +82,42 @@
80
82
  "build": "rm -R -f lib/* && tsc --project tsconfig.build.json",
81
83
  "dev": "npm run build && node .",
82
84
  "watch": "nodemon --exec npm run dev",
83
- "test": "npm run build && jest --runInBand --setupFiles",
84
- "test:watch": "jest --runInBand --watch --setupFiles",
85
- "test:cov": "jest --runInBand --coverage --setupFiles",
85
+ "test": "npm run build && jest --runInBand",
86
+ "test:watch": "jest --runInBand --watch",
87
+ "test:cov": "jest --runInBand --coverage",
86
88
  "prepare": "husky"
87
89
  },
88
90
  "dependencies": {
89
- "@eso-status/types": "2.0.0-dev.11",
90
- "axios": "1.7.7",
91
+ "@eso-status/types": "2.0.0-dev.17",
92
+ "axios": "1.13.6",
91
93
  "moment": "2.30.1"
92
94
  },
95
+ "lint-staged": {
96
+ "*.ts": [
97
+ "eslint --fix",
98
+ "prettier --write"
99
+ ],
100
+ "*.{json,md,yml,yaml}": [
101
+ "prettier --write"
102
+ ]
103
+ },
93
104
  "devDependencies": {
94
- "@types/jest": "29.5.12",
95
- "eslint": "8.57.0",
96
- "eslint-config-airbnb-base": "15.0.0",
97
- "eslint-config-airbnb-typescript": "18.0.0",
98
- "eslint-config-prettier": "9.1.0",
99
- "eslint-plugin-jest": "28.8.3",
100
- "eslint-plugin-prettier": "5.2.1",
101
- "eslint-plugin-sonarjs": "2.0.2",
102
- "eslint-plugin-unused-imports": "4.1.3",
103
- "husky": "9.1.5",
104
- "jest": "29.7.0",
105
- "nodemon": "3.1.4",
106
- "prettier": "3.3.3",
107
- "ts-jest": "29.2.5",
108
- "typescript": "5.5.4"
105
+ "@eslint/js": "10.0.1",
106
+ "@types/jest": "30.0.0",
107
+ "eslint": "10.0.3",
108
+ "eslint-config-prettier": "10.1.8",
109
+ "eslint-plugin-jest": "29.15.0",
110
+ "eslint-plugin-sonarjs": "4.0.2",
111
+ "eslint-plugin-unused-imports": "4.4.1",
112
+ "globals": "17.4.0",
113
+ "husky": "9.1.7",
114
+ "jest": "30.3.0",
115
+ "lint-staged": "16.3.3",
116
+ "nodemon": "3.1.14",
117
+ "prettier": "3.8.1",
118
+ "ts-jest": "29.4.6",
119
+ "typescript": "5.9.3",
120
+ "typescript-eslint": "8.57.0"
109
121
  },
110
122
  "jest": {
111
123
  "moduleFileExtensions": [
@@ -123,9 +135,6 @@
123
135
  ],
124
136
  "coverageDirectory": "./coverage",
125
137
  "testEnvironment": "node",
126
- "setupFiles": [
127
- "dotenv/config"
128
- ],
129
138
  "moduleDirectories": [
130
139
  "node_modules",
131
140
  "src"