Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/8times4/eliza into HEAD
Browse files Browse the repository at this point in the history
  • Loading branch information
lalalune committed Nov 26, 2024
2 parents 1670600 + 60da90b commit 7c83578
Show file tree
Hide file tree
Showing 21 changed files with 1,520 additions and 33,593 deletions.
3 changes: 3 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ STARKNET_ADDRESS=
STARKNET_PRIVATE_KEY=
STARKNET_RPC_URL=

# Intiface Configuration
INTIFACE_WEBSOCKET_URL=ws://localhost:12345


# Farcaster
FARCASTER_HUB_URL=
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ node_modules
.env.production
concatenated-output.ts
embedding-cache.json
packages/plugin-buttplug/intiface-engine

.DS_Store

Expand Down
1 change: 1 addition & 0 deletions agent/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"@ai16z/eliza": "workspace:*",
"@ai16z/plugin-bootstrap": "workspace:*",
"@ai16z/plugin-conflux": "workspace:*",
"@ai16z/plugin-buttplug": "workspace:*",
"@ai16z/plugin-image-generation": "workspace:*",
"@ai16z/plugin-node": "workspace:*",
"@ai16z/plugin-solana": "workspace:*",
Expand Down
1 change: 1 addition & 0 deletions agent/src/character.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export const character: Character = {
// modelProvider: ModelProviderName.OPENAI,
// settings: {
// secrets: {},
// buttplug: true,
// voice: {
// model: "en_US-hfc_female-medium",
// },
Expand Down
4 changes: 3 additions & 1 deletion agent/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,12 @@ import { bootstrapPlugin } from "@ai16z/plugin-bootstrap";
import { confluxPlugin } from "@ai16z/plugin-conflux";
import { solanaPlugin } from "@ai16z/plugin-solana";
import { zgPlugin } from "@ai16z/plugin-0g";
import { type NodePlugin, createNodePlugin } from "@ai16z/plugin-node";
import { nodePlugin, type NodePlugin, createNodePlugin } from "@ai16z/plugin-node";
import {
coinbaseCommercePlugin,
coinbaseMassPaymentsPlugin,
} from "@ai16z/plugin-coinbase";
import { buttplugPlugin } from "@ai16z/plugin-buttplug";
import Database from "better-sqlite3";
import fs from "fs";
import readline from "readline";
Expand Down Expand Up @@ -275,6 +276,7 @@ export function createAgent(
getSecret(character, "COINBASE_PRIVATE_KEY")
? coinbaseMassPaymentsPlugin
: null,
getSecret(character, "BUTTPLUG_API_KEY") ? buttplugPlugin : null,
].filter(Boolean),
providers: [],
actions: [],
Expand Down
91 changes: 91 additions & 0 deletions docs/api/interfaces/IButtplugService.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
[@ai16z/eliza v1.0.0](../index.md) / IButtplugService

# Interface: IButtplugService

## Extends

- [`Service`](../classes/Service.md)

## Methods

### vibrate()

> **vibrate**(`strength`, `duration`): `Promise`\<`void`\>
#### Parameters

**strength**: `number`

**duration**: `number`

#### Returns

`Promise`\<`void`\>

#### Defined in

[packages/plugin-buttplug/src/index.ts:14](https://github.com/ai16z/eliza/blob/main/packages/plugin-buttplug/src/index.ts#L14)

---

### rotate()

> **rotate**(`strength`, `duration`): `Promise`\<`void`\>
#### Parameters

**strength**: `number`

**duration**: `number`

#### Returns

`Promise`\<`void`\>

#### Defined in

[packages/plugin-buttplug/src/index.ts:15](https://github.com/ai16z/eliza/blob/main/packages/plugin-buttplug/src/index.ts#L15)

---

---

### getBatteryLevel()

> **getBatteryLevel**(): `Promise`\<`number`\>
#### Returns

`Promise`\<`number`\>

#### Defined in

[packages/plugin-buttplug/src/index.ts:17](https://github.com/ai16z/eliza/blob/main/packages/plugin-buttplug/src/index.ts#L17)

---

### isConnected()

> **isConnected**(): `boolean`
#### Returns

`boolean`

#### Defined in

[packages/plugin-buttplug/src/index.ts:15](https://github.com/ai16z/eliza/blob/main/packages/plugin-buttplug/src/index.ts#L15)

---

### getDevices()

> **getDevices**(): `any`[]
#### Returns

`any`[]

#### Defined in

[packages/plugin-buttplug/src/index.ts:16](https://github.com/ai16z/eliza/blob/main/packages/plugin-buttplug/src/index.ts#L16)
18 changes: 16 additions & 2 deletions docs/docs/packages/plugins.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,20 @@ Integrates Solana blockchain functionality:
- `walletProvider` - Wallet management
- `trustScoreProvider` - Transaction trust metrics

#### 5. Buttplug Plugin (`@eliza/plugin-buttplug`)

Integrates Buttplug.io for intimate toy control:

**Services:**

- `ButtplugService` - Buttplug.io integration itself

**Actions:**

- `VIBRATE` - Control vibration intensity and duration of connected devices
- `ROTATE` - Control rotation intensity and duration of connected devices
- `BATTERY` - Get the battery level of connected devices

## Using Plugins

### Installation
Expand All @@ -99,10 +113,10 @@ pnpm add @eliza/plugin-[name]
```typescript
import { bootstrapPlugin } from "@eliza/plugin-bootstrap";
import { imageGenerationPlugin } from "@eliza/plugin-image-generation";

import { buttplugPlugin } from "@eliza/plugin-buttplug";
const character = {
// ... other character config
plugins: [bootstrapPlugin, imageGenerationPlugin],
plugins: [bootstrapPlugin, imageGenerationPlugin, buttplugPlugin],
};
```

Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -666,6 +666,7 @@ export type Character = {
/** Optional configuration */
settings?: {
secrets?: { [key: string]: string };
buttplug?: boolean;
voice?: {
model?: string;
url?: string;
Expand Down Expand Up @@ -1092,6 +1093,7 @@ export enum ServiceType {
BROWSER = "browser",
SPEECH_GENERATION = "speech_generation",
PDF = "pdf",
BUTTPLUG = "buttplug",
}

export enum LoggingLevel {
Expand Down
6 changes: 6 additions & 0 deletions packages/plugin-buttplug/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
*

!dist/**
!package.json
!readme.md
!tsup.config.ts
20 changes: 20 additions & 0 deletions packages/plugin-buttplug/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "@ai16z/plugin-buttplug",
"version": "0.1.4-alpha.3",
"main": "dist/index.js",
"type": "module",
"types": "dist/index.d.ts",
"dependencies": {
"@ai16z/eliza": "workspace:*",
"tsup": "^8.3.5",
"buttplug": "^3.2.2",
"net": "^1.0.2"
},
"scripts": {
"build": "tsup --format esm --dts",
"test-via-bun": "bun test/simulate.ts"
},
"peerDependencies": {
"whatwg-url": "7.1.0"
}
}
20 changes: 20 additions & 0 deletions packages/plugin-buttplug/src/buttplug-user-device-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"version": {
"major": 2,
"minor": 6
},
"user-configs": {
"specifiers": {
"lovense": {
"websocket": {
"names": ["LVSDevice"]
}
},
"tcode-v03": {
"websocket": {
"names": ["TCodeDevice"]
}
}
}
}
}
51 changes: 51 additions & 0 deletions packages/plugin-buttplug/src/enviroment.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { IAgentRuntime } from "@ai16z/eliza";
import { z } from "zod";

export const buttplugEnvSchema = z
.object({
INTIFACE_URL: z.string().default("ws://localhost:12345"),
INTIFACE_NAME: z.string().default("Eliza Buttplug Client"),
DEVICE_NAME: z.string().default("Lovense Nora"),
})
.refine(
(data) => {
return (
data.INTIFACE_URL.startsWith("ws://") ||
data.INTIFACE_URL.startsWith("wss://")
);
},
{
message:
"INTIFACE_URL must be a valid WebSocket URL (ws:// or wss://)",
}
);

export type ButtplugConfig = z.infer<typeof buttplugEnvSchema>;

export async function validateButtplugConfig(
runtime: IAgentRuntime
): Promise<ButtplugConfig> {
try {
const config = {
INTIFACE_URL:
runtime.getSetting("INTIFACE_URL") || process.env.INTIFACE_URL,
INTIFACE_NAME:
runtime.getSetting("INTIFACE_NAME") ||
process.env.INTIFACE_NAME,
DEVICE_NAME:
runtime.getSetting("DEVICE_NAME") || process.env.DEVICE_NAME,
};

return buttplugEnvSchema.parse(config);
} catch (error) {
if (error instanceof z.ZodError) {
const errorMessages = error.errors
.map((err) => `${err.path.join(".")}: ${err.message}`)
.join("\n");
throw new Error(
`Buttplug configuration validation failed:\n${errorMessages}`
);
}
throw error;
}
}
Loading

0 comments on commit 7c83578

Please sign in to comment.