Руководство
Как настроить права на сервере Counter-Strike 2, управлять группами и игроками командами и проверять права из своего плагина.
В руководстве две части. Первая для владельцев серверов: хранилище, настройки и команды. Вторая для авторов плагинов: как проверять и менять права через API.
Строки прав
Право это строка из сегментов, разделённых точками. Плагины сами выбирают свои строки, обычно начиная их с имени плагина.
| Строка | Значение |
|---|---|
admin.kick | Одно право |
admin.* | Всё внутри admin. |
* | Всё |
-admin.ban | Запрет: запрещает admin.ban |
*может быть только последним сегментом. Пустые сегменты (a..b,a.) не допускаются.admin.*покрываетadmin.kick, а обычная строкаadminне покрывает.- Запретом отнимают одно право у того, у кого есть wildcard:
admin.*вместе с-admin.ban.
Как решается проверка
Когда право проверяется для игрока, побеждает первое место, которое знает ответ:
- временные права игрока;
- постоянные права игрока;
- группы игрока, от самого высокого приоритета к самому низкому. Сначала спрашивается сама группа, затем её родитель, затем родитель родителя.
Поэтому собственные права игрока перекрывают группы, а группа с более высоким приоритетом перекрывает группу с более низким.
Иммунитет
У каждого игрока есть уровень иммунитета. Администратор может действовать на игрока, только когда иммунитет администратора равен или выше. Иммунитет -1 означает «взять приоритет моей старшей группы».
Владельцам серверов
Установка
Все три плагина входят в билд Plugify Source 2 и сразу работают с базой SQLite. Как поставить их отдельно, описано на странице Установка.
Хранилище
Плагин хранилища держит настройки в permissions_storage.settings.yaml. Значения по умолчанию лежат рядом с плагином. Чтобы изменить их, создайте configs/permissions/permissions_storage.settings.yaml с теми ключами, которые меняете:
| Настройка | Значение |
|---|---|
storage_method | sqlite3 (по умолчанию), mysql или postgres |
data | Подключение к MySQL или PostgreSQL: host, port, username, password, database, schema (PostgreSQL), params и pool_settings |
server_id | Id этого сервера. 0 означает все серверы: группы и права, выданные на сервере 0, действуют везде |
global_cookie | Общие cookie для всех серверов вместо отдельных на каждый сервер |
delete_expired_records | Удалять из базы истёкшие группы и права |
delete_removed_records | Удалять из базы снятые группы и права, а не помечать их |
- SQLite не требует настройки. База лежит в
data/permissions/permissions.dbи создаётся при первом запуске с группойDefault, которую получает каждый игрок. SQLite всегда работает как сервер0. - Таблицы MySQL и PostgreSQL плагин не создаёт. Создайте их до первого запуска скриптом
tables_mysql.sqlилиtables_postgres.sqlиз репозитория permissions-storage.
Настройки коннектора
Коннектор так же читает permissions_connector_s2.settings.yaml, правки кладутся в configs/permissions/:
| Настройка | Значение |
|---|---|
notify_mode | Куда приходят уведомления игрокам: console, chat, hint, каждое true или false |
hint_duration | Сколько секунд подсказка остаётся на экране |
time_mode | Единица <duration> в командах: 0 секунды, 1 минуты, 2 часы, 3 дни |
abbreviate_time | Сокращённые единицы (5 мин.) вместо полных слов |
format_timestamp | Формат даты в виде Go layout, например 2006-01-02 15:04:05 |
display_active_groups | Показывать игрокам их активные группы при входе |
hidden_groups | Группы, которые игрокам не показываются, по умолчанию Default |
Фразы лежат в permissions_connector_s2.translations.yaml. Чтобы изменить их, положите свою копию в data/permissions/. Применить изменения без перезапуска можно командами perms_reload_cfg и perms_reload_translations.
Команды
Команды работают в консоли сервера и в чате. Из консоли сервера разрешено всё. Игроку нужно право из таблицы, и он не может действовать на игроков с более высоким иммунитетом.
<player> это #userid, $steamid64, &account_id или имя. <duration> это число в единицах time_mode, а 0 означает навсегда. В perms_creategroup передайте "", если родителя нет, а несколько прав запишите в кавычках через пробел.
| Команда | Право | Что делает |
|---|---|---|
perms | нет | Список доступных вам команд |
perms_reload_cfg | permissions.reload_config | Перечитать настройки |
perms_reload_translations | permissions.reload_translations | Перечитать фразы |
perms_users | permissions.user.list | Список игроков на сервере |
perms_user_info <player> | permissions.user.info | Все сведения об игроке |
perms_user_permissions <player> | permissions.user.permission.info | Права и запреты игрока |
perms_user_groups <player> | permissions.user.group.info | Группы игрока |
perms_user_check_permission <player> <permission> | permissions.user.permission.check | Проверить право |
perms_user_check_group <player> <group> | permissions.user.group.check | Проверить, состоит ли игрок в группе |
perms_user_add_permission <player> <permission> <duration> | permissions.user.permission.add | Добавить право или запрет |
perms_user_set_permission <player> <permission> <duration> | permissions.user.permission.set | Установить право или запрет с заменой текущего |
perms_user_remove_permission <player> <permission> | permissions.user.permission.remove | Снять право или запрет |
perms_user_add_group <player> <group> <duration> | permissions.user.group.add | Добавить группу |
perms_user_set_group <player> <group> <duration> | permissions.user.group.set | Установить группу с заменой срока |
perms_user_remove_group <player> <group> | permissions.user.group.remove | Снять группу |
perms_groups | permissions.listgroups | Список групп |
perms_group_info <group> | permissions.group.info | Сведения о группе |
perms_group_permissions <group> | permissions.group.permissions | Права группы |
perms_group_check_permission <group> <permission> | permissions.group.permission.check | Проверить право группы |
perms_creategroup <group> <priority> <parent> <permissions> | permissions.creategroup | Создать группу |
perms_deletegroup <group> | permissions.deletegroup | Удалить группу |
perms_group_parent_set <child> <parent> | permissions.group.parent.set | Задать родительскую группу |
perms_group_parent_info <group> | permissions.group.parent.info | Показать родительскую группу |
perms_group_parent_check <child> <parent> | permissions.group.parent.check | Проверить, является ли группа родителем другой |
perms_group_set_option <group> <option> <value> | permissions.group.option.set | Задать опцию группы |
perms_group_option <group> <option> | permissions.group.option | Показать опцию группы |
perms_group_add_permission <group> <permission> | permissions.group.permission.add | Добавить право |
perms_group_set_permission <group> <permission> | permissions.group.permission.set | Установить право с заменой текущего |
perms_group_remove_permission <group> <permission> | permissions.group.permission.remove | Снять право |
Первая настройка
Выполните в консоли сервера, чтобы создать группу администраторов и выдать её себе:
Игрок должен быть на сервере: пользователи загружаются при входе и выгружаются при выходе.
Авторам плагинов
Добавьте зависимость
Примеры ниже написаны на Go и используют готовые биндинги, go get github.com/fr0nch/go-plugify-permissions. В других языках те же функции импортируются из плагина permissions, см. страницу Import Functions вашего языка.
Проверка права
HasPermission возвращает Status: Allow, Disallow, PermNotFound или TargetUserNotFound, когда игрок не загружен. Сравнивайте с Allow, тогда отсутствующее право означает «нет».
Изменение прав и подписка на изменения
- Время задаётся как Unix-время момента, когда право или группа истекает.
0означает навсегда. - Функции, которые что-то меняют, принимают
pluginID, он передаётся в колбэки, иdontBroadcast, с которым изменение применяется без уведомления подписчиков. - Любой статус больше
ErrorsStartявляется ошибкой. AddPermissionотказывается менять право, которое уже есть с противоположным состоянием (PermConflict).SetPermissionего заменяет.
Основные функции
| Функция | Назначение |
|---|---|
HasPermission(targetID, perm) | Проверить право пользователя |
HasPermissionExtended(targetID, perm, exact, permSource, timestamp) | То же, и сообщает, откуда пришло право и когда оно истекает |
AddPermission, SetPermission, RemovePermission | Изменить права пользователя |
HasGroup, AddGroup, RemoveGroup, GetUserGroups | Группы пользователя |
GetImmunity, SetImmunity, CanAffectUser | Иммунитет |
GetCookie, SetCookie, GetAllCookies | Именованные значения для каждого пользователя |
CreateGroup, DeleteGroup, GroupExists, GetAllGroups | Группы |
SetParent, GetParent, HasParentGroup, GetPriorityGroup | Иерархия групп |
HasPermissionGroup, AddPermissionGroup, SetPermissionGroup, RemovePermissionGroup | Права группы |
GetOptionGroup, SetOptionGroup, GetAllOptionsGroup | Опции группы |
UserExists, DumpUsersList, DumpPermissions | Что загружено сейчас |
События
У каждого события есть пара функций, On<Event>_Register и On<Event>_Unregister.
| Событие | Когда срабатывает |
|---|---|
OnUserLoaded | Пользователь загружен со всеми группами и правами |
OnUserCreate, OnUserDelete | Пользователь появился в ядре или удалён |
OnUserPermissionChange, OnUserGroupChange | Право или группа пользователя добавлены, заменены или сняты |
OnUserCookieChange, OnUserImmunityChange | Изменились cookie или иммунитет пользователя |
OnPermissionExpiration, OnGroupExpiration | Истекло временное право или группа |
OnGroupCreate, OnGroupDelete, OnSetParent | Группы созданы, удалены или связаны |
OnGroupPermissionChange, OnGroupOptionChange | Изменились право или опция группы |
OnGroupsLoaded | Группы сервера загружены |
Своё хранилище или коннектор
Ядро само ничего не загружает. LoadGroups и LoadUser вызывают колбэки OnGroupsLoad и OnUserRequest, а плагин, который их зарегистрировал, наполняет ядро через CreateGroup, CreateUser, AddGroup, AddPermission и SetCookie.
Чтобы сохранять изменения, зарегистрируйте колбэки хранилища: OnUserPermissionChangeStorage, OnUserGroupChangeStorage, OnUserCookieChangeStorage, OnUserImmunityChangeStorage, OnGroupCreateStorage, OnGroupDeleteStorage, OnGroupPermissionChangeStorage, OnGroupOptionChangeStorage и OnSetParentStorage. Они вызываются до применения изменения и возвращают bool. Если вернуть false, изменение отменяется, а вызвавший получает статус DBNotReady.
Полный список функций, колбэков и кодов статуса есть на API Hub.