Add support for server-specific timezone and date format settings

This commit is contained in:
Dragory 2020-08-10 00:24:06 +03:00
parent ddbbc543c2
commit c67a1df11d
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1
51 changed files with 326 additions and 168 deletions

View file

@ -6,6 +6,7 @@ import humanizeDuration from "humanize-duration";
import LCL from "last-commit-log";
import path from "path";
import moment from "moment-timezone";
import { getGuildTz } from "../../../utils/timezones";
export const AboutCmd = utilityCmd({
trigger: "about",
@ -29,7 +30,7 @@ export const AboutCmd = utilityCmd({
let version;
if (lastCommit) {
lastUpdate = moment(lastCommit.committer.date, "X").format("LL [at] H:mm [(UTC)]");
lastUpdate = moment.utc(lastCommit.committer.date, "X").format("LL [at] H:mm z");
version = lastCommit.shortHash;
} else {
lastUpdate = "?";
@ -49,6 +50,7 @@ export const AboutCmd = utilityCmd({
["Last update", lastUpdate],
["Version", version],
["API latency", `${shard.latency}ms`],
["Server timezone", getGuildTz(pluginData)],
];
const loadedPlugins = Array.from(

View file

@ -40,7 +40,7 @@ export const SourceCmd = utilityCmd({
const source = `${textSource}\n\nSource:\n\n${fullSource}`;
const archiveId = await pluginData.state.archives.create(source, moment().add(1, "hour"));
const archiveId = await pluginData.state.archives.create(source, moment.utc().add(1, "hour"));
const baseUrl = getBaseUrl(pluginData);
const url = pluginData.state.archives.getUrl(baseUrl, archiveId);
cmdMessage.channel.createMessage(`Message source: ${url}`);

View file

@ -4,6 +4,8 @@ import { Constants, EmbedOptions } from "eris";
import moment from "moment-timezone";
import humanizeDuration from "humanize-duration";
import { formatNumber, preEmbedPadding, trimLines } from "../../../utils";
import { inGuildTz } from "../../../utils/timezones";
import { getDateFormat } from "../../../utils/dateFormats";
const TEXT_CHANNEL_ICON =
"https://cdn.discordapp.com/attachments/740650744830623756/740656843545772062/text-channel.png";
@ -55,7 +57,8 @@ export async function getChannelInfoEmbed(
channelName = `#${channel.name}`;
}
const createdAt = moment(channel.createdAt, "x");
const createdAt = moment.utc(channel.createdAt, "x");
const prettyCreatedAt = inGuildTz(pluginData, createdAt).format(getDateFormat(pluginData, "pretty_datetime"));
const channelAge = humanizeDuration(Date.now() - channel.createdAt, {
largest: 2,
round: true,
@ -69,7 +72,7 @@ export async function getChannelInfoEmbed(
value: trimLines(`
Name: **${channelName}**
ID: \`${channel.id}\`
Created: **${channelAge} ago** (\`${createdAt.format("MMM D, YYYY [at] H:mm [UTC]")}\`)
Created: **${channelAge} ago** (\`${prettyCreatedAt}\`)
Type: **${channelType}**
${showMention ? `Mention: <#${channel.id}>` : ""}
`),

View file

@ -43,7 +43,7 @@ export async function getInviteInfoEmbed(
}
const serverCreatedAtTimestamp = snowflakeToTimestamp(invite.guild.id);
const serverCreatedAt = moment(serverCreatedAtTimestamp, "x");
const serverCreatedAt = moment.utc(serverCreatedAtTimestamp, "x");
const serverAge = humanizeDuration(Date.now() - serverCreatedAtTimestamp, {
largest: 2,
round: true,
@ -66,7 +66,7 @@ export async function getInviteInfoEmbed(
: `#${invite.channel.name}`;
const channelCreatedAtTimestamp = snowflakeToTimestamp(invite.channel.id);
const channelCreatedAt = moment(channelCreatedAtTimestamp, "x");
const channelCreatedAt = moment.utc(channelCreatedAtTimestamp, "x");
const channelAge = humanizeDuration(Date.now() - channelCreatedAtTimestamp, {
largest: 2,
round: true,
@ -117,7 +117,7 @@ export async function getInviteInfoEmbed(
}
const channelCreatedAtTimestamp = snowflakeToTimestamp(invite.channel.id);
const channelCreatedAt = moment(channelCreatedAtTimestamp, "x");
const channelCreatedAt = moment.utc(channelCreatedAtTimestamp, "x");
const channelAge = humanizeDuration(Date.now() - channelCreatedAtTimestamp, {
largest: 2,
round: true,

View file

@ -5,6 +5,8 @@ import moment from "moment-timezone";
import humanizeDuration from "humanize-duration";
import { chunkMessageLines, preEmbedPadding, trimEmptyLines, trimLines } from "../../../utils";
import { getDefaultPrefix } from "knub/dist/commands/commandUtils";
import { inGuildTz } from "../../../utils/timezones";
import { getDateFormat } from "../../../utils/dateFormats";
const MESSAGE_ICON = "https://cdn.discordapp.com/attachments/740650744830623756/740685652152025088/message.png";
@ -27,13 +29,15 @@ export async function getMessageInfoEmbed(
icon_url: MESSAGE_ICON,
};
const createdAt = moment(message.createdAt, "x");
const createdAt = moment.utc(message.createdAt, "x");
const prettyCreatedAt = inGuildTz(pluginData, createdAt).format(getDateFormat(pluginData, "pretty_datetime"));
const messageAge = humanizeDuration(Date.now() - message.createdAt, {
largest: 2,
round: true,
});
const editedAt = message.editedTimestamp && moment(message.editedTimestamp, "x");
const editedAt = message.editedTimestamp && moment.utc(message.editedTimestamp, "x");
const prettyEditedAt = inGuildTz(pluginData, editedAt).format(getDateFormat(pluginData, "pretty_datetime"));
const editAge =
message.editedTimestamp &&
humanizeDuration(Date.now() - message.editedTimestamp, {
@ -62,8 +66,8 @@ export async function getMessageInfoEmbed(
ID: \`${message.id}\`
Channel: <#${message.channel.id}>
Channel ID: \`${message.channel.id}\`
Created: **${messageAge} ago** (\`${createdAt.format("MMM D, YYYY [at] H:mm [UTC]")}\`)
${editedAt ? `Edited at: **${editAge} ago** (\`${editedAt.format("MMM D, YYYY [at] H:mm [UTC]")}\`)` : ""}
Created: **${messageAge} ago** (\`${prettyCreatedAt}\`)
${editedAt ? `Edited at: **${editAge} ago** (\`${prettyEditedAt}\`)` : ""}
Type: **${type}**
Link: [**Go to message **](https://discord.com/channels/${pluginData.guild.id}/${message.channel.id}/${
message.id
@ -72,13 +76,19 @@ export async function getMessageInfoEmbed(
),
});
const authorCreatedAt = moment(message.author.createdAt);
const authorCreatedAt = moment.utc(message.author.createdAt, "x");
const prettyAuthorCreatedAt = inGuildTz(pluginData, authorCreatedAt).format(
getDateFormat(pluginData, "pretty_datetime"),
);
const authorAccountAge = humanizeDuration(Date.now() - message.author.createdAt, {
largest: 2,
round: true,
});
const authorJoinedAt = message.member && moment(message.member.joinedAt);
const authorJoinedAt = message.member && moment.utc(message.member.joinedAt, "x");
const prettyAuthorJoinedAt = inGuildTz(pluginData, authorJoinedAt).format(
getDateFormat(pluginData, "pretty_datetime"),
);
const authorServerAge =
message.member &&
humanizeDuration(Date.now() - message.member.joinedAt, {
@ -91,12 +101,8 @@ export async function getMessageInfoEmbed(
value: trimLines(`
Name: **${message.author.username}#${message.author.discriminator}**
ID: \`${message.author.id}\`
Created: **${authorAccountAge} ago** (\`${authorCreatedAt.format("MMM D, YYYY [at] H:mm [UTC]")}\`)
${
authorJoinedAt
? `Joined: **${authorServerAge} ago** (\`${authorJoinedAt.format("MMM D, YYYY [at] H:mm [UTC]")}\`)`
: ""
}
Created: **${authorAccountAge} ago** (\`${prettyAuthorCreatedAt}\`)
${authorJoinedAt ? `Joined: **${authorServerAge} ago** (\`${prettyAuthorJoinedAt}\`)` : ""}
Mention: <@!${message.author.id}>
`),
});

View file

@ -5,6 +5,8 @@ import { CategoryChannel, EmbedOptions, Guild, RESTChannelInvite, TextChannel, V
import moment from "moment-timezone";
import humanizeDuration from "humanize-duration";
import { getGuildPreview } from "./getGuildPreview";
import { inGuildTz } from "../../../utils/timezones";
import { getDateFormat } from "../../../utils/dateFormats";
export async function getServerInfoEmbed(
pluginData: PluginData<UtilityPluginType>,
@ -37,14 +39,15 @@ export async function getServerInfoEmbed(
};
// BASIC INFORMATION
const createdAt = moment((guildPreview || restGuild).createdAt);
const serverAge = humanizeDuration(moment().valueOf() - createdAt.valueOf(), {
const createdAt = moment.utc((guildPreview || restGuild).createdAt, "x");
const prettyCreatedAt = inGuildTz(pluginData, createdAt).format(getDateFormat(pluginData, "pretty_datetime"));
const serverAge = humanizeDuration(moment.utc().valueOf() - createdAt.valueOf(), {
largest: 2,
round: true,
});
const basicInformation = [];
basicInformation.push(`Created: **${serverAge} ago** (${createdAt.format("YYYY-MM-DD[T]HH:mm:ss")})`);
basicInformation.push(`Created: **${serverAge} ago** (${prettyCreatedAt})`);
if (thisServer) {
const owner = await resolveUser(pluginData.client, thisServer.ownerID);

View file

@ -6,6 +6,8 @@ import moment from "moment-timezone";
import { CaseTypes } from "src/data/CaseTypes";
import humanizeDuration from "humanize-duration";
import { snowflakeToTimestamp } from "../../../utils/snowflakeToTimestamp";
import { inGuildTz } from "../../../utils/timezones";
import { getDateFormat } from "../../../utils/dateFormats";
const SNOWFLAKE_ICON = "https://cdn.discordapp.com/attachments/740650744830623756/742020790471491668/snowflake.png";
@ -29,7 +31,8 @@ export function getSnowflakeInfoEmbed(
}
const createdAtMS = snowflakeToTimestamp(snowflake);
const createdAt = moment(createdAtMS, "x");
const createdAt = moment.utc(createdAtMS, "x");
const prettyCreatedAt = inGuildTz(pluginData, createdAt).format(getDateFormat(pluginData, "pretty_datetime"));
const snowflakeAge = humanizeDuration(Date.now() - createdAtMS, {
largest: 2,
round: true,
@ -37,7 +40,7 @@ export function getSnowflakeInfoEmbed(
embed.fields.push({
name: preEmbedPadding + "Basic information",
value: `Created: **${snowflakeAge} ago** (\`${createdAt.format("MMM D, YYYY [at] H:mm [UTC]")}\`)`,
value: `Created: **${snowflakeAge} ago** (\`${prettyCreatedAt}\`)`,
});
return embed;

View file

@ -5,6 +5,8 @@ import { UnknownUser, trimLines, embedPadding, resolveMember, resolveUser, preEm
import moment from "moment-timezone";
import { CaseTypes } from "src/data/CaseTypes";
import humanizeDuration from "humanize-duration";
import { inGuildTz } from "../../../utils/timezones";
import { getDateFormat } from "../../../utils/dateFormats";
export async function getUserInfoEmbed(
pluginData: PluginData<UtilityPluginType>,
@ -29,8 +31,9 @@ export async function getUserInfoEmbed(
const avatarURL = user.avatarURL || user.defaultAvatarURL;
embed.author.icon_url = avatarURL;
const createdAt = moment(user.createdAt);
const accountAge = humanizeDuration(moment().valueOf() - user.createdAt, {
const createdAt = moment.utc(user.createdAt, "x");
const prettyCreatedAt = inGuildTz(pluginData, createdAt).format(getDateFormat(pluginData, "pretty_datetime"));
const accountAge = humanizeDuration(moment.utc().valueOf() - user.createdAt, {
largest: 2,
round: true,
});
@ -40,16 +43,17 @@ export async function getUserInfoEmbed(
name: preEmbedPadding + "User information",
value: trimLines(`
Profile: <@!${user.id}>
Created: **${accountAge} ago** (\`${createdAt.format("MMM D, YYYY")}\`)
Created: **${accountAge} ago** (\`${prettyCreatedAt}\`)
`),
});
if (member) {
const joinedAt = moment(member.joinedAt);
const joinAge = humanizeDuration(moment().valueOf() - member.joinedAt, {
const joinedAt = moment.utc(member.joinedAt, "x");
const prettyJoinedAt = inGuildTz(pluginData, joinedAt).format(getDateFormat(pluginData, "pretty_datetime"));
const joinAge = humanizeDuration(moment.utc().valueOf() - member.joinedAt, {
largest: 2,
round: true,
});
embed.fields[0].value += `\nJoined: **${joinAge} ago** (\`${joinedAt.format("MMM D, YYYY")}\`)`;
embed.fields[0].value += `\nJoined: **${joinAge} ago** (\`${prettyJoinedAt}\`)`;
} else {
embed.fields.push({
name: preEmbedPadding + "!! NOTE !!",
@ -65,14 +69,15 @@ export async function getUserInfoEmbed(
value: trimLines(`
Name: **${user.username}#${user.discriminator}**
ID: \`${user.id}\`
Created: **${accountAge} ago** (\`${createdAt.format("MMM D, YYYY [at] H:mm [UTC]")}\`)
Created: **${accountAge} ago** (\`${prettyCreatedAt}\`)
Mention: <@!${user.id}>
`),
});
if (member) {
const joinedAt = moment(member.joinedAt);
const joinAge = humanizeDuration(moment().valueOf() - member.joinedAt, {
const joinedAt = moment.utc(member.joinedAt, "x");
const prettyJoinedAt = inGuildTz(pluginData, joinedAt).format(getDateFormat(pluginData, "pretty_datetime"));
const joinAge = humanizeDuration(moment.utc().valueOf() - member.joinedAt, {
largest: 2,
round: true,
});
@ -81,7 +86,7 @@ export async function getUserInfoEmbed(
embed.fields.push({
name: preEmbedPadding + "Member information",
value: trimLines(`
Joined: **${joinAge} ago** (\`${joinedAt.format("MMM D, YYYY [at] H:mm [UTC]")}\`)
Joined: **${joinAge} ago** (\`${prettyJoinedAt}\`)
${roles.length > 0 ? "Roles: " + roles.map(r => r.name).join(", ") : ""}
`),
});

View file

@ -214,7 +214,7 @@ export async function archiveSearch(
${resultList}
`),
moment().add(1, "hour"),
moment.utc().add(1, "hour"),
);
const baseUrl = getBaseUrl(pluginData);