Админ система

xf1ne

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

1 Создать колонку в DB "admin" после чего, цитирую - "добавь в загрузку в моде это поле ( player.admin = result[0].admin )", после чего проверяй его в каждой команде.
2. Добавить для player переменную admin и так же проверять в команде это переменную.

У меня возникло много вопросов: 1. Где именно вписывать строку из варианта 1; 2. Если я создам просто переменную с указанным значением, как мне вывести это в DB.

Подскажите пожалуйста как это правильно сделать, или укажите свой вариант если он лучше. Заранее спасибо.

P/s Пишу на JS + Node.js
 
Решение
1) Это нужно делать когда ты выгружаешь данные игрока из БД при авторизации на сервере. То-есть:
  • Игрок вводит правильный пароль от своего аккаунта -> делаем запрос в БД -> выгружаем все данные связанные с игроком, в том числе с его уровнем админки.
  • player.admin - это переменная где хранится уровень админки
  • result[0].admin - тут хранится значения админки которое указанно в БД
  • player.admin = result[0].admin -> тут мы присвоим нашей переменной значение из БД
2) Далее в команде:

JavaScript:
mp.events.addCommand('commandName', (player, string) => {
    if (player.admin < 1)
        return console.log('Для использование данной команды, вы должны быть администратором.')

    /* выполнение какого-то...

geneff

Junior Developer
1) Это нужно делать когда ты выгружаешь данные игрока из БД при авторизации на сервере. То-есть:
  • Игрок вводит правильный пароль от своего аккаунта -> делаем запрос в БД -> выгружаем все данные связанные с игроком, в том числе с его уровнем админки.
  • player.admin - это переменная где хранится уровень админки
  • result[0].admin - тут хранится значения админки которое указанно в БД
  • player.admin = result[0].admin -> тут мы присвоим нашей переменной значение из БД
2) Далее в команде:

JavaScript:
mp.events.addCommand('commandName', (player, string) => {
    if (player.admin < 1)
        return console.log('Для использование данной команды, вы должны быть администратором.')

    /* выполнение какого-то действия */
})
 
Решение

xf1ne

New member
Какая у тебя база данных? Есть таблица с аккаунтами?
mysql, да вот:
1611680185812.png
 

SlowSuicide

Middle Developer
как вариант построения разных уровней:
1.png

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

xf1ne

New member
1) Это нужно делать когда ты выгружаешь данные игрока из БД при авторизации на сервере. То-есть:
  • Игрок вводит правильный пароль от своего аккаунта -> делаем запрос в БД -> выгружаем все данные связанные с игроком, в том числе с его уровнем админки.
  • player.admin - это переменная где хранится уровень админки
  • result[0].admin - тут хранится значения админки которое указанно в БД
  • player.admin = result[0].admin -> тут мы присвоим нашей переменной значение из БД
2) Далее в команде:

JavaScript:
mp.events.addCommand('commandName', (player, string) => {
    if (player.admin < 1)
        return console.log('Для использование данной команды, вы должны быть администратором.')

    /* выполнение какого-то действия */
})
Спасибо вам огромное!:) Еще один маленький вопросик, как мне через команду уровень админки менять?
 

SlowSuicide

Middle Developer
делаешь UPDATE в БД и меняешь его на сервере. При последующей авторизации будет подтягиваться новое значение поля таблицы
 

xf1ne

New member
делаешь UPDATE в БД и меняешь его на сервере. При последующей авторизации будет подтягиваться новое значение поля таблицы
А как тогда устроена админка которая сразу обновляется? После команды /makeadmin? И я так понимаю если DB обновляется только после перезахода, то как привязать кошелек?
 

geneff

Junior Developer
А как тогда устроена админка которая сразу обновляется? После команды /makeadmin? И я так понимаю если DB обновляется только после перезахода, то как привязать кошелек?
JavaScript:
const MIN_ADMIN_LEVEL = 0
const MAX_ADMIN_LEVEL = 6

mp.events.addCommand('makeadmin', (player, string, target, level) => {
    if (!string)
        return player.outputChatBox('Введите: /makeadmin [id] [level]')
   
    target = mp.players.at(target)

    if (target === undefined)
        return player.outputChatBox('Данного игрока нет на сервере.')
   
    if (level < MIN_ADMIN_LEVEL || level > MAX_ADMIN_LEVEL)
        return player.outputChatBox(`Уровень должен быть от ${MIN_ADMIN_LEVEL} до ${MAX_ADMIN_LEVEL}.`)
   
    target.admin = level;
    /* сохраняем в базе */
   
    player.outputChatBox(`Вы назначили ${target.name} администратором ${level} уровня.`)
    target.outputChatBox(`${player.name} назначил Вас администратором ${level} уровня.`)
})
 
Последнее редактирование:

SlowSuicide

Middle Developer
А как тогда устроена админка которая сразу обновляется? После команды /makeadmin? И я так понимаю если DB обновляется только после перезахода, то как привязать кошелек?
К сожалению вероятно не понял вопроса. БД обновляется после соответствующего запроса в нём. Не могу ответить как это устроено в NodeJS (так как серверную часть пишу на шарпе), однако у меня реализовано следующим образом: при заходе на сервер - клиент записывается в список текущих игроков на сервере, далее я работаю исключительно с этим списком (при выходе игрока - вычеркиваю его из списка). Если требуется дать ему денег или опыта - с помощью команды выдаю ему это количество и сразу же записываю (обновляю значение) новое количество в БД.
 

Lev Angel

Developer
Команда форума
JavaScript:
const MIN_ADMIN_LEVEL = 0
const MAX_ADMIN_LEVEL = 6

mp.events.addCommand('makeadmin', (player, string, target, level) => {
    if (!string)
        return player.outputChatBox('Введите: /makeadmin [id] [level]')
  
    target = mp.players.at(target)

    if (target === undefined)
        return player.outputChatBox('Данного игрока нет на сервере.')
  
    if (level < MIN_ADMIN_LEVEL || level > MAX_ADMIN_LEVEL)
        return player.outputChatBox(`Уровень должен быть от ${MIN_ADMIN_LEVEL} до ${MAX_ADMIN_LEVEL}.`)
  
    target.admin = level;
    /* сохраняем в базе */
  
    player.outputChatBox(`Вы назначили ${target.name} администратором ${level} уровня.`)
    target.outputChatBox(`${player.name} назначил Вас администратором ${level} уровня.`)
})
Забыл самую главную проверку 😁
 

Lev Angel

Developer
Команда форума
Ну да, важно не забыть проверить является ли сам player админом достаточного уровня.
А почему специально не делал?
 

geneff

Junior Developer
Ну да, важно не забыть проверить является ли сам player админом достаточного уровня.
А почему специально не делал?
Нууууу... Потому-что, чтобы он смог назначить сам себя и ему не прийшлось лезть БД :ROFLMAO: А потом когда-бы уже назначил себя админом, добавил бы проверку :ROFLMAO:
 

geneff

Junior Developer
Кароче, если у Вас есть мысль, что назначать администратора должен только основатель, то предыдущий код будет выглядит вот-так:

JavaScript:
const MIN_ADMIN_LEVEL = 0
const MAX_ADMIN_LEVEL = 6

const founderNames = ['Joseph', 'Jenya', 'Kirill'] // Ники основателей сервера
const isFounder = name => founderNames.includes(name) // функция которая возвращает true - если name есть в массиве основателей и false- если name нет в массиве

mp.events.addCommand('makeadmin', (player, string, target, level) => {
    if (!isFounder(player.name)) // Если игрок не основатель - не позволяем ему воспользоватся командой
        return
   
    if (!string)
        return player.outputChatBox('Введите: /makeadmin [id] [level]')
 
    target = mp.players.at(target)

    if (target === undefined)
        return player.outputChatBox('Данного игрока нет на сервере.')
 
    if (level < MIN_ADMIN_LEVEL || level > MAX_ADMIN_LEVEL)
        return player.outputChatBox(`Уровень должен быть от ${MIN_ADMIN_LEVEL} до ${MAX_ADMIN_LEVEL}.`)
 
    target.admin = level;
    /* сохраняем в базе */
 
    player.outputChatBox(`Вы назначили ${target.name} администратором ${level} уровня.`)
    target.outputChatBox(`${player.name} назначил Вас администратором ${level} уровня.`)
})
 
Яндекс.Метрика
Верх