####################################################################################################
# +----------------------------------------------------------------------------------------------+ #
# |                                   __         __   ___  __         __                         | #
# |                        |    |  | /  ` |__/  |__) |__  |__)  |\/| /__`                        | #
# |                        |___ \__/ \__, |  \  |    |___ |  \  |  | .__/                        | #
# |                                                                                              | #
# |                                                                                              | #
# |  SOURCE CODE: https://github.com/lucko/LuckPerms                                             | #
# |  WIKI:        https://github.com/lucko/LuckPerms/wiki                                        | #
# |  BUG REPORTS: https://github.com/lucko/LuckPerms/issues                                      | #
# |                                                                                              | #
# |  Each option in this file is documented and explained here:                                  | #
# |   ==>  https://github.com/lucko/LuckPerms/wiki/Configuration                                 | #
# |                                                                                              | #
# |  New options are not added to this file automatically. Default values are used if an         | #
# |  option cannot be found. The latest config versions can be obtained at the link above.       | #
# +----------------------------------------------------------------------------------------------+ #
####################################################################################################

# +----------------------------------------------------------------------------------------------+ #
# |                                                                                              | #
# |                                      ESSENTIAL SETTINGS                                      | #
# |                                                                                              | #
# |                   Important settings that control how LuckPerms functions.                   | #
# |                                                                                              | #
# +----------------------------------------------------------------------------------------------+ #

# The name of the server, used for server specific permissions.
#
# - When set to "global" this setting is effectively ignored.
# - In all other cases, the value here is added to all players in a "server" context.
# - See: https://github.com/lucko/LuckPerms/wiki/Context
server = "global"

# If the servers own UUID cache/lookup facility should be used when there is no record for a player
# already in LuckPerms.
#
# - When this is set to 'false', commands using a player's username will not work unless the player
#   has joined since LuckPerms was first installed.
# - To get around this, you can use a player's uuid directly in the command, or enable this option.
# - When this is set to 'true', the server facility is used. This may use a number of methods,
#   including checking the servers local cache, or making a request to the Mojang API.
use-server-uuid-cache = false




# +----------------------------------------------------------------------------------------------+ #
# |                                                                                              | #
# |                                       STORAGE SETTINGS                                       | #
# |                                                                                              | #
# |                Controls which storage method LuckPerms will use to store data.               | #
# |                                                                                              | #
# +----------------------------------------------------------------------------------------------+ #

# How the plugin should store data
#
# - The various options are explained in more detail on the wiki:
#   https://github.com/lucko/LuckPerms/wiki/Choosing-a-Storage-type
#
# - Possible options:
#
#   |  Remote databases - require connection information to be configured below
#   |=> MySQL
#   |=> MariaDB (preferred over MySQL)
#   |=> PostgreSQL
#   |=> MongoDB
#
#   |  Flatfile/local database - don't require any extra configuration
#   |=> H2 (preferred over SQLite)
#   |=> SQLite
#
#   |  Readable & editable text files - don't require any extra configuration
#   |=> YAML (.yml files)
#   |=> JSON (.json files)
#   |=> HOCON (.conf files)
#   |=> TOML (.toml files)
#   |
#   | By default, user, group and track data is separated into different files. Data can be combined
#   | and all stored in the same file by switching to a combined storage variant.
#   | Just add '-combined' to the end of the storage-method, e.g. 'yaml-combined'
#
# - A H2 database is the default option.
# - If you want to edit data manually in "traditional" storage files, we suggest using YAML.
storage-method = "h2"

# The following block defines the settings for remote database storage methods.
#
# - You don't need to touch any of the settings here if you're using a local storage method!
# - The connection detail options are shared between all remote storage types.
data {

  # Define the address and port for the database.
  # - The standard DB engine port is used by default
  #   (MySQL = 3306, PostgreSQL = 5432, MongoDB = 27017)
  # - Specify as "host:port" if differs
  address = "localhost"

  # The name of the database to store LuckPerms data in.
  # - This must be created already. Don't worry about this setting if you're using MongoDB.
  database = "minecraft"

  # Credentials for the database.
  username = "root"
  password = ""

  # These settings apply to the MySQL connection pool.
  # - The default values will be suitable for the majority of users.
  # - Do not change these settings unless you know what you're doing!
  pool-settings {

    # Sets the maximum size of the MySQL connection pool.
    # - Basically this value will determine the maximum number of actual
    #   connections to the database backend.
    # - More information about determining the size of connection pools can be found here:
    #   https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
    maximum-pool-size = 10

    # Sets the minimum number of idle connections that the pool will try to maintain.
    # - For maximum performance and responsiveness to spike demands, it is recommended to not set
    #   this value and instead allow the pool to act as a fixed size connection pool.
    #   (set this value to the same as 'maximum-pool-size')
    minimum-idle = 10

    # This setting controls the maximum lifetime of a connection in the pool in milliseconds.
    # - The value should be at least 30 seconds less than any database or infrastructure imposed
    #   connection time limit.
    maximum-lifetime = 1800000 # 30 minutes

    # This setting controls the maximum number of milliseconds that the plugin will wait for a
    # connection from the pool, before timing out.
    connection-timeout = 5000 # 5 seconds

    # This setting allows you to define extra properties for connections.
    properties {
      useUnicode = true
      characterEncoding = "utf8"
    }
  }

  # The prefix for all LuckPerms SQL tables.
  # - Change this is you want to use different tables for different servers.
  table_prefix = "luckperms_"

  # The prefix to use for all LuckPerms collections. Change this if you want to use different
  # collections for different servers. The default is no prefix.
  mongodb_collection_prefix = ""

  # MongoDB ClientConnectionURI for use with replica sets and custom connection options
  # - See https://docs.mongodb.com/manual/reference/connection-string/
  mongodb_connection_URI = ""
}

# Define settings for a "split" storage setup.
#
# - This allows you to define a storage method for each type of data.
# - The connection options above still have to be correct for each type here.
split-storage {
  # Don't touch this if you don't want to use split storage!
  enabled = false
  methods {
    # These options don't need to be modified if split storage isn't enabled.
    user = "h2"
    group = "h2"
    track = "h2"
    uuid = "h2"
    log = "h2"
  }
}




# +----------------------------------------------------------------------------------------------+ #
# |                                                                                              | #
# |                            UPDATE PROPAGATION & MESSAGING SERVICE                            | #
# |                                                                                              | #
# |    Controls the ways in which LuckPerms will sync data & notify other servers of changes.    | #
# |     These options are documented on greater detail on the wiki under "Instant Updates".      | #
# |                                                                                              | #
# +----------------------------------------------------------------------------------------------+ #

# This option controls how frequently LuckPerms will perform a sync task.
#
# - A sync task will refresh all data from the storage, and ensure that the most up-to-date data is
#   being used by the plugin.
# - This is disabled by default, as most users will not need it. However, if you're using a remote
#   storage type without a messaging service setup, you may wish to set this to something like 3.
# - Set to -1 to disable the task completely.
sync-minutes = -1

# If the file watcher should be enabled.
#
# - When using a file-based storage type, LuckPerms can monitor the data files for changes, and
#   automatically update when changes are detected.
# - If you don't want this feature to be active, set this option to false.
watch-files = true

# Define which messaging service should be used by the plugin.
#
# - If enabled and configured, LuckPerms will use the messaging service to inform other connected
#   servers of changes.
# - Use the command "/lp networksync" to manually push changes.
# - Data is NOT stored using this service. It is only used as a messaging platform.
#
# - If you decide to enable this feature, you should set "sync-minutes" to -1, as there is no need
#   for LuckPerms to poll the database for changes.
#
# - Possible options:
#   => sql       Uses the SQL database to form a queue system for communication. Will only work when
#                'storage-method' is set to MySQL or MariaDB. This is chosen by default if the
#                option is set to 'none' and SQL storage is in use. Set to 'notsql' to disable this.
#   => bungee    Uses the plugin messaging channels to communicate with the proxy.
#                LuckPerms must be installed on your proxy & all connected servers backend servers.
#                Won't work if you have more than one BungeeCord proxy.
#   => redis     Uses Redis pub-sub to push changes. Your server connection info must be configured
#                below.
#   => none      Disables the service.
messaging-service = "none"

# If LuckPerms should automatically push updates after a change has been made with a command.
auto-push-updates = true

# If LuckPerms should push logging entries to connected servers via the messaging service.
push-log-entries = true

# If LuckPerms should broadcast received logging entries to players on this platform.
#
# - If you have LuckPerms installed on your backend servers as well as a BungeeCord proxy, you
#   should set this option to false on either your backends or your proxies, to avoid players being
#   messaged twice about log entries.
broadcast-received-log-entries = true

# Settings for Redis.
# Port 6379 is used by default; set address to "host:port" if differs
redis {
  enabled = false
  address = "localhost"
  password = ""
}




# +----------------------------------------------------------------------------------------------+ #
# |                                                                                              | #
# |                                    CUSTOMIZATION SETTINGS                                    | #
# |                                                                                              | #
# |              Settings that allow admins to customize the way LuckPerms operates.             | #
# |                                                                                              | #
# +----------------------------------------------------------------------------------------------+ #

# Controls how temporary permissions/parents/meta should be accumulated.
#
# - The default behaviour is "deny".
# - This behaviour can also be specified when the command is executed. See the command usage
#   documentation for more info.
#
# - Possible options:
#   => accumulate   durations will be added to the existing expiry time
#   => replace      durations will be replaced if the new duration is later than the current
#                   expiration
#   => deny         the command will just fail if you try to add another node with the same expiry
temporary-add-behaviour = "deny"

# Controls how LuckPerms will determine a users "primary" group.
#
# - The meaning and influence of "primary groups" are explained in detail on the wiki.
# - The preferred approach is to let LuckPerms automatically determine a users primary group
#   based on the relative weight of their parent groups.
#
# - Possible options:
#   => stored                  use the value stored against the users record in the file/database
#   => parents-by-weight       just use the users most highly weighted parent
#   => all-parents-by-weight   same as above, but calculates based upon all parents inherited from
#                              both directly and indirectly
primary-group-calculation = "parents-by-weight"

# If the plugin should check for "extra" permissions with users run LP commands.
#
# - These extra permissions allow finer control over what users can do with each command, and who
#   they have access to edit.
# - The nature of the checks are documented on the wiki under "Argument based command permissions".
# - Argument based permissions are *not* static, unlike the 'base' permissions, and will depend upon
#   the arguments given within the command.
argument-based-command-permissions = false

# If the plugin should send log notifications to users whenever permissions are modified.
#
# - Notifications are only sent to those with the appropriate permission to receive them
# - They can also be temporarily enabled/disabled on a per-user basis using
#   '/lp log notify <on|off>'
log-notify = true

# Defines the options for prefix and suffix stacking.
#
# - The feature allows you to display multiple prefixes or suffixes alongside a players username in
#   chat.
# - It is explained and documented in more detail on the wiki under "Prefix & Suffix Stacking".
#
# - The options are divided into separate sections for prefixes and suffixes.
# - The value of 'start-spacer' is included at the start of the resultant prefix/suffix.
# - The value of 'end-spacer' is included at the end of the resultant prefix/suffix.
# - The value of 'middle-spacer' is included between each element in the resultant prefix/suffix.
#
# - Possible format options:
#   => highest                        Selects the value with the highest weight, from all values
#                                     held by or inherited by the player.
#
#   => lowest                         Same as above, except takes the one with the lowest weight.
#
#   => highest_own                    Selects the value with the highest weight, but will not
#                                     accept any inherited values.
#
#   => lowest_own                     Same as above, except takes the value with the lowest weight.
#
#   => highest_inherited              Selects the value with the highest weight, but will only
#                                     accept inherited values.
#
#   => lowest_inherited               Same as above, except takes the value with the lowest weight.
#
#   => highest_on_track_<track>       Selects the value with the highest weight, but only if the
#                                     value was inherited from a group on the given track.
#
#   => lowest_on_track_<track>        Same as above, except takes the value with the lowest weight.
#
#   => highest_not_on_track_<track>   Selects the value with the highest weight, but only if the
#                                     value was inherited from a group not on the given track.
#
#   => lowest_not_on_track_<track>    Same as above, except takes the value with the lowest weight.
meta-formatting {
  prefix {
    format = [
      "highest"
    ]
    start-spacer = ""
    middle-spacer = " "
    end-spacer = ""
  }
  suffix {
    format = [
      "highest"
    ]
    start-spacer = ""
    middle-spacer = " "
    end-spacer = ""
  }
}




# +----------------------------------------------------------------------------------------------+ #
# |                                                                                              | #
# |                            PERMISSION CALCULATION AND INHERITANCE                            | #
# |                                                                                              | #
# |    Modify the way permission checks, meta lookups and inheritance resolutions are handled.   | #
# |                                                                                              | #
# +----------------------------------------------------------------------------------------------+ #

# The algorithm LuckPerms should use when traversing the "inheritance tree".
#
# - Possible options:
#   => breadth-first            See: https://en.wikipedia.org/wiki/Breadth-first_search
#   => depth-first-pre-order    See: https://en.wikipedia.org/wiki/Depth-first_search
#   => depth-first-post-order   See: https://en.wikipedia.org/wiki/Depth-first_search
inheritance-traversal-algorithm = "depth-first-pre-order"

# +----------------------------------------------------------------------------------------------+ #
# | Permission resolution settings                                                               | #
# +----------------------------------------------------------------------------------------------+ #

# If users on this server should have their global permissions applied.
# When set to false, only server specific permissions will apply for users on this server
include-global = true

# If users on this server should have their global world permissions applied.
# When set to false, only world specific permissions will apply for users on this server
include-global-world = true

# If users on this server should have global (non-server specific) groups applied
apply-global-groups = true

# If users on this server should have global (non-world specific) groups applied
apply-global-world-groups = true

# +----------------------------------------------------------------------------------------------+ #
# | Inheritance settings                                                                         | #
# +----------------------------------------------------------------------------------------------+ #

# If the plugin should apply wildcard permissions.
#
# - If set to true, LuckPerms will detect wildcard permissions, and resolve & apply all registered
#   permissions matching the wildcard.
apply-wildcards = true

# If the plugin should parse regex permissions.
#
# - If set to true, LuckPerms will detect regex permissions, marked with "r=" at the start of the
#   node, and resolve & apply all registered permissions matching the regex.
apply-regex = true

# If the plugin should complete and apply shorthand permissions.
#
# - If set to true, LuckPerms will detect and expand shorthand node patterns.
apply-shorthand = true

# If LuckPerms should resolve and apply permissions according to Sponge's implicit wildcard
# inheritance system.
#
# That being:
# If a user has been granted "example", then the player should have also be automatically granted
# "example.function", "example.another", "example.deeper.nesting", and so on.
#
# If this option is set to false, this system will not be applied.
apply-sponge-implicit-wildcards=true

# If the plugin should apply Sponge default subject permissions.
# Plugins can manipulate a set of default permissions granted to all users. If this option is set to
# false, LuckPerms will ignore this data when considering if a player has a permission.
apply-sponge-default-subjects=true

# +----------------------------------------------------------------------------------------------+ #
# | Extra settings                                                                               | #
# +----------------------------------------------------------------------------------------------+ #

# Allows you to set "aliases" for the worlds sent forward for context calculation.
#
# - These aliases are provided in addition to the real world name. Applied recursively.
# - Remove the comment characters for the default aliases to apply.
world-rewrite {
  #world_nether = "world"
  #world_the_end = "world"
}

# Define special group weights for this server.
#
# - Group weights can also be applied directly to group data, using the setweight command.
# - This section allows weights to be set on a per-server basis.
group-weight {
  #admin = 10
}




# +----------------------------------------------------------------------------------------------+ #
# |                                                                                              | #
# |                                      FINE TUNING OPTIONS                                     | #
# |                                                                                              | #
# |     A number of more niche settings for tweaking and changing behaviour. The section also    | #
# | contains toggles for some more specialised features. It is only necessary to make changes to | #
# |                  these options if you want to fine-tune LuckPerms behaviour.                 | #
# |                                                                                              | #
# +----------------------------------------------------------------------------------------------+ #

# +----------------------------------------------------------------------------------------------+ #
# | Miscellaneous (and rarely used) settings                                                     | #
# +----------------------------------------------------------------------------------------------+ #

# If LuckPerms should produce extra logging output when it handles logins.
#
# - Useful if you're having issues with UUID forwarding or data not being loaded.
debug-logins = false

# If LuckPerms should allow usernames with non alphanumeric characters.
#
# - Note that due to the design of the storage implementation, usernames must still be 16 characters
#   or less.
allow-invalid-usernames = false

# If LuckPerms should allow a users primary group to be removed with the 'parent remove' command.
#
# - When this happens, the plugin will set their primary group back to default.
prevent-primary-group-removal = false




# +----------------------------------------------------------------------------------------------+ #
# |                                                                                              | #
# |                                      DEFAULT ASSIGNMENTS                                     | #
# |                                                                                              | #
# +----------------------------------------------------------------------------------------------+ #

# This section allows you to define defaults to give users whenever they connect to the server.
# The default assignments are highly configurable and conditional.
#
# There is one default assignment built into LuckPerms, which will add all users to the "default"
# group if they are not a member of any other group. This setting cannot be disabled. However, you
# can use this section to add more of your own.
#
# IMPORTANT:
# In order to save storage space, LuckPerms does not store users who have no permissions defined,
# and are only a member of the default group. Adding default assignments to this section will negate
# this effect. It is HIGHLY RECCOMENDED that instead of assigning defaults here, you add permissions
# to the "default" group, or set the "default" group to inherit other groups, and then use the
# group-name-rewrite rule above.
#
# It is also important to note that these rules are considered every time a player logs into the
# server, and are applied directly to the user's data. Simply removing a rule here will not reverse
# the effect of that rule on any users who have already had it applied to them.
#
# The "has" and "lacks" conditions below support standard boolean logic, using the 'and' & 'or'
# characters used in Java.
# e.g. "(some.other.permission | some.permission.other) & some.thing.else" == a user has
# 'some.other.permission', or 'some.permission.other', and they also have 'some.thing.else'
#
# Groups are represented by the permission node: group.<group name>
# Per server and per world nodes are represented by "server-world/permission" or "server/permission"
#
# Within conditions, permission nodes MUST be escaped using "<" and ">". See the example below.
#
# Explanation of the examples below: (they're just to demonstrate the features & use cases)
#
# rule1:
# If a user is either in the vip or vip+ group, and they have the "titles.titlecollector" permission
# set to true, and the "some.random.permission" set to false... if they're not in the group
# "prison_titlepack" on the "prison" server, then give add them to the "prison_titlepack" group on
# the "prison" server, and remove "some.random.permission".
#
# rule2:
# If the user isn't in any of the following groups on the skyblock server: sb_level1, sb_level2,
# sb_level3, then add them to sb_level1 on the skyblock server.
#
# rule3:
# If the user is a member of the default group, remove them from default, add them to member, and
# set their primary group to member.
#
# WARNING: Unlike internal commands, this system does not ensure that a group exists before adding
# a user to it. It also does not unsure that a user is a member of a group before making that group
# their primary group.
#
# Before you use "give: group.<name>" or "set-primary-group", make sure that the group exists, and
# that the user is a member of the group.
default-assignments {
#  rule1 {
#    if {
#      has-true="(<group.vip> | <group.vip+>) & <titles.tilecollector>"
#      has-false="<some.random.permission>"
#      lacks="<prison/group.prison_titlepack>"
#    }
#    give = [
#      "prison/group.prison_titlepack"
#    ]
#    take = [
#      "some.random.permission"
#    ]
#  }
#  rule2 {
#    if {
#      lacks="<skyblock/group.sb_level1> & <skyblock/group.sb_level2> & <skyblock/group.sb_level3>"
#    }
#    give = [
#      "skyblock/group.sb_level1"
#    ]
#  }
#  rule3 {
#    if {
#      has-true="<group.default>"
#    }
#    take = [
#      "group.default"
#    ]
#    give = [
#      "group.member"
#    ]
#    set-primary-group="member"
#  }
}
