### Starting BungeeCord Proxy with Classpath Source: https://github.com/a248/libertybans/wiki/Importing-from-Other-Plugins Shows the command to start a BungeeCord proxy server with custom libraries included in the classpath. ```java java -classpath server.jar:libs/* net.md_5.bungee.Bootstrap ``` -------------------------------- ### Starting Server with Classpath for Custom Libraries Source: https://github.com/a248/libertybans/wiki/Importing-from-Other-Plugins Demonstrates how to start a Bukkit/Spigot/Paper server using the -classpath option to include libraries from the 'libs' directory. This is necessary when using custom JDBC drivers like PostgreSQL or H2. ```java java -classpath server.jar:libs/* org.bukkit.craftbukkit.Main ``` -------------------------------- ### Starting Velocity Proxy with Classpath Source: https://github.com/a248/libertybans/wiki/Importing-from-Other-Plugins Shows the command to start a Velocity proxy server with custom libraries included in the classpath. ```java java -classpath server.jar:libs/* com.velocitypowered.proxy.Velocity ``` -------------------------------- ### Getting the LibertyBans Instance Source: https://github.com/a248/libertybans/wiki/Developer-API Demonstrates how to obtain an instance of the LibertyBans API, typically done once when a plugin starts. ```APIDOC ## Getting the Instance ### Description This method shows how to acquire the LibertyBans API instance. It's recommended to do this once during plugin initialization. ### Method Signature ```java public static WikiExamples create() ``` ### Usage ```java Omnibus omnibus = OmnibusProvider.getOmnibus(); LibertyBans libertyBans = omnibus.getRegistry().getProvider(LibertyBans.class).orElseThrow(); ``` ``` -------------------------------- ### Install Addon Command Source: https://github.com/a248/libertybans/blob/master/docs/Addons.md Use this command to install an addon by its ID. The addon jar will be extracted to the filesystem, ready for the next server restart. ```bash /libertybans addon install ``` -------------------------------- ### Server Directory Structure Example Source: https://github.com/a248/libertybans/wiki/Importing-from-Other-Plugins Illustrates the expected directory structure for a Minecraft server when adding custom libraries. ```text libs/ logs/ plugins/ server.properties bukkit.yml spigot.yml paper.yml server.jar ... etc ``` -------------------------------- ### Detected Addons at Startup Source: https://github.com/a248/libertybans/blob/master/docs/Addons.md This message indicates the number of addons detected by LibertyBans when the server starts. ```text [LibertyBans] Detected 2 addon(s) ``` -------------------------------- ### Getting LibertyBans API Instance Source: https://github.com/a248/libertybans/wiki/Developer-API Obtain the LibertyBans API instance once when your plugin starts. Pass this instance when API access is required. ```java public class WikiExamples { private final Omnibus omnibus; private final LibertyBans libertyBans; public WikiExamples(Omnibus omnibus, LibertyBans libertyBans) { this.omnibus = omnibus; this.libertyBans = libertyBans; } public static WikiExamples create() { Omnibus omnibus = OmnibusProvider.getOmnibus(); LibertyBans libertyBans = omnibus.getRegistry().getProvider(LibertyBans.class).orElseThrow(); return new WikiExamples(omnibus, libertyBans); } } ``` -------------------------------- ### Basic Tellraw JSON Example Source: https://github.com/a248/libertybans/wiki/JSON-Messages Illustrates the structure of a basic JSON message using the /tellraw command, including text formatting, tooltips, and click events. ```minecraft tellraw @a ["",{"text":"Basic","bold":true,"color":"yellow"},{"text":" tellraw example with ","color":"yellow"},{"text":"tooltip","color":"yellow","hoverEvent":{"action":"show_text","value":"Hey look at this"}},{"text":" and ","color":"yellow"},{"text":"command","color":"yellow","clickEvent":{"action":"run_command","value":"/kill"}}] ``` -------------------------------- ### Using thenRunSync with CentralisedFuture Source: https://github.com/a248/libertybans/wiki/Developer-API Demonstrates how to use the `thenRunSync` method on CentralisedFuture to perform operations on the main thread, followed by an asynchronous operation. This example also shows how `join()` is enhanced to prevent deadlocks when called on the main thread. ```java CentralisedFuture future; future.thenRunSync(() -> { // thenRunSync is not available with CompletableFuture // do operation on main thread }).thenRunAsync(() -> { // do async operation }).join(); // Calling join() will cause a deadlock when using a plain CompletableFuture ``` -------------------------------- ### Basic Color Code Usage Source: https://github.com/a248/libertybans/wiki/Color-Codes Demonstrates how to apply basic color codes to chat messages. Color codes start with '&' followed by a color character. ```plaintext &61. Be kind to your fellow players. &b2. No griefing. &d3. No swearing. ``` -------------------------------- ### Silent Ban Example Source: https://github.com/a248/libertybans/blob/master/docs/Silent-Punishments.md Use the -s flag to issue a ban silently, preventing the notification message from being displayed to other players. ```bash ban -s A248 You are banned ``` -------------------------------- ### Getting Punishments Source: https://github.com/a248/libertybans/wiki/Developer-API Explains how to retrieve specific punishments, such as all mutes issued by a particular staff member, using the punishment selection API. ```APIDOC ## Getting Punishments ### Description This API allows for retrieving punishments based on various criteria. The example shows how to fetch all mutes performed by a specific staff member. ### Method Signature ```java public ReactionStage> getMutesFrom(UUID staffMemberUuid) ``` ### Usage Use the `libertyBans.getSelector().selectionBuilder()` to construct a query for punishments. ### Example ```java return libertyBans.getSelector().selectionBuilder() .type(PunishmentType.MUTE) .operator(PlayerOperator.of(staffMemberUuid)) .build() .getAllSpecificPunishments(); ``` ``` -------------------------------- ### Silent Timed Ban Example Source: https://github.com/a248/libertybans/blob/master/docs/Silent-Punishments.md Issue a timed ban silently by including the duration and the -s flag. The notification message will not be sent. ```bash ban A248 30d -s Banned for 30 days ``` -------------------------------- ### Emulating Sequence Increment in MySQL Source: https://github.com/a248/libertybans/blob/master/docs/The-Database-Schema.md This SQL snippet demonstrates how to emulate the behavior of `NEXT VALUE FOR` for a sequence in MySQL, as MySQL does not natively support sequences. It involves starting a transaction, selecting the current value, incrementing it, and then using the previously selected value. ```sql SET autocommit = 0; -- Emulate NEXT VALUE FOR("libertybans_punishment_ids") START TRANSACTION; SELECT "value" INTO @@id FROM "libertybans_punishment_ids"; UPDATE "libertybans_punishment_ids" SET "value" = "value" + 1; COMMIT; -- Now we may use @@id ``` -------------------------------- ### LENIENT: Active Punishments Query Source: https://github.com/a248/libertybans/blob/master/docs/Database-Performance.md Analyzes the execution plan for a query to fetch all of a player's currently active punishments, ordered by start time and then by ID. Supports lookups via UUID, address, or both. ```sql -- 3 explain plan for select "victim_type", "victim_uuid", "victim_address", "type", "operator", "reason", "scope_type", "scope", "start", "end", "track", "id" from "libertybans_simple_active" where (("libertybans_simple_active"."victim_type" = 0 and "libertybans_simple_active"."victim_uuid" = X'524a5f914d3e49d8a9c7400d4f59569a') or ("libertybans_simple_active"."victim_type" = 1 and "libertybans_simple_active"."victim_address" = X'6A087183') or ("libertybans_simple_active"."victim_type" = 2 and ("libertybans_simple_active"."victim_uuid" = X'524a5f914d3e49d8a9c7400d4f59569a' or "libertybans_simple_active"."victim_address" = X'6A087183' )) ) order by "start" asc, "id" asc; ``` -------------------------------- ### Set New Version and Check Hashes for Release Source: https://github.com/a248/libertybans/blob/master/CONTRIBUTING.md Steps to prepare for a release: set the new version, check dependency hashes, and update the parent POM. ```bash mvn versions:set -DnewVersion={theNextVersion} ``` ```bash build/check-hashes.sh ``` -------------------------------- ### Migrating RevocationOrder Undo and Get Enforcement Source: https://github.com/a248/libertybans/blob/master/docs/Changes-in-LibertyBans-1.0.0.md Update calls to undo and get a revocation without enforcement to use the new EnforcementOptions builder. ```java revocationOrder.undoAndGetPunishmentWithoutUnenforcement() -> revocationOrder.undoAndGetPunishment(EnforcementOptions.builder().enforcement(Enforcement.NONE).build()) ``` -------------------------------- ### Velocity Plugin Startup Flow Source: https://github.com/a248/libertybans/blob/master/CONTRIBUTING.md Illustrates the startup process for the Velocity plugin, showing how the plugin interacts with the bootstrap and core modules through isolated classloaders. ```text bans-env-velocityplugin | | | | V V V V bans-bootstrap | | | | --------- V V V V ------------------------------------- bans-core / | \ / | \ V V V Config Database bans-env-velocity ``` -------------------------------- ### Build LibertyBans from Source Source: https://github.com/a248/libertybans/blob/master/CONTRIBUTING.md Clone the repository and build the project using Maven. The executable jar will be located in the distribution directory upon successful completion. ```bash git clone https://github.com/A248/LibertyBans.git && cd LibertyBans && mvn package ``` -------------------------------- ### Silent Unban Example Source: https://github.com/a248/libertybans/blob/master/docs/Silent-Punishments.md Unpunish a player silently using the -s flag. This suppresses the notification message for the unban action. ```bash unban A248 -s ``` -------------------------------- ### Retrieve IP Address from BINARY Source: https://github.com/a248/libertybans/wiki/The-Database-Schema Demonstrates retrieving a BINARY IP address from the `libertybans_victims` table and converting it to a human-readable format using `UNHEX`. This is applicable when `type` is 1 (IP address). ```sql SELECT UNHEX(data) FROM libertybans_victims WHERE type = 1 AND data = ? ``` -------------------------------- ### Deploy Release Candidate with Checks Source: https://github.com/a248/libertybans/blob/master/CONTRIBUTING.md Deploy the release candidate using Maven, skipping tests and invoker, while checking hashes and disabling Docker. This is a crucial step before final tagging. ```bash mvn clean deploy -Pcheck-hash,-docker-enabled -DskipTests -Dinvoker.skip=true ``` -------------------------------- ### Getting Mutes by Staff Member Source: https://github.com/a248/libertybans/wiki/Developer-API Retrieve all mute punishments issued by a specific staff member using the punishment selection API. ```java public ReactionStage> getMutesFrom(UUID staffMemberUuid) { return libertyBans.getSelector().selectionBuilder() .type(PunishmentType.MUTE) .operator(PlayerOperator.of(staffMemberUuid)) .build().getAllSpecificPunishments(); } ``` -------------------------------- ### Explain Plan for Player's History Query (Detailed) Source: https://github.com/a248/libertybans/blob/master/docs/Database-Performance.md Analyzes the execution plan for a detailed query retrieving player history, combining data from applicable history and strict links, and aggregating results. ```sql -- 3 explain plan for select "inner_victim_type" as "victim_type", "inner_victim_uuid" as "victim_uuid", "inner_victim_address" as "victim_address", "inner_type" as "type", "inner_operator" as "operator", "inner_reason" as "reason", "inner_scope_type" as "scope_type", "inner_scope" as "scope", "inner_start" as "start", "inner_end" as "end", "inner_track" as "track", "id" from ( select max("victim_type") as "inner_victim_type", max("victim_uuid") as "inner_victim_uuid", max("victim_address") as "inner_victim_address", max("type") as "inner_type", max("operator") as "inner_operator", max("reason") as "inner_reason", max("scope_type") as "inner_scope_type", max("scope") as "inner_scope", max("start") as "inner_start", max("end") as "inner_end", max("track") as "inner_track", "id" from ( select "victim_type", "victim_uuid", "victim_address", "type", "operator", "reason", "scope_type", "scope", "start", "end", "track", "id" from "libertybans_applicable_history" join "libertybans_strict_links" on "libertybans_applicable_history"."uuid" = "libertybans_strict_links"."uuid1" where ("libertybans_strict_links"."uuid2" = X'65e16e917b7e4df692eb3172eb138235' and "libertybans_applicable_history"."victim_type" <> 0) union all select "victim_type", "victim_uuid", "victim_address", "type", "operator", "reason", "scope_type", "scope", "start", "end", "track", "id" ``` -------------------------------- ### Avoid Completable Future Nesting Source: https://github.com/a248/libertybans/blob/master/CONTRIBUTING.md This example demonstrates excessive indentation when nesting CompletableFuture callbacks. Prefer the alternative style for improved readability. ```java return selector.getApplicablePunishment(id) .thenCompose((optPunishment) -> { // Callback // Notice the extra indentation }); ``` -------------------------------- ### Listening to Events Source: https://github.com/a248/libertybans/wiki/Developer-API Shows how to register a listener for the `PunishEvent` to execute custom code when a player is punished. ```APIDOC ## Listening to Events ### Description This demonstrates how to subscribe to events, specifically the `PunishEvent`, to perform actions whenever a punishment is enacted. ### Method Signature ```java public void listenToPunishEvent() ``` ### Usage 1. Create an `EventConsumer` implementation for the desired event. 2. Register the consumer with the `omnibus.getEventBus()` using the event class and priority. ### Example ```java EventConsumer listener = new EventConsumer<>() { @Override public void accept(PunishEvent event) { logger.info("Listening to punish event {}", event); } }; omnibus.getEventBus().registerListener(PunishEvent.class, ListenerPriorities.NORMAL, listener); ``` ``` -------------------------------- ### Explain Plan for Player History Query Source: https://github.com/a248/libertybans/blob/master/docs/Database-Performance.md Analyzes the execution plan for a query retrieving historical ban data for a specific player UUID. ```sql explain plan for select max("victim_type") as "inner_victim_type", max("victim_uuid") as "inner_victim_uuid", max("victim_address") as "inner_victim_address", max("type") as "inner_type", max("operator") as "inner_operator", max("reason") as "inner_reason", max("scope_type") as "inner_scope_type", max("scope") as "inner_scope", max("start") as "inner_start", max("end") as "inner_end", max("track") as "inner_track", "id" from "libertybans_applicable_history" where "libertybans_applicable_history"."uuid" = X'd46b4b373e584adf8510a691bbbc6b10' group by "id" ) as "sq_agg" order by "inner_start" asc, "id" asc; ``` -------------------------------- ### JSON Message with Tooltips and Commands Source: https://github.com/a248/libertybans/wiki/JSON-Messages Demonstrates creating JSON messages with multiple clusters, each containing text, tooltips, and commands. This format is specifically for chat messages. ```minecraft "&7&oHello, this is a &bsample json&7.||ttp:&bI'm a tooltip for the first cluster.|| There's no tag, so I've started a new cluster.||cmd:/ping||ttp:&6&o&lCLICK&f for /ping" ``` -------------------------------- ### Get Applicable Mutes for Player Source: https://github.com/a248/libertybans/blob/master/docs/Developer-API.md Determine if a player is currently muted by checking for applicable mutes, including user and IP mutes. This returns an Optional Punishment if found. ```java public ReactionStage> getMutesApplyingTo(UUID playerUuid, InetAddress playerAddress) { return libertyBans.getSelector() .selectionByApplicabilityBuilder(playerUuid, playerAddress) .type(PunishmentType.MUTE) .build() .getFirstSpecificPunishment(); } ``` -------------------------------- ### Explain Plan for Active Punishments Query Source: https://github.com/a248/libertybans/blob/master/docs/Database-Performance.md Analyzes the execution plan for a query retrieving active punishment data for a specific player UUID. ```sql explain plan for select "inner_victim_type" as "victim_type", "inner_victim_uuid" as "victim_uuid", "inner_victim_address" as "victim_address", "inner_type" as "type", "inner_operator" as "operator", "inner_reason" as "reason", "inner_scope_type" as "scope_type", "inner_scope" as "scope", "inner_start" as "start", "inner_end" as "end", "inner_track" as "track", "id" from ( select max("victim_type") as "inner_victim_type", max("victim_uuid") as "inner_victim_uuid", max("victim_address") as "inner_victim_address", max("type") as "inner_type", max("operator") as "inner_operator", max("reason") as "inner_reason", max("scope_type") as "inner_scope_type", max("scope") as "inner_scope", max("start") as "inner_start", max("end") as "inner_end", max("track") as "inner_track", "id" from "libertybans_applicable_active" where "libertybans_applicable_active"."uuid" = X'd46b4b373e584adf8510a691bbbc6b10' group by "id" ) as "sq_agg" order by "inner_start" asc, "id" asc; ``` -------------------------------- ### Player's History Query Source: https://github.com/a248/libertybans/blob/master/docs/Database-Performance.md Retrieves the history of punishments for a specific player, joining history and strict link tables. Filters for active or non-expired punishments and orders by start time. ```sql -- 3 explain plan for select "inner_victim_type" as "victim_type", "inner_victim_uuid" as "victim_uuid", "inner_victim_address" as "victim_address", "inner_type" as "type", "inner_operator" as "operator", "inner_reason" as "reason", "inner_scope_type" as "scope_type", "inner_scope" as "scope", "inner_start" as "start", "inner_end" as "end", "inner_track" as "track", "id" from ( select max("victim_type") as "inner_victim_type", max("victim_uuid") as "inner_victim_uuid", max("victim_address") as "inner_victim_address", max("libertybans_applicable_history"."type") as "inner_type", max("libertybans_applicable_history"."operator") as "inner_operator", max("libertybans_applicable_history"."reason") as "inner_reason", max("libertybans_applicable_history"."scope_type") as "inner_scope_type", max("libertybans_applicable_history"."scope") as "inner_scope", max("libertybans_applicable_history"."start") as "inner_start", max("libertybans_applicable_history"."end") as "inner_end", max("libertybans_applicable_history"."track") as "inner_track", "id" from "libertybans_applicable_history" join "libertybans_strict_links" on "libertybans_applicable_history"."uuid" = "libertybans_strict_links"."uuid1" where ( ("libertybans_applicable_history"."end" = 0 or "libertybans_applicable_history"."end" > 1621440000) and "libertybans_strict_links"."uuid2" = X'406a3a9452ed494b8aec8e9690283dfd' ) group by "id" ) as "sq_agg" order by "inner_start" desc, "id" desc; ``` -------------------------------- ### Explain Plan for Login or Mute Check Query Source: https://github.com/a248/libertybans/blob/master/docs/Database-Performance.md Analyzes the execution plan for a query checking login or mute status, considering strict links and active bans. It filters for non-expired punishments. ```sql -- 1 explain plan for select "victim_type", "victim_uuid", "victim_address", "operator", "reason", "scope_type", "scope", "start", "end", "track", "id" from ( select "libertybans_applicable_bans".* from "libertybans_applicable_bans" join "libertybans_strict_links" on "libertybans_applicable_bans"."uuid" = "libertybans_strict_links"."uuid1" where ("libertybans_strict_links"."uuid2" = X'51ac4257ea954b32ab902e79fdae4b21' and "libertybans_applicable_bans"."victim_type" <> 0) union all select "libertybans_applicable_bans".* from "libertybans_applicable_bans" where "libertybans_applicable_bans"."uuid" = X'51ac4257ea954b32ab902e79fdae4b21' ) as "sq_union" where ("end" = 0 or "end" > 1621440000) order by case "end" when 0 then 9223372036854775807 else "end" end desc limit 1; ``` -------------------------------- ### LENIENT: Player History Query Source: https://github.com/a248/libertybans/blob/master/docs/Database-Performance.md Analyzes the execution plan for a query to retrieve a player's entire ban history, ordered by start time and then by ID. It supports lookups by UUID, address, or both. ```sql -- 2 explain plan for select "victim_type", "victim_uuid", "victim_address", "type", "operator", "reason", "scope_type", "scope", "start", "end", "track", "id" from "libertybans_simple_history" where (("libertybans_simple_history"."victim_type" = 0 and "libertybans_simple_history"."victim_uuid" = X'524a5f914d3e49d8a9c7400d4f59569a') or ("libertybans_simple_history"."victim_type" = 1 and "libertybans_simple_history"."victim_address" = X'6A087183') or ("libertybans_simple_history"."victim_type" = 2 and ("libertybans_simple_history"."victim_uuid" = X'524a5f914d3e49d8a9c7400d4f59569a' or "libertybans_simple_history"."victim_address" = X'6A087183' )) ) order by "start" asc, "id" asc; ``` -------------------------------- ### Get Player's Active Punishments Source: https://github.com/a248/libertybans/blob/master/docs/Database-Performance.md Retrieves all active punishments for a given player UUID, combining data from active and strict link tables. Used for comprehensive player history checks. ```sql -- 4 explain plan for select "inner_victim_type" as "victim_type", "inner_victim_uuid" as "victim_uuid", "inner_victim_address" as "victim_address", "inner_type" as "type", "inner_operator" as "operator", "inner_reason" as "reason", "inner_scope_type" as "scope_type", "inner_scope" as "scope", "inner_start" as "start", "inner_end" as "end", "inner_track" as "track", "id" from ( select max("victim_type") as "inner_victim_type", max("victim_uuid") as "inner_victim_uuid", max("victim_address") as "inner_victim_address", max("type") as "inner_type", max("operator") as "inner_operator", max("reason") as "inner_reason", max("scope_type") as "inner_scope_type", max("scope") as "inner_scope", max("start") as "inner_start", max("end") as "inner_end", max("track") as "inner_track", "id" from ( select "victim_type", "victim_uuid", "victim_address", "type", "operator", "reason", "scope_type", "scope", "start", "end", "track", "id" from "libertybans_applicable_active" join "libertybans_strict_links" on "libertybans_applicable_active"."uuid" = "libertybans_strict_links"."uuid1" where ("libertybans_strict_links"."uuid2" = X'65e16e917b7e4df692eb3172eb138235' and "libertybans_applicable_active"."victim_type" <> 0) union all select "victim_type", "victim_uuid", "victim_address", "type", "operator", "reason", "scope_type", "scope", "start", "end", "track", "id" from "libertybans_applicable_active" where "libertybans_applicable_active"."uuid" = X'65e16e917b7e4df692eb3172eb138235' ) as "sq_union" group by "id" ) as "sq_agg" order by "inner_start" asc, "id" asc; ``` -------------------------------- ### Explain Plan for Login to Cracked Network Query Source: https://github.com/a248/libertybans/blob/master/docs/Database-Performance.md Analyzes the execution plan for a query checking login status to a cracked network, considering strict links, active bans, and player type. It filters for non-expired punishments. ```sql -- 2 explain plan for select "victim_type", "victim_uuid", "victim_address", "operator", "reason", "start", "end", "track", "id" from ( select "libertybans_applicable_bans".* from "libertybans_applicable_bans" join "libertybans_strict_links" on "libertybans_applicable_bans"."uuid" = "libertybans_strict_links"."uuid1" where ("libertybans_strict_links"."uuid2" = X'51ac4257ea954b32ab902e79fdae4b21' and "libertybans_applicable_bans"."victim_type" <> 0) union all select "libertybans_applicable_bans".* from "libertybans_applicable_bans" where ("libertybans_applicable_bans"."uuid" = X'51ac4257ea954b32ab902e79fdae4b21' or ("libertybans_applicable_bans"."victim_type" <> 0 and "libertybans_applicable_bans"."address" = X'1EF97F89') ) ) as "sp_union" where ("end" = 0 or "end" > 1621440000) order by case "end" when 0 then 9223372036854775807 else "end" end desc limit 1; ``` -------------------------------- ### Restart LibertyBans Plugin Source: https://github.com/a248/libertybans/wiki/Configuration This command is required to apply changes made in sql.yml and other specific configuration files. A full server restart can also be used. ```bash /libertybans restart ``` -------------------------------- ### Run Specific Integration Test with Maven Source: https://github.com/a248/libertybans/blob/master/CONTRIBUTING.md Execute a particular integration test (e.g., PaginationIT) while skipping Maven Invoker and Docker tests. This is useful for focused debugging. ```bash mvn clean verify -Dinvoker.skip=true -Dit.test=PaginationIT -P-docker-enabled ``` -------------------------------- ### LibertyBans Misbehaving Plugin Warning Source: https://github.com/a248/libertybans/blob/master/docs/Misbehaving-Plugins.md This console message indicates that a plugin is interfering with LibertyBans' event handling, potentially allowing muted players to speak. It suggests investigating installed plugins on a test server. ```text 10.05 14:41:56 [Server] ERROR [space.arim.libertybans.core.env.ParallelisedListener]: You likely have a misbehaving plugin installed on your server. This may lead to bans or mutes not being checked and enforced. Reason: the event PlayerChatEvent was previously blocked by the server or another plugin, but since then, some plugin has uncancelled the blocking. ``` -------------------------------- ### Gradle Dependency Configuration Source: https://github.com/a248/libertybans/blob/master/docs/Developer-API.md Set up your Gradle project to use the LibertyBans API. This includes adding necessary repositories and the dependency itself. ```gradle repositories { ... maven { name= 'arim-mvn-lgpl3' url = 'https://mvn-repo.arim.space/lesser-gpl3/' } maven { name= 'arim-mvn-gpl3' url = 'https://mvn-repo.arim.space/gpl3/' } maven { name= 'arim-mvn-agpl3' url = 'https://mvn-repo.arim.space/affero-gpl3/' } ... } dependencies { ... compileOnly "space.arim.libertybans:bans-api:{INSERT_LATEST_VERSION}" } ``` -------------------------------- ### Reload LibertyBans Configuration Source: https://github.com/a248/libertybans/wiki/Configuration Use this command to reload most of the plugin's configuration without a full server restart. Ensure you have the necessary permissions. ```bash /libertybans reload ```