[general]
# if this path is encountered during path traversal,
# it will be removed. this is useful for instances
# where your absolute domain path is not long enough
# to replace boomlings.com, because you can then point
# it at a different, longer path to fill the gap
#
# example:
#   boomlings.com/database/
#   example.com/aaaaaaaaaa/
#               ^^^^^^^^^^^
#
# leaving blank will disable this
append_path = ""
# where can your server be accessible?
# for dev environments, "localhost:8080" will do
# otherwise, try something like "gdpstest.oat.zone"
hostname = "localhost:8080"
# if you're putting the server behind nginx or cloudflare,
# keep this on to keep ips accurate
trust_proxy = true
# 🤫
easter_eggs = false

[formatting]
# whether to format dates as relative or absolute
# "relative" = relative, "absolute" = absolute
# do note that absolute times can result in uglier
# times due to colons being forbiddne in certain
# spots
date = "relative"

[comments]
# comments with a like count <= this number
# will be marked as spam
spam_thres = -3

[accounts]
# allow new accounts to be created
allow_registration = true

# determine what permissions different ranks of users get
# ranks (based on `position`) will get all perms of
# ranks below (<) their own
# todo: document this fully
[ranks.everyone]
position = 0
[ranks.everyone.permissions]
upload_levels = true        # todo: unimplemented
backup_save = true          # todo: unimplemented
level_comment = true        # todo: unimplemented
profile_comment = true      # todo: unimplemented
leaderboard = true          # todo: unimplemented
level_leaderboard = true    # todo: unimplemented
send_friend_requests = true # todo: unimplemented
send_messages = true        # todo: unimplemented

reupload_songs = true       # todo: unimplemented
reupload_levels = true      # todo: unimplemented

[ranks.mod]
position = 1
badge = 1
is_mod = true # can request mod access ingame
text_color = [200, 255, 200]
[ranks.mod.permissions]
rate_levels = true
rate_levels_demon = true # todo: unimplemented

[ranks.eldermod]
position = 2
badge = 2
is_mod = true
text_color = [75, 255, 75]
[ranks.eldermod.permissions]
delete_level_comments = true # todo: unimplemented
delete_others_levels = true  # todo: unimplemented

[sessions]
# allow sessions to be created (for 1.9, as it
# doesn't send the password for authentication
# in any shape or form, making relying on ip
# addresses the only secure way of accessing
# the server)
allow = true

# how long the session should last for (in seconds)
expiry_time = 604800

[reuploads]
# allow reuploading levels from other servers
allowed = true

[chests]
enabled = true

# these are the vanilla values, but free for you to tweak
[chests.small]
# in seconds
timer = 14400 # 4hr
orbs_min = 20
orbs_max = 50
orbs_increment = 5
diamonds_min = 1
diamonds_max = 4
shards_min = 0
shards_max = 1
keys_min = 0
keys_max = 1

[chests.large]
# in seconds
timer = 86400 # 24hr
orbs_min = 100
orbs_max = 300
orbs_increment = 25
diamonds_min = 4
diamonds_max = 10
shards_min = 1
shards_max = 2
keys_min = 0
keys_max = 1

[quests]
enabled = true
# in seconds
timer = 21600 # 6hr

# top slot quests
[[quests.tier_1]]
name = "Orb Finder"
required_type = "orb"
required_amt = 200
reward_diamonds = 5

[[quests.tier_1]]
name = "Star Finder"
required_type = "star"
required_amt = 5
reward_diamonds = 5

[[quests.tier_1]]
name = "Coin Finder"
required_type = "coin"
required_amt = 2
reward_diamonds = 5

# middle slot quests
[[quests.tier_2]]
name = "Orb Collector"
required_type = "orb"
required_amt = 500
reward_diamonds = 10

[[quests.tier_2]]
name = "Star Collector"
required_type = "star"
required_amt = 10
reward_diamonds = 10

[[quests.tier_2]]
name = "Coin Collector"
required_type = "coin"
required_amt = 4
reward_diamonds = 10

# bottom slot quests
[[quests.tier_3]]
name = "Orb Master"
required_type = "orb"
required_amt = 1000
reward_diamonds = 15

[[quests.tier_3]]
name = "Star Master"
required_type = "star"
required_amt = 15
reward_diamonds = 15

[[quests.tier_3]]
name = "Coin Master"
required_type = "coin"
required_amt = 6
reward_diamonds = 15


[voting]
# allow votes to influence a level's difficulty when it
# hasn't been set yet. when set to false, all unrated
# levels will be NA
allow_votes = true
# same as above, but for demon difficulties
# this will let people vote and influence a demon'S
# difficulty past its original demon rating
allow_demon_votes = true
# the minimum amount of votes before a level's difficulty
# will go from NA to the average
min_votes = 10
# same as above, but for demon ratings
min_demon_votes = 10

[levels]
# prevent users from deleting their own levels
# if they are rated
prevent_deletion_rated = true
# prevent users from deleting their own levels
# if they are featured
prevent_deletion_featured = true
# prevents levels above a certain object count from
# being uploaded
# works best with levels.parsing.enabled = true
# set to 0 to disable
max_objects = 80_000

[levels.creator_points]
# how many creator points to award per type of event
rated = 1
featured = 1
epic = 1
daily = 0
weekly = 0
mappack = 0
gauntlet = 0

[levels.parsing]
# parse the level to extract data and enforce
# rulesets. makes uploads a tiny bit slower and
# less stable
enabled = true

# a list of ids to prevent levels from including
# see ID 58079690 on vanilla GD servers
object_blocklist = [ 31 ] # 31 : start pos
#object_blocklist = [ 901, 1006, 1007, 1049, 1268, 1346, 1347, 1520, 1585, 1595, 1611, 1612, 1613, 1616, 1811, 1812, 1814, 1815, 1817, 1818, 1819 ] # every 2.0+ trigger, essentially turns your server into a 1.9 gdps

# a list of ids to exclusively allow; leave empty
# to disable
object_allowlist = [ ]

[songs]
# allow custom songs in general to be used,
# whether it be non-newgrounds or newgrounds ones
allow_custom_songs = true
# pushes all non-newgrounds songs above an arbitrary
# id to prevent collisions with newgrounds ids, meaning
# all song ids that work in vanilla GD will work
# on the server
preserve_newgrounds_ids = true

[songs.sources]
# allow ALL sources that yt-dlp supports for music
# this is a BAD idea for many reasons
allow_all_sources = false

# lets you support much more sites but may result in much
# slower download speeds and more bandwidth. requires ffmpeg
allow_transcoding = true

# location of your yt-dlp binary. get one here: https://github.com/yt-dlp/yt-dlp/releases/tag/2022.11.11
# defaults to checking through path
ytdlp_binary = "/usr/bin/yt-dlp"

# location of your ffmpeg binary. get one here: https://ffmpeg.org/download.html
# allows for transcoding
# defaults to checking through path
ffmpeg_binary = "/usr/bin/ffmpeg"

# leads to more stable downloads at the cost of
# using up much more storage to store every song
#
# required for allow_transcoding
proxy_downloads = true

# expressed in seconds
max_duration = 600

# expressed in bytes
max_filesize = 10000000 # = 10MB

# see: https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md
# not every source is supported, and most video sites will fail w/o transcoding enabled
[songs.sources.newgrounds]
allow = true

[songs.sources.youtube]
allow = true

[songs.sources.soundcloud]
allow = true

[songs.sources.generic]
# direct URLs and similar
allow = true
