MetaTell Bot を TypeScript/Node.js で構築するための公式 SDK。
npm install @metatell/bot-sdk
# または
pnpm add @metatell/bot-sdk
# または
yarn add @metatell/bot-sdk
import { createMetatellClient } from '@metatell/bot-sdk'
async function main() {
const client = createMetatellClient({
serverUrl: 'wss://metatell.app',
roomId: 'YOUR_ROOM_ID',
username: 'MyBot',
// token: process.env.METATELL_TOKEN, // 認証が必要な環境では設定
debug: true, // 詳細ログ
})
// 接続
await client.connect()
// ボット情報
const botInfo = await client.getInfo()
console.log('接続しました:', botInfo.name)
// メッセージ処理(メンションにのみ応答)
client.chat.onMessage(async ({ from, text, mention, reply }) => {
if (mention?.sessionId === botInfo.sessionId) {
await reply(`こんにちは ${from.name ?? ''}`.trim())
}
})
// アバター選択と操作
await client.avatar.select('default-avatar')
await client.avatar.moveTo({ x: 1, y: 1.6, z: -2 })
await client.avatar.rotateTo({ x: 0, y: 180, z: 0 })
await client.avatar.play({ id: 'wave', loop: false })
}
main().catch(console.error)
client.chat.send
, client.chat.onMessage
)room.getUsers
, getUsers
)MetatellClientEvents
)await client.connect()
await client.disconnect()
// 接続状態
const status = client.getStatus() // { connected: boolean, connecting: boolean }
// ボット情報
const info = await client.getInfo() // { name, version, roomId, sessionId? }
// メッセージ送信
await client.chat.send('こんにちは!')
// メッセージ購読 + 返信
client.chat.onMessage(async ({ from, text, reply }) => {
console.log(`${from.name}: ${text}`)
await reply('メッセージありがとうございます!')
})
// アバター選択
await client.avatar.select('avatar-asset-id')
// 移動/回転(度数法)
await client.avatar.moveTo({ x: 10, y: 0, z: 5 })
await client.avatar.rotateTo({ x: 0, y: 90, z: 0 })
// アニメーション再生
await client.avatar.play({ id: 'wave', loop: true, duration: 5000 })
// 利用可能なアセット/アニメーション
const assets = await client.avatar.getAvailableAssets()
const animations = await client.avatar.getAvailableAnimations()
// すべてのユーザー
const users = await client.room.getUsers()
// 近傍ユーザー(既定 10m)
const nearby = await client.room.getNearbyUsers(10)
// 現在キャッシュしているユーザー(同期)
const cached = client.getUsers()
client.on('connected', () => {})
client.on('disconnected', (reason) => {})
client.on('chat-message', (message) => {})
client.on('user-join', (user) => {})
client.on('user-leave', (user) => {})
注記: 現状 error
イベントの発火は限定的で、主に例外としてスローされます。
client.on('voice:connected', () => {})
client.on('voice:disconnected', () => {})
client.on('voice:error', (err) => {})
client.on('voice:frame-received', ({ participantId, pcmData }) => {})
// ミュート状態の変化
client.on('voice:mute-changed', ({ muted }) => {
console.log('microphone muted:', muted)
})
// ミュート要求
await client.muteVoice(true) // -> EventBus に 'voice:mute-changed' を emit
await client.muteVoice(false) // -> 同上
補足: muteVoice(muted)
は内部状態を直接変更せず、EventBus に 'voice:mute-changed'
を発行します。クライアントはこのイベントを購読して isVoiceMuted()
を同期します。
import { AuthError, NetworkError } from '@metatell/bot-sdk'
try {
await client.connect()
} catch (error) {
if (error instanceof AuthError) {
console.error('認証に失敗しました:', error.message)
} else if (error instanceof NetworkError) {
console.error('ネットワークエラー:', error.message)
}
}
setRateLimit
で送信頻度を調整disconnect()
MIT