aboutsummaryrefslogtreecommitdiff
path: root/src/extension.ts
blob: 17b0f536953e31653785826dbe0ed29b88033358 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode';
import * as buttplug from 'buttplug';

let selected_device: buttplug.ButtplugClientDevice | null = null;
let timeout: NodeJS.Timeout | null = null;
let config: vscode.WorkspaceConfiguration | null = null;
let taskRunning = false;

export async function activate(context: vscode.ExtensionContext) {
	config = vscode.workspace.getConfiguration('buttplug');
	context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(_ => config = vscode.workspace.getConfiguration('buttplug')));
	const connector = new buttplug.ButtplugNodeWebsocketClientConnector("ws://127.0.0.1:12345");
	let client = new buttplug.ButtplugClient("VS Code");

	client.addListener("deviceadded", async (device: buttplug.ButtplugClientDevice) => {
		vscode.window.showInformationMessage(`Device Connected: ${device.name}`);
		if (device.vibrateAttributes.length == 0) {
			return;
		}
		try {
			await device.vibrate(0.1);
			await device.stop();
			selected_device = device;
		} catch (e) {
			vscode.window.showErrorMessage(e as string);
			if (e instanceof buttplug.ButtplugDeviceError) {
				vscode.window.showErrorMessage("got a device error!");
			}
		}
	});
	client
		.addListener("deviceremoved", (device) => console.log(`Device Removed: ${device.name}`));

	await client.connect(connector);

	const disposable = vscode.workspace.onDidChangeTextDocument(async (e) => {
		if (taskRunning) return;
		const activeEditor = vscode.window.activeTextEditor;

		if (!activeEditor) {
			return;
		}

		await selected_device?.vibrate((config!.get('typingStrength') as number) * (config!.get('strength') as number));
		if (timeout) {
			clearTimeout(timeout);
		}
		timeout = setTimeout(async () => await selected_device?.stop(), config!.get('typingDuration') as number * 1000);
	});

	context.subscriptions.push(disposable);

	context.subscriptions.push(vscode.tasks.onDidStartTask(async e => {
		if (e.execution.task.group === vscode.TaskGroup.Build) {
			taskRunning = true;
			await selected_device?.vibrate((config!.get('buildStrength') as number) * (config!.get('strength') as number));
		}
	}));

	context.subscriptions.push(vscode.tasks.onDidEndTask(async e => {
		if (e.execution.task.group === vscode.TaskGroup.Build) {
			taskRunning = false;
			await selected_device?.stop();
		}
	}));
}

// This method is called when your extension is deactivated
export function deactivate() { }