diff --git a/src/plugins/timezones/api.ts b/src/plugins/timezones/api.ts index c9feafe3e..246ffb50d 100644 --- a/src/plugins/timezones/api.ts +++ b/src/plugins/timezones/api.ts @@ -9,11 +9,26 @@ import { Logger } from "@utils/Logger"; import settings from "./settings"; +export const DEFAULT_API = "https://timezonedb.catvibers.me/api"; + export type Snowflake = string; type ApiError = { error: string; }; type UserFetchResponse = ApiError | { timezoneId: string } type BulkFetchResponse = ApiError | Record; +export async function verifyApi(url: string): Promise { + if (url === DEFAULT_API) return true; + + const res = await fetch(url, { + method: "GET", + headers: { + "User-Agent": VENCORD_USER_AGENT, + }, + }); + + return "logged_in" in await res.json(); +} + export async function fetchTimezonesBulk(ids: Snowflake[]): Promise | undefined> { try { const { apiUrl } = settings.store; @@ -21,7 +36,7 @@ export async function fetchTimezonesBulk(ids: Snowflake[]): Promise): Promisable { + // Check that API url is valid + const { apiUrl } = options; + if (!apiUrl) return "Invalid API url!"; + + return verifyApi(apiUrl).then(success => { + if (success) return true; + return "Failed to verify API!"; + }).catch(err => { + new Logger("Timezones").info("Failed to verify API url", err); + return "Failed to verify API!"; + }); + }, + renderProfileTimezone: (props?: { user?: User; }) => { if (!settings.store.displayInProfile || !props?.user?.id) return null; diff --git a/src/plugins/timezones/settings.tsx b/src/plugins/timezones/settings.tsx index 282ce8dfd..8c9537c8e 100644 --- a/src/plugins/timezones/settings.tsx +++ b/src/plugins/timezones/settings.tsx @@ -19,31 +19,28 @@ import { DataStore } from "@api/index"; import { definePluginSettings } from "@api/Settings"; import { Link } from "@components/Link"; +import { Margins } from "@utils/margins"; +import { classes } from "@utils/misc"; import { IPluginOptionComponentProps, OptionType } from "@utils/types"; import { Text } from "@webpack/common"; -import { Snowflake } from "./api"; +import { DEFAULT_API, Snowflake } from "./api"; import { TimezoneCache } from "./cache"; -import { classes } from "@utils/misc"; -import { Margins } from "@utils/margins"; export type TimezoneOverrides = Record; -const DEFAULT_API = "https://timezonedb.catvibers.me/api"; - const settings = definePluginSettings({ enableApi: { type: OptionType.BOOLEAN, description: "Fetch user timezones from TimezoneDB when a local override does not exist", default: true, }, - // TODO: disable this if enableApi is disabled apiUrl: { type: OptionType.STRING, description: "The TimezoneDB API instance", default: DEFAULT_API, placeholder: DEFAULT_API, - onChange(_: any) { + onChange(_: string) { DataStore.clear(TimezoneCache).catch(_ => _); }, },