discord-vscode/src/extension.ts

124 lines
3.7 KiB
TypeScript
Raw Normal View History

2021-02-10 03:24:42 +00:00
const { Client } = require('discord-rpc'); // eslint-disable-line
import {
commands,
ExtensionContext,
StatusBarAlignment,
StatusBarItem,
window,
workspace,
extensions,
debug,
} from 'vscode';
2021-02-10 15:54:44 +00:00
import throttle from 'lodash-es/throttle';
2017-11-23 13:06:21 +00:00
2021-02-10 15:54:44 +00:00
import { activity } from './activity';
2021-02-10 03:24:42 +00:00
import { CLIENT_ID, CONFIG_KEYS } from './constants';
import { GitExtension } from './git';
import { log, LogLevel } from './logger';
import { getConfig } from './util';
const statusBarIcon: StatusBarItem = window.createStatusBarItem(StatusBarAlignment.Left);
statusBarIcon.text = '$(pulse) Connecting to Discord...';
2021-02-10 03:24:42 +00:00
const rpc = new Client({ transport: 'ipc' });
const config = getConfig();
2021-02-10 15:54:44 +00:00
let state = {};
2021-02-10 03:24:42 +00:00
async function sendActivity() {
2021-02-10 15:54:44 +00:00
state = {
...(await activity(state)),
};
rpc.setActivity(state);
2021-02-10 03:24:42 +00:00
}
async function login(context: ExtensionContext) {
rpc.once('ready', () => {
log(LogLevel.Info, 'Successfully connected to Discord');
statusBarIcon.text = '$(globe) Connected to Discord';
statusBarIcon.tooltip = 'Connected to Discord';
const onChangeActiveTextEditor = window.onDidChangeActiveTextEditor(() => sendActivity());
2021-02-10 15:54:44 +00:00
const onChangeTextDocument = workspace.onDidChangeTextDocument(throttle(() => sendActivity(), 1000));
2021-02-10 03:24:42 +00:00
const onStartDebugSession = debug.onDidStartDebugSession(() => sendActivity());
const onTerminateDebugSession = debug.onDidTerminateDebugSession(() => sendActivity());
context.subscriptions.push(
onChangeActiveTextEditor,
onChangeTextDocument,
onStartDebugSession,
onTerminateDebugSession,
);
});
try {
await rpc.login({ clientId: CLIENT_ID });
} catch (error) {
log(LogLevel.Error, `Encountered following error while trying to login:\n${error as string}`);
rpc.dispose();
if (!config[CONFIG_KEYS.SuppressNotifications]) {
if (error?.message?.includes('ENOENT')) void window.showErrorMessage('No Discord client detected');
else void window.showErrorMessage(`Couldn't connect to Discord via RPC: ${error as string}`);
}
rpc.statusBarIcon.text = '$(pulse) Reconnect to Discord';
rpc.statusBarIcon.command = 'discord.reconnect';
}
}
2021-02-10 03:24:42 +00:00
export function activate(context: ExtensionContext) {
log(LogLevel.Info, 'Discord Presence activated');
let isWorkspaceExcluded = false;
2021-02-10 03:24:42 +00:00
for (const pattern of config[CONFIG_KEYS.WorkspaceExcludePatterns]) {
const regex = new RegExp(pattern);
const folders = workspace.workspaceFolders;
if (!folders) break;
if (folders.some((folder) => regex.test(folder.uri.fsPath))) {
isWorkspaceExcluded = true;
break;
}
}
const enabler = commands.registerCommand('discord.enable', () => {
2021-02-10 03:24:42 +00:00
rpc.destroy();
2020-05-23 03:34:15 +00:00
void config.update('enabled', true);
2021-02-10 03:24:42 +00:00
statusBarIcon.text = '$(pulse) Connecting to Discord...';
statusBarIcon.show();
void login(context);
void window.showInformationMessage('Enabled Discord Presence for this workspace');
});
2021-02-10 03:24:42 +00:00
const disabler = commands.registerCommand('discord.disable', () => {
2020-05-23 03:34:15 +00:00
void config.update('enabled', false);
2021-02-10 03:24:42 +00:00
rpc.destroy();
rpc.statusBarIcon.hide();
2021-02-10 03:24:42 +00:00
void window.showInformationMessage('Disabled Discord Presence for this workspace');
2017-11-23 23:53:16 +00:00
});
2021-02-10 03:24:42 +00:00
const reconnecter = commands.registerCommand('discord.reconnect', () => {
2021-02-10 03:24:42 +00:00
deactivate();
void activate(context);
});
2021-02-10 03:24:42 +00:00
const disconnect = commands.registerCommand('discord.disconnect', () => {
2021-02-10 03:24:42 +00:00
rpc.destroy();
rpc.statusBarIcon.text = '$(pulse) Reconnect to Discord';
rpc.statusBarIcon.command = 'discord.reconnect';
});
2021-02-10 03:24:42 +00:00
context.subscriptions.push(enabler, disabler, reconnecter, disconnect);
if (!isWorkspaceExcluded && config[CONFIG_KEYS.Enabled]) {
2019-11-02 16:55:43 +00:00
statusBarIcon.show();
2021-02-10 03:24:42 +00:00
void login(context);
2019-11-02 16:55:43 +00:00
}
const gitExtension = extensions.getExtension<GitExtension>('vscode.git');
2021-02-10 03:24:42 +00:00
void gitExtension?.activate();
2017-11-23 13:06:21 +00:00
}
export function deactivate() {
2021-02-10 03:24:42 +00:00
rpc.destroy();
}