change protocol links to all use `vizality://` instead

- Protocol links changed from `vz-asset://` `vz-builtin://` `vz-plugin://` `vz-theme://` to `vizality://assets` `vizality://builtins` `vizality://plugins` `vizality://themes` So if you were linking to `vz-plugin://my-plugin/assets/pie.png` before, it would now be `vizality://plugins/my-plugin/assets/pie.png`
pull/78/head
dperolio 3 years ago
parent edc5380366
commit 05019daec6

@ -169,7 +169,7 @@ export default class Vizality extends Updatable {
* Clean up console by clearing it first, then log our startup banner.
*/
console.clear();
console.log('%c ', `background: url('vz-asset://images/console-banner.gif') no-repeat center / contain; padding: 110px 350px; font-size: 1px; margin: 10px 0;`);
console.log('%c ', `background: url('vizality://assets/images/console-banner.gif') no-repeat center / contain; padding: 110px 350px; font-size: 1px; margin: 10px 0;`);
/**
* Initialize the APIs.
@ -277,14 +277,14 @@ export default class Vizality extends Updatable {
switch (type) {
case 'info':
case 'log':
return _log({ badge: 'vz-asset://images/discord.png', labels: [ 'DiscordNative', submodule ], message });
return _log({ badge: 'vizality://assets/images/discord.png', labels: [ 'DiscordNative', submodule ], message });
case 'error':
case 'trace':
return _error({ badge: 'vz-asset://images/discord.png', labels: [ 'DiscordNative', submodule ], message });
return _error({ badge: 'vizality://assets/images/discord.png', labels: [ 'DiscordNative', submodule ], message });
case 'warn':
return _warn({ badge: 'vz-asset://images/discord.png', labels: [ 'DiscordNative', submodule ], message });
return _warn({ badge: 'vizality://assets/images/discord.png', labels: [ 'DiscordNative', submodule ], message });
default:
return _log({ badge: 'vz-asset://images/discord.png', labels: [ 'DiscordNative', submodule ], message });
return _log({ badge: 'vizality://assets/images/discord.png', labels: [ 'DiscordNative', submodule ], message });
}
});
}

@ -10,7 +10,7 @@
// content: '';
// -webkit-mask-image: linear-gradient(to top, transparent 0%, #000 70%);
// mask-image: linear-gradient(to top, transparent 0%, #000 70%);
// background-image: url('vz-asset://images/addons-list-bg-dark.png');
// background-image: url('vizaliy://assets/images/addons-list-bg-dark.png');
// background-repeat: no-repeat;
// background-position: center;
// background-size: cover;
@ -20,7 +20,7 @@
// z-index: 0;
// animation: vz-fade-half 0.3s forwards;
// [vz-theme='light'] & {
// background-image: url('vz-asset://images/addons-list-bg-light.png');
// background-image: url('vizality://assets/images/addons-list-bg-light.png');
// }
// }
}

@ -119,7 +119,7 @@ export default class Commands extends Builtin {
if (this.showCommandRail) {
const callers = [];
const vizalitySectionInner = [];
vizalitySectionInner.push(renderHeader('', null, 'Vizality', `vz-asset://images/logo.png`, `vz-cmd-vizality`));
vizalitySectionInner.push(renderHeader('', null, 'Vizality', `vizality://assets/images/logo.png`, `vz-cmd-vizality`));
results.forEach(result => {
const { command } = findInReactTree(result, r => r.command);
if (!callers.includes(command.caller) && command.caller.id !== 'vizality' && command.caller.type !== 'builtin') {
@ -175,7 +175,7 @@ export default class Commands extends Builtin {
}
railSections.unshift({
icon: 'vz-asset://images/logo.png',
icon: 'vizality://assets/images/logo.png',
id: 'vizality',
isBuiltIn: false,
commandsAmount: vizalitySectionInner.length - 1,
@ -373,7 +373,7 @@ export default class Commands extends Builtin {
if (plugin?.manifest?.icon) {
commandImage = plugin?.manifest?.icon;
} else {
commandImage = 'vz-asset://images/logo.png';
commandImage = 'vizality://assets/images/logo.png';
}
}
if (!this.showCommandImages) {
@ -406,8 +406,10 @@ export default class Commands extends Builtin {
* Patch icons on the slash commands autocomplete rail.
*/
patch('vz-commands-railIcon', ApplicationCommandDiscoveryApplicationIcon, 'default', ([ props ], res) => {
// Check if it's a Vizality-specific icon
if (props?.section?.icon?.includes('vz-plugin://') || props?.section?.icon?.includes('vz-asset://')) {
/**
* Check if it's a Vizality-specific icon.
*/
if (props?.section?.icon?.includes('vizality://')) {
res.props.onClick = () => {
/**
* Scrolls to the specific category section on click. Using DOM selectors here which is less than ideal.
@ -437,14 +439,18 @@ export default class Commands extends Builtin {
const _autocomplete = findInReactTree(res, r => r.className?.includes(autocomplete) && !r.className?.includes(outerWrapper));
const _rail = findInReactTree(res, r => r.className?.includes('vz-commands-rail'));
// Target the autocompleteInner div
/**
* Target the autocompleteInner div.
*/
if (_autocompleteInner) {
_autocompleteInner.className = joinClassNames(_autocompleteInner.className, {
[wrapper]: Boolean(_rail)
});
}
// Target the autocomplete div
/**
* Target the autocomplete div.
*/
if (_autocomplete) {
res.props['vz-rail-active'] = Boolean(_rail) && '';
_autocomplete.className = joinClassNames(
@ -475,8 +481,10 @@ export default class Commands extends Builtin {
const { BOT_AVATARS } = getModule('BOT_AVATARS');
const { getChannelId } = channels;
// Create a new `BOT_AVATARS` key called 'vizality' which we'll later use to replace Clyde.
BOT_AVATARS.vizality = 'vz-asset://images/logo.png';
/**
* Create a new `BOT_AVATARS` key called 'vizality' which we'll later use to replace Clyde.
*/
BOT_AVATARS.vizality = 'vizality://assets/images/logo.png';
messages.sendMessage = (sendMessage => async (id, message, ...params) => {
if (!message.content.startsWith(vizality.api.commands?.prefix)) {
@ -517,7 +525,7 @@ export default class Commands extends Builtin {
const avatar = command.avatar ||
(vizality.manager.plugins.get(command.caller) &&
vizality.manager.plugins.get(command.caller).manifest.icon) ||
'vz-asset://images/logo.png';
'vizality://assets/images/logo.png';
BOT_AVATARS[botAvatarName] = avatar;
receivedMessage.author.username = username;

@ -86,19 +86,19 @@ export default memo(() => {
paused='false'
items={[
{
src: 'vz-plugin://example-plugin-settings/screenshots/preview-1.png',
src: 'vizality://plugins/example-plugin-settings/screenshots/preview-1.png',
type: 1
},
{
src: 'vz-plugin://copy-raw-message/screenshots/preview-1.png',
src: 'vizality://plugins/copy-raw-message/screenshots/preview-1.png',
type: 1
},
{
src: 'vz-plugin://channel-members-activity-icons/screenshots/preview-1.png',
src: 'vizality://plugins/channel-members-activity-icons/screenshots/preview-1.png',
type: 1
},
{
src: 'vz-plugin://heyzere/screenshots/preview-1.png',
src: 'vizality://plugins/heyzere/screenshots/preview-1.png',
type: 1
}
]}

@ -114,7 +114,7 @@ export default class Settings extends Builtin {
});
// Ensure components do get the update
experimentsModule._changeCallbacks.forEach(cb => cb());
experimentsModule._changeCallbacks.forEach(callback => callback());
} catch (err) {
// :eyes:
}

@ -18,7 +18,7 @@ export default memo(props => {
<LazyImage
className='vz-updater-update-icon-img-wrapper'
imageClassName='vz-updater-update-icon-img'
src='vz-asset://images/logo.png'
src='vizality://assets/images/logo.png'
/>
)
: <>

@ -26,7 +26,7 @@ export default class Updater extends Builtin {
constructor () {
super();
this.changelog = {
image: 'vz-builtin://updater/assets/updates-2021-01-11.png',
image: 'vizality://builtins/updater/assets/updates-2021-01-11.png',
id: 'updates-2021-01-11'
};
this.checking = false;

@ -704,13 +704,13 @@ export default class AddonManager extends Events {
if (!validExtensions.some(ext => manifest.icon.endsWith(ext))) {
this._warn(`${toTitleCase(this.type)} icon must be of type .png, .jpg, or .jpeg.`);
} else {
return manifest.icon = `vz-${this.type}://${addonId}/${manifest.icon}`;
return manifest.icon = `vizality://${toPlural(this.type)}/${addonId}/${manifest.icon}`;
}
}
if (validExtensions.some(ext => existsSync(resolve(this.dir, addonId, 'assets', `icon${ext}`)))) {
for (const ext of validExtensions) {
if (existsSync(resolve(this.dir, addonId, 'assets', `icon${ext}`))) {
manifest.icon = `vz-${this.type}://${addonId}/assets/icon${ext}`;
manifest.icon = `vizality://${toPlural(this.type)}/${addonId}/assets/icon${ext}`;
break;
}
}
@ -737,9 +737,12 @@ export default class AddonManager extends Events {
}
}
/**
*
*/
/**
*
* @param {string} addonId Addon ID
* @param {AddonManifest} manifest Addon manifest
* @returns {void}
*/
_setScreenshotImages (addonId, manifest) {
try {
const validExtensions = [ '.png', '.jpg', '.jpeg', '.gif', '.webp' ];
@ -749,26 +752,26 @@ export default class AddonManager extends Events {
if (!validExtensions.some(ext => screenshot.endsWith(ext))) {
this._warn(`${toTitleCase(this.type)} screenshots must be of type .png, .jpg, .jpeg, .gif, or .webp`);
} else {
screenshotUrls.push(`vz-${this.type}://${addonId}/${screenshot}`)
screenshotUrls.push(`vizality://${toPlural(this.type)}/${addonId}/${screenshot}`);
}
});
} else {
const screenshotsDir = join(this.dir, addonId, 'screenshots');
const hasScreenshots = existsSync(screenshotsDir) && lstatSync(screenshotsDir)?.isDirectory();
if (hasScreenshots) {
const previewImages = [];
const validExtensions = [ '.png', '.gif', '.jpg', '.jpeg', '.webp' ];
readdirSync(screenshotsDir)
.filter(file => validExtensions.indexOf(extname(file).toLowerCase()) !== -1)
.map(file => previewImages.push(`vz-${this.type}://${addonId}/screenshots/${file}`));
return manifest.screenshots = previewImages;
}
const screenshotsDir = join(this.dir, addonId, 'screenshots');
const hasScreenshots = existsSync(screenshotsDir) && lstatSync(screenshotsDir)?.isDirectory();
if (hasScreenshots) {
const previewImages = [];
const validExtensions = [ '.png', '.gif', '.jpg', '.jpeg', '.webp' ];
readdirSync(screenshotsDir)
.filter(file => validExtensions.indexOf(extname(file).toLowerCase()) !== -1)
.map(file => previewImages.push(`vizality://${toPlural(this.type)}/${addonId}/screenshots/${file}`));
return manifest.screenshots = previewImages;
}
}
} catch (err) {
return this._error(err);
}
}
/**
* Enables the addon directory watcher.
* @private

@ -1,5 +1,5 @@
import { toKebabCase, isUrl, toPlural } from '@vizality/util/string';
import React, { memo, useState, useEffect, Children } from 'react';
import { toKebabCase, isUrl } from '@vizality/util/string';
import { getModule, contextMenu } from '@vizality/webpack';
import { getMediaDimensions } from '@vizality/util/file';
import { open as openModal } from '@vizality/modal';
@ -15,7 +15,7 @@ import { CheckboxItem } from './settings';
const { readFile } = promises;
const { openContextMenu, closeContextMenu } = contextMenu;
export default memo(({ source, git, type, addonId }) => {
export default memo(({ source, type, addonId }) => {
const [ markdown, setMarkdown ] = useState();
const { base } = getModule('base');
const { size32, size24, size20, size16, size14, size12 } = getModule('size32');
@ -195,12 +195,16 @@ export default memo(({ source, git, type, addonId }) => {
const [ size, setSize ] = useState(null);
useEffect(() => {
async function getSize (src) {
const dimensions = await getMediaDimensions(src);
setSize(dimensions);
}
let __src;
async function getSrc () {
if (!isUrl(src)) {
if (addonId) {
__src = `vz-${type}://${addonId}/${src}`;
setSrc(`vz-${type}://${addonId}/${src}`);
__src = `vizality://${toPlural(type)}/${addonId}/${src}`;
setSrc(`vizality://${toPlural(type)}/${addonId}/${src}`);
await getSize(__src);
}
} else {
@ -208,10 +212,6 @@ export default memo(({ source, git, type, addonId }) => {
setSrc(src);
}
}
async function getSize (src) {
const dimensions = await getMediaDimensions(src);
setSize(dimensions);
}
getSrc();
}, []);

@ -130,17 +130,17 @@ export const Events = Object.freeze({
});
export const Avatars = Object.freeze({
get DEFAULT_THEME_1 () { return 'vz-asset://images/default-theme-1.png'; },
get DEFAULT_THEME_2 () { return 'vz-asset://images/default-theme-2.png'; },
get DEFAULT_THEME_3 () { return 'vz-asset://images/default-theme-3.png'; },
get DEFAULT_THEME_4 () { return 'vz-asset://images/default-theme-4.png'; },
get DEFAULT_THEME_5 () { return 'vz-asset://images/default-theme-5.png'; },
get DEFAULT_THEME_1 () { return 'vizality://assets/images/default-theme-1.png'; },
get DEFAULT_THEME_2 () { return 'vizality://assets/images/default-theme-2.png'; },
get DEFAULT_THEME_3 () { return 'vizality://assets/images/default-theme-3.png'; },
get DEFAULT_THEME_4 () { return 'vizality://assets/images/default-theme-4.png'; },
get DEFAULT_THEME_5 () { return 'vizality://assets/images/default-theme-5.png'; },
// ---
get DEFAULT_PLUGIN_1 () { return 'vz-asset://images/default-plugin-1.png'; },
get DEFAULT_PLUGIN_2 () { return 'vz-asset://images/default-plugin-2.png'; },
get DEFAULT_PLUGIN_3 () { return 'vz-asset://images/default-plugin-3.png'; },
get DEFAULT_PLUGIN_4 () { return 'vz-asset://images/default-plugin-4.png'; },
get DEFAULT_PLUGIN_5 () { return 'vz-asset://images/default-plugin-5.png'; }
get DEFAULT_PLUGIN_1 () { return 'vizality://assets/images/default-plugin-1.png'; },
get DEFAULT_PLUGIN_2 () { return 'vizality://assets/images/default-plugin-2.png'; },
get DEFAULT_PLUGIN_3 () { return 'vizality://assets/images/default-plugin-3.png'; },
get DEFAULT_PLUGIN_4 () { return 'vizality://assets/images/default-plugin-4.png'; },
get DEFAULT_PLUGIN_5 () { return 'vizality://assets/images/default-plugin-5.png'; }
});
export const ActionTypes = Object.freeze({

@ -21,7 +21,9 @@ import { isString } from './String';
const { readdir, lstat, unlink, rmdir } = promises;
const _getImageSize = promisify(imageSize);
/** @private */
/**
* @private
*/
const _labels = [ 'Util', 'File' ];
const _log = (labels, ...message) => log({ labels, message });
const _warn = (labels, ...message) => warn({ labels, message });
@ -55,34 +57,37 @@ export const getCaller = path => {
type: 'core',
id: 'vizality'
};
} else {
const stackTrace = (new Error()).stack;
const plugin = stackTrace.match(new RegExp(`${escapeRegExp(Directories.PLUGINS)}.([-\\w]+)`));
if (plugin) {
return {
type: 'plugin',
id: plugin[1]
};
}
const builtin = stackTrace.match(new RegExp(`${escapeRegExp(Directories.BUILTINS)}.([-\\w]+)`));
if (builtin) {
return {
type: 'builtin',
id: builtin[1]
};
}
const theme = stackTrace.match(new RegExp(`${escapeRegExp(Directories.THEMES)}.([-\\w]+)`));
if (theme) {
return {
type: 'theme',
id: theme[1]
};
}
}
/**
* If no path is provided, try to determine one with a forced error stack trace.
*/
const stackTrace = (new Error()).stack;
const plugin = stackTrace.match(new RegExp(`${escapeRegExp(Directories.PLUGINS)}.([-\\w]+)`));
if (plugin) {
return {
type: 'core',
id: 'vizality'
type: 'plugin',
id: plugin[1]
};
}
const builtin = stackTrace.match(new RegExp(`${escapeRegExp(Directories.BUILTINS)}.([-\\w]+)`));
if (builtin) {
return {
type: 'builtin',
id: builtin[1]
};
}
const theme = stackTrace.match(new RegExp(`${escapeRegExp(Directories.THEMES)}.([-\\w]+)`));
if (theme) {
return {
type: 'theme',
id: theme[1]
};
}
return {
type: 'core',
id: 'vizality'
};
} catch (err) {
_error(_labels.concat('getCaller'), err);
}

@ -66,7 +66,7 @@ export const MODULES = {
* Outputs messages to console of varying types. Outputted messages contain a badge, label(s), and a message.
* @param {object} options Options for the console message
* @param {string} [options.type='log'] Type of console method to use
* @param {string} [options.badge='vz-asset://images/logo.png'] Badge image URL
* @param {string} [options.badge='vizality://assets/images/logo.png'] Badge image URL
* @param {Array<string|LoggerLabel>} [options.labels] Label texts or label objects. Limit of 10.
* @param {...any} [options.message] Contents of the console message
* @private
@ -81,7 +81,7 @@ const _logHandler = options => {
*/
labels = labels || [];
type = _parseType(type);
badge = badge || 'vz-asset://images/logo.png';
badge = badge || 'vizality://assets/images/logo.png';
/**
* Throw an error if any of the arg types aren't as expected.

@ -131,7 +131,7 @@ export const stripDiacritics = text => {
* isUrl('https://google.com')
* @example
* // returns `true`
* isUrl('vz-asset://svgs/Activity.svg')
* isUrl('vizality://assets/svgs/Activity.svg')
*/
export const isUrl = input => {
try {

@ -6,6 +6,6 @@ $icons: (
:root {
@each $icon in $icons {
--vz-icon-#{vz.str-case($icon, 'kebab')}: url('vz-asset://svgs/#{$icon}.svg');
--vz-icon-#{vz.str-case($icon, 'kebab')}: url('vizality://assets/svgs/#{$icon}.svg');
}
}

@ -4,6 +4,6 @@ $logos: ( 'Discord', 'Spotify', 'Twitter', 'Vizality', 'Xbox' );
:root {
@each $logo in $logos {
--vz-logo-#{vz.str-case($logo, 'kebab')}: url('vz-asset://logos/#{$logo}.svg');
--vz-logo-#{vz.str-case($logo, 'kebab')}: url('vizality://assets/logos/#{$logo}.svg');
}
}

@ -445,60 +445,60 @@
* @param {number} $how-many-lines Max amount of lines a text can be.
*/
:root {
--vz-icon-activity: url("vz-asset://svgs/Activity.svg");
--vz-icon-add-circle: url("vz-asset://svgs/AddCircle.svg");
--vz-icon-add-photo: url("vz-asset://svgs/AddPhoto.svg");
--vz-icon-add-reaction: url("vz-asset://svgs/AddReaction.svg");
--vz-icon-alert: url("vz-asset://svgs/Alert.svg");
--vz-icon-alien-head: url("vz-asset://svgs/AlienHead.svg");
--vz-icon-analytics-bubble: url("vz-asset://svgs/AnalyticsBubble.svg");
--vz-icon-application-command: url("vz-asset://svgs/ApplicationCommand.svg");
--vz-icon-arrow-back: url("vz-asset://svgs/ArrowBack.svg");
--vz-icon-arrow-corner: url("vz-asset://svgs/ArrowCorner.svg");
--vz-icon-arrow-drop-down: url("vz-asset://svgs/ArrowDropDown.svg");
--vz-icon-arrow-drop-up: url("vz-asset://svgs/ArrowDropUp.svg");
--vz-icon-arrow-left: url("vz-asset://svgs/ArrowLeft.svg");
--vz-icon-arrow-up: url("vz-asset://svgs/ArrowUp.svg");
--vz-icon-at: url("vz-asset://svgs/At.svg");
--vz-icon-ballot-checkbox: url("vz-asset://svgs/BallotCheckbox.svg");
--vz-icon-bell: url("vz-asset://svgs/Bell.svg");
--vz-icon-bell-off: url("vz-asset://svgs/BellOff.svg");
--vz-icon-bin: url("vz-asset://svgs/Bin.svg");
--vz-icon-block-quote: url("vz-asset://svgs/BlockQuote.svg");
--vz-icon-bold: url("vz-asset://svgs/Bold.svg");
--vz-icon-book-close: url("vz-asset://svgs/BookClose.svg");
--vz-icon-book-close-alt: url("vz-asset://svgs/BookCloseAlt.svg");
--vz-icon-book-library: url("vz-asset://svgs/BookLibrary.svg");
--vz-icon-book-open: url("vz-asset://svgs/BookOpen.svg");
--vz-icon-bowling: url("vz-asset://svgs/Bowling.svg");
--vz-icon-bug: url("vz-asset://svgs/Bug.svg");
--vz-icon-bulb: url("vz-asset://svgs/Bulb.svg");
--vz-icon-calendar: url("vz-asset://svgs/Calendar.svg");
--vz-icon-call: url("vz-asset://svgs/Call.svg");
--vz-icon-call-join: url("vz-asset://svgs/CallJoin.svg");
--vz-icon-call-leave: url("vz-asset://svgs/CallLeave.svg");
--vz-icon-call-videocamera: url("vz-asset://svgs/CallVideoCamera.svg");
--vz-icon-call-videocamera-disabled: url("vz-asset://svgs/CallVideoCameraDisabled.svg");
--vz-icon-call-videocamera-limited: url("vz-asset://svgs/CallVideoCameraLimited.svg");
--vz-icon-carousel: url("vz-asset://svgs/Carousel.svg");
--vz-icon-certificate: url("vz-asset://svgs/Certificate.svg");
--vz-icon-change-down: url("vz-asset://svgs/ChangeDown.svg");
--vz-icon-change-up: url("vz-asset://svgs/ChangeUp.svg");
--vz-icon-channelcategory: url("vz-asset://svgs/ChannelCategory.svg");
--vz-icon-channel-text: url("vz-asset://svgs/ChannelText.svg");
--vz-icon-channel-text-limited: url("vz-asset://svgs/ChannelTextLimited.svg");
--vz-icon-channel-text-nsfw: url("vz-asset://svgs/ChannelTextNsfw.svg");
--vz-icon-channel-thread: url("vz-asset://svgs/ChannelThread.svg");
--vz-icon-plugin: url("vz-asset://svgs/Plugin.svg");
--vz-icon-theme: url("vz-asset://svgs/Theme.svg");
--vz-icon-activity: url("vizality://assets/svgs/Activity.svg");
--vz-icon-add-circle: url("vizality://assets/svgs/AddCircle.svg");
--vz-icon-add-photo: url("vizality://assets/svgs/AddPhoto.svg");
--vz-icon-add-reaction: url("vizality://assets/svgs/AddReaction.svg");
--vz-icon-alert: url("vizality://assets/svgs/Alert.svg");
--vz-icon-alien-head: url("vizality://assets/svgs/AlienHead.svg");
--vz-icon-analytics-bubble: url("vizality://assets/svgs/AnalyticsBubble.svg");
--vz-icon-application-command: url("vizality://assets/svgs/ApplicationCommand.svg");
--vz-icon-arrow-back: url("vizality://assets/svgs/ArrowBack.svg");
--vz-icon-arrow-corner: url("vizality://assets/svgs/ArrowCorner.svg");
--vz-icon-arrow-drop-down: url("vizality://assets/svgs/ArrowDropDown.svg");
--vz-icon-arrow-drop-up: url("vizality://assets/svgs/ArrowDropUp.svg");
--vz-icon-arrow-left: url("vizality://assets/svgs/ArrowLeft.svg");
--vz-icon-arrow-up: url("vizality://assets/svgs/ArrowUp.svg");
--vz-icon-at: url("vizality://assets/svgs/At.svg");
--vz-icon-ballot-checkbox: url("vizality://assets/svgs/BallotCheckbox.svg");
--vz-icon-bell: url("vizality://assets/svgs/Bell.svg");
--vz-icon-bell-off: url("vizality://assets/svgs/BellOff.svg");
--vz-icon-bin: url("vizality://assets/svgs/Bin.svg");
--vz-icon-block-quote: url("vizality://assets/svgs/BlockQuote.svg");
--vz-icon-bold: url("vizality://assets/svgs/Bold.svg");
--vz-icon-book-close: url("vizality://assets/svgs/BookClose.svg");
--vz-icon-book-close-alt: url("vizality://assets/svgs/BookCloseAlt.svg");
--vz-icon-book-library: url("vizality://assets/svgs/BookLibrary.svg");
--vz-icon-book-open: url("vizality://assets/svgs/BookOpen.svg");
--vz-icon-bowling: url("vizality://assets/svgs/Bowling.svg");
--vz-icon-bug: url("vizality://assets/svgs/Bug.svg");
--vz-icon-bulb: url("vizality://assets/svgs/Bulb.svg");
--vz-icon-calendar: url("vizality://assets/svgs/Calendar.svg");
--vz-icon-call: url("vizality://assets/svgs/Call.svg");
--vz-icon-call-join: url("vizality://assets/svgs/CallJoin.svg");
--vz-icon-call-leave: url("vizality://assets/svgs/CallLeave.svg");
--vz-icon-call-videocamera: url("vizality://assets/svgs/CallVideoCamera.svg");
--vz-icon-call-videocamera-disabled: url("vizality://assets/svgs/CallVideoCameraDisabled.svg");
--vz-icon-call-videocamera-limited: url("vizality://assets/svgs/CallVideoCameraLimited.svg");
--vz-icon-carousel: url("vizality://assets/svgs/Carousel.svg");
--vz-icon-certificate: url("vizality://assets/svgs/Certificate.svg");
--vz-icon-change-down: url("vizality://assets/svgs/ChangeDown.svg");
--vz-icon-change-up: url("vizality://assets/svgs/ChangeUp.svg");
--vz-icon-channelcategory: url("vizality://assets/svgs/ChannelCategory.svg");
--vz-icon-channel-text: url("vizality://assets/svgs/ChannelText.svg");
--vz-icon-channel-text-limited: url("vizality://assets/svgs/ChannelTextLimited.svg");
--vz-icon-channel-text-nsfw: url("vizality://assets/svgs/ChannelTextNsfw.svg");
--vz-icon-channel-thread: url("vizality://assets/svgs/ChannelThread.svg");
--vz-icon-plugin: url("vizality://assets/svgs/Plugin.svg");
--vz-icon-theme: url("vizality://assets/svgs/Theme.svg");
}
:root {
--vz-logo-discord: url("vz-asset://logos/Discord.svg");
--vz-logo-spotify: url("vz-asset://logos/Spotify.svg");
--vz-logo-twitter: url("vz-asset://logos/Twitter.svg");
--vz-logo-vizality: url("vz-asset://logos/Vizality.svg");
--vz-logo-xbox: url("vz-asset://logos/Xbox.svg");
--vz-logo-discord: url("vizality://assets/logos/Discord.svg");
--vz-logo-spotify: url("vizality://assets/logos/Spotify.svg");
--vz-logo-twitter: url("vizality://assets/logos/Twitter.svg");
--vz-logo-vizality: url("vizality://assets/logos/Vizality.svg");
--vz-logo-xbox: url("vizality://assets/logos/Xbox.svg");
}
:root {

@ -1,5 +1,5 @@
const { default: installExtension, REACT_DEVELOPER_TOOLS } = require('electron-devtools-installer');
const { join, dirname, normalize } = require('path');
const { join, dirname, normalize, sep } = require('path');
const electron = require('electron');
const Module = require('module');
@ -22,10 +22,9 @@ let settings = {};
try {
settings = require(join(__dirname, '..', '..', 'settings', 'settings.json'));
({ reactDeveloperTools, smoothScrolling } = settings);
} catch (err) {
// @todo Handle this.
// @todo Consider handling this.
}
if (smoothScrolling === false) {
@ -38,7 +37,9 @@ const discordPath = join(dirname(require.main.filename), '..', 'app.asar');
const PatchedBrowserWindow = require('./browserWindow');
const electronPath = require.resolve('electron');
// Restore the classic path; the updater relies on it and it makes Discord go corrupt
/**
* Restore the classic path. The updater relies on it and it makes Discord go corrupt.
*/
require.main.filename = join(discordPath, 'app_bootstrap', 'index.js');
let _patched = false;
@ -69,36 +70,12 @@ const electronExports = new Proxy(electron, {
delete require.cache[electronPath].exports;
require.cache[electronPath].exports = electronExports;
/**
* Register our protocol sceheme with elevated privileges.
*/
electron.protocol.registerSchemesAsPrivileged([
{
scheme: 'vz-plugin',
privileges: {
supportFetchAPI: true,
corsEnabled: true,
standard: true,
secure: true
}
},
{
scheme: 'vz-theme',
privileges: {
supportFetchAPI: true,
corsEnabled: true,
standard: true,
secure: true
}
},
{
scheme: 'vz-builtin',
privileges: {
supportFetchAPI: true,
corsEnabled: true,
standard: true,
secure: true
}
},
{
scheme: 'vz-asset',
scheme: 'vizality',
privileges: {
supportFetchAPI: true,
corsEnabled: true,
@ -114,7 +91,9 @@ electron.app.once('ready', () => {
.then(name => console.log(`Added Extension: ${name}`))
.catch(err => console.error('An error occurred: ', err));
}
// @todo Possibly add whitelists instead of just disabling CSP.
/**
* @todo Possibly add whitelists instead of just disabling CSP.
*/
electron.session.defaultSession.webRequest.onHeadersReceived(({ responseHeaders }, done) => {
Object.keys(responseHeaders)
.filter(k => (/^content-security-policy/i).test(k) || (/^x-frame-options/i).test(k))
@ -124,38 +103,45 @@ electron.app.once('ready', () => {
});
const urlRegex = /^(https:\/\/(?:canary|ptb)?.?discord(app)?\.com)\/vizality/;
electron.session.defaultSession.webRequest.onBeforeRequest((details, done) => {
if (urlRegex.test(details.url)) {
// It should get restored to the vizality url later.
/**
* It should get restored to the Vizality URL later.
*/
done({ redirectURL: `${details.url.match(urlRegex)[1]}/app` });
} else {
done({});
}
});
const registerProtocol = name => {
electron.protocol.registerFileProtocol(name, (request, cb) => {
// https://security.stackexchange.com/a/123723
const [ url ] = normalize(request.url.replace(`${name}://`, '')).replace(/^(\.\.(\/|\\|$))+/, '').split('?');
switch (name) {
case 'vz-asset':
return cb({ path: join(__dirname, '..', '..', 'assets', url) });
case 'vz-builtin':
return cb({ path: join(__dirname, '..', 'core', 'builtins', url) });
case 'vz-theme':
return cb({ path: join(__dirname, '..', '..', 'addons', 'themes', url) });
case 'vz-plugin':
return cb({ path: join(__dirname, '..', '..', 'addons', 'plugins', url) });
}
});
};
registerProtocol('vz-asset');
registerProtocol('vz-builtin');
registerProtocol('vz-theme');
registerProtocol('vz-plugin');
/**
* Now we can register the vizality:// file protocol to be able to conveniently
* link to local files from within Discord.
*/
electron.protocol.registerFileProtocol('vizality', (request, callback) => {
/**
* Seems to be a security thing to limit users from accessing things they shouldn't be.
* We're splitting by ? because protocol file URLs can't seem to deal with queries.
* https://security.stackexchange.com/a/123723
*/
const [ url ] = normalize(request.url.replace('vizality://', '')).replace(/^(\.\.(\/|\\|$))+/, '').split('?');
/**
* Try to get the type of the asset.
*/
const type = url.split(sep)[0];
/**
* Remove the type to determine the file path.
*/
const path = url.replace(`${type}${sep}`, '');
if (type === 'assets') {
return callback({ path: join(__dirname, '..', '..', 'assets', path) });
} else if (type === 'plugins' || type === 'themes') {
return callback({ path: join(__dirname, '..', '..', 'addons', type, path) });
} else if (type === 'builtins') {
return callback({ path: join(__dirname, '..', 'core', 'builtins', path) });
}
});
});
const discordPackage = require(join(discordPath, 'package.json'));

Loading…
Cancel
Save