Skip to content

Commit d71eba2

Browse files
committed
Add different timezones to events
1 parent 7753020 commit d71eba2

File tree

4 files changed

+99
-33
lines changed

4 files changed

+99
-33
lines changed

src/commands/news/events.ts

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { CommandInteraction, Message, MessageEmbed } from "discord.js"
22

33
import Command from "../../utils/Command"
44
import client from "../../main"
5-
import { Bookmarkable, Colors, getDate, getEventEmbed, paginator } from "../../utils/Utils"
5+
import { Bookmarkable, Colors, getDate, getEndTime, getEventEmbed, getStartTime, paginator, } from "../../utils/Utils"
66
import { CommandSource, Event, SendMessage } from "../../utils/Types"
77

88
export default class Events extends Command {
@@ -29,28 +29,43 @@ export default class Events extends Command {
2929
const now = Date.now()
3030
const { events } = client.data
3131

32+
const startTimezone = "+08:00"
33+
const endTimezone = "-05:00"
34+
3235
const ongoing = events
33-
.filter(e =>
34-
e.start &&
35-
getDate(e.start, e.timezone).getTime() <= now &&
36-
(
37-
(e.end && getDate(e.end, e.timezone).getTime() >= now) ||
38-
(!e.end && e.reminder == "daily")
39-
)
40-
).sort((a, b) => {
41-
if (!a.end) return 1
42-
if (!b.end) return -1
43-
return getDate(a.end, a.timezone).getTime() - getDate(b.end, b.timezone).getTime()
36+
.filter(e => {
37+
const start = getStartTime(e, startTimezone)
38+
const end = getEndTime(e, endTimezone)
39+
40+
return start && start.getTime() <= now &&
41+
(
42+
(end && end.getTime() >= now) ||
43+
(!end && e.reminder == "daily")
44+
)
45+
}).sort((a, b) => {
46+
const endA = getEndTime(a, endTimezone)
47+
const endB = getEndTime(b, endTimezone)
48+
49+
if (!endA) return 1
50+
if (!endB) return -1
51+
52+
return endA.getTime() - endB.getTime()
4453
})
4554

4655
const upcoming = events
47-
.filter(e => e.start == undefined || getDate(e.start, e.timezone).getTime() > now)
48-
.sort((a, b) => {
49-
if (!a.start) return 1
50-
if (!b.start) return -1
51-
return getDate(a.start, a.timezone).getTime() - getDate(b.start, b.timezone).getTime()
56+
.filter(e => {
57+
const start = getStartTime(e, startTimezone)
58+
return start == false || start.getTime() > now
5259
})
60+
.sort((a, b) => {
61+
const startA = getStartTime(a, startTimezone)
62+
const startB = getStartTime(b, startTimezone)
5363

64+
if (!startA) return 1
65+
if (!startB) return -1
66+
67+
return startA.getTime() - startB.getTime()
68+
})
5469
const summaryPages = this.getSummaryPages(ongoing, upcoming)
5570
const pages: Bookmarkable[] = [{
5671
bookmarkEmoji: "",

src/data/events.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
"link": "https://www.hoyolab.com/article/324025",
111111
"img": "https://upload-os-bbs.mihoyo.com/upload/2021/04/25/1015537/5800bc8cae272566c0c70b2a3a4c452d_8480392818056458896.jpg",
112112
"start": "2021-04-28 11:00:00",
113+
"start_server": false,
113114
"end": "2021-05-18 17:59:00",
114115
"reminder": "end"
115116
},
@@ -119,6 +120,7 @@
119120
"link": "https://www.hoyolab.com/article/324040",
120121
"img": "https://upload-os-bbs.mihoyo.com/upload/2021/04/25/1015537/1df2bb7513a56f26bd87a4aa86ff8a93_8076639008885797857.jpg",
121122
"start": "2021-04-28 11:00:00",
123+
"start_server": false,
122124
"end": "2021-05-18 17:59:00",
123125
"reminder": "end"
124126
},
@@ -213,6 +215,7 @@
213215
"link": "https://www.hoyolab.com/article/415711",
214216
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/06/07/1015537/bf8645444de96287d9d66a813d9f0aa4_2451975548209649534.png",
215217
"start": "2021-06-09 11:00:00",
218+
"start_server": false,
216219
"end": "2021-06-29 17:59:00",
217220
"reminder": "end"
218221
},
@@ -222,6 +225,7 @@
222225
"link": "https://www.hoyolab.com/article/415712",
223226
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/06/07/1015537/26a86231e87f5d39a87306a77487b387_5687829416457810134.png",
224227
"start": "2021-06-09 11:00:00",
228+
"start_server": false,
225229
"end": "2021-06-29 17:59:00",
226230
"reminder": "end"
227231
},
@@ -256,6 +260,7 @@
256260
"link": "https://www.hoyolab.com/article/415687",
257261
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/06/07/1015537/271b4d0b0e2f3c848bccd1c4625fa6ca_1951559009485518734.png",
258262
"start": "2021-06-09 11:00:00",
263+
"start_server": false,
259264
"end": "2021-06-28 03:59:59",
260265
"reminder": "end"
261266
},
@@ -265,7 +270,9 @@
265270
"link": "https://www.hoyolab.com/article/415684",
266271
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/06/07/1015537/528eba2c062fec3768f66e3a24f2f23b_1431588138158128250.png",
267272
"start": "2021-06-09 11:00:00",
273+
"start_server": false,
268274
"end": "2021-07-21 05:59:59",
275+
"end_server": false,
269276
"reminder": "end"
270277
},
271278
{
@@ -361,6 +368,7 @@
361368
"link": "https://www.hoyolab.com/article/568050",
362369
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/07/19/1015537/9c6070da0fe23081c6ad3389b8ee010d_8307924212594573588.jpg",
363370
"start": "2021-07-21 11:00:00",
371+
"start_server": false,
364372
"end": "2021-08-10 17:59:00",
365373
"reminder": "end"
366374
},
@@ -370,6 +378,7 @@
370378
"link": "https://www.hoyolab.com/article/568052",
371379
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/07/19/1015537/5412443a686ef1cf9471a4f462eabc52_2614061678267906223.jpg",
372380
"start": "2021-07-21 11:00:00",
381+
"start_server": false,
373382
"end": "2021-08-10 17:59:00",
374383
"reminder": "end"
375384
},
@@ -493,6 +502,7 @@
493502
"link": "https://www.hoyolab.com/article/780998",
494503
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/08/28/1015537/8ba1f5c1d60e1476372aa2c4f27b382c_2286871364869273866.jpg",
495504
"start": "2021-09-01 11:00:00",
505+
"start_server": false,
496506
"end": "2021-09-21 17:59:00",
497507
"reminder": "end"
498508
},
@@ -502,6 +512,7 @@
502512
"link": "https://www.hoyolab.com/article/780981",
503513
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/08/28/1015537/1fc8403a31b02883763d0598c4425a38_2004836154187283192.jpg",
504514
"start": "2021-09-01 11:00:00",
515+
"start_server": false,
505516
"end": "2021-09-21 17:59:00",
506517
"reminder": "end"
507518
},
@@ -623,6 +634,7 @@
623634
"link": "https://www.hoyolab.com/article/1189984",
624635
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/10/11/1015537/86594246247263e30a0422d361a28bfb_7557166207046229842.jpg",
625636
"start": "2021-10-13 11:00:00",
637+
"start_server": false,
626638
"end": "2021-11-02 17:59:00",
627639
"reminder": "end"
628640
},
@@ -632,6 +644,7 @@
632644
"link": "https://www.hoyolab.com/article/1189985",
633645
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/10/11/1015537/0428b5c5613ac8bf5ee646dffa4808b8_8619510908833644737.jpg",
634646
"start": "2021-10-13 11:00:00",
647+
"start_server": false,
635648
"end": "2021-11-02 17:59:00",
636649
"reminder": "end"
637650
},
@@ -747,6 +760,7 @@
747760
"link": "https://www.hoyolab.com/article/1432611",
748761
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/11/19/1015537/21312fbcddc4c542a6db2a45870d1e1c_1739550797452216548.jpg",
749762
"start": "2021-11-24 11:00:00",
763+
"start_server": false,
750764
"end": "2021-12-14 17:59:00",
751765
"reminder": "end"
752766
},
@@ -756,6 +770,7 @@
756770
"link": "https://www.hoyolab.com/article/1432612",
757771
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/11/19/1015537/e6f83945ea2410bbeb2ad05ae88c0148_1358919906986922846.jpg",
758772
"start": "2021-11-24 11:00:00",
773+
"start_server": false,
759774
"end": "2021-12-14 17:59:00",
760775
"reminder": "end"
761776
},
@@ -765,6 +780,7 @@
765780
"link": "https://www.hoyolab.com/article/1432613e",
766781
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/11/19/1015537/c33c252a39318a29509e30d90c3ce183_1666493581406037042.jpg",
767782
"start": "2021-11-24 11:00:00",
783+
"start_server": false,
768784
"end": "2021-12-14 17:59:00",
769785
"reminder": "end"
770786
},
@@ -872,6 +888,7 @@
872888
"link": "https://www.hoyolab.com/article/1823224",
873889
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/12/29/1015537/ce08eefda22a1a4600a5ca3e850ef982_6338416199084824666.jpg",
874890
"start": "2022-01-05 11:00:00",
891+
"start_server": false,
875892
"end": "2022-01-25 17:59:00",
876893
"reminder": "end"
877894
},
@@ -881,6 +898,7 @@
881898
"link": "https://www.hoyolab.com/article/1823212",
882899
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/12/29/1015537/a843e23224ad57d6beea24f0a1865c30_5955783831679103604.jpg",
883900
"start": "2022-01-05 11:00:00",
901+
"start_server": false,
884902
"end": "2022-01-25 17:59:00",
885903
"reminder": "end"
886904
},
@@ -890,6 +908,7 @@
890908
"link": "https://www.hoyolab.com/article/1823187",
891909
"img": "https://upload-os-bbs.hoyolab.com/upload/2021/12/29/1015537/5443c79b66ed862ecffbbd9dfbee241d_1610682672805067671.jpg",
892910
"start": "2022-01-05 11:00:00",
911+
"start_server": false,
893912
"end": "2022-01-25 17:59:00",
894913
"reminder": "end"
895914
},

src/utils/Types.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export interface CommandStats {
1919
}
2020

2121
// Genshin stuff
22-
export type Server = "America" | "Europe" | "Asia" | "TW, HK, MO"
22+
export type Server = "Asia" | "Europe" | "America"
2323

2424
// Following stuff
2525
export type FollowCategory =
@@ -541,16 +541,18 @@ export interface AbyssSchedule {
541541

542542
// Events
543543
export interface Event {
544-
name: string
545-
type: EventType
546-
prediction?: boolean
547-
link?: string
548-
img?: string
549-
start?: string
550-
timezone?: string
551-
reminder?: EventReminderType
552-
remindtime?: string
553-
end?: string
544+
name: string
545+
type: EventType
546+
prediction?: boolean
547+
link?: string
548+
img?: string
549+
start?: string
550+
start_server?: boolean
551+
end?: string
552+
end_server?: boolean
553+
timezone?: string
554+
reminder?: EventReminderType
555+
remindtime?: string
554556
}
555557

556558
export enum EventType {

src/utils/Utils.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,9 @@ export function truncate(text: string, maxLength = 50): string {
102102

103103
// Get time information
104104
const offsets: {[server in Server]: number} = {
105+
Asia: +8,
106+
Europe: +1,
105107
America: -5,
106-
Europe: 1,
107-
Asia: +8,
108-
"TW, HK, MO": +8,
109108
}
110109
const servers = Object.keys(offsets) as Server[]
111110

@@ -179,6 +178,19 @@ export function getDate(timestamp: string, timezone = "+08:00"): Date {
179178
return new Date(`${timestamp}${timezone}`)
180179
}
181180

181+
export function isServerTimeStart(event: Event) {
182+
return event.start_server ?? (event.type == EventType.Banner || event.type == EventType.InGame || event.type == EventType.Unlock)
183+
}
184+
export function getStartTime(event: Event, serverTimezone: string) {
185+
return event.start != undefined && getDate(event.start, event.timezone ?? isServerTimeStart(event) ? serverTimezone : undefined)
186+
}
187+
188+
export function isServerTimeEnd(event: Event) {
189+
return event.end_server ?? (event.type == EventType.Banner || event.type == EventType.InGame || event.type == EventType.Web)
190+
}
191+
export function getEndTime(event: Event, serverTimezone: string) {
192+
return event.end != undefined && getDate(event.end, event.timezone ?? isServerTimeEnd(event) ? serverTimezone : undefined)
193+
}
182194

183195
// Format news
184196
export function getNewsEmbed(post: StoredNews, relativePage = -1, currentPage?: number, maxPages?: number): MessageEmbed | undefined {
@@ -288,12 +300,30 @@ export function getEventEmbed(event: Event): MessageEmbed {
288300
embed.setTitle(event.name)
289301
if (event.img) embed.setImage(event.img)
290302
if (event.link) embed.setURL(event.link)
291-
embed.addField(event.type == EventType.Unlock ? "Unlock Time" : "Start Time", event.start ? `${event.prediction ? "(prediction) " : ""}${event.start}${event.timezone?` (GMT${event.timezone})`:""}\n${relativeTimestampFromString(event.start, event.timezone)}` : "Unknown", true)
292-
if (event.end) embed.addField("End Time", `${event.end}${event.timezone?` (GMT${event.timezone})`:""}\n${relativeTimestampFromString(event.end, event.timezone)}`, true)
303+
embed.addField(event.type == EventType.Unlock ? "Unlock Time" : "Start Time", event.start ? `${event.prediction ? "(prediction) " : ""}${event.start}${event.timezone?` (GMT${event.timezone})`:""}\n${startTimes(event)}` : "Unknown", true)
304+
if (event.end) embed.addField("End Time", `${event.end}${event.timezone?` (GMT${event.timezone})`:""}\n${endTimes(event)}`, true)
293305
if (event.type && event.type !== EventType.Unlock) embed.addField("Type", event.type, true)
294306

295307
return embed
296308
}
309+
function startTimes(e: Event) {
310+
if (!e.start) return ""
311+
312+
if (!isServerTimeStart(e))
313+
return `Global: ${relativeTimestampFromString(e.start, e.timezone)}`
314+
315+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
316+
return getServerTimeInfo().map(st => `${st.server}: ${relativeTimestampFromString(e.start!, `${st.offset.split("").join("0")}:00`)}`).join("\n")
317+
}
318+
function endTimes(e: Event) {
319+
if (!e.end) return ""
320+
321+
if (!isServerTimeEnd(e))
322+
return relativeTimestampFromString(e.end, e.timezone)
323+
324+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
325+
return getServerTimeInfo().map(st => `${st.server}: ${relativeTimestampFromString(e.end!, `${st.offset.split("").join("0")}:00`)}`).join("\n")
326+
}
297327

298328
function split(splitted: string[], currentLine: string, toSplit: string | RegExp) {
299329
splitted = currentLine.split(toSplit)

0 commit comments

Comments
 (0)