Danil_Valov 22 Posted January 7, 2017 (edited) Добавляем в папку `packages/keker/commands` файл `pm.js` со следующим содержанием: findPlayerByIdOrNickname = playerName => { var foundPlayer = null; // Проверяем, число ли это if (playerName == parseInt(playerName)) { // Если число - ищем среди ID'ов пользователей foundPlayer = mp.players.at(playerName); } // Если пользователь не найден по ID - ищем по никам if (!foundPlayer) { mp.players.forEach((_player) => { if (_player.name === playerName) { foundPlayer = _player; } }); } return foundPlayer; }; module.exports = { // Добавляем команду `/pm` "pm": (player, args) => { // Проверяем корректность введённой команды if (args.length < 3 || !args[1].length || !args[2].length) { // Если что-то в команде было введено не так, то выводим соответствующее сообщение player.outputChatBox('Для отправки личного сообщения введите:<br /><b>/pm [id_получателя_или_ник] [текст сообщения]</b>'); return false; } // Ищем пользователя по иду или нику среди всех пользователей сервера const recipient = findPlayerByIdOrNickname(args[1]); // Если пользователь не найден, то выводим соответствующее сообщение if (!recipient) { player.outputChatBox('<b>Указанный пользователь не найден в игре</b>'); return false; } // Собираем текст сообщения из агрументов, игнорируя команду `/pm` и ид/ник получателя в аргументах const message = args.slice(2).join(' '); // Генерируем строку для чата в формате: // [PM] Ник_Отправителя[ID_Отправителя] -> Ник_Получателя[ID_Получателя]: Текст сообщения const str = `<b>[PM] ${player.name}[${player.id}] -> ${recipient.name}[${recipient.id}]</b>: ${message}`; // Отправляем сообщение в чат получателю recipient.outputChatBox(str); // Отправляем сообщение в чат отправителю player.outputChatBox(str); } }; Теперь если пользователь введёт команду: /pm [ид_или_ник_игрока] [текст сообщения] будет отправляться личное сообщение указанному игроку. Примеры: Цитата /pm 0 Текст сообщения Цитата /pm ragemptester Текст сообщения ВАЖНО: Требуется сохранить файл pm.js в кодировке UTF-8 (Unicode), т.к. в нём присутствует кириллица! Иначе все системные сообщения, написанные на русском, в игре будут отображаться знаками вопроса вместо букв. Edited January 8, 2017 by Danil_Valov 1 Share this post Link to post Share on other sites
Noah_Murray 1 Posted January 7, 2017 Годный мануал, молодец. Share this post Link to post Share on other sites
Wimps 1 Posted January 8, 2017 !args[1].length неправильно юзаешь, используй !args[1]. Когда используешь length выдает ошибку Share this post Link to post Share on other sites
Danil_Valov 22 Posted January 8, 2017 1 час назад, Wimps сказал: !args[1].length неправильно юзаешь, используй !args[1]. Когда используешь length выдает ошибку Каждый аргумент - это строка, у которой точно есть свойство length (количество символов). Проверка наличия аргументов осуществляется в самом начале условия (`args.length < 3`). Так что проверяйте ваш код, всё должно работать. Или если уверены, что дело именно в моём коде, приведите пример вызова команды `/pm`, которая показывает ошибку. Share this post Link to post Share on other sites
Wimps 1 Posted January 8, 2017 1 минуту назад, Danil_Valov сказал: Каждый аргумент - это строка, у которой точно есть свойство length (количество символов). Проверка наличия аргументов осуществляется в самом начале условия (`args.length < 3`). Так что проверяйте ваш код, всё должно работать. Или если уверены, что дело именно в моём коде, приведите пример вызова команды `/pm`, которая показывает ошибку. Это будет работать к примеру есть они сделают пробел, а если нет то проверка не проудет Share this post Link to post Share on other sites
Danil_Valov 22 Posted January 8, 2017 Только что, Wimps сказал: Это будет работать к примеру есть они сделают пробел, а если нет то проверка не проудет Там чётко стоит условие: - если аргументов меньше 3-х - если второй аргумент не имеет символов (как раз пробел) - если третий аргумент не имеет символов (тоже пробел) тогда весь дальнейший скрипт не выполняется, а пользователю показывается сообщение, как правильно нужно вводить команду. Я проверил сейчас - ни один из вариантов написания команды, которые мне в голову пришли, не привели к какой-либо ошибке. Приведи конкретный пример ошибочного ввода команды, пожалуйста, который может привести к ошибке. Иначе разговор не имеет смысла. Share this post Link to post Share on other sites
Wimps 1 Posted January 8, 2017 Все извиняюсь, не заметил) Share this post Link to post Share on other sites
tmaslov22 3 Posted January 8, 2017 (edited) Под каждую команду теперь будем новый файл создавать? )) P.S число можно так проверить: Number.isInteger Или даже так Number.isSafeInteger(number); Возвращает true если аргумент является безопасным целым числом Edited January 8, 2017 by tmaslov22 Share this post Link to post Share on other sites
Danil_Valov 22 Posted January 8, 2017 Только что, tmaslov22 сказал: Под каждую команду теперь будем новый файл создавать? )) Да, так правильно делать. Код не должен лежать в одном длиннющем файле. У нас на работе, например, есть чёткие правила, что каждый js-файл не должен быть более 150 строк (а на прошлой моей работе ограничение было вообще в 100 строк) и не более 120 символов в строке. Читабельность кода повышается + расширяемость упрощается. Так что да, для каждой команды или группы команд требуется отдельный файл. Да и к тому же разработчики сами сделали для этого наглядный пример: папку `commands`, из которой подгружаются все команды автоматически. Share this post Link to post Share on other sites
tmaslov22 3 Posted January 8, 2017 1 час назад, Danil_Valov сказал: Да, так правильно делать. Код не должен лежать в одном длиннющем файле. У нас на работе, например, есть чёткие правила, что каждый js-файл не должен быть более 150 строк (а на прошлой моей работе ограничение было вообще в 100 строк) и не более 120 символов в строке. Читабельность кода повышается + расширяемость упрощается. Так что да, для каждой команды или группы команд требуется отдельный файл. Да и к тому же разработчики сами сделали для этого наглядный пример: папку `commands`, из которой подгружаются все команды автоматически. Понятно что в 1 файле не нужно все писать, но и под каждую команду создавать файл не лучшая идея. Что если на сервере будет 1000 команд? Как поддерживать код?) Мне вообще архитектура которая есть сейчас в keker не очень понравилась. Share this post Link to post Share on other sites