Skip to content

Commit e38283d

Browse files
committed
feat: fix leap year rules, add year and month to the delay string
1 parent eb5fda8 commit e38283d

File tree

28 files changed

+64
-55
lines changed

28 files changed

+64
-55
lines changed

backend/src/humanizeDuration.ts

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import humanizeduration from "humanize-duration";
2+
3+
export const delayStringMultipliers = {
4+
y: 1000 * 60 * 60 * 24 * (365 + 1 / 4 - 1 / 100 + 1 / 400), // 365 + 1/4 - 1/100 + 1/400 (leap year rules) = 365.2425 days
5+
mo: 1000 * 60 * 60 * 24 * (365 + 1 / 4 - 1 / 100 + 1 / 400) / 12, // 365.2425 / 12 = 30.436875 days
6+
w: 1000 * 60 * 60 * 24 * 7,
7+
d: 1000 * 60 * 60 * 24,
8+
h: 1000 * 60 * 60,
9+
m: 1000 * 60,
10+
s: 1000,
11+
ms: 1,
12+
};
13+
14+
export const humanizeDurationShort = humanizeduration.humanizer({
15+
language: "shortEn",
16+
languages: {
17+
shortEn: {
18+
y: () => "y",
19+
mo: () => "mo",
20+
w: () => "w",
21+
d: () => "d",
22+
h: () => "h",
23+
m: () => "m",
24+
s: () => "s",
25+
ms: () => "ms",
26+
},
27+
},
28+
spacer: "",
29+
unitMeasures: delayStringMultipliers,
30+
});
31+
32+
export const humanizeDuration = humanizeduration.humanizer({
33+
unitMeasures: delayStringMultipliers
34+
})

backend/src/humanizeDurationShort.ts

-18
This file was deleted.

backend/src/plugins/Automod/functions/createMessageSpamTrigger.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import z from "zod";
22
import { SavedMessage } from "../../../data/entities/SavedMessage.js";
3-
import { humanizeDurationShort } from "../../../humanizeDurationShort.js";
3+
import { humanizeDurationShort } from "../../../humanizeDuration.js";
44
import { getBaseUrl } from "../../../pluginUtils.js";
55
import { convertDelayStringToMS, sorter, zDelayString } from "../../../utils.js";
66
import { RecentActionType } from "../constants.js";

backend/src/plugins/ContextMenus/actions/mute.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ContextMenuCommandInteraction } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { GuildPluginData } from "knub";
44
import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError.js";
55
import { canActOn } from "../../../pluginUtils.js";

backend/src/plugins/LocateUser/commands/FollowCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import humanizeDuration from "humanize-duration";
1+
import { humanizeDuration } from "../../../humanizeDuration.js";
22
import moment from "moment-timezone";
33
import { commandTypeHelpers as ct } from "../../../commandTypes.js";
44
import { registerExpiringVCAlert } from "../../../data/loops/expiringVCAlertsLoop.js";

backend/src/plugins/Logs/logFunctions/logMemberJoin.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { GuildMember } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import {humanizeDuration} from "humanize-duration";
33
import { GuildPluginData } from "knub";
44
import moment from "moment-timezone";
55
import { LogType } from "../../../data/LogType.js";

backend/src/plugins/ModActions/commands/BanCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import humanizeDuration from "humanize-duration";
1+
import { humanizeDuration } from "../../../humanizeDuration.js";
22
import { getMemberLevel } from "knub/helpers";
33
import { commandTypeHelpers as ct } from "../../../commandTypes.js";
44
import { CaseTypes } from "../../../data/CaseTypes.js";

backend/src/plugins/ModActions/commands/MassBanCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { performance } from "perf_hooks";
44
import { commandTypeHelpers as ct } from "../../../commandTypes.js";
55
import { CaseTypes } from "../../../data/CaseTypes.js";
66
import { LogType } from "../../../data/LogType.js";
7-
import { humanizeDurationShort } from "../../../humanizeDurationShort.js";
7+
import { humanizeDurationShort } from "../../../humanizeDuration.js";
88
import { canActOn, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils.js";
99
import { CasesPlugin } from "../../../plugins/Cases/CasesPlugin.js";
1010
import { DAYS, MINUTES, SECONDS, noop } from "../../../utils.js";

backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { GuildMember, GuildTextBasedChannel, Message, User } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { GuildPluginData } from "knub";
44
import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError.js";
55
import { logger } from "../../../logger.js";

backend/src/plugins/ModActions/functions/actualUnmuteUserCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { GuildMember, Message, User } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { GuildPluginData } from "knub";
44
import { hasPermission, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils.js";
55
import { MutesPlugin } from "../../../plugins/Mutes/MutesPlugin.js";

backend/src/plugins/ModActions/functions/banUserId.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { DiscordAPIError, Snowflake } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { GuildPluginData } from "knub";
44
import { CaseTypes } from "../../../data/CaseTypes.js";
55
import { LogType } from "../../../data/LogType.js";

backend/src/plugins/ModActions/functions/clearTempban.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Snowflake } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { GuildPluginData } from "knub";
44
import moment from "moment-timezone";
55
import { CaseTypes } from "../../../data/CaseTypes.js";

backend/src/plugins/Mutes/commands/MutesCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
} from "discord.js";
99
import moment from "moment-timezone";
1010
import { commandTypeHelpers as ct } from "../../../commandTypes.js";
11-
import { humanizeDurationShort } from "../../../humanizeDurationShort.js";
11+
import { humanizeDurationShort } from "../../../humanizeDuration.js";
1212
import { getBaseUrl } from "../../../pluginUtils.js";
1313
import { DBDateFormat, MINUTES, renderUsername, resolveMember } from "../../../utils.js";
1414
import { IMuteWithDetails, mutesCmd } from "../types.js";

backend/src/plugins/Mutes/functions/muteUser.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Snowflake } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { GuildPluginData } from "knub";
44
import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError.js";
55
import { CaseTypes } from "../../../data/CaseTypes.js";

backend/src/plugins/Mutes/functions/unmuteUser.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Snowflake } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { GuildPluginData } from "knub";
44
import { CaseTypes } from "../../../data/CaseTypes.js";
55
import { AddMuteParams } from "../../../data/GuildMutes.js";

backend/src/plugins/Post/commands/ScheduledPostsListCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { escapeCodeBlock } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import moment from "moment-timezone";
44
import { createChunkedMessage, DBDateFormat, deactivateMentions, sorter, trimLines } from "../../../utils.js";
55
import { TimeAndDatePlugin } from "../../TimeAndDate/TimeAndDatePlugin.js";

backend/src/plugins/Post/util/actualPostCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { GuildTextBasedChannel, Message } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { GuildPluginData } from "knub";
44
import moment from "moment-timezone";
55
import { registerUpcomingScheduledPost } from "../../../data/loops/upcomingScheduledPostsLoop.js";

backend/src/plugins/Reminders/commands/RemindCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import humanizeDuration from "humanize-duration";
1+
import { humanizeDuration } from "../../../humanizeDuration.js";
22
import moment from "moment-timezone";
33
import { commandTypeHelpers as ct } from "../../../commandTypes.js";
44
import { registerUpcomingReminder } from "../../../data/loops/upcomingRemindersLoop.js";

backend/src/plugins/Reminders/commands/RemindersCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import humanizeDuration from "humanize-duration";
1+
import { humanizeDuration } from "../../../humanizeDuration.js";
22
import moment from "moment-timezone";
33
import { sendErrorMessage } from "../../../pluginUtils.js";
44
import { createChunkedMessage, DBDateFormat, sorter } from "../../../utils.js";

backend/src/plugins/Slowmode/commands/SlowmodeGetCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import humanizeDuration from "humanize-duration";
1+
import { humanizeDuration } from "../../../humanizeDuration.js";
22
import { commandTypeHelpers as ct } from "../../../commandTypes.js";
33
import { slowmodeCmd } from "../types.js";
44

backend/src/plugins/Slowmode/commands/SlowmodeListCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { GuildChannel, TextChannel } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { createChunkedMessage } from "knub/helpers";
44
import { errorMessage } from "../../../utils.js";
55
import { slowmodeCmd } from "../types.js";

backend/src/plugins/Slowmode/commands/SlowmodeSetCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { escapeInlineCode, PermissionsBitField } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { commandTypeHelpers as ct } from "../../../commandTypes.js";
44
import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils.js";
55
import { asSingleLine, DAYS, HOURS, MINUTES } from "../../../utils.js";

backend/src/plugins/Tags/TagsPlugin.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Snowflake } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../humanizeDuration.js";
33
import { PluginOptions, guildPlugin } from "knub";
44
import moment from "moment-timezone";
55
import { GuildArchives } from "../../data/GuildArchives.js";

backend/src/plugins/Utility/commands/AboutCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { APIEmbed, GuildChannel } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import LCL from "last-commit-log";
44
import shuffle from "lodash/shuffle.js";
55
import moment from "moment-timezone";

backend/src/plugins/Utility/commands/CleanCmd.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { allowTimeout } from "../../../RegExpRunner.js";
44
import { commandTypeHelpers as ct } from "../../../commandTypes.js";
55
import { LogType } from "../../../data/LogType.js";
66
import { SavedMessage } from "../../../data/entities/SavedMessage.js";
7-
import { humanizeDurationShort } from "../../../humanizeDurationShort.js";
7+
import { humanizeDurationShort } from "../../../humanizeDuration.js";
88
import { getBaseUrl, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils.js";
99
import { ModActionsPlugin } from "../../../plugins/ModActions/ModActionsPlugin.js";
1010
import { DAYS, SECONDS, chunkArray, getInviteCodesInString, noop } from "../../../utils.js";

backend/src/plugins/Utility/functions/getChannelInfoEmbed.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { APIEmbed, ChannelType, Snowflake, StageChannel, VoiceChannel } from "discord.js";
2-
import humanizeDuration from "humanize-duration";
2+
import { humanizeDuration } from "../../../humanizeDuration.js";
33
import { GuildPluginData } from "knub";
44
import { EmbedWith, MINUTES, formatNumber, preEmbedPadding, trimLines, verboseUserMention } from "../../../utils.js";
55
import { UtilityPluginType } from "../types.js";

backend/src/utils.ts

+5-12
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
import emojiRegex from "emoji-regex";
2929
import fs from "fs";
3030
import https from "https";
31-
import humanizeDuration from "humanize-duration";
31+
import { humanizeDuration, delayStringMultipliers } from "./humanizeDuration.js"
3232
import isEqual from "lodash/isEqual.js";
3333
import { performance } from "perf_hooks";
3434
import tlds from "tlds" assert { type: "json" };
@@ -44,21 +44,14 @@ import { waitForButtonConfirm } from "./utils/waitForInteraction.js";
4444

4545
const fsp = fs.promises;
4646

47-
const delayStringMultipliers = {
48-
w: 1000 * 60 * 60 * 24 * 7,
49-
d: 1000 * 60 * 60 * 24,
50-
h: 1000 * 60 * 60,
51-
m: 1000 * 60,
52-
s: 1000,
53-
x: 1,
54-
};
55-
5647
export const MS = 1;
5748
export const SECONDS = 1000 * MS;
5849
export const MINUTES = 60 * SECONDS;
5950
export const HOURS = 60 * MINUTES;
6051
export const DAYS = 24 * HOURS;
61-
export const WEEKS = 7 * 24 * HOURS;
52+
export const WEEKS = 7 * DAYS;
53+
export const YEARS = (365 + 1/4 - 1/100 + 1/400) * DAYS;
54+
export const MONTHS = YEARS / 12;
6255

6356
export const EMPTY_CHAR = "\u200b";
6457

@@ -407,7 +400,7 @@ const MAX_DELAY_STRING_AMOUNT = 100 * 365 * DAYS;
407400
* Turns a "delay string" such as "1h30m" to milliseconds
408401
*/
409402
export function convertDelayStringToMS(str, defaultUnit = "m"): number | null {
410-
const regex = /^([0-9]+)\s*([wdhms])?[a-z]*\s*/;
403+
const regex = /^([0-9]+)\s*((?:mo?)|[ywdhs])?[a-z]*\s*/;
411404
let match;
412405
let ms = 0;
413406

dashboard/src/components/dashboard/GuildAccess.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ import {
108108
GuildState,
109109
RootState
110110
} from "../../store/types";
111-
import humanizeDuration from "humanize-duration";
111+
import { humanizeDuration } from "humanize-duration";
112112
import moment from "moment";
113113
114114
export default {

0 commit comments

Comments
 (0)