# LuxinfinePermissions-9.5-1.7.10

**Информация:**

Мод-аналог плагинов на права с удобным апи, заточкой под производительность, полную настройку и удобство работы. Работает с БД mysql/mariadb. Позволяет выдавать группы прав, а также права отдельно. Имеет систему аттрибутов, с помощью которых можно задать префиксы, суффиксы, лимиты для наших модов и прочее, что вы можете добавить сами и проверять через апи.&#x20;

Поддерживаются SuperPerms (иерархичные права со звёздочкой, по типу `command.warps.*`), в т.ч. пермишен-звёздочка.

Также есть поддержка авто-обновления прав, атрибутов, групп игроков налету, если настроить слушатель ивентов БД.

*Для пользователей Bukkit:*\
Рекомендуется default группе выдать отрицательный пермишен "\*". Это заблокирует разрешенные по умолчанию права бакита, по типу команды /plugins.\
Мод по возможности будет заменять `I'm sorry, but you do not have permission to perform this command. Please contact the server administrators if you believe that this is in error.` сообщение на нормальное локализованное сообщение нехватки прав.\
Полностью реализуется Vault Permission & Chat API, инжектит Permissible для игрока, по этому будет совместим со всеми плагинами. Также мод изменяет систему прав для команд из модов. Если удаётся определить мод-источник команды, то вместо имени класса у команды будет пермишен в формате `command.MOD_ID.COMMAND_NAME`, что намного удобнее.

Для работы мода требуется LuxinfineDatabaseLib мод.

**Конфигурация:**

```json
{
  "configuration": {
    "admins": {
      "comment": "Список игроков, которые будут иметь все права и возможности",
      "type": "Set<String>",
      "default": [
        "Angelok",
        "daniorio"
      ],
      "value": [
        "Angelok",
	"daniorio"
      ]
    },
    "allow_ops": {
      "comment": "Если true - то опка будет равна привилегии администратора, иначе вся власть опки будет обнулена, включая всю ванильную логику, и заменена на лист администраторов из этого конфига",
      "type": "boolean",
      "default": false,
      "value": false
    },
    "default_group": {
      "comment": "Имя группы по умолчанию. Лучше не трогать, иначе можно что-то сломать",
      "type": "String",
      "default": "default",
      "value": "default"
    },
    "database": {
      "properties": {
        "replication_id": {
          "comment": "Индекс репликации для обновления прав в режиме реального времени",
          "range": "От -2147483648 до 2147483647",
          "type": "int",
          "default": 0,
          "value": 0
        },
        "connection_id": {
          "comment": "Индекс подключения к БД",
          "range": "От -2147483648 до 2147483647",
          "type": "int",
          "default": 0,
          "value": 0
        },
        "user_permissions": {
          "properties": {
            "column_expire_time": {
              "type": "String",
              "default": "expire_time",
              "value": "expire_time"
            },
            "column_allow": {
              "type": "String",
              "default": "allow",
              "value": "allow"
            },
            "column_user": {
              "type": "String",
              "default": "uuid",
              "value": "uuid"
            },
            "table_name": {
              "type": "String",
              "default": "user_permissions",
              "value": "user_permissions"
            },
            "column_permission": {
              "type": "String",
              "default": "permission",
              "value": "permission"
            }
          }
        },
        "group_info": {
          "properties": {
            "column_priority": {
              "type": "String",
              "default": "priority",
              "value": "priority"
            },
            "column_group_name": {
              "type": "String",
              "default": "name",
              "value": "name"
            },
            "table_name": {
              "type": "String",
              "default": "group_info",
              "value": "group_info"
            },
            "column_display_name": {
              "type": "String",
              "default": "display_name",
              "value": "display_name"
            }
          }
        },
        "group_attributes": {
          "properties": {
            "column_group": {
              "type": "String",
              "default": "name",
              "value": "name"
            },
            "column_value": {
              "type": "String",
              "default": "value",
              "value": "value"
            },
            "column_attribute": {
              "type": "String",
              "default": "attribute",
              "value": "attribute"
            },
            "table_name": {
              "type": "String",
              "default": "group_attributes",
              "value": "group_attributes"
            }
          }
        },
        "group_permissions": {
          "properties": {
            "column_allow": {
              "type": "String",
              "default": "allow",
              "value": "allow"
            },
            "column_permission": {
              "type": "String",
              "default": "permission",
              "value": "permission"
            },
            "column_group": {
              "type": "String",
              "default": "name",
              "value": "name"
            },
            "table_name": {
              "type": "String",
              "default": "group_permissions",
              "value": "group_permissions"
            }
          }
        },
        "user_groups": {
          "properties": {
            "column_expire_time": {
              "type": "String",
              "default": "expire_time",
              "value": "expire_time"
            },
            "column_group": {
              "type": "String",
              "default": "group_name",
              "value": "group_name"
            },
            "table_name": {
              "type": "String",
              "default": "user_groups",
              "value": "user_groups"
            },
            "column_user": {
              "type": "String",
              "default": "uuid",
              "value": "uuid"
            }
          }
        },
        "user_attributes": {
          "properties": {
            "column_attribute": {
              "type": "String",
              "default": "attribute",
              "value": "attribute"
            },
            "column_expire_time": {
              "type": "String",
              "default": "expire_time",
              "value": "expire_time"
            },
            "column_user": {
              "type": "String",
              "default": "uuid",
              "value": "uuid"
            },
            "column_value": {
              "type": "String",
              "default": "value",
              "value": "value"
            },
            "table_name": {
              "type": "String",
              "default": "user_attributes",
              "value": "user_attributes"
            }
          }
        },
        "group_parents": {
          "properties": {
            "column_parent": {
              "type": "String",
              "default": "parent",
              "value": "parent"
            },
            "table_name": {
              "type": "String",
              "default": "group_parents",
              "value": "group_parents"
            },
            "column_group": {
              "type": "String",
              "default": "group",
              "value": "group"
            }
          }
        }
      }
    },
    "debug": {
      "properties": {
        "database": {
          "comment": "Отладка мода без подключения к БД",
          "type": "boolean",
          "default": false,
          "value": false
        },
        "general": {
          "comment": "Вывод отладочной информации",
          "type": "boolean",
          "default": true,
          "value": true
        }
      }
    },
    "replaceTabUsernames": {
      "comment": "Подмена ников в S38PacketPlayerListItem. За счёт этого реализуются префиксы и суффиксы в списке онлайн-игроков (таб). Если у вас кастомный ТАБ и эта опция конфликтует - можете выключить её",
      "type": "boolean",
      "default": true,
      "value": true
    },
    "rcon_group": {
      "comment": "Имя группы, права которой используются для R-CON. Если указать пустую строку - прав вообще не будет. Если указать звёздочку - будут все права. Иначе - будут права по указанному имени группы",
      "type": "String",
      "default": "",
      "value": ""
    },
    "command_blocks_group": {
      "comment": "Имя группы, права которой используются для командных блоков. Если указать пустую строку - прав вообще не будет. Если указать звёздочку - будут все права. Иначе - будут права по указанному имени группы",
      "type": "String",
      "default": "",
      "value": ""
    },
    "customSendersPermissions": {
      "comment": "Map классов 'доверенных' ICommandSender, для которых будут действовать права на основе указанного значения. Если значение звёздочка - то будут все права, если пустая строка - никаких прав не будет, иначе - права из группы по указанному названию",
      "type": "Map<Class<? extends net.minecraft.command.ICommandSender>, String>",
      "default": {},
      "value": {}
    }
  }
}
```

**SQL скрипт развёртывания структуры БД для мода:**

```sql
-- Создание структур в БД
-- Если переименуете колонки - не забудьте отредактировать конфиг мода!

CREATE TABLE `group_info` (
      `name` VARCHAR(25) NOT NULL COLLATE 'utf8mb4_bin',
      `display_name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
      `priority` INT(10) NOT NULL DEFAULT '0',
      PRIMARY KEY (`name`)
);

CREATE TABLE `group_parents` (
       `group` VARCHAR(25) NOT NULL COLLATE 'utf8mb4_bin',
       `parent` VARCHAR(25) NOT NULL COLLATE 'utf8mb4_bin',
       PRIMARY KEY (`group`, `parent`),
       CONSTRAINT `fk_group_parents_group_info` FOREIGN KEY (`group`) REFERENCES `group_info` (`name`) ON UPDATE NO ACTION ON DELETE CASCADE,
       CONSTRAINT `fk_group_parents_parent_group_info` FOREIGN KEY (`parent`) REFERENCES `group_info` (`name`) ON UPDATE NO ACTION ON DELETE CASCADE
);

CREATE TABLE `group_attributes` (
        `name` VARCHAR(25) NOT NULL COLLATE 'utf8mb4_bin',
        `attribute` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_bin',
        `value` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_bin',
        PRIMARY KEY (`name`, `attribute`),
        CONSTRAINT `fk_group_attributes` FOREIGN KEY (`name`) REFERENCES `group_info` (`name`) ON UPDATE NO ACTION ON DELETE CASCADE
);

CREATE TABLE `group_permissions` (
         `name` VARCHAR(25) NOT NULL COLLATE 'utf8mb4_bin',
         `permission` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_bin',
         `allow` TINYINT(1) NOT NULL,
         PRIMARY KEY (`name`, `permission`),
         CONSTRAINT `fk_group_permissions` FOREIGN KEY (`name`) REFERENCES `group_info` (`name`) ON UPDATE NO ACTION ON DELETE CASCADE
);

CREATE TABLE `user_attributes` (
       `uuid` CHAR(36) NOT NULL COLLATE 'latin1_swedish_ci',
       `attribute` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_bin',
       `value` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_bin',
       `expire_time` DATETIME NULL DEFAULT NULL,
       PRIMARY KEY (`uuid`, `attribute`)
);

CREATE TABLE `user_permissions` (
        `uuid` CHAR(36) NOT NULL COLLATE 'latin1_swedish_ci',
        `permission` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_bin',
        `allow` TINYINT(1) NOT NULL,
        `expire_time` DATETIME NULL DEFAULT NULL,
        PRIMARY KEY (`uuid`, `permission`)
);

CREATE TABLE `user_groups` (
       `uuid` CHAR(36) NOT NULL COLLATE 'latin1_swedish_ci',
       `group_name` VARCHAR(25) NOT NULL COLLATE 'utf8mb4_bin',
       `expire_time` DATETIME NULL DEFAULT NULL,
       PRIMARY KEY (`uuid`, `group_name`),
       INDEX `fk_user_groups` (`group_name`),
       CONSTRAINT `fk_user_groups` FOREIGN KEY (`group_name`) REFERENCES `group_info` (`name`) ON UPDATE NO ACTION ON DELETE CASCADE
);

-- Группа по умолчанию ОБЯЗАТЕЛЬНО должна быть в БД!
INSERT INTO `group_info` (`name`, `display_name`, `priority`) VALUES ('default', 'Игроки', 0);
```

**Команды:**

<table><thead><tr><th width="172">Команда</th><th width="374">Права и атрибуты</th><th>Описание</th></tr></thead><tbody><tr><td>/permissions user &#x3C;игрок> setpermission &#x3C;право> &#x3C;true|false> [длительность]</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.user</code></li><li><code>command.permissions.permissions.user.setpermission</code></li></ul><p> Дополнительные права:</p><ul><li><code>command.permissions.permissions.user.offline</code> - изменения для офлайн игрока</li><li><code>command.permissions.permissions.user.other</code> - изменения для другого игрока</li></ul></td><td><p>Устанавливает игроку пермишен. </p><p></p><p>Если true - пермишен положительный, если false - отрицательный. </p><p></p><p>Если длительность права не указана - оно выдаётся навсегда</p></td></tr><tr><td>/permissions user &#x3C;игрок> setattribute &#x3C;атрибут> &#x3C;значение> [длительность]</td><td><p></p><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.user</code></li><li><code>command.permissions.permissions.user.setattribute</code></li></ul><p> Дополнительные права:</p><ul><li><code>command.permissions.permissions.user.offline</code> - изменения для офлайн игрока</li><li><code>command.permissions.permissions.user.other</code> - изменения для другого игрока</li></ul></td><td><p>Устанавливает игроку значение атрибута. </p><p></p><p>Если длительность не указана - устанавливается навсегда</p></td></tr><tr><td>/permissions user &#x3C;игрок> removeattribute &#x3C;атрибут></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.user</code></li><li><code>command.permissions.permissions.user.removeattribute</code></li></ul><p>Дополнительные права:</p><ul><li><code>command.permissions.permissions.user.offline</code> - изменения для офлайн игрока</li><li><code>command.permissions.permissions.user.other</code> - изменения для другого игрока</li></ul></td><td>Удаляет указанный атрибут у игрока</td></tr><tr><td>/permissions user &#x3C;игрок> removepermission &#x3C;право></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.user</code></li><li><code>command.permissions.permissions.user.removepermission</code></li></ul><p>Дополнительные права:</p><ul><li><code>command.permissions.permissions.user.offline</code> - изменения для офлайн игрока</li><li><code>command.permissions.permissions.user.other</code> - изменения для другого игрока</li></ul></td><td>Удаляет указанное право у игрока</td></tr><tr><td>/permissions user &#x3C;игрок> permissions</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.user</code></li><li><code>command.permissions.permissions.user.permissions</code></li></ul><p>Дополнительные права:</p><ul><li><code>command.permissions.permissions.user.offline</code> - просмотр прав офлайн игрока</li><li><code>command.permissions.permissions.user.other</code> - просмотр прав другого игрока</li></ul></td><td>Просмотр прав, заданных для указанного игрока</td></tr><tr><td>/permissions user &#x3C;игрок> attributes</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.user</code></li><li><code>command.permissions.permissions.user.attributes</code></li></ul><p>Дополнительные права:</p><ul><li><code>command.permissions.permissions.user.offline</code> - просмотр атрибутов офлайн игрока</li><li><code>command.permissions.permissions.user.other</code> - просмотр атрибутов другого игрока</li></ul></td><td>Просмотр атрибутов, заданных для указанного игрока</td></tr><tr><td>/permissions user &#x3C;игрок> setgroup &#x3C;группа> [длительность]</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.user</code></li><li><code>command.permissions.permissions.user.setgroup</code></li></ul><p>Дополнительные права:</p><ul><li><code>command.permissions.permissions.user.offline</code> - изменения для офлайн игрока</li><li><code>command.permissions.permissions.user.other</code> - изменения для другого игрока</li></ul></td><td><p>Добавляет игрока в указанную группу на указанное время. </p><p></p><p>Если длительность не задана - добавляется навсегда</p></td></tr><tr><td>/permissions user &#x3C;игрок> removegroup &#x3C;группа> </td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.user</code></li><li><code>command.permissions.permissions.user.removegroup</code></li></ul><p>Дополнительные права:</p><ul><li><code>command.permissions.permissions.user.offline</code> - изменения для офлайн игрока</li><li><code>command.permissions.permissions.user.other</code> - изменения для другого игрока</li></ul></td><td>Удаляет игрока из указанной группы</td></tr><tr><td>/permissions user &#x3C;игрок> groups</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.user</code></li><li><code>command.permissions.permissions.user.groups</code></li></ul><p>Дополнительные права:</p><ul><li><code>command.permissions.permissions.user.offline</code> - просмотр групп офлайн игрока</li><li><code>command.permissions.permissions.user.other</code> - просмотр групп другого игрока</li></ul></td><td>Просмотр групп, в которые добавлен указанный игрок</td></tr><tr><td>/permissions group &#x3C;группа> setpermission &#x3C;право> &#x3C;true|false></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.setpermission</code></li></ul></td><td><p>Устанавливает группе пермишен. </p><p></p><p>Если true - пермишен положительный, если false - отрицательный</p></td></tr><tr><td>/permissions group &#x3C;группа> setattribute &#x3C;атрибут> &#x3C;значение></td><td><p></p><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.setattribute</code></li></ul></td><td>Устанавливает группе значение атрибута</td></tr><tr><td>/permissions group &#x3C;группа> removeattribute &#x3C;атрибут></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.removeattribute</code></li></ul></td><td>Удаляет атрибут из группы</td></tr><tr><td>/permissions group &#x3C;группа> removepermission &#x3C;право></td><td><p></p><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.removepermission</code></li></ul></td><td>Удаляет право из группы</td></tr><tr><td>/permissions group &#x3C;группа> permissions</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.permissions</code></li></ul></td><td>Просмотр заданных прав в группе</td></tr><tr><td>/permissions group &#x3C;группа> attributes</td><td><p></p><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.attributes</code></li></ul></td><td>Просмотр заданных атрибутов в группе</td></tr><tr><td>/permissions group &#x3C;группа> addparent &#x3C;группа></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.addparent</code></li></ul></td><td>Добавляет родительскую группу для указанной группы.<br><br>Первый аргумент - группа, для которой задаём родителя, второй аргумент - родитель</td></tr><tr><td>/permissions group &#x3C;группа> removeparent &#x3C;группа></td><td><p></p><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.removeparent</code></li></ul></td><td>Удаляет родительскую группу для указанной группы.<br><br>Первый аргумент - группа, из которой удаляем родителя, второй аргумент - родитель</td></tr><tr><td>/permissions group &#x3C;группа> setpriority &#x3C;приоритет></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.setpriority</code></li></ul></td><td>Устанавливает приоритет группе<br><br>Приоритетом может быть любое целое число, в том числе и отрицательное. Чем больше значение - тем приоритетнее группа</td></tr><tr><td>/permissions group &#x3C;группа> setdisplayname &#x3C;имя></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.setdisplayname</code></li></ul></td><td>Устанавливает отображаемое имя группы<br><br>Это имя никак не связано с префиксами! Оно может быть получено кодом для вывода куда-либо</td></tr><tr><td>/permissions group &#x3C;группа> removedisplayname</td><td><p></p><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.removedisplayname</code></li></ul></td><td>Удаляет отображаемое имя группы</td></tr><tr><td>/permissions group &#x3C;группа> info</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.group</code></li><li><code>command.permissions.permissions.group.info</code></li></ul></td><td>Вывод информацию о группе: приоритет, отображаемое имя, родительские группы</td></tr><tr><td>/permissions creategroup &#x3C;имя></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.creategroup</code></li></ul></td><td>Создаёт новую группу с указанным названием</td></tr><tr><td>/permissions removegroup &#x3C;группа></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.removegroup</code></li></ul></td><td>Удаляет группу по названию</td></tr><tr><td>/permissions grouplist</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.grouplist</code></li></ul></td><td>Список существующих групп в данный момент</td></tr><tr><td>/permissions testpermission &#x3C;игрок> &#x3C;право></td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.testpermission</code></li></ul><p>Дополнительные права:</p><ul><li><code>command.permissions.permissions.testpermission.other</code> - проверка права для другого игрока</li><li><code>command.permissions.permissions.testpermission.offline</code> - проверка права для офлайн игрока</li></ul></td><td>Проверяет наличие указанного права у игрока.<br><br>Команда используется в отладочных целях</td></tr><tr><td>/permissions getattribute &#x3C;игрок> &#x3C;атрибут></td><td><p></p><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.getattribute</code></li></ul><p>Дополнительные права:</p><ul><li><code>command.permissions.permissions.getattribute.other</code> - проверка права для другого игрока</li><li><code>command.permissions.permissions.getattribute.offline</code> - проверка права для офлайн игрока</li></ul></td><td>Получает значение атрибута для игрока.<br><br>Команда используется в отладочных целях</td></tr><tr><td>/permissions reload</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.reload</code></li></ul></td><td>Перезагружает мод, выкачивая актуальную информацию из базы данных</td></tr><tr><td>/permissions verbose</td><td><p>Основные права:</p><ul><li><code>command.permissions.permissions</code></li><li><code>command.permissions.permissions.verbose</code></li></ul></td><td>Включает/выключает режим логгирования всех проверок прав игрока<br><br>Команда используется в отладочных целях</td></tr></tbody></table>

**Дополнительные атрибуты мода:**

| Атрибут     | Описание                               |
| ----------- | -------------------------------------- |
| prefix      | префикс игрока в отображаемом имени    |
| suffix      | суффикс игрока в отображаемом имени    |
| tab\_prefix | префикс игрока в табе (списке игроков) |
| tab\_suffix | суффикс игрока в табе (списке игроков) |
