aboutsummaryrefslogtreecommitdiff
path: root/src/extension.ts
diff options
context:
space:
mode:
authorsoaos <soaos@soaos.dev>2026-01-27 23:07:40 -0500
committersoaos <soaos@soaos.dev>2026-01-27 23:07:40 -0500
commit248f89c80eddf5f01cc78b9011d62a3c83801d1c (patch)
treec99fb93881702415a4854753d311a50c06ea7741 /src/extension.ts
Initial Commit
Diffstat (limited to 'src/extension.ts')
-rw-r--r--src/extension.ts71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/extension.ts b/src/extension.ts
new file mode 100644
index 0000000..17b0f53
--- /dev/null
+++ b/src/extension.ts
@@ -0,0 +1,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() { }