Danil_Valov

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

Recommended Posts

Danil_Valov    16

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

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

Share this post


Link to post
Share on other sites
Danil_Valov    16
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
1 минуту назад, Danil_Valov сказал:

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

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

Share this post


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

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

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

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

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

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

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

 

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

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

Share this post


Link to post
Share on other sites
tmaslov22    3

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

Edited by tmaslov22

Share this post


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

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

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

 

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

Share this post


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

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

 

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

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

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.