Danil_Valov Posted January 7, 2017 Share 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 Link to comment Share on other sites More sharing options...
Noah_Murray Posted January 7, 2017 Share Posted January 7, 2017 Годный мануал, молодец. Link to comment Share on other sites More sharing options...
Wimps Posted January 8, 2017 Share Posted January 8, 2017 !args[1].length неправильно юзаешь, используй !args[1]. Когда используешь length выдает ошибку Link to comment Share on other sites More sharing options...
Danil_Valov Posted January 8, 2017 Author Share Posted January 8, 2017 1 час назад, Wimps сказал: !args[1].length неправильно юзаешь, используй !args[1]. Когда используешь length выдает ошибку Каждый аргумент - это строка, у которой точно есть свойство length (количество символов). Проверка наличия аргументов осуществляется в самом начале условия (`args.length < 3`). Так что проверяйте ваш код, всё должно работать. Или если уверены, что дело именно в моём коде, приведите пример вызова команды `/pm`, которая показывает ошибку. Link to comment Share on other sites More sharing options...
Wimps Posted January 8, 2017 Share Posted January 8, 2017 1 минуту назад, Danil_Valov сказал: Каждый аргумент - это строка, у которой точно есть свойство length (количество символов). Проверка наличия аргументов осуществляется в самом начале условия (`args.length < 3`). Так что проверяйте ваш код, всё должно работать. Или если уверены, что дело именно в моём коде, приведите пример вызова команды `/pm`, которая показывает ошибку. Это будет работать к примеру есть они сделают пробел, а если нет то проверка не проудет Link to comment Share on other sites More sharing options...
Danil_Valov Posted January 8, 2017 Author Share Posted January 8, 2017 Только что, Wimps сказал: Это будет работать к примеру есть они сделают пробел, а если нет то проверка не проудет Там чётко стоит условие: - если аргументов меньше 3-х - если второй аргумент не имеет символов (как раз пробел) - если третий аргумент не имеет символов (тоже пробел) тогда весь дальнейший скрипт не выполняется, а пользователю показывается сообщение, как правильно нужно вводить команду. Я проверил сейчас - ни один из вариантов написания команды, которые мне в голову пришли, не привели к какой-либо ошибке. Приведи конкретный пример ошибочного ввода команды, пожалуйста, который может привести к ошибке. Иначе разговор не имеет смысла. Link to comment Share on other sites More sharing options...
Wimps Posted January 8, 2017 Share Posted January 8, 2017 Все извиняюсь, не заметил) Link to comment Share on other sites More sharing options...
tmaslov22 Posted January 8, 2017 Share Posted January 8, 2017 (edited) Под каждую команду теперь будем новый файл создавать? )) P.S число можно так проверить: Number.isInteger Или даже так Number.isSafeInteger(number); Возвращает true если аргумент является безопасным целым числом Edited January 8, 2017 by tmaslov22 Link to comment Share on other sites More sharing options...
Danil_Valov Posted January 8, 2017 Author Share Posted January 8, 2017 Только что, tmaslov22 сказал: Под каждую команду теперь будем новый файл создавать? )) Да, так правильно делать. Код не должен лежать в одном длиннющем файле. У нас на работе, например, есть чёткие правила, что каждый js-файл не должен быть более 150 строк (а на прошлой моей работе ограничение было вообще в 100 строк) и не более 120 символов в строке. Читабельность кода повышается + расширяемость упрощается. Так что да, для каждой команды или группы команд требуется отдельный файл. Да и к тому же разработчики сами сделали для этого наглядный пример: папку `commands`, из которой подгружаются все команды автоматически. Link to comment Share on other sites More sharing options...
tmaslov22 Posted January 8, 2017 Share Posted January 8, 2017 1 час назад, Danil_Valov сказал: Да, так правильно делать. Код не должен лежать в одном длиннющем файле. У нас на работе, например, есть чёткие правила, что каждый js-файл не должен быть более 150 строк (а на прошлой моей работе ограничение было вообще в 100 строк) и не более 120 символов в строке. Читабельность кода повышается + расширяемость упрощается. Так что да, для каждой команды или группы команд требуется отдельный файл. Да и к тому же разработчики сами сделали для этого наглядный пример: папку `commands`, из которой подгружаются все команды автоматически. Понятно что в 1 файле не нужно все писать, но и под каждую команду создавать файл не лучшая идея. Что если на сервере будет 1000 команд? Как поддерживать код?) Мне вообще архитектура которая есть сейчас в keker не очень понравилась. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now