From a2f1dc3d1e33d9c6a9ccbff112e35d3f63305890 Mon Sep 17 00:00:00 2001 From: Silas <91368591+Daaisukidayo@users.noreply.github.com> Date: Tue, 28 Jul 2026 19:05:09 +0200 Subject: [PATCH 1/2] Refactor calendar week calculation for ISO 8601 --- src/native/time/calendarWeek.ts | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/native/time/calendarWeek.ts b/src/native/time/calendarWeek.ts index 157446f3cf..0825feb9b2 100644 --- a/src/native/time/calendarWeek.ts +++ b/src/native/time/calendarWeek.ts @@ -3,13 +3,7 @@ * Copyright © 2026 BotForge */ -import { ArgType, NativeFunction, Return } from "../../structures" - -function getWeekOfYear(date: Date) { - const start = new Date(date.getFullYear(), 0, 1) - const days = (date.getTime() - start.getTime()) / 86400000 - return Math.ceil((days + start.getDay() + 1) / 7) -} +import { ArgType, NativeFunction, CalendarType } from "../../structures" export default new NativeFunction({ name: "$calendarWeek", @@ -18,6 +12,24 @@ export default new NativeFunction({ unwrap: true, output: ArgType.Number, execute: async function(ctx) { - return this.success(getWeekOfYear(new Date(new Date().toLocaleString("en-US", { timeZone: ctx.timezone, calendar: ctx.calendar })))) + const date = new Date(new Date().toLocaleString("en-US", { timeZone: ctx.timezone, calendar: ctx.calendar })) + + if (ctx.calendar === CalendarType.Iso8601) { + const target = new Date(date.valueOf()) + const dayNr = (date.getDay() + 6) % 7 + target.setDate(target.getDate() - dayNr + 3) + const firstThursday = target.valueOf() + target.setMonth(0, 1) + if (target.getDay() !== 4) { + target.setMonth(0, 1 + ((4 - target.getDay() + 7) % 7)) + } + return this.success(1 + Math.ceil((firstThursday - target.valueOf()) / 604800000)) + } + + const start = new Date(date.getFullYear(), 0, 1) + const days = (date.getTime() - start.getTime()) / 86400000 + const week = Math.ceil((days + start.getDay() + 1) / 7) + + return this.success(week) } -}) \ No newline at end of file +}) From a207d710d5546d596d192bb4a9a9e5037e125fc7 Mon Sep 17 00:00:00 2001 From: daisukidayo Date: Wed, 29 Jul 2026 21:47:40 +0200 Subject: [PATCH 2/2] Refactor calendar week calculation for ISO 8601 --- dist/native/time/calendarWeek.d.ts.map | 2 +- dist/native/time/calendarWeek.js | 22 ++++++++++++++++------ dist/native/time/calendarWeek.js.map | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/dist/native/time/calendarWeek.d.ts.map b/dist/native/time/calendarWeek.d.ts.map index f46a1bb28d..b143d3ef61 100644 --- a/dist/native/time/calendarWeek.d.ts.map +++ b/dist/native/time/calendarWeek.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"calendarWeek.d.ts","sourceRoot":"","sources":["../../../src/native/time/calendarWeek.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAU,MAAM,kBAAkB,CAAA;;AAQlE,wBASE"} \ No newline at end of file +{"version":3,"file":"calendarWeek.d.ts","sourceRoot":"","sources":["../../../src/native/time/calendarWeek.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAgB,MAAM,kBAAkB,CAAA;;AAExE,wBA2BE"} \ No newline at end of file diff --git a/dist/native/time/calendarWeek.js b/dist/native/time/calendarWeek.js index 197ae577e2..6636446507 100644 --- a/dist/native/time/calendarWeek.js +++ b/dist/native/time/calendarWeek.js @@ -5,11 +5,6 @@ */ Object.defineProperty(exports, "__esModule", { value: true }); const structures_1 = require("../../structures"); -function getWeekOfYear(date) { - const start = new Date(date.getFullYear(), 0, 1); - const days = (date.getTime() - start.getTime()) / 86400000; - return Math.ceil((days + start.getDay() + 1) / 7); -} exports.default = new structures_1.NativeFunction({ name: "$calendarWeek", version: "1.5.0", @@ -17,7 +12,22 @@ exports.default = new structures_1.NativeFunction({ unwrap: true, output: structures_1.ArgType.Number, execute: async function (ctx) { - return this.success(getWeekOfYear(new Date(new Date().toLocaleString("en-US", { timeZone: ctx.timezone, calendar: ctx.calendar })))); + const date = new Date(new Date().toLocaleString("en-US", { timeZone: ctx.timezone, calendar: ctx.calendar })); + if (ctx.calendar === structures_1.CalendarType.Iso8601) { + const target = new Date(date.valueOf()); + const dayNr = (date.getDay() + 6) % 7; + target.setDate(target.getDate() - dayNr + 3); + const firstThursday = target.valueOf(); + target.setMonth(0, 1); + if (target.getDay() !== 4) { + target.setMonth(0, 1 + ((4 - target.getDay() + 7) % 7)); + } + return this.success(1 + Math.ceil((firstThursday - target.valueOf()) / 604800000)); + } + const start = new Date(date.getFullYear(), 0, 1); + const days = (date.getTime() - start.getTime()) / 86400000; + const week = Math.ceil((days + start.getDay() + 1) / 7); + return this.success(week); } }); //# sourceMappingURL=calendarWeek.js.map \ No newline at end of file diff --git a/dist/native/time/calendarWeek.js.map b/dist/native/time/calendarWeek.js.map index e2263675fe..b8a45d3370 100644 --- a/dist/native/time/calendarWeek.js.map +++ b/dist/native/time/calendarWeek.js.map @@ -1 +1 @@ -{"version":3,"file":"calendarWeek.js","sourceRoot":"","sources":["../../../src/native/time/calendarWeek.ts"],"names":[],"mappings":";AAAA;;;EAGE;;AAEF,iDAAkE;AAElE,SAAS,aAAa,CAAC,IAAU;IAC7B,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAA;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,kBAAe,IAAI,2BAAc,CAAC;IAC9B,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,2BAA2B;IACxC,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,oBAAO,CAAC,MAAM;IACtB,OAAO,EAAE,KAAK,WAAU,GAAG;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACxI,CAAC;CACJ,CAAC,CAAA"} \ No newline at end of file +{"version":3,"file":"calendarWeek.js","sourceRoot":"","sources":["../../../src/native/time/calendarWeek.ts"],"names":[],"mappings":";AAAA;;;EAGE;;AAEF,iDAAwE;AAExE,kBAAe,IAAI,2BAAc,CAAC;IAC9B,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,2BAA2B;IACxC,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,oBAAO,CAAC,MAAM;IACtB,OAAO,EAAE,KAAK,WAAU,GAAG;QACvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAE7G,IAAI,GAAG,CAAC,QAAQ,KAAK,yBAAY,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACvC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAA;YAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;YACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACrB,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC3D,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAA;QACtF,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAChD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAA;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAEvD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;CACJ,CAAC,CAAA"} \ No newline at end of file