Кофемашина:Команда

**Команда** — специализированное сообщение, которое позволяет обратиться к боту и активировать определенное его поведение. Отличается от сообщений общего характера определенным синтаксисом и смыслом.

Команды Кофемашины могут быть применены только на серверах. На личные сообщения и добавление в группу он не реагирует.

## Синтаксис

Обычно команды пишутся на латинице, однако возможно наличие иноязычных вариантов, в том числе и русского. Она начинается префиксом, по которому бот определяет, что обращаются именно к нему. Каждый бот имеет свой префикс, назначенный автором, хотя часть из них имеет в своем функционале возможность локально изменить используемый префикс во избежание, например, конфликтов, когда несколько ботов откликаются на одинаковый префикс. Кофемашина же всегда отвечает на команды, начинающиеся `kof.`.

Сразу после приставки идет слово или несколько слов, объединенных в одно, которые несут смысл команды. Эта конструкция должна быть лаконичной и наиболее полно отражать функции команды. Люди охотнее будут использовать команду `kof.top`, которая, судя по названию, отображает топ, чем непонятно что делающую `kof.xyz`. Или длина: удобнее написать краткое `kof.help`, чем длиннющее `kof.helpmepleaseidontknowwhattodo`.

После ключевого слова команды идут аргументы, разделяемые наиболее часто пробелом либо иной другой комбинацией символов. Аргументы позволяют ввести пользовательские данные, которые будут обработаны и как-либо повлияют на результат. Это позволяет сделать систему более интерактивной. Количество аргументов системно не ограничено, однако нужно помнить, что Дискорд не позволяет отсылать сообщения длиной выше двух тысяч знаков.

Прописывать аргументы командам, их не принимающим, можно, но никакого влияния при этом не будет. Так, например, при игре в `kof.casino` пользователи пишут слова и даже целые фразы "на удачу".

## Список команд

В настоящее время бот знает *столько-то* команд, распределенных по *стольки-то* категориям и отсортированных по алфавиту. Узнать об изменениях можно здесь.

### Основные

*Нужны для настройки бота, а также получения некоторой информации по нему.*
* `kof.about` — кратенько описывает то, чем бот занимается, а также показывает версию и использованные библиотеки.
* `kof.backup` — заставляет бота сохранить файл систем, минуя десятиминутный промежуток.
* `kof.config` — позволяет менять настройки бота для сервера.
* `kof.help` — команда помощи, выдает ссылку на этот проект.
* `kof.ignore` — бот перестает реагировать на использовавшего команду на всех серверах. Отменяется повторным вводом.
* `kof.leave` — заставляет бота выйти с сервера.
* `kof.listening` — настраивает статус, отображающийся в профиле бота. Формат "Listening to".
* `kof.nick` — изменяет ник бота на данном сервере.
* `kof.ping` — показывает среднее время ответа сервера Дискорда.
* `kof.playing` — настраивает статус, отображающийся в профиле бота. Формат "Playing".
* `kof.status` — устанавливает один из четырех цветов кружочка-статуса рядом с аватаром.
* `kof.streaming` — настраивает статус, отображающийся в профиле бота. Формат "Streaming", ссылка ведет на главную страницу Twitch.
* `kof.support` — дает написать сообщение прямо в личные сообщения автору бота. Не советую злоупотреблять.
* `kof.uptime` — нужна для просмотра времени работы с момента последней перезагрузки.
* `kof.thegreatreset` — устраивает Обнуление.
* `kof.watching` — настраивает статус, отображающийся в профиле бота. Формат "Watching".

### Информационные

*Предоставляют информацию, не имеющую отношения напрямую к боту.*
* `kof.emoji` — показывает информацию о **пользовательском** эмодзи с сервера, на котором бот присутствует.
* `kof.emojis` — выводит все эмодзи данного сервера.
* `kof.serverinfo` — выдает информацию о текущем сервере.
* `kof.userinfo` — показывает информацию о пользователе.
* `kof.weather` — показывает погоду в реальном месте планеты, основываясь на информации openweathermap.org.

### Классические

*Это те команды, которые существуют у многих других ботов, но от того не перестают быть менее значимыми.*
* `kof.altsay` — дает отправить сообщение от лица бота в другой канал, к которому тот имеет доступ.
* `kof.alttype` — "печатает" сообщение, а затем отсылает его в другой канал.
* `kof.ava` — возвращает ссылку на аватар участника **в формате webp**.
* `kof.choose` — случайно выбирает один из вариантов, перечисленных через `|`.
* `kof.coin` — имитирует подкидывание монетки.
* `kof.dice` — бросает кубик.
* `kof.prob` — случайно определяет вероятность какого-то события или факта.
* `kof.rate` — случайно оценивает любую сущность по шкале от 0 до 10.
* `kof.reverse` — прогоняет текст в обратном порядке.
* `kof.say` — создает имитацию разговора бота, отправляя сообщения с каким-то текстом от его лица.
* `kof.type` — отправляет сообщение с пользовательским текстом от лица бота, предварительно создав иллюзию его набора.
* `kof.when` — случайно определяет, когда произойдет указанное событие.

### Развлекательные

*Созданы для получения удовольствия и скорее всего не имеют аналогов у других ботов.*
* `kof.article` — случайно предсказывает событие, которое произойдет со статьей на ФЭНДОМЕ вне зависимости от того, существует она или нет.
* `kof.cat` — находит случайную картинку с котом.
* `kof.dog` — находит случайную картинку с собакой.
* `kof.f` — вызов сообщения "Press F to pay respects".
* `kof.fact` — выдергивает случайный факт с сайта factopedia.ru и выдает его в оригинальной орфографии и пунктуации (которые не всегда идеальны).
* `kof.fox` — находит случайную картинку с лисой.
* `kof.level` — выдает случайную сложность уровню из Geometry Dash вне зависимости от того, существует он или нет.
* `kof.rps` — дает сыграть в однострочную игру "камень-ножницы-бумага".
* `kof.tictactoe` — активирует игру в крестики-нолики против другого участника.
* `kof.user` — случайно предсказывает событие для участника ФЭНДОМА вне зависимости от того, существует он или нет. Разумеется, без цели кого-то обидеть.
* `kof.whois` — тыкает пальцем на случайного пользователя данного сервера, без злого умысла, конечно.

### Административные

*Помогают поддерживать правопорядок на сервере.*
* `kof.ban` — перманентно банит пользователя на сервере.
* `kof.kick` — изгоняет пользователя с сервера.
* `kof.prune` — массово чистит сообщения в канале.
* `kof.pin` — закрепляет сообщение.
* `kof.unpin` — открепляет сообщение.

### Полезные

*Самая маленькая категория для команд, которые могут оказать помощь в реальной жизни.*
* `kof.root` — извлекает квадратные корни, но может лагать.
* `kof.sqrequation` — решает квадратное уравнение.

### Тестовые

*Эти команды еще разрабатываются либо нужны для тестирования других команд. Соответственно они могут работать нестабильно.*
* `kof.eval` — команда выполнения JS-кода.
* `kof.fight` — запускает систему решения простых примеров.
* `kof.giveaway` — создает раздачу какой-то награды.
* `kof.search` — показывает всех пользователь, удовлетворяющих поисковому запросу.
* `kof.since` — вычисляет примерное время, прошедшее с какой-то даты.
* `kof.toptop` — показывает место в топе по кофейным зернам .

### Валютные

*Команды этой категории используются для взаимодействия с валютной системой.*
* `kof.balance` — демонстрирует число зерен на балансе пользователя.
* `kof.casino` — команда-казино, с помощью которой можно как выиграть, так и проиграть.
* `kof.compare` — сравнивает баланс пользователя с балансом самого богатого участника.
* `kof.event` — показывает описание события, если оно идет.
* `kof.gifts` — выдает статистику по подаркам.
* `kof.jackpot` — отображает количество зерен, которые сейчас лежат в сундуке.
* `kof.kofiesturn` — служебная команда, позволяющая изменять значение зерен для любого пользователя.
* `kof.monopoly` — оценивает долю зерен пользователя в общей их массе.
* `kof.reward` — выдает бесплатные 500 . При постоянном использовании начисляется бонус.
* `kof.shop` или `kof.buy` — открывает магазин и позволяет купить в нем товары.
* `kof.slots` — дает сыграть в игровой автомат с возможностью заработать зерен.
* `kof.transfer` — позволяет передавать зерна другим пользователям.

### Опытные

*С помощью этих команд можно взаимодействовать с системой опыта.*
* `kof.rank` — показывает данные по рангу пользователя: уровень, текущий и весь набранный опыт, статус.
* `kof.xprogress` — действует сходно с командой ранга, почти не имеет оформления, однако показывает прогресс набора следующего уровня в процентах и с помощью прогрессбара.

### Репутационные

*Данные команды позволяют обращаться к репутационной системе бота.*
* `kof.myrep` — показывает текущий счет репутации.
* `kof.rep` — делится очком репутации (кофейной чашкой) с другим пользователем.

### Группы

*Эти команды нужны для управления группами.*
* `kof.group` — основная команда, с помощью которой и производятся все действия с группами.
* `kof.topgr` — открывает топ самых богатых групп.

### Вне категории

*Сюда входят команды, которые не относятся ни к одной из вышеперечисленных категорий либо подходящие сразу нескольким.*
* `kof.expandedglobal` — отображает расширенный глобальный топ пользователей на десять мест.
* `kof.expandedtop` — отображает расширенный локальный топ пользователей на десять мест.
* `kof.global` — показывает пять пользователей, добившихся наибольших успехов в одной из трех систем на глобальном уровне.
* `kof.profile` — открывает профиль пользователя, в котором отображена информация по всем системам.
* `kof.top` — показывает пять пользователей, добившихся наибольших успехов в одной из трех систем и находящихся на данном сервере.

## Взгляд изнутри

Строго говоря, команда представляет собой конструкцию ветвления в теле алгоритма. Ниже мы рассмотрим пример создания самой классической из всех классических команд — пинг-понга. Так как автор программирует на JavaScript с подтягиванием Node.js и discord.js, нижеследующие выкладки будут, скорее всего, бесполезны для адептов других языков.

```
const Discord = require('discord.js'),
 client = new Discord.Client(),
 prefix = 'kof.';

client.on('message', message => {
 if (message.content.startsWith(prefix + 'ping')) {
 message.channel.send('Pong')
 }
});

client.login('token')

```

Когда пользователь отправляет сообщение в канал сервера, на котором есть бот, он это замечает и начинает проверку. Если сообщение начинается с префикса со словом "ping", производится отправка сообщения в тот же канал, где была введена команда.

Этот способ перехвата плох тем, что такой же эффект будет иметь команда `kof.pingblah`, так как она содержит в начале подстроку `kof.ping`. Способ решения проблемы можно представить так:

```
function commandIs(cmd, msg) {
 if (msg.content.split(' ')[0] === 'kof.' + cmd) return true
}

client.on('message', message => {
 if (commandIs('ping', message)) {
 message.channel.send('Pong')
 }
});

```

Здесь проверяется кусок строки до первого пробела, и если он *строго равен* префиксу и какой-то определенной последовательности символов (`cmd`), то возвращается значение истины `true`, которое удовлетворяет условию нижнего `if`. А чтобы сделать команду нечувствительной к регистру, после `content` нужно приписать `.toLowerCase()`.