parent
6af3a231df
commit
c387979be1
@ -0,0 +1,28 @@ |
|||||||
|
/* |
||||||
|
* SPDX-License-Identifier: GPL-3.0 |
||||||
|
* Aerocord, a vesktop fork for older microsoft NT releases such as NT 6.0, 6.1, 6.2 and 6.3.
|
||||||
|
* Credits to vendicated and the rest of the vesktop contribuitors for making Vesktop! |
||||||
|
*/ |
||||||
|
|
||||||
|
import { BrowserWindow } from "electron"; |
||||||
|
import { join } from "path"; |
||||||
|
import { ICON_PATH, VIEW_DIR } from "shared/paths"; |
||||||
|
|
||||||
|
import { makeLinksOpenExternally } from "./utils/makeLinksOpenExternally"; |
||||||
|
|
||||||
|
export function createAboutWindow() { |
||||||
|
const about = new BrowserWindow({ |
||||||
|
center: true, |
||||||
|
autoHideMenuBar: true, |
||||||
|
icon: ICON_PATH, |
||||||
|
webPreferences: { |
||||||
|
preload: join(__dirname, "updaterPreload.js") |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
makeLinksOpenExternally(about); |
||||||
|
|
||||||
|
about.loadFile(join(VIEW_DIR, "about.html")); |
||||||
|
|
||||||
|
return about; |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
/* |
||||||
|
* SPDX-License-Identifier: GPL-3.0 |
||||||
|
* Aerocord, a vesktop fork for older microsoft NT releases such as NT 6.0, 6.1, 6.2 and 6.3.
|
||||||
|
* Credits to vendicated and the rest of the vesktop contribuitors for making Vesktop! |
||||||
|
*/ |
||||||
|
|
||||||
|
import { app, NativeImage, nativeImage } from "electron"; |
||||||
|
import { join } from "path"; |
||||||
|
import { BADGE_DIR } from "shared/paths"; |
||||||
|
|
||||||
|
const imgCache = new Map<number, NativeImage>(); |
||||||
|
function loadBadge(index: number) { |
||||||
|
const cached = imgCache.get(index); |
||||||
|
if (cached) return cached; |
||||||
|
|
||||||
|
const img = nativeImage.createFromPath(join(BADGE_DIR, `${index}.ico`)); |
||||||
|
imgCache.set(index, img); |
||||||
|
|
||||||
|
return img; |
||||||
|
} |
||||||
|
|
||||||
|
let lastIndex: null | number = -1; |
||||||
|
|
||||||
|
export function setBadgeCount(count: number) { |
||||||
|
switch (process.platform) { |
||||||
|
case "linux": |
||||||
|
if (count === -1) count = 0; |
||||||
|
app.setBadgeCount(count); |
||||||
|
break; |
||||||
|
case "darwin": |
||||||
|
if (count === 0) { |
||||||
|
app.dock.setBadge(""); |
||||||
|
break; |
||||||
|
} |
||||||
|
app.dock.setBadge(count === -1 ? "•" : count.toString()); |
||||||
|
break; |
||||||
|
case "win32": |
||||||
|
const [index, description] = getBadgeIndexAndDescription(count); |
||||||
|
if (lastIndex === index) break; |
||||||
|
|
||||||
|
lastIndex = index; |
||||||
|
|
||||||
|
// circular import shenanigans
|
||||||
|
const { mainWin } = require("./mainWindow") as typeof import("./mainWindow"); |
||||||
|
mainWin.setOverlayIcon(index === null ? null : loadBadge(index), description); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function getBadgeIndexAndDescription(count: number): [number | null, string] { |
||||||
|
if (count === -1) return [11, "Unread Messages"]; |
||||||
|
if (count === 0) return [null, "No Notifications"]; |
||||||
|
|
||||||
|
const index = Math.max(1, Math.min(count, 10)); |
||||||
|
return [index, `${index} Notification`]; |
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
/* |
||||||
|
* SPDX-License-Identifier: GPL-3.0 |
||||||
|
* Aerocord, a vesktop fork for older microsoft NT releases such as NT 6.0, 6.1, 6.2 and 6.3.
|
||||||
|
* Credits to vendicated and the rest of the vesktop contribuitors for making Vesktop! |
||||||
|
*/ |
||||||
|
|
||||||
|
import Server from "arrpc"; |
||||||
|
import { IpcEvents } from "shared/IpcEvents"; |
||||||
|
|
||||||
|
import { mainWin } from "./mainWindow"; |
||||||
|
import { Settings } from "./settings"; |
||||||
|
|
||||||
|
let server: any; |
||||||
|
|
||||||
|
const inviteCodeRegex = /^(\w|-)+$/; |
||||||
|
|
||||||
|
export async function initArRPC() { |
||||||
|
if (server || !Settings.store.arRPC) return; |
||||||
|
|
||||||
|
try { |
||||||
|
server = await new Server(); |
||||||
|
server.on("activity", (data: any) => mainWin.webContents.send(IpcEvents.ARRPC_ACTIVITY, JSON.stringify(data))); |
||||||
|
server.on("invite", (invite: string, callback: (valid: boolean) => void) => { |
||||||
|
invite = String(invite); |
||||||
|
if (!inviteCodeRegex.test(invite)) return callback(false); |
||||||
|
|
||||||
|
mainWin.webContents |
||||||
|
// Safety: Result of JSON.stringify should always be safe to equal
|
||||||
|
// Also, just to be super super safe, invite is regex validated above
|
||||||
|
.executeJavaScript(`Vesktop.openInviteModal(${JSON.stringify(invite)})`) |
||||||
|
.then(callback); |
||||||
|
}); |
||||||
|
} catch (e) { |
||||||
|
console.error("Failed to start arRPC server", e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Settings.addChangeListener("arRPC", initArRPC); |
@ -0,0 +1,57 @@ |
|||||||
|
/* |
||||||
|
* SPDX-License-Identifier: GPL-3.0 |
||||||
|
* Aerocord, a vesktop fork for older microsoft NT releases such as NT 6.0, 6.1, 6.2 and 6.3.
|
||||||
|
* Credits to vendicated and the rest of the vesktop contribuitors for making Vesktop! |
||||||
|
*/ |
||||||
|
|
||||||
|
import { app } from "electron"; |
||||||
|
import { existsSync, mkdirSync, renameSync, rmSync, writeFileSync } from "fs"; |
||||||
|
import { join } from "path"; |
||||||
|
|
||||||
|
interface AutoStart { |
||||||
|
isEnabled(): boolean; |
||||||
|
enable(): void; |
||||||
|
disable(): void; |
||||||
|
} |
||||||
|
|
||||||
|
function makeAutoStartLinux(): AutoStart { |
||||||
|
const configDir = process.env.XDG_CONFIG_HOME || join(process.env.HOME!, ".config"); |
||||||
|
const dir = join(configDir, "autostart"); |
||||||
|
const file = join(dir, "vesktop.desktop"); |
||||||
|
|
||||||
|
// IM STUPID
|
||||||
|
const legacyName = join(dir, "vencord.desktop"); |
||||||
|
if (existsSync(legacyName)) renameSync(legacyName, file); |
||||||
|
|
||||||
|
// "Quoting must be done by enclosing the argument between double quotes and escaping the double quote character,
|
||||||
|
// backtick character ("`"), dollar sign ("$") and backslash character ("\") by preceding it with an additional backslash character"
|
||||||
|
// https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
|
||||||
|
const commandLine = process.argv.map(arg => '"' + arg.replace(/["$`\\]/g, "\\$&") + '"').join(" "); |
||||||
|
|
||||||
|
return { |
||||||
|
isEnabled: () => existsSync(file), |
||||||
|
enable() { |
||||||
|
const desktopFile = ` |
||||||
|
[Desktop Entry] |
||||||
|
Type=Application |
||||||
|
Name=Vesktop |
||||||
|
Comment=Vesktop autostart script |
||||||
|
Exec=${commandLine} |
||||||
|
StartupNotify=false |
||||||
|
Terminal=false |
||||||
|
`.trim();
|
||||||
|
|
||||||
|
mkdirSync(dir, { recursive: true }); |
||||||
|
writeFileSync(file, desktopFile); |
||||||
|
}, |
||||||
|
disable: () => rmSync(file, { force: true }) |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
const autoStartWindowsMac: AutoStart = { |
||||||
|
isEnabled: () => app.getLoginItemSettings().openAtLogin, |
||||||
|
enable: () => app.setLoginItemSettings({ openAtLogin: true }), |
||||||
|
disable: () => app.setLoginItemSettings({ openAtLogin: false }) |
||||||
|
}; |
||||||
|
|
||||||
|
export const autoStart = process.platform === "linux" ? makeAutoStartLinux() : autoStartWindowsMac; |
@ -0,0 +1,74 @@ |
|||||||
|
/* |
||||||
|
* SPDX-License-Identifier: GPL-3.0 |
||||||
|
* Aerocord, a vesktop fork for older microsoft NT releases such as NT 6.0, 6.1, 6.2 and 6.3.
|
||||||
|
* Credits to vendicated and the rest of the vesktop contribuitors for making Vesktop! |
||||||
|
*/ |
||||||
|
|
||||||
|
import { app } from "electron"; |
||||||
|
import { existsSync, mkdirSync, readdirSync, renameSync, rmdirSync } from "fs"; |
||||||
|
import { dirname, join } from "path"; |
||||||
|
|
||||||
|
const vesktopDir = dirname(process.execPath); |
||||||
|
|
||||||
|
export const PORTABLE = |
||||||
|
process.platform === "win32" && |
||||||
|
!process.execPath.toLowerCase().endsWith("electron.exe") && |
||||||
|
!existsSync(join(vesktopDir, "Uninstall Vesktop.exe")); |
||||||
|
|
||||||
|
const LEGACY_DATA_DIR = join(app.getPath("appData"), "VencordDesktop", "VencordDesktop"); |
||||||
|
export const DATA_DIR = |
||||||
|
process.env.VENCORD_USER_DATA_DIR || (PORTABLE ? join(vesktopDir, "Aerocord_Data") : join(app.getPath("userData"))); |
||||||
|
|
||||||
|
mkdirSync(DATA_DIR, { recursive: true }); |
||||||
|
|
||||||
|
// TODO: remove eventually
|
||||||
|
if (existsSync(LEGACY_DATA_DIR)) { |
||||||
|
try { |
||||||
|
console.warn("Detected legacy settings dir", LEGACY_DATA_DIR + ".", "migrating to", DATA_DIR); |
||||||
|
for (const file of readdirSync(LEGACY_DATA_DIR)) { |
||||||
|
renameSync(join(LEGACY_DATA_DIR, file), join(DATA_DIR, file)); |
||||||
|
} |
||||||
|
rmdirSync(LEGACY_DATA_DIR); |
||||||
|
renameSync( |
||||||
|
join(app.getPath("appData"), "VencordDesktop", "IndexedDB"), |
||||||
|
join(DATA_DIR, "sessionData", "IndexedDB") |
||||||
|
); |
||||||
|
} catch (e) { |
||||||
|
console.error("Migration failed", e); |
||||||
|
} |
||||||
|
} |
||||||
|
app.setPath("sessionData", join(DATA_DIR, "sessionData")); |
||||||
|
|
||||||
|
export const VENCORD_SETTINGS_DIR = join(DATA_DIR, "settings"); |
||||||
|
export const VENCORD_QUICKCSS_FILE = join(VENCORD_SETTINGS_DIR, "quickCss.css"); |
||||||
|
export const VENCORD_SETTINGS_FILE = join(VENCORD_SETTINGS_DIR, "settings.json"); |
||||||
|
export const VENCORD_THEMES_DIR = join(DATA_DIR, "themes"); |
||||||
|
|
||||||
|
// needs to be inline require because of circular dependency
|
||||||
|
// as otherwise "DATA_DIR" (which is used by ./settings) will be uninitialised
|
||||||
|
export const VENCORD_FILES_DIR = |
||||||
|
(require("./settings") as typeof import("./settings")).Settings.store.vencordDir || join(DATA_DIR, "vencordDist"); |
||||||
|
|
||||||
|
export const USER_AGENT = `Vesktop/${app.getVersion()} (https://git.randomserver.top/aiek/aerocord)`; |
||||||
|
|
||||||
|
// dimensions shamelessly stolen from Discord Desktop :3
|
||||||
|
export const MIN_WIDTH = 940; |
||||||
|
export const MIN_HEIGHT = 500; |
||||||
|
export const DEFAULT_WIDTH = 1280; |
||||||
|
export const DEFAULT_HEIGHT = 720; |
||||||
|
|
||||||
|
export const DISCORD_HOSTNAMES = ["discord.com", "canary.discord.com", "ptb.discord.com"]; |
||||||
|
|
||||||
|
const BrowserUserAgents = { |
||||||
|
darwin: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", |
||||||
|
linux: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", |
||||||
|
windows: |
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36" |
||||||
|
}; |
||||||
|
|
||||||
|
export const BrowserUserAgent = BrowserUserAgents[process.platform] || BrowserUserAgents.windows; |
||||||
|
|
||||||
|
export const enum MessageBoxChoice { |
||||||
|
Default, |
||||||
|
Cancel |
||||||
|
} |
Loading…
Reference in new issue