Несколько недель назад я был спотыкаясь CoinChat и был отчасти впечатлен этим и быстро хотел написать бот для игры я имел в виду. Первый бот был сделан, и я боролся с таким количеством CoinChat вещей, что я решил написать модуль coinchat-клиент для облегчения повторного использования. Код для него можно найти либо на GitHub или установить с помощью NPM установить coinchat-клиент. Также, если у вас нет опыта написания JavaScript или еще не трогали ничего Node.js, этот учебник, вероятно, не для вас, и вы должны начать получать в этих двух темах.
Для этого урока мы собираемся создать бот, который позволяет монетку и в зависимости от результата, наклонить пользователь пользовательского количества. Если вы не работаете в системе на платформе Unix Я предлагаю вам запустить виртуальную машину с Linux на нем. Я предлагаю не просто копировать / вставить, но варьировать некоторые из вещей, которые я пишу, чтобы получить чувство для сруба.
Начиная
Мы начнем с создания новой папки проекта для нашего бота. Перейти в каталог по вашему выбору, и введите следующую команду:
Код:
MkDir dicebot && кд dicebot
NPM установить coinchat-клиент
NPM установить coinchat-клиент
Она будет автоматически устанавливать все зависимости coinchat-клиент, и вы готовы пойти.
Подключение к и регистрации на CoinChat
Подключение к coinchat действительно не может быть проще. Во-первых, мы будем требовать библиотеку coinchat-клиента и создать новый экземпляр. Нам необходимо передать объект в coinchat-клиент, поэтому структура знает свои учетные данные (Примечание: Вы можете также установить полномочия на более позднем этапе). После того, как мы создали клиент, мы будем подключаться к серверу. Подключения метод принимает функцию обратного вызова, которая вызывается, когда мы успешно подключены к серверу. В функции обратного вызова, мы входа в систему с указанными учетными данными в начале, который снова принимает функцию обратного вызова, которая вызывается после успешного входа в систему.
Код:
вар CoinChatClient = требуется ( 'coinchat-клиент');
вар клиент = новый CoinChatClient ({
Имя пользователя: 'Foo',
Пароль: «бар»
});
console.log ( 'Подключение к coinchat ...');
client.connect (функция () {
console.log ( 'Connected Вход в систему ....');
client.login (функция () {
console.log ("WooHoo! Мы вошли в систему!");
});
});
вар клиент = новый CoinChatClient ({
Имя пользователя: 'Foo',
Пароль: «бар»
});
console.log ( 'Подключение к coinchat ...');
client.connect (функция () {
console.log ( 'Connected Вход в систему ....');
client.login (функция () {
console.log ("WooHoo! Мы вошли в систему!");
});
});
Если теперь запустить точный код с учетными данными, вы получите исключение. Это, как ожидается, как учетная запись не зарегистрирована и или неверный пароль. Оба случая являются условием выхода, в котором код, как ожидается, не потому, что он, очевидно, не может работать в его текущем состоянии (Примечание: Вы можете использовать TRY / поймать вокруг него, но это действительно не имеет смысла). Изменение учетных данных для собственных единиц, и это должно дать вам все отладочные сообщения, таким образом показывая полное соединение.
Обработка сообщений
Рамки не было бы весело, если бы не иметь дело с сообщениями. В его нынешнем виде она абстрагирует все вшивые песчаные подробности и позволяет работать с сообщениями. Для этого экземпляр клиента предоставляет метод регистра. Она либо принимает функцию или объект, содержащий метод handleMessage для рассмотрения сообщений в стандартной форме, независимо, если они позволили цвета или нет. Давайте перейдем к деталям и улучшить наш пример немного. Во-первых, давайте определим функцию, которая должна выступать в качестве нашего обработчика сообщений.
Код:
Функция messageParser (MSG) {
console.log ("Получено сообщение от "+ Msg.user +" в "+ Msg.room +" и первое слово, которое он сказал, было "+ Msg.params [0] +", Он получил "+ Msg.tip +"МВТС для этого.");
}
console.log ("Получено сообщение от "+ Msg.user +" в "+ Msg.room +" и первое слово, которое он сказал, было "+ Msg.params [0] +", Он получил "+ Msg.tip +"МВТС для этого.");
}
То, что это делает довольно легко. Он получает сообщение в качестве первого параметра и записывает сообщение отладки на консоль. Сейчас он не работает, хотя, потому что наш клиент еще не знает функцию. Давайте расширим первый пример кода и изменить его выглядеть следующим образом:
Код:
...
client.login (функция () {
client.register (messageParser);
});
...
client.login (функция () {
client.register (messageParser);
});
...
Теперь, каждое сообщение, которое отправляется получает нашу функцию messageParser и получает выводится в нашей командной строке. Ладно. Я врал. Это работает, но вы не увидите сообщение прямо сейчас, потому что вы еще не в любой комнате! Давайте исправим это до ...
Присоединение и выход номера
Нет веселья без номеров. Давайте сделаем это быстро. Экземпляр клиента предоставляет два метода для этого, присоединиться и оставить, как принимая название номера в первом сообщении. Внутри вашего входа типа обратного вызова
Код:
client.join ( 'Foobar')
и боты будут подключаться к комнате. Если сейчас написать сообщение там будет выводиться на консоль. Разве это не здорово? Какие? Вы хотите, чтобы ответить на эти сообщения? Бог вам, ребята, трудно удовлетворить ...
Запись сообщений
Поисковые системы имеют ограничения, когда дело доходит до написания сообщений, который, не отправить несколько сообщений меньше чем 550ms или бота будет заглушены. Рамки помогают вам в этом, что он имеет так называемое сообщение насос, который очереди и отправляет сообщения в интервале, таким образом, не становится приглушенным. Для этого есть 3 способа:
Код:
client.pushMessage (roomName, сообщение, [цвет]);
client.pushTip (roomName, имя пользователя, tipAmount, [сообщение]);
client.pushPrivateMessage (Username, сообщение);
client.pushTip (roomName, имя пользователя, tipAmount, [сообщение]);
client.pushPrivateMessage (Username, сообщение);
Каждый из этих методов будет подталкивать новое сообщение в очередь сообщений, которое доставляется тогда. Давайте, попробовать его в функции MessageHandler мы писали ранее (Примечание: pushTip не работает, если ваш баланс бот ниже 0.25mBTC, как это минимальный размер наконечника).
Получая советы
Когда сообщение достигает вашу функцию обработчика сообщений, есть атрибут на нем называется isTip. Всегда проверяйте isTip в обработчике сообщений первым. Если isTip установлен, также будет tipAmount на нем.
Использование объекта для обработки сообщений
Теперь вы должны знать, большинство возможностей платформы, и мы собираемся расширить наш пример немного. Помните, раньше, когда я сказал, что вы могли бы использовать объект в качестве обработчика сообщений? Ну, теперь та часть, где мы будем использовать именно это. Давайте сначала определить, что наш бот должен быть в состоянии сделать. Если вы наберете! Катиться он должен бросить один 6 кубика и вывести сообщение. Если вы наберете! Катиться 20 он должен катиться 20 6 сторонними умереть, и если вы делаете! Рулет-20 он должен выбросить-20 кубик. В качестве администратора только особенность должна также иметь команду выключения для отключения от сервера. Позволяет начать писать бот в традиционном "OOP" Способ:
Код:
вар DiceBot = функция (клиент) {
// сохранить локальный экземпляр клиента
this.client = клиент;
// ввести все имена администратора в нижнем регистре здесь
this.admins = [ 'вашеимя']; // Сохранить все имена администратора здесь
// это используется, чтобы сохранить наш баланс
this.balance = 0;
// Это должно содержать отображение ваших команд в нижнем регистре
this.commands = {
'Помощь!': This.printHelp,
'Ролл!': This.rollDice
};
// Это хорошая практика, чтобы отделить администратор
// команда из обычных команд, используя
// другой префикс, так вот команда останова
this.adminCommands = {
'! #shutdown': this.shutdown
};
this.helpText = "Здесь идет ваш HelpText";
};
/ **
* Выдать помощь, когда помощь! Получена пользователем
* /
DiceBot.prototype.printHelp = функция (MSG) {
this.client.pushMessage (msg.room, msg.user +": "+ This.helpText);
вернуться ложным;
};
/ **
* Это то, что вызывается нашим клиентом случай, когда
* Зарегистрировав его с помощью client.register
* /
DiceBot.prototype.handleMessage = функция (MSG) {
// Первая позволяет проверить, если администратор написал
вар админ = (this.admins.indexOf (msg.user.toLowerCase)! = -1)
// Давайте посмотрим, если сообщение наконечник
если (msg.isTip) {
// нормально, мы не должны фактически сделать больше здесь, в этом случае
this.balance = msg.tipAmount;
this.client.pushMessage (msg.room, msg.user + ': Благодарим Вас за кончик Вашего вклад очень приветствуется.!');
вернуться ложным;
}
// нормально, вот сложная часть. Мы проверяем первый параметр сообщения
// и проверить, если у нас есть команда, есть. Если у нас есть тот, который мы называем это и
// передать ему сообщение в качестве параметра.
если (TypeOf this.commands [msg.params [0]] == 'функция') {
вернуть this.commands [msg.params [0]] вызов (это, MSG).
}
// Тогда, наконец, мы делаем то же самое с командами администратора
// если это админы печатая сообщение.
если (администратора && TypeOf this.adminCommands [msg.params [0]] == 'функция') {
вернуть this.adminCommands [msg.params [0]] вызов (это, MSG).
}
};
/ **
* Это проверяет параметры MSG и устанавливает значения по умолчанию, если что-то не дано.
* /
DiceBot.prototype.rollDice = функция (MSG) {
вар nrDice = Число (msg.params [1]) || 1,
сторона = Число (msg.params [2]) || 6,
валки = [];
для (вар я = 0; я rolls.push (1 + Math.Floor (Math.random () * стороны));
}
// Дайте пользователю его кости рулон
this.client.pushMessage (msg.room, msg.user +": Вы прокатка "+ NrDice +"D"+ стороны +" и получил " + Rolls.reduce (функция (р, резюме) {возвращение р + резюме;}, 0) + ", "+ Rolls.join ( ''));
}
/ **
* Это выключит бот
* /
DiceBot.prototype.shutdown = функция (MSG) {
console.log ( 'закрытие ..');
process.exit ();
вернуться ложным;
};
module.exports = DiceBot;
// сохранить локальный экземпляр клиента
this.client = клиент;
// ввести все имена администратора в нижнем регистре здесь
this.admins = [ 'вашеимя']; // Сохранить все имена администратора здесь
// это используется, чтобы сохранить наш баланс
this.balance = 0;
// Это должно содержать отображение ваших команд в нижнем регистре
this.commands = {
'Помощь!': This.printHelp,
'Ролл!': This.rollDice
};
// Это хорошая практика, чтобы отделить администратор
// команда из обычных команд, используя
// другой префикс, так вот команда останова
this.adminCommands = {
'! #shutdown': this.shutdown
};
this.helpText = "Здесь идет ваш HelpText";
};
/ **
* Выдать помощь, когда помощь! Получена пользователем
* /
DiceBot.prototype.printHelp = функция (MSG) {
this.client.pushMessage (msg.room, msg.user +": "+ This.helpText);
вернуться ложным;
};
/ **
* Это то, что вызывается нашим клиентом случай, когда
* Зарегистрировав его с помощью client.register
* /
DiceBot.prototype.handleMessage = функция (MSG) {
// Первая позволяет проверить, если администратор написал
вар админ = (this.admins.indexOf (msg.user.toLowerCase)! = -1)
// Давайте посмотрим, если сообщение наконечник
если (msg.isTip) {
// нормально, мы не должны фактически сделать больше здесь, в этом случае
this.balance = msg.tipAmount;
this.client.pushMessage (msg.room, msg.user + ': Благодарим Вас за кончик Вашего вклад очень приветствуется.!');
вернуться ложным;
}
// нормально, вот сложная часть. Мы проверяем первый параметр сообщения
// и проверить, если у нас есть команда, есть. Если у нас есть тот, который мы называем это и
// передать ему сообщение в качестве параметра.
если (TypeOf this.commands [msg.params [0]] == 'функция') {
вернуть this.commands [msg.params [0]] вызов (это, MSG).
}
// Тогда, наконец, мы делаем то же самое с командами администратора
// если это админы печатая сообщение.
если (администратора && TypeOf this.adminCommands [msg.params [0]] == 'функция') {
вернуть this.adminCommands [msg.params [0]] вызов (это, MSG).
}
};
/ **
* Это проверяет параметры MSG и устанавливает значения по умолчанию, если что-то не дано.
* /
DiceBot.prototype.rollDice = функция (MSG) {
вар nrDice = Число (msg.params [1]) || 1,
сторона = Число (msg.params [2]) || 6,
валки = [];
для (вар я = 0; я
}
// Дайте пользователю его кости рулон
this.client.pushMessage (msg.room, msg.user +": Вы прокатка "+ NrDice +"D"+ стороны +" и получил " + Rolls.reduce (функция (р, резюме) {возвращение р + резюме;}, 0) + ", "+ Rolls.join ( ''));
}
/ **
* Это выключит бот
* /
DiceBot.prototype.shutdown = функция (MSG) {
console.log ( 'закрытие ..');
process.exit ();
вернуться ложным;
};
module.exports = DiceBot;
Уф, это было много кода, но вы должны это понимать. Часть вы должны заметить здесь, что мы определили метод handleMessage. Если зарегистрировать экземпляр бота он будет автоматически вызывать это сообщение. Сохраните этот файл в том же каталоге и назовите его "dicebot.js", Теперь, давайте интегрировать это в нашей предыдущей выборке.
Код:
вар CoinChatClient = требуется ( 'coinchat-клиент'),
DiceBot = требуется (»./ dicebot.js'),
клиент, боты;
клиент = новый CoinChatClient ({
Имя пользователя: 'Foo',
Пароль: «бар»
});
// создать новый экземпляр бота и передачу экземпляра клиента
// поэтому мы имеем доступ к методам толчка.
бот = новый DiceBot (клиент);
console.log ( 'Подключение ...');
client.connect (функция () {
console.log ( 'Connected Вход в систему ....');
client.login (функция () {
console.log ( 'Помнить Присоединение номер ....');
// теперь мы присоединяемся номер
client.join ( 'throwingdice');
// мы реализуем задержку
SetTimeout (функция () {
client.register (СЭП);
}, 3000);
});
});
DiceBot = требуется (»./ dicebot.js'),
клиент, боты;
клиент = новый CoinChatClient ({
Имя пользователя: 'Foo',
Пароль: «бар»
});
// создать новый экземпляр бота и передачу экземпляра клиента
// поэтому мы имеем доступ к методам толчка.
бот = новый DiceBot (клиент);
console.log ( 'Подключение ...');
client.connect (функция () {
console.log ( 'Connected Вход в систему ....');
client.login (функция () {
console.log ( 'Помнить Присоединение номер ....');
// теперь мы присоединяемся номер
client.join ( 'throwingdice');
// мы реализуем задержку
SetTimeout (функция () {
client.register (СЭП);
}, 3000);
});
});
Выполнив этот код с вашими учетными данными, и все должно работать. Если у вас есть вопросы, не стесняйтесь спросить. Если вы хотите добавить функции в рамках просто уронить запрос тянуть на GitHub и я объединить его. В учебнике также можно найти на GitHub в каталоге образцов.
Примечание: Если вы собираетесь обрабатывать остатки обязательно добавить в сохранение слоя, как MySQL или MongoDB. Потеря остатков пользователей является болью и вы можете получить запрещены.
Я надеюсь, что вам понравился этот небольшой учебник и написать некоторые качества роботов способствовать coinchat.
Ура,
Sargo Дарья