⚠️ АХТУНГ: ДОКУМЕНТАЦИЯ СГЕНЕРИРОВАНА CLAUDE.
Высокоуровневый SDK для работы с BlockMine Bot WebSocket API.
npm install blockmine-apiСмотрите папку examples/ для полных примеров использования:
- basic.js - Базовое подключение и события
- raw-messages.js - Работа с сырыми сообщениями и JSON
- chatbot.js - Чат-бот с командами и автоответчиком
Запуск примеров:
npm run example:basic
npm run example:raw
npm run example:chatbotconst BlockMindBot = require('blockmine-api');
const bot = new BlockMindBot({
url: 'http://localhost:3001',
botId: 1,
apiKey: 'bk_your_api_key_here'
});
async function main() {
// Подключиться к боту
await bot.connect();
console.log('Подключено!');
// Слушать сообщения в чате
bot.onChatMessage((data) => {
console.log(`[${data.type}] ${data.username}: ${data.message}`);
});
// Слушать сырые сообщения (весь JSON от Minecraft)
bot.onRawMessage((data) => {
console.log('Сырое сообщение:', data.raw_message);
console.log('JSON:', data.json);
});
// Отправить сообщение
await bot.sendMessage('Привет из API!');
}
main().catch(console.error);const bot = new BlockMindBot(options)Параметры:
options.url(string) - URL сервера BlockMind (обязательно)options.botId(number) - ID бота (обязательно)options.apiKey(string) - API ключ (обязательно)
Подключиться к боту.
await bot.connect();Возвращает: Promise
События:
connected- Успешное подключениеerror- Ошибка подключенияdisconnected- Отключение
Отключиться от бота.
bot.disconnect();Получить текущий статус бота (онлайн/офлайн).
const isOnline = await bot.getStatus();
console.log(isOnline ? 'Бот онлайн' : 'Бот офлайн');Возвращает: Promise
Отправить сообщение в чат от имени бота.
// Обычное сообщение в чат
await bot.sendMessage('Привет всем!');
// Сообщение в клан
await bot.sendMessage('Привет клан!', 'clan');
// Приватное сообщение
await bot.sendMessage('Привет!', 'private', 'Player123');
// Команда
await bot.sendMessage('/home', 'command');Параметры:
message(string) - Текст сообщенияchatType(string) - Тип чата: 'chat', 'clan', 'private', 'command' (по умолчанию: 'chat')recipient(string) - Получатель (только для 'private')
Возвращает: Promise
Вызвать граф и получить ответ от него.
const result = await bot.callGraph('calculate', {
operation: 'add',
a: 10,
b: 20
});
console.log('Результат:', result);Параметры:
graphName(string) - Название графаdata(object) - Данные для графа (по умолчанию: {})
Возвращает: Promise - Данные, которые граф отправил через ноду "Отправить ответ в WebSocket"
Примечания:
- Граф должен иметь триггер "Вызов из WebSocket API"
- В графе доступна нода "Отправить ответ в WebSocket" для отправки данных обратно
- Таймаут: 30 секунд
Запустить визуальный граф (без ожидания ответа).
await bot.triggerGraph('welcome_player', {
playerName: 'Steve'
});Параметры:
graphName(string) - Название графаcontext(object) - Контекст для графа (по умолчанию: {})
Возвращает: Promise
Выполнить команду бота от имени пользователя. Команда будет выполнена с полной проверкой прав, кулдаунов и черного списка для указанного пользователя.
// Выполнить команду 'ping' от имени пользователя 'Steve'
const result = await bot.executeCommand('Steve', 'ping');
console.log('Результат:', result); // "Понг, Steve!"
// Выполнить команду с аргументами
const result2 = await bot.executeCommand('Steve', 'ping', { target: 'Alex' });
console.log('Результат:', result2); // "Понг, Steve! Пингую игрока Alex."
// Выполнить команду 'dev'
const info = await bot.executeCommand('Steve', 'dev');
console.log('Информация:', info); // "Бот создан с помощью - BlockMine. Версия: v1.21.0..."Параметры:
username(string) - Имя пользователя, от имени которого выполняется команда (обязательно)command(string) - Название командыargs(object) - Объект с аргументами команды (по умолчанию: {})
Возвращает: Promise - Результат выполнения команды
Примечания:
- Команда выполняется с проверкой всех прав пользователя (permissions, cooldowns, blacklist)
- Если у пользователя нет прав, будет выброшена ошибка
- Команды выполняются через универсальную систему валидации, такую же как для игровых команд
- Это позволяет использовать одну и ту же логику для Minecraft, WebSocket, Telegram и других источников
Обработка ошибок:
try {
const result = await bot.executeCommand('Player123', 'admin_command');
console.log('Успех:', result);
} catch (error) {
if (error.message.includes('insufficient permissions')) {
console.error('У пользователя нет прав');
} else if (error.message.includes('cooldown')) {
console.error('Команда на кулдауне');
} else if (error.message.includes('blacklisted')) {
console.error('Пользователь в черном списке');
} else if (error.message.includes('not found')) {
console.error('Команда не найдена или отключена');
} else {
console.error('Ошибка:', error.message);
}
}Получить данные о пользователе.
const user = await bot.getUser('Player123');
console.log(user);
// {
// username: 'Player123',
// isBlacklisted: false,
// groups: ['vip', 'moderator'],
// permissions: ['ban', 'kick']
// }Параметры:
username(string) - Имя пользователя
Возвращает: Promise
Добавить пользователя в группу.
await bot.addUserToGroup('Player123', 'vip');Параметры:
username(string) - Имя пользователяgroupName(string) - Название группы
Возвращает: Promise
Удалить пользователя из группы.
await bot.removeUserFromGroup('Player123', 'vip');Параметры:
username(string) - Имя пользователяgroupName(string) - Название группы
Возвращает: Promise
Установить/снять blacklist для пользователя.
// Добавить в blacklist
await bot.setUserBlacklist('Griefer123', true);
// Убрать из blacklist
await bot.setUserBlacklist('Griefer123', false);Параметры:
username(string) - Имя пользователяvalue(boolean) - true для добавления в blacklist, false для удаления
Возвращает: Promise
Слушать сообщения в чате.
bot.onChatMessage((data) => {
console.log(`[${data.type}] ${data.username}: ${data.message}`);
});Callback параметры:
data.type(string) - Тип чатаdata.username(string) - Имя отправителяdata.message(string) - Текст сообщения (обработанный)data.raw_message(string) - Сырое сообщение без обработки
Слушать события входа игроков.
bot.onPlayerJoin((username) => {
console.log(`${username} зашёл на сервер`);
});Callback параметры:
username(string) - Имя игрока
Слушать события выхода игроков.
bot.onPlayerLeave((username) => {
console.log(`${username} вышел с сервера`);
});Callback параметры:
username(string) - Имя игрока
Слушать изменения статуса бота (онлайн/офлайн).
bot.onStatusChanged((isOnline) => {
console.log(isOnline ? 'Бот онлайн' : 'Бот офлайн');
});Callback параметры:
isOnline(boolean) - Статус бота
Слушать обновления здоровья бота.
bot.onHealthUpdate((data) => {
console.log(`Здоровье: ${data.health}, Еда: ${data.food}`);
});Callback параметры:
data.health(number) - Здоровьеdata.food(number) - Сытость
Слушать событие смерти бота.
bot.onDeath(() => {
console.log('Бот умер!');
});Слушать сырые сообщения чата (все сообщения без фильтрации).
bot.onRawMessage((data) => {
console.log('Сырое сообщение:', data.raw_message);
console.log('JSON объект:', data.json);
});Callback параметры:
data.raw_message(string) - Сырое сообщение из чата (текст)data.json(object) - Полный JSON объект сообщения от Minecraft
Слушать кастомные события от плагинов.
bot.onCustomEvent((data) => {
console.log('Кастомное событие:', data);
});Callback параметры:
data(object) - Данные события
Слушать сообщения от бота, отправленные через bot.sendMessage('websocket', ...).
bot.onBotMessage((message) => {
console.log('Сообщение от бота:', message);
});Callback параметры:
message(string) - Текст сообщения
const BlockMindBot = require('blockmine-api');
const bot = new BlockMindBot({
url: 'http://localhost:3001',
botId: 1,
apiKey: 'bk_your_api_key_here'
});
async function main() {
try {
// Подключаемся
await bot.connect();
console.log('✓ Подключено к боту');
// Проверяем статус
const isOnline = await bot.getStatus();
console.log(`✓ Бот ${isOnline ? 'онлайн' : 'офлайн'}`);
// Подписываемся на события
bot.onChatMessage((data) => {
console.log(`[ЧАТ] ${data.username}: ${data.message}`);
// Автоответчик
if (data.message.includes('!помощь')) {
bot.sendMessage('Доступные команды: !помощь, !статус');
}
});
bot.onPlayerJoin(async (username) => {
console.log(`[+] ${username} зашёл`);
// Приветствуем нового игрока
await bot.sendMessage(`Привет, ${username}!`);
// Запускаем граф приветствия
await bot.triggerGraph('welcome_player', { username });
});
bot.onPlayerLeave((username) => {
console.log(`[-] ${username} вышел`);
});
bot.onHealthUpdate((data) => {
if (data.health < 5) {
console.log('⚠️ Критически низкое здоровье!');
}
});
bot.onDeath(async () => {
console.log('💀 Бот умер!');
await bot.sendMessage('Упс...');
});
// Управление пользователями
const user = await bot.getUser('Steve');
console.log('Данные пользователя:', user);
if (!user.groups.includes('member')) {
await bot.addUserToGroup('Steve', 'member');
console.log('✓ Добавлен в группу member');
}
console.log('Бот запущен и слушает события...');
} catch (error) {
console.error('Ошибка:', error.message);
bot.disconnect();
}
}
// Обработка выхода
process.on('SIGINT', () => {
console.log('\nОтключение...');
bot.disconnect();
process.exit(0);
});
main();Все методы возвращают Promise, поэтому используйте try/catch:
try {
await bot.sendMessage('Тест');
} catch (error) {
if (error.message === 'Bot is offline') {
console.log('Бот офлайн, ожидаем...');
} else if (error.message === 'Insufficient permissions: Read-only key') {
console.log('Недостаточно прав');
} else {
console.error('Ошибка:', error.message);
}
}API ключи могут иметь разные уровни доступа:
- Read - Только чтение событий
- Write - Только отправка команд
- ReadWrite - Полный доступ
При использовании Read-only ключа методы sendMessage, triggerGraph, addUserToGroup, removeUserFromGroup и setUserBlacklist вернут ошибку.
Вы можете вызывать визуальные графы из внешних приложений и получать от них ответы. Это позволяет создавать мощные интеграции между вашим ботом и другими системами.
- Откройте раздел "Графы событий" в интерфейсе BlockMind
- Создайте новый граф
- В качестве триггера выберите "📡 Вызов из WebSocket API"
- Постройте логику графа
- В конце добавьте ноду "📤 Отправить ответ в WebSocket" для отправки данных обратно
const BlockMindBot = require('blockmine-api');
const bot = new BlockMindBot({
url: 'http://localhost:3001',
botId: 1,
apiKey: 'bk_your_api_key_here'
});
async function main() {
await bot.connect();
// Вызов графа с данными
try {
const result = await bot.callGraph('calculate', {
operation: 'add',
a: 10,
b: 20
});
console.log('Результат:', result); // { result: 30 }
} catch (error) {
console.error('Ошибка вызова графа:', error.message);
}
}
main();Триггер: 📡 Вызов из WebSocket API
Логика графа:
- Получить данные из триггера (data.operation, data.a, data.b)
- Выполнить операцию через ноду "🔢 Математика"
- Отправить результат через "📤 Отправить ответ в WebSocket"
Пример использования:
// Сложение
const sum = await bot.callGraph('calculate', {
operation: 'add',
a: 5,
b: 3
});
console.log(sum); // { result: 8 }
// Умножение
const product = await bot.callGraph('calculate', {
operation: 'multiply',
a: 5,
b: 3
});
console.log(product); // { result: 15 }Триггер: 📡 Вызов из WebSocket API
Логика графа:
- Получить список игроков (нода "👥 Список игроков")
- Получить позицию бота (нода "🤖 Позиция бота")
- Собрать объект с данными (нода "🏗️ Собрать объект")
- Отправить ответ
Пример использования:
const serverInfo = await bot.callGraph('server_info', {});
console.log(serverInfo);
// {
// players: ['Player1', 'Player2', 'Player3'],
// botPosition: { x: 100, y: 64, z: 200 },
// timestamp: '2024-01-15T10:30:00Z'
// }Триггер: 📡 Вызов из WebSocket API
Логика:
- Получить username из data
- Получить данные пользователя через БД
- Проверить группы и права
- Отправить результат
Пример использования:
const hasAccess = await bot.callGraph('check_permission', {
username: 'Player123',
permission: 'build'
});
console.log(hasAccess);
// {
// allowed: true,
// groups: ['vip', 'builder'],
// reason: 'User has builder group'
// }try {
const result = await bot.callGraph('my_graph', { data: 'test' });
console.log('Успех:', result);
} catch (error) {
if (error.message === 'Timeout') {
console.error('Граф не ответил в течение 30 секунд');
} else if (error.message.includes('Graph not found')) {
console.error('Граф не найден или не имеет триггер "Вызов из WebSocket API"');
} else if (error.message === 'Bot is offline') {
console.error('Бот офлайн');
} else {
console.error('Ошибка:', error.message);
}
}Когда граф запускается через callGraph(), в контексте графа доступны следующие переменные:
- graphName (String) - Имя графа, который был вызван
- data (Object) - Данные, переданные при вызове
- socketId (String) - ID WebSocket соединения
- keyPrefix (String) - Префикс API ключа (первые символы)
Эти данные можно получить из выходов триггера "📡 Вызов из WebSocket API".
- callGraph() - Ждёт ответа от графа (до 30 секунд), возвращает данные
- triggerGraph() - Просто запускает граф и сразу возвращается, не ждёт результата
Используйте callGraph() когда нужен результат работы графа, и triggerGraph() для простого запуска действий.
Сырые сообщения содержат полный JSON от Minecraft сервера, включая цвета, форматирование и дополнительные данные.
const BlockMindBot = require('blockmine-api');
const bot = new BlockMindBot({
url: 'http://localhost:3001',
botId: 1,
apiKey: 'bk_your_api_key_here'
});
async function main() {
await bot.connect();
// Обработка сырых сообщений
bot.onRawMessage((data) => {
// Текстовая версия
console.log('Текст:', data.raw_message);
// Полный JSON объект
const json = data.json;
// Доступ к дополнительным данным
if (json.extra) {
// Обработка форматированного текста
json.extra.forEach(part => {
console.log('Часть сообщения:', part.text);
if (part.color) console.log('Цвет:', part.color);
if (part.clickEvent) console.log('Клик событие:', part.clickEvent);
});
}
// Проверка на специальные сообщения
if (json.translate) {
console.log('Тип перевода:', json.translate);
console.log('Параметры:', json.with);
}
});
// Обработанные сообщения чата (проще в использовании)
bot.onChatMessage((data) => {
console.log(`[${data.type}] ${data.username}: ${data.message}`);
// Также содержит raw_message для доступа к исходному тексту
console.log('Исходное сообщение:', data.raw_message);
});
}
main().catch(console.error);bot.onRawMessage((data) => {
const json = data.json;
// Сообщения о смерти
if (json.translate && json.translate.startsWith('death.')) {
console.log('💀 Событие смерти:', data.raw_message);
}
// Системные сообщения
if (json.translate && json.translate.startsWith('chat.type.')) {
console.log('📢 Системное сообщение:', data.raw_message);
}
// Сообщения с упоминанием бота
if (data.raw_message.includes('BotName')) {
console.log('📬 Упоминание бота:', data.raw_message);
}
});async function main() {
await bot.connect();
bot.onChatMessage(async (data) => {
// Проверяем команды
if (data.message.startsWith('!help')) {
await bot.sendMessage(`Привет, ${data.username}! Доступные команды: !help, !status, !rules`);
}
if (data.message.startsWith('!status')) {
const isOnline = await bot.getStatus();
await bot.sendMessage(`Бот ${isOnline ? 'онлайн ✅' : 'офлайн ❌'}`);
}
if (data.message.startsWith('!rules')) {
await bot.sendMessage('1. Не гриферить 2. Уважать игроков 3. Не использовать читы');
}
});
// Автоматическое приветствие новых игроков
bot.onPlayerJoin(async (username) => {
await bot.sendMessage(`Добро пожаловать на сервер, ${username}! 👋`);
// Запускаем граф приветствия
try {
await bot.triggerGraph('welcome_player', { username });
} catch (error) {
console.error('Ошибка запуска графа:', error.message);
}
});
// Прощание с игроками
bot.onPlayerLeave((username) => {
console.log(`${username} покинул сервер`);
});
}async function main() {
await bot.connect();
// Список запрещенных слов
const bannedWords = ['spam', 'grief', 'hack'];
bot.onChatMessage(async (data) => {
const message = data.message.toLowerCase();
const username = data.username;
// Проверка на запрещенные слова
const hasBannedWord = bannedWords.some(word => message.includes(word));
if (hasBannedWord) {
console.log(`⚠️ ${username} использовал запрещенное слово`);
// Получаем данные пользователя
const user = await bot.getUser(username);
// Если уже в blacklist, ничего не делаем
if (user.isBlacklisted) {
return;
}
// Проверяем количество нарушений (нужно вести свой счетчик)
// Для примера сразу добавляем предупреждение
if (!user.groups.includes('warned')) {
await bot.addUserToGroup(username, 'warned');
await bot.sendMessage(`${username}, предупреждение за нарушение правил!`, 'chat');
} else {
// Второе нарушение - в blacklist
await bot.setUserBlacklist(username, true);
await bot.sendMessage(`${username} был заблокирован за повторное нарушение`, 'chat');
}
}
});
// Команда для админов - снять блокировку
bot.onChatMessage(async (data) => {
if (!data.message.startsWith('!unban ')) return;
// Проверяем права отправителя
const sender = await bot.getUser(data.username);
if (!sender.groups.includes('admin')) {
await bot.sendMessage('У вас нет прав для этой команды', 'private', data.username);
return;
}
const targetUsername = data.message.split(' ')[1];
if (!targetUsername) {
await bot.sendMessage('Использование: !unban <username>', 'private', data.username);
return;
}
try {
await bot.setUserBlacklist(targetUsername, false);
await bot.sendMessage(`${targetUsername} был разблокирован`, 'chat');
} catch (error) {
await bot.sendMessage(`Ошибка: ${error.message}`, 'private', data.username);
}
});
}async function main() {
await bot.connect();
let lastHealth = 20;
bot.onHealthUpdate((data) => {
console.log(`❤️ Здоровье: ${data.health}/20, 🍖 Еда: ${data.food}/20`);
// Критическое здоровье
if (data.health < 5 && lastHealth >= 5) {
console.log('⚠️ КРИТИЧЕСКОЕ ЗДОРОВЬЕ!');
// Можно отправить уведомление админам
}
// Низкая сытость
if (data.food < 5) {
console.log('🍖 Низкая сытость!');
}
lastHealth = data.health;
});
bot.onDeath(async () => {
console.log('💀 Бот умер!');
await bot.sendMessage('Упс, я умер...');
});
// Отслеживание статуса
bot.onStatusChanged((isOnline) => {
console.log(`Статус бота изменился: ${isOnline ? 'ONLINE' : 'OFFLINE'}`);
if (!isOnline) {
console.log('⚠️ Бот офлайн! Переподключение...');
}
});
}async function main() {
await bot.connect();
bot.onCustomEvent((data) => {
console.log('🔔 Кастомное событие:', data);
// Обработка специфичных событий плагинов
if (data.type === 'economy:transaction') {
console.log(`💰 Транзакция: ${data.from} -> ${data.to}: $${data.amount}`);
}
if (data.type === 'clan:war_started') {
console.log(`⚔️ Война кланов: ${data.clan1} vs ${data.clan2}`);
}
});
}MIT