mirror of
https://github.com/Vendicated/Vencord.git
synced 2025-02-25 07:48:32 +00:00
Timezoes plugin
This commit is contained in:
parent
4c02b949ad
commit
a994e7629f
2 changed files with 243 additions and 0 deletions
57
src/plugins/Timezones/Utils.ts
Normal file
57
src/plugins/Timezones/Utils.ts
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Vencord, a modification for Discord's desktop app
|
||||||
|
* Copyright (c) 2022 Vendicated and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { findByPropsLazy } from "@webpack";
|
||||||
|
|
||||||
|
|
||||||
|
const API_URL = "https://timezonedb.catvibers.me/";
|
||||||
|
const Cache = new Map();
|
||||||
|
export const moment: typeof import("moment") = findByPropsLazy("parseTwoDigitYear");
|
||||||
|
|
||||||
|
export interface Timezone {
|
||||||
|
userID: string,
|
||||||
|
timezoneId: String,
|
||||||
|
timezone: string;
|
||||||
|
error: string;
|
||||||
|
}
|
||||||
|
const getSettings = () => Vencord.Settings.plugins.Timezones;
|
||||||
|
|
||||||
|
export async function getUserTimezone(discordID: string): Promise<Timezone> {
|
||||||
|
|
||||||
|
if (getSettings()[`timezones.${discordID}`])
|
||||||
|
return {
|
||||||
|
timezone: getSettings()[`timezones.${discordID}`],
|
||||||
|
} as Timezone;
|
||||||
|
|
||||||
|
if (Cache.has(discordID)) {
|
||||||
|
return Cache.get(discordID).timezone;
|
||||||
|
}
|
||||||
|
|
||||||
|
const timezone = await fetch(API_URL + "api/user/" + discordID).then(
|
||||||
|
r => r.json()
|
||||||
|
);
|
||||||
|
Cache.set(discordID, timezone);
|
||||||
|
return timezone.timezone;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getTimeString(timezone: Timezone, timestamp = moment()): string {
|
||||||
|
|
||||||
|
const time = timestamp.utcOffset(Number(timezone));
|
||||||
|
|
||||||
|
return time.format(Vencord.Settings.plugins.Timezones.use24hr ? "HH:mm" : "h:mm A");
|
||||||
|
}
|
186
src/plugins/Timezones/index.tsx
Normal file
186
src/plugins/Timezones/index.tsx
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
/*
|
||||||
|
* Vencord, a modification for Discord's desktop app
|
||||||
|
* Copyright (c) 2022 Vendicated and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import { ApplicationCommandInputType, ApplicationCommandOptionType, findOption, sendBotMessage } from "@api/Commands";
|
||||||
|
import { Devs } from "@utils/constants";
|
||||||
|
import { classes } from "@utils/misc";
|
||||||
|
import definePlugin, { OptionType } from "@utils/types";
|
||||||
|
import { findByPropsLazy } from "@webpack";
|
||||||
|
import { React } from "@webpack/common";
|
||||||
|
import { Message, User } from "discord-types/general";
|
||||||
|
|
||||||
|
import { getTimeString, getUserTimezone, Timezone } from "./Utils";
|
||||||
|
const styles = findByPropsLazy("timestampInline");
|
||||||
|
|
||||||
|
export default definePlugin({
|
||||||
|
name: "Timezones",
|
||||||
|
description: "Shows the timezones of users",
|
||||||
|
authors: [Devs.mantikafasi],
|
||||||
|
options: {
|
||||||
|
use24hr: {
|
||||||
|
type: OptionType.BOOLEAN,
|
||||||
|
description: "Use 24h format",
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
showTimezonesInChat: {
|
||||||
|
type: OptionType.BOOLEAN,
|
||||||
|
description: "Show timezones in chat",
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
showTimezonesInProfile: {
|
||||||
|
type: OptionType.BOOLEAN,
|
||||||
|
description: "Show timezones in profile",
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
commands: [
|
||||||
|
{
|
||||||
|
name: "settimezone",
|
||||||
|
description: "Set a users timezone",
|
||||||
|
inputType: ApplicationCommandInputType.BUILT_IN,
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: "user",
|
||||||
|
description: "User to set timezone for",
|
||||||
|
type: ApplicationCommandOptionType.USER,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "timezone",
|
||||||
|
description: "Timezone to set (+3, -5, etc.)",
|
||||||
|
type: ApplicationCommandOptionType.STRING,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
execute(args, ctx) {
|
||||||
|
const user = findOption(args, "user");
|
||||||
|
const timezone = findOption(args, "timezone");
|
||||||
|
Vencord.Settings.plugins.Timezones[`timezones.${user}`] = timezone;
|
||||||
|
sendBotMessage(ctx.channel.id, {content: "Timezone set"});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "deletetimezone",
|
||||||
|
description: "Delete a users timezone",
|
||||||
|
inputType: ApplicationCommandInputType.BUILT_IN,
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: "user",
|
||||||
|
description: "User to delete timezone for",
|
||||||
|
type: ApplicationCommandOptionType.USER,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
execute(args, ctx) {
|
||||||
|
const user = findOption(args, "user");
|
||||||
|
if (!Vencord.Settings.plugins.Timezones[`timezones.${user}`]) {
|
||||||
|
sendBotMessage(ctx.channel.id, {content: "No timezone"});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
delete Vencord.Settings.plugins.Timezones[`timezones.${user}`];
|
||||||
|
sendBotMessage(ctx.channel.id, {content: "Timezone deleted"});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "gettimezones",
|
||||||
|
description: "Get all timezones",
|
||||||
|
inputType: ApplicationCommandInputType.BUILT_IN,
|
||||||
|
execute(args, ctx) {
|
||||||
|
const timezones = Vencord.Settings.plugins.Timezones;
|
||||||
|
let str = Object.entries(timezones).filter(t => t.toString().startsWith("timezones.")).map(([user, timezone]) => `<@${user.slice(10)}>: ${timezone}`).join("\n");
|
||||||
|
|
||||||
|
if (str.length === 0) {
|
||||||
|
str = "No timezones set";
|
||||||
|
}
|
||||||
|
sendBotMessage(ctx.channel.id, {content:str});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
patches: [
|
||||||
|
{
|
||||||
|
find: "showCommunicationDisabledStyles",
|
||||||
|
replacement: {
|
||||||
|
|
||||||
|
match: /(?<=return\s*\(0,\w{1,3}\.jsxs?\)\(.+!\w{1,3}&&)(\[{0,1}\(0,\w{1,3}.jsxs?\)\(.+?\{.+?\}\)*\]{0,1})/,
|
||||||
|
// DONT EVER ASK ME HOW THIS WORKS I DONT KNOW EITHER I STOLE IT FROM TYMEN
|
||||||
|
replace: "[$1, Vencord.Plugins.plugins.Timezones.getTimezonesComponent(e)]"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
find: "().popoutNoBannerPremium",
|
||||||
|
replacement: {
|
||||||
|
match: /return(\(0,.\.jsx\)\(.\..,\{.*\}\))/,
|
||||||
|
replace: "return [$1, Vencord.Plugins.plugins.Timezones.getProfileTimezonesComponent(e)]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
getProfileTimezonesComponent: (e: any) => {
|
||||||
|
|
||||||
|
if (!Vencord.Settings.plugins.Timezones.showTimezonesInProfile) {
|
||||||
|
return (<></>);
|
||||||
|
}
|
||||||
|
|
||||||
|
const user = e.user as User;
|
||||||
|
|
||||||
|
const [timezone, setTimezone] = React.useState<Timezone | null>(null);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
getUserTimezone(user.id).then(timezone => setTimezone(timezone));
|
||||||
|
}, [user.id]);
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<span style={{
|
||||||
|
position: "absolute",
|
||||||
|
top: "110px",
|
||||||
|
right: "10px",
|
||||||
|
zIndex: 5,
|
||||||
|
background: "white",
|
||||||
|
borderRadius: "5px",
|
||||||
|
border: "4px solid white"
|
||||||
|
}}>
|
||||||
|
{timezone && getTimeString(timezone)}
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
,
|
||||||
|
getTimezonesComponent: (e: any) => {
|
||||||
|
if (Vencord.Settings.plugins.showTimezonesInChat || e.user)
|
||||||
|
return (<></>);
|
||||||
|
|
||||||
|
const message = e.message as Message;
|
||||||
|
|
||||||
|
const [timezone, setTimezone] = React.useState<Timezone | null>(null);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
getUserTimezone(e.message.author.id).then(timezone => setTimezone(timezone));
|
||||||
|
}, [message.author.id]);
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<span className={classes(styles.timestampInline, styles.timestamp)}>
|
||||||
|
{timezone && "• " + getTimeString(timezone, message.timestamp)}
|
||||||
|
</span>);
|
||||||
|
}
|
||||||
|
});
|
Loading…
Add table
Reference in a new issue