import { addExtensionSettings } from "@/seqta/utils/Adders/AddExtensionSettings"; import { loadHomePage } from "@/seqta/utils/Loaders/LoadHomePage"; import { SendNewsPage } from "@/seqta/utils/SendNewsPage"; import { setupSettingsButton } from "@/seqta/utils/setupSettingsButton"; import { GetThresholdOfColor } from "@/seqta/ui/colors/getThresholdColour"; import { appendBackgroundToUI } from "./ImageBackgrounds"; import stringToHTML from "@/seqta/utils/stringToHTML"; import { settingsState } from "@/seqta/utils/listeners/SettingsState"; import { updateAllColors } from "./colors/Manager"; import { delay } from "@/seqta/utils/delay"; let cachedUserInfo: any = null; let LightDarkModeSnakeEggButton = 0; export async function getUserInfo() { if (cachedUserInfo) return cachedUserInfo; try { const response = await fetch(`${location.origin}/seqta/student/login`, { method: "POST", headers: { "Content-Type": "application/json; charset=utf-8", }, body: JSON.stringify({ mode: "normal", query: null, redirect_url: location.origin, }), }); cachedUserInfo = (await response.json()).payload; return cachedUserInfo; } catch (error) { console.error("[BetterSEQTA+] Failed to get user info:", error); throw error; } } export async function AddBetterSEQTAElements() { if (settingsState.onoff) { if (settingsState.DarkMode) { document.documentElement.classList.add("dark"); } const fragment = document.createDocumentFragment(); const menu = document.getElementById("menu")!; const menuList = menu.firstChild as HTMLElement; createHomeButton(fragment, menuList); createNewsButton(fragment, menu); menuList.insertBefore(fragment, menuList.firstChild); try { await Promise.all([ appendBackgroundToUI(), handleUserInfo(), handleStudentData(), ]); } catch (error) { console.error("[BetterSEQTA+] Failed to initialize UI elements:", error); } setupEventListeners(); await addDarkLightToggle(); customizeMenuToggle(); } addExtensionSettings(); await createSettingsButton(); setupSettingsButton(); } function createHomeButton(fragment: DocumentFragment, _: HTMLElement) { const container = document.getElementById("content")!; const div = document.createElement("div"); div.classList.add("titlebar"); container.append(div); fragment.appendChild( stringToHTML( /* html */ `
  • `, ).firstChild!, ); } async function handleUserInfo() { try { updateUserInfo(await getUserInfo()); } catch (error) { console.error("[BetterSEQTA+] Failed to handle user info:", error); } } function updateUserInfo(info: { basic: boolean; clientIP: string[] | null; email: string | null; id: number | null; lastAccessedTime: number | null; meta: { code: string | null; governmentID: string | null; }; personUUID: string | null; status: number | null; synergeticCommunityUrl: string | null; type: string | null; userCode: string | null; userDesc: string | null; userName: string | null; }) { const titlebar = document.getElementsByClassName("titlebar")[0]; titlebar.append( stringToHTML(/* html */ `
    `).firstChild!, ); titlebar.append( stringToHTML(/* html */ `

    ${info.userDesc}

    ${info.meta.code} // ${info.meta.governmentID}

    `).firstChild!, ); document .getElementById("logouttooltip")! .appendChild(document.getElementsByClassName("logout")[0]); } async function handleStudentData() { try { const response = await fetch( `${location.origin}/seqta/student/load/message/people`, { method: "POST", headers: { "Content-Type": "application/json; charset=utf-8", }, body: JSON.stringify({ mode: "student" }), }, ); await updateStudentInfo((await response.json()).payload); } catch (error) { console.error("[BetterSEQTA+] Failed to handle student data:", error); } } async function updateStudentInfo(students: any) { const info = await getUserInfo(); const index = students.findIndex( (person: any) => person.firstname == info.userDesc.split(" ")[0] && person.surname == info.userDesc.split(" ")[1], ); const houseelement = document.getElementsByClassName( "userInfohouse", )[0] as HTMLElement; const student = students[index] ?? {}; let text = "N/A"; if (student.house) { text = `${student.year ?? ""}${student.house}`; if (student.house_colour) { houseelement.style.background = student.house_colour; try { const colorresult = GetThresholdOfColor(student.house_colour); houseelement.style.color = colorresult && colorresult > 300 ? "black" : "white"; } catch { // Invalid color format, leave text color as default } } } else if (student.year) { text = student.year; } houseelement.innerText = text; } function createNewsButton(fragment: DocumentFragment, menu: HTMLElement) { fragment.appendChild( stringToHTML( '
  • ', ).firstChild!, ); const iconCover = document.createElement("div"); iconCover.classList.add("icon-cover"); iconCover.id = "icon-cover"; menu.appendChild(iconCover); } function setupEventListeners() { const menuCover = document.querySelector("#icon-cover"); const homebutton = document.getElementById("homebutton"); const newsbutton = document.getElementById("newsbutton"); homebutton?.addEventListener("click", function () { if ( !homebutton.classList.contains("draggable") && !homebutton.classList.contains("active") ) { loadHomePage(); } }); newsbutton?.addEventListener("click", function () { if ( !newsbutton.classList.contains("draggable") && !newsbutton.classList.contains("active") ) { SendNewsPage(); } }); menuCover?.addEventListener("click", function () { location.href = "../#?page=/home"; loadHomePage(); ( document.getElementById("menu")!.firstChild! as HTMLElement ).classList.remove("noscroll"); }); } async function createSettingsButton() { document.getElementById("content")!.append( stringToHTML(/* html */ ` `).firstChild!, ); } function GetLightDarkModeString() { return settingsState.DarkMode ? "Switch to light theme" : "Switch to dark theme"; } async function addDarkLightToggle() { const SUN_ICON_SVG = /* html */ ``; const MOON_ICON_SVG = /* html */ ``; document.getElementById("content")!.append( stringToHTML(/* html */ ` `).firstChild!, ); updateAllColors(); const lightDarkModeButtonElement = document.getElementById( "LightDarkModeButton", )!; lightDarkModeButtonElement.addEventListener("click", async () => { const darklightText = document.getElementById("darklighttooliptext"); LightDarkModeSnakeEggButton += 1; if (LightDarkModeSnakeEggButton >= 10) { window.open("https://www.youtube.com/watch?v=dQw4w9WgXcQ", "_blank"); LightDarkModeSnakeEggButton = 0; } if ( settingsState.originalDarkMode !== undefined && settingsState.selectedTheme ) { darklightText!.innerText = "Locked by current theme"; await delay(1000); darklightText!.innerText = GetLightDarkModeString(); return; } settingsState.DarkMode = !settingsState.DarkMode; updateAllColors(); const svgElement = lightDarkModeButtonElement.querySelector("svg")!; svgElement.innerHTML = settingsState.DarkMode ? SUN_ICON_SVG : MOON_ICON_SVG; darklightText!.innerText = GetLightDarkModeString(); }); } function customizeMenuToggle() { const menuToggle = document.getElementById("menuToggle")!; menuToggle.innerHTML = ""; for (let i = 0; i < 3; i++) { const line = document.createElement("div"); line.className = "hamburger-line"; menuToggle.appendChild(line); } }