const fs = require("fs") const { join } = require("path") const { pathToFileURL } = require("url") const ipc = require("../discord_native/renderer/ipc") let webviews = new Map() window.webviews = webviews function forwardToCurrentWebview(event){ return [event, async (...args) => { let webview = webviews.get(document.querySelector(".chrome-tab[active]")) if(!webview)return await webview.ready webview.send(event, ...args.slice(1)) }] } /** discord_desktop_core Stable */ ipc.on(...forwardToCurrentWebview("MAIN_WINDOW_FOCUS")) ipc.on(...forwardToCurrentWebview("MAIN_WINDOW_BLUR")) ipc.on(...forwardToCurrentWebview("SYSTEM_TRAY_OPEN_VOICE_SETTINGS")) ipc.on(...forwardToCurrentWebview("SYSTEM_TRAY_TOGGLE_MUTE")) ipc.on(...forwardToCurrentWebview("SYSTEM_TRAY_TOGGLE_DEAFEN")) ipc.on(...forwardToCurrentWebview("LAUNCH_APPLICATION")) ipc.on(...forwardToCurrentWebview("SPELLCHECK_RESULT")) ipc.on(...forwardToCurrentWebview("WINDOW_DEVTOOLS_OPENED")) ipc.on(...forwardToCurrentWebview("WINDOW_DEVTOOLS_CLOSED")) ipc.on(...forwardToCurrentWebview("UPDATE_ERROR")) ipc.on(...forwardToCurrentWebview("UPDATE_NOT_AVAILABLE")) ipc.on(...forwardToCurrentWebview("UPDATE_MANUALLY")) ipc.on(...forwardToCurrentWebview("UPDATE_AVAILABLE")) ipc.on(...forwardToCurrentWebview("MODULE_INSTALL_PROGRESS")) ipc.on(...forwardToCurrentWebview("UPDATE_DOWNLOADED")) ipc.on(...forwardToCurrentWebview("MODULE_INSTALLED")) ipc.on(...forwardToCurrentWebview("CHECKING_FOR_UPDATES")) ipc.on(...forwardToCurrentWebview("UPDATER_HISTORY_RESPONSE")) ipc.on(...forwardToCurrentWebview("ACCESSIBILITY_SUPPORT_CHANGED")) ipc.on(...forwardToCurrentWebview("HELP_OPEN")) ipc.on(...forwardToCurrentWebview("USER_SETTINGS_OPEN")) ipc.on(...forwardToCurrentWebview("MAIN_WINDOW_PATH")) /** discord_desktop_core Development */ ipc.on(...forwardToCurrentWebview("NAVIGATE_BACK")) ipc.on(...forwardToCurrentWebview("NAVIGATE_FORWARD")) ipc.on("RELOAD", () => { let webview = webviews.get(document.querySelector(".chrome-tab[active]")) if(!webview)return webview.reload() }) ipc.on("NEW_TAB", () => { chromeTabs.addTab({ title: 'Lightcord', favicon: faviconURL }) }) ipc.on("CLOSE_TAB", () => { let active = document.querySelector("div.chrome-tab[active]") if(!active)return chromeTabs.removeTab(active) }) ipc.on("OPEN_DEVTOOLS", () => { let webview = webviews.get(document.querySelector(".chrome-tab[active]")) if(!webview)return webview.openDevTools() }) window.onload = () => { const ChromeTabs = require("chrome-tabs") require("chrome-tabs/css/chrome-tabs.css") require("chrome-tabs/css/chrome-tabs-dark-theme.css") require("./controls.css") let tabs = document.querySelector(".chrome-tabs") let chromeTabs = new ChromeTabs() chromeTabs.init(tabs) tabs.addEventListener('activeTabChange', ({detail}) => { let webview = webviews.get(detail.tabEl) if(!webview){ chromeTabs.removeTab(detail.tabEl) return } let active = Array.from(webviews.values()).find(e => e.classList.contains("active-webview")) if(active)active.classList.remove("active-webview") webview.classList.add("active-webview") }) tabs.addEventListener('tabAdd', ({detail}) => { chromeTabs.updateTab(detail.tabEl, { title: "Lightcord Loading...", favicon: faviconURL }) let webview = document.createElement("webview") webview.src = "https://discord.com/app" webview.classList.add("discord-webview") webview.classList.add("webview-active") webview.setAttribute("preload", pathToFileURL(join(__dirname, "../mainScreenPreload.js"))) webview.shadowRoot.childNodes.item(1).style.height = "100%" webview.enableremotemodule = true webview.nodeintegration = false webview.spellcheck = true webview.webpreferences = "nativeWindowOpen=yes" webview.enableblinkfeatures = "EnumerateDevices,AudioOutputDevices" webview.addEventListener("ipc-message", function(...ev){ // TODO: Why don't we receive Ipc Messages, but they get processed anyway (notification, etc) ? console.log(ev[0].channel) if(ev[0].channel === "DISCORD_NEW_TAB"){ chromeTabs.addTab({ title: 'Lightcord', favicon: faviconURL }) return } ipc.send(ev[0].channel.replace("DISCORD_", ""), ev.slice(1)) }) webview.addEventListener('page-title-updated', () => { let el = Array.from(webviews.entries()).find(e => e[1] === webview)[0] if(!el)return chromeTabs.updateTab(el, { favicon: faviconURL, title: webview.getTitle() }) }) webviews.set(detail.tabEl, webview) document.querySelector(".documentFull").appendChild(webview) let r webview.ready = new Promise(resolve => (r = resolve)) webview.addEventListener("dom-ready", () => { r() webview.send("DISCORD_IS_TAB") }) webview.addEventListener("will-navigate", (e) => { e.preventDefault() console.log(e, e.url) }) }) tabs.addEventListener('tabRemove', ({detail}) => { let webview = webviews.get(detail.tabEl) if(!webview)return webview.remove() webviews.delete(detail.tabEl) if(document.querySelector(".chrome-tabs-content").childNodes.length === 0){ window.close() } }) window.addEventListener('keydown', (event) => { if(event.ctrlKey){ if(event.key === 't'){ chromeTabs.addTab({ title: 'Lightcord', favicon: faviconURL }) }else if(event.key === "w"){ let active = document.querySelector("div.chrome-tab[active]") if(!active)return chromeTabs.removeTab(active) } } }) setImmediate(() => { chromeTabs.addTab({ title: 'Lightcord Loading...', favicon: faviconURL }) }) } require.extensions[".css"] = (m, filename) => { let content = fs.readFileSync(filename, "binary") let style = document.createElement("style") style.id = btoa(filename) style.innerHTML = content document.head.appendChild(style) m.exports = { id: style.id, remove(){ return style.remove() } } return m.exports } const faviconURL = pathToFileURL(join(__dirname, "../images/discord.png"))