access
Права как именованные ноды, группы и иммунитет. Право — именованная нода:admin.kick, shop.vip.buy.
У консоли и rcon прав нет — им разрешено всё.
ctx.player там nil, любая
проверка проходит.p:can, p:groups,
p:group, p:weight,
p:outranks.
Файлы
data/groups.lua правится руками, модуль его только читает.
data/users.lua — кто есть кто. Ключ записи: steamid или name:<ник>.
Оба файла необязательны: без
groups.lua работают встроенные default, admin
и owner. Битый файл даёт ошибку в консоль и пустую половину прав, а не
половинчатые права.
Разрешение конфликтов
Нода в выдаче может быть с хвостовой звёздочкой (shop.vip.*, *) и с минусом
впереди — -admin.ban означает явный запрет.
Порядок в файле роли не играет. Побеждает запись, которая выигрывает по
признакам, в этом порядке:
- источник — личная запись > своя группа > унаследованная >
defaultноды; - вес — среди групп одного уровня выигрывает более тяжёлая;
- точность —
shop.vip.buy>shop.vip.*>shop.*>*; - запрет — при полном равенстве выигрывает
deny.
admin с allow = {"admin.*"} и deny = {"admin.rcon"} получает всё
кроме rcon, а личный allow = {"admin.rcon"} в записи игрока это перебивает.
Иммунитет
Иммунитет — этоweight группы. Действие против другого игрока требует строго
большего веса, поэтому два админа одного ранга друг друга не тронут.
Вручную — p:outranks. Декларативно — opts.target в
cmd.add.
Права считаются лениво и кешируются на слот. Кеш сбрасывается сам: на
player_authorized, при смене карты, по истечении срока и при любом изменении
прав.