JS Система административных команд

Drogo

Junior Developer
Скриптер
Здравствуйте, при разработке нашего проекта команда столкнулась с вопросом удобной регистрации административных команд по одному шаблону, а так же использования их в консоли сервера.

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

Так же прошу заметить, что для интеграции данной системы вам в обязательном порядке необходимо будет переопределить получение "Административного уровня" игрока, или же удалить проверку и вывод предупреждения об ограничении использования команды.


Для работы необходимо подключение npm i readline

JavaScript:
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", (input) => {
  for (com in commandsList) {
    let args = input.split(" ");
    if (args[0] == com && commandsList[com].console) {
      args = args.slice(1);
      if ((commandsList[com].args && args.length == 0) || args[0] == "?")
        return console.log(commandsList[com].desc);
      commandsList[com].func("console", args);
    }
  }
});

mp.events.add("playerChat", (player, input) => {
  if (input.charAt(0) == "!") {
    input = input.substr(1);
    for (com in commandsList) {
      let args = input.split(" ");
      if (args[0] == com) {
        if (player.getAdminlvl() < commandsList[com].adminLvl)
          return player.outputChatBox(
            `Для использование данной команды, вы должны быть администратором ${commandsList[com].adminLvl} уровня!`
          );
        args = args.slice(1);
        if ((commandsList[com].args && args.length == 0) || args[0] == "?")
          return player.outputChatBox(commandsList[com].desc);
        commandsList[com].func(player, args);
      }
    }
  }
});

Выше представленный код является обработчиком ввода команд в игровой чат (команды сопровождаются открывающим символом "!") или же консоль сервера (команды вводятся без "!")

Если у вызываемой команды ожидаются аргументы, но сервер не получил их, или был введен знак "?" как аргумент команды, то пользователю в чат ( консоль сервера) выведется описание для данной команды.

Ниже приведен код заполнения команд.

JavaScript:
global.commandsList = {};

global.addCommandToList = function (name, desc, args, cons, adminLvl, func) {
  commandsList[name] = {
    // Название команды
    desc: desc, // Описание команды [string]
    args: args, // Передаются ли команде аргументы [true/false]
    console: cons, // Можно ли вызвать команду из консоли [true/false]
    adminLvl: adminLvl, // Необходимый уровень администратора для вызова команды [int]
    func: func, // Функция при вызове команды [func(args)]
  };
};

////////////////////////////////// Инвиз ///////////////////////////////////////////
addCommandToList(
  "invize",
  "Команда: !invize\nОписание: Режим невидимости.",
  false,
  false,
  1,
  function (player) {
    if (player.alpha == 255) {
      player.alpha = 0;
    } else {
      player.alpha = 255;
    }
  }
);

/////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////// Выставить здоровье ///////////////////////////////
addCommandToList(
  "sethp",
  "Команда: !sethp [ID] [Кол-во здоровья]\nОписание: Установить количество здоровья игроку.",
  true,
  true,
  1,
  function (player, data) {
    let cons = (player == "console" && true) || false;
    let id = parseInt(data[0]);
    let hp = parseInt(data[1]);
    let target = mp.players.FindByID(id);
    if (!target)
      return (
        (cons && console.log("Игрок с таким id не найден!")) ||
        player.outputChatBox("Игрок с таким id не найден!")
      );
    if (!hp || typeof hp != "number")
      return (
        (cons && console.log("Введено некоректное значение!")) ||
        player.outputChatBox("Введено некоректное значение!")
      );
    target.health = hp;
  }
);

/////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////// Выгнать игрока ///////////////////////////////////
addCommandToList(
  "kick",
  "Команда: !kick [ID] [Причина]\nОписание: Выгоняет игрока с сервера.",
  true,
  true,
  1,
  function (player, data) {
    let cons = (player == "console" && true) || false;
    let id = parseInt(data[0]);
    let reason = data.slice(1).join(" ");
    let target = mp.players.FindByID(id);
    if (!target)
      return (
        (cons && console.log("Игрок с таким id не найден!")) ||
        player.outputChatBox("Игрок с таким id не найден!")
      );
    if (!reason || typeof reason != "string")
      return (
        (cons && console.log("Указана некорректная причина!")) ||
        player.outputChatBox("Указана некорректная причина!")
      );
    mp.players.broadcast(
      `${player.name || "Console"} кикнул ${
        target.name
      }. Причина: ${reason}`
    );
    console.log(
      `${player.name || "Console"} кикнул ${
        target.name
      }. Причина: ${reason}`
    );
    target.kick();
  }
);

/////////////////////////////////////////////////////////////////////////////////////

В нем создается глобальный объект, в котором будут хранится объекты всех зарегистрированных команд и с помощью функции addCommandToList() он заполняется. Прошу заметить что приведенные в пример команды, где указывается ID игрока, всегда будут возвращать ошибку, так как mp.players.FindByID() является нашей функцией, следовательно поиск цели остается на вашей реализации.

В будущем будет добавлен вывод списка команд в CEF и удобное использование их как отдельных кнопок.

Спасибо за внимание!
 

Lev Angel

Developer
Команда форума
Скриптер
Спасибо что поделился! Полезная штука и удобно что в консоли можно использовать.
 
Яндекс.Метрика
Верх