import { faBadgeCheck, faCircleExclamation, faPlus, } from "@fortawesome/pro-regular-svg-icons"; import { useLocation, useNavigate } from "@solidjs/router"; import { eq } from "drizzle-orm"; import createClient from "openapi-fetch"; import { For, createResource } from "solid-js"; import { getRequestEvent } from "solid-js/web"; import { FontAwesomeIcon } from "~/components/FontAwesomeIcon"; import Layout from "~/components/Layout"; import db from "~/drizzle"; import { discordTokens } from "~/drizzle/schema"; import { paths } from "~/types/discord"; import "../../styles/pages/config.scss"; if (typeof import.meta.env.VITE_DISCORD_CLIENT_ID === "undefined") throw new Error("No env VITE_DISCORD_CLIENT_ID found!"); if (typeof import.meta.env.VITE_DISCORD_OAUTH2_PERMISSIONS === "undefined") throw new Error("No env VITE_DISCORD_OAUTH2_PERMISSIONS found!"); const initialValue = () => ({ success: null as boolean | null, guilds: [] as { id: string; name: string; icon: string | null | undefined; }[], }); const getPayload = async (): Promise< | { success: false; message: string } | (ReturnType & { success: true }) > => { "use server"; const event = getRequestEvent(); if (!event) return { success: false, message: "No request event!" }; const pathname = new URL(event.request.url).pathname; const { user } = event.nativeEvent.context; if (!user) return { success: false, message: "User not logged in!" }; const tokens = await db.query.discordTokens .findFirst({ where: eq(discordTokens.userId, user.id), }) .execute(); if (!tokens) return { success: false, message: "No discord access token!" }; const { GET } = createClient({ baseUrl: "https://discord.com/api/v10", }); const { data: guilds, error } = await GET("/users/@me/guilds", { headers: { Authorization: `Bearer ${tokens.accessToken}` }, }); if (error) { console.log(error); return { success: false, message: "Error on discord api request!" }; } console.log(pathname, "success"); return { success: true, guilds: guilds ?.filter((e) => parseInt(e.permissions) & (1 << 5)) .map(({ id, name, icon }) => ({ id, name, icon })) ?? [], }; }; function index() { const navigator = useNavigate(); const location = useLocation(); const [payload] = createResource( // eslint-disable-next-line solid/reactivity async () => { const payload = await getPayload().catch((e) => console.warn(e)); if (!payload) { console.error(location.pathname, payload); return initialValue(); } if (!payload.success) { console.log(location.pathname, payload.message, "No success"); navigator("/", { replace: false }); return initialValue(); } return payload; }, { deferStream: true }, ); const icons = [faPlus, faCircleExclamation, faBadgeCheck]; const colors = [undefined, "orange", "green"]; return (

Configure li'l Judd in

{(guild, i) => { return ( Server pfp

{guild.name}

); }}
); } export default index;