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