Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин [ADMIN/SEC] CommandWhitelist v0.3 (NMS) [1.8-1.12.2] - белый список команд

Плагин вам пригодился?

  • Да (пригодился)

    12 голосов 80,0%
  • Нет (не пригодился)

    3 голосов 20,0%
  • Другое

    0 голосов 0,0%

Bomb

Активный участник
Пользователь
Баллы
76
CommandWhitelist (NMS) - белый список команд
Требования:
Spigot
Последняя версия: 0.3
Описание:
Данный плагин блокирует и скрывает все команды на которых у игрока нет права "commandwhitelist.override.<разрешённая команда тут>".
Команды: Отсутствуют
Права: commandwhitelist.override.<разрешённая команда тут> - разрешает использовать команду введённую вместо "<разрешённая команда тут>" (символ "/" в начале не требуется)
Конфиг: Отсутствует
Скачать 1_12_R1 : CommandWhitelist_v0.3_v1_12_R1.jar
Скачать 1_11_R1 : CommandWhitelist_v0.3_v1_11_R1.jar
Скачать 1_10_R1 : CommandWhitelist_v0.3_v1_10_R1.jar
Скачать 1_9_R2 : CommandWhitelist_v0.3_v1_9_R2.jar
Скачать 1_8_R3 : CommandWhitelist_v0.3_v1_8_R3.jar
Скачать 1_12_R1 : CommandWhitelist_v0_2_v1_12_R1.jar
Скачать 1_11_R1 : CommandWhitelist_v0_2_v1_11_R1.jar
Скачать 1_10_R1 : CommandWhitelist_v0_2_v1_10_R1.jar
Скачать 1_9_R2 : CommandWhitelist_v0_2_v1_9_R2.jar
Скачать 1_8_R3 : CommandWhitelist_v0_2_v1_8_R3.jar
Скачать 1_12_R1 : CommandWhitelist_v0_1_v1_12_R1.jar
Скачать 1_11_R1 : CommandWhitelist_v0_1_v1_11_R1.jar
Скачать 1_10_R1 : CommandWhitelist_v0_1_v1_10_R1.jar
Скачать 1_9_R2 : CommandWhitelist_v0_1_v1_9_R2.jar
Скачать 1_8_R3 : CommandWhitelist_v0_1_v1_8_R3.jar

  • Не требует зависимости ProtocolLib
  • Не имеет ошибки которая не позволяла получить корректный список разрешённых команд если часть команды уже введена. (Набирать команду с использованием авто заполнения проще и быстрее)
  • Op и '*' не дают право использовать все команды. (Даёт возможность ограничивать команды у op и '*')
  • Останавливает исполнение команды путём отмены пакета (Проверка проходит до того как сервер узнает что игрок ввёл команду. Меньшая вероятность срабатывания возможного бэкдора-команды) [Добавлено в версии v0.2]
Код:
public final class CommandWhitelist extends JavaPlugin {
    public final void onEnable() {
        Bukkit.getPluginManager().registerEvents(new Listener() {
            private final PacketPlayOutChat unknowncommandmessagepacket = new PacketPlayOutChat(new ChatMessage(YamlConfiguration.loadConfiguration(new File("spigot.yml")).getString("messages.unknown-command" ,"Unknown command.")), ChatMessageType.SYSTEM);
            @EventHandler
            public final void onJoin(PlayerJoinEvent event) {
                CraftPlayer player = (CraftPlayer) event.getPlayer();
                PlayerConnection connection = player.getHandle().playerConnection;
                connection.networkManager.channel.pipeline().addBefore("packet_handler", "commandwhitelist", new ChannelDuplexHandler() {
                    private int hashcode = 0;
                    private final HashSet<String> allowedcommands = new HashSet<String>();
                    private final HashSet<String> getAllowedCommands() {
                        Set<PermissionAttachmentInfo> effectivepermissions = player.getEffectivePermissions();
                        int hashcode = effectivepermissions.hashCode();
                        if(this.hashcode == hashcode) {
                            return allowedcommands;
                        }
                        allowedcommands.clear();
                        this.hashcode = hashcode;
                        effectivepermissions.forEach(effectivepermission -> {
                            String permissionname = effectivepermission.getPermission();
                            if(effectivepermission.getValue() && permissionname.startsWith("commandwhitelist.override.")) {
                                String command = permissionname.substring(26);
                                allowedcommands.add(command);
                            }
                         });
                        return allowedcommands;
                    }
                    private final String[] getCompletions(String command) {
                        List<String> tosendcompletions = new ArrayList<String>();
                        getAllowedCommands().forEach(completion -> {
                            if(completion.startsWith(command)) {
                                tosendcompletions.add("/".concat(completion));
                            }
                        });
                        return tosendcompletions.toArray(new String[tosendcompletions.size()]);
                    }
                    @Override
                    public final void channelRead(ChannelHandlerContext context, Object packet) throws Exception {
                        if (packet instanceof PacketPlayInTabComplete) {
                            PacketPlayInTabComplete info = (PacketPlayInTabComplete) packet;
                            String command = info.a().trim().toLowerCase();
                            if(command.startsWith("/")) {
                                int endindex = command.indexOf(" ", 1);
                                if(endindex == -1) {
                                    PacketPlayOutTabComplete tabcompletepacket = new PacketPlayOutTabComplete(getCompletions(command.substring(1)));
                                    connection.sendPacket(tabcompletepacket);
                                    return;
                                } else if(!getAllowedCommands().contains(command.substring(1, endindex))) {
                                    return;
                                }
                            }
                        }
                        if (packet instanceof PacketPlayInChat) {
                            PacketPlayInChat info = (PacketPlayInChat) packet;
                            String command = info.a().trim();
                            if(command.startsWith("/")) {
                                int endindex = command.indexOf(" ", 1);
                                if(endindex==-1) endindex=command.length();
                                command = command.substring(1, endindex).toLowerCase();
                                if(!getAllowedCommands().contains(command)) {
                                    connection.sendPacket(unknowncommandmessagepacket);
                                    return;
                                }
                            }
                        }
                        super.channelRead(context, packet);
                    }
                });
            }
        }, this);
    }
}
v0.3
  • Добавлено кеширование доступных команд
  • Исправлено кратковременное отключение плагина во время перезагрузки
v0.2
  • Изменён способ отмены исполнения не разрешённых команд
  • Исправлены потенциальные проблемы совместимости
  • Оптимизирован способ получения сообщения запрета исполнения
v0.1
  • Релиз
 
Последнее редактирование:
не имеет ошибки которая не позволяла получить корректный список команд если часть команды уже введена.
Как по мне это было лишь в плюс плагину, ведь он таким образом запрещал просматривать все команды на серваке.(да, отключить автокомплит можно и в настойках иных блокираторов, но в оригинале он работал довольно неплохо, показывая лишь команды из вайтлиста) Если "умник" не увидит лишнего, он будет банально в смятении. Запутать любителя обходов - бесценно, а смотреть как он мучается от непонимания, почему его любимые команды не работают - дико весело.
 
Как по мне это было лишь в плюс плагину, ведь он таким образом запрещал просматривать все команды на серваке.
Плагин и сейчас запрещает просматривать все запрещённые команды. Баг проявлялся во время просмотра всех разрешённых команд. Приведу пример как это проявлялось: Игроку разрешены команды /teleport /tell и /testforblock. Игрок хочет ввести команду /testforblock. Вводит первую часть /test и нажимает tab чтобы не вводить дальше. По идее автозаполнение должно было бы вернуть ему /testforblock но из за недоработки старый CommandWhitelist не учитывал что игрок уже ввёл /test а сразу возвращал список сначала то есть /teleport, /tell , /testforblock и приходилось бы ещё 2 раза тыкать в tab. Новый CommandWhitelist учитывает уже введённую часть /test и вернёт игроку /testforblock сразу. Я привёл пример с 3 командами, а их обычно гораздо больше.
 
Как выдать право человеку использовать все команды на сервере?
 

Поделиться этой страницей

Назад
Верх