Danil_Valov

Личные сообщения между игроками на сервере

Recommended Posts

Добавляем в папку `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 by Danil_Valov
  • Like 1

Share this post


Link to post
Share on other sites

!args[1].length неправильно юзаешь, используй !args[1]. Когда используешь length выдает ошибку

Share this post


Link to post
Share on other sites
1 час назад, Wimps сказал:

!args[1].length неправильно юзаешь, используй !args[1]. Когда используешь length выдает ошибку

Каждый аргумент - это строка, у которой точно есть свойство length (количество символов). Проверка наличия аргументов осуществляется в самом начале условия (`args.length < 3`). Так что проверяйте ваш код, всё должно работать. Или если уверены, что дело именно в моём коде, приведите пример вызова команды `/pm`, которая показывает ошибку.

Share this post


Link to post
Share on other sites
1 минуту назад, Danil_Valov сказал:

Каждый аргумент - это строка, у которой точно есть свойство length (количество символов). Проверка наличия аргументов осуществляется в самом начале условия (`args.length < 3`). Так что проверяйте ваш код, всё должно работать. Или если уверены, что дело именно в моём коде, приведите пример вызова команды `/pm`, которая показывает ошибку.

Это будет работать к примеру есть они сделают пробел, а если нет то проверка не проудет

Share this post


Link to post
Share on other sites
Только что, Wimps сказал:

Это будет работать к примеру есть они сделают пробел, а если нет то проверка не проудет

Там чётко стоит условие:

- если аргументов меньше 3-х

- если второй аргумент не имеет символов (как раз пробел)

- если третий аргумент не имеет символов (тоже пробел)

тогда весь дальнейший скрипт не выполняется, а пользователю показывается сообщение, как правильно нужно вводить команду.

 

Я проверил сейчас - ни один из вариантов написания команды, которые мне в голову пришли, не привели к какой-либо ошибке.

Приведи конкретный пример ошибочного ввода команды, пожалуйста, который может привести к ошибке. Иначе разговор не имеет смысла.

Share this post


Link to post
Share on other sites

Под каждую команду теперь будем новый файл создавать? ))
P.S число можно так проверить: Number.isInteger
Или даже так Number.isSafeInteger(number); Возвращает true если аргумент является безопасным целым числом
 

Edited by tmaslov22

Share this post


Link to post
Share on other sites
Только что, tmaslov22 сказал:

Под каждую команду теперь будем новый файл создавать? ))

Да, так правильно делать. Код не должен лежать в одном длиннющем файле. У нас на работе, например, есть чёткие правила, что каждый js-файл не должен быть более 150 строк (а на прошлой моей работе ограничение было вообще в 100 строк) и не более 120 символов в строке. Читабельность кода повышается + расширяемость упрощается. Так что да, для каждой команды или группы команд требуется отдельный файл.

 

Да и к тому же разработчики сами сделали для этого наглядный пример: папку `commands`, из которой подгружаются все команды автоматически.

Share this post


Link to post
Share on other sites
1 час назад, Danil_Valov сказал:

Да, так правильно делать. Код не должен лежать в одном длиннющем файле. У нас на работе, например, есть чёткие правила, что каждый js-файл не должен быть более 150 строк (а на прошлой моей работе ограничение было вообще в 100 строк) и не более 120 символов в строке. Читабельность кода повышается + расширяемость упрощается. Так что да, для каждой команды или группы команд требуется отдельный файл.

 

Да и к тому же разработчики сами сделали для этого наглядный пример: папку `commands`, из которой подгружаются все команды автоматически.

Понятно что в 1 файле не нужно все писать, но и под каждую команду создавать файл не лучшая идея. Что если на сервере будет 1000 команд? Как поддерживать код?) Мне вообще архитектура которая есть сейчас в keker не очень понравилась.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.