# Configuration

```
Config = {}

-- =========================================================
-- CORE SETTINGS
-- =========================================================

-- Maximum distance (in meters) players can see head bubbles
Config.Distance = 25.0

-- Whether bubbles can be seen through walls
-- false = requires line of sight (recommended)
-- true  = visible through walls
Config.ShowThroughWalls = false

-- Server-side proximity filtering
-- true  = server only sends bubbles to nearby players (recommended, OneSync friendly)
-- false = server broadcasts to all players
Config.ServerSideFiltering = true

-- =========================================================
-- TIMING & LIFETIME
-- =========================================================

-- Base lifetime of a bubble in milliseconds
Config.BaseDurationMs = 4500

-- Extra lifetime added per character typed
Config.ExtraPerCharMs = 35

-- Minimum lifetime clamp (milliseconds)
Config.MinDurationMs = 2500

-- Maximum lifetime clamp (milliseconds)
Config.MaxDurationMs = 9000

-- =========================================================
-- UI & STACKING
-- =========================================================

-- Vertical spacing (in pixels) between stacked bubbles
-- Changing is not recommended unless you actually know what you're doing!
Config.StackSpacingPx = 62

-- =========================================================
-- LIMITS & SAFETY
-- =========================================================

-- Maximum number of active bubbles per player
Config.MaxActivePerPlayer = 2

-- Maximum allowed message length
-- Prevents spam and UI abuse
Config.MaxMessageLength = 120

-- =========================================================
-- BLACKLIST SYSTEM (WHOLE-WORD ONLY)
-- =========================================================

Config.Blacklist = {
  -- Enable or disable blacklist filtering
  Enabled = false,

  -- List of blocked words or phrases
  -- Matching is case-insensitive and whole-word only
  Words = {
    -- "exampleword",
    -- "bad phrase"
  },

  -- Message shown to the player when blocked
  -- Optional - adding {word} at the end of "word/phrase" will be replaced with the matched entry (example below)
  -- NotifyMessage = "~r~Blocked: message contains a blacklisted word/phrase: {word}."
  -- Player sees = "~r~Blocked: message contains a blacklisted word/phrase: exampleword." 
  NotifyMessage = "~r~Blocked: message contains a blacklisted word/phrase."
}

-- =========================================================
-- CHAT SUGGESTIONS
-- =========================================================

-- Adds autocomplete suggestions to the chat box
Config.ChatSuggestions = {
  Enabled = true
}

-- =========================================================
-- DISCORD WEBHOOK LOGGING
-- =========================================================
-- Webhook URL is stored in webhook.json for security
-- Identifiers logged:
--   • discord
--   • steam
--   • license
--

Config.WebhookLogging = {
  -- Master enable switch
  Enabled = false,

  -- Log successful /me /do etc usage
  LogCommandUses = true,

  -- Log blocked blacklist attempts
  LogBlacklistBlocks = true,

  -- Webhook username
  Username = "m_me_do",

  -- Optional webhook avatar URL
  AvatarUrl = ""
}

-- =========================================================
-- THEMES
-- =========================================================
-- Each command can have its own visual theme

Config.Themes = {
  me = {
    label  = "/me",
    accent = "rgba(80, 160, 255, 0.95)",
    bg     = "rgba(18, 26, 40, 0.70)",
    border = "rgba(120, 190, 255, 0.35)"
  },

  do_ = {
    label  = "/do",
    accent = "rgba(255, 215, 80, 0.95)",
    bg     = "rgba(40, 34, 18, 0.70)",
    border = "rgba(255, 230, 140, 0.35)"
  },

  polme = {
    label  = "/polme",
    accent = "rgba(70, 120, 255, 0.98)",
    bg     = "rgba(10, 18, 38, 0.70)",
    border = "rgba(90, 150, 255, 0.45)"
  },

  poldo = {
    label  = "/poldo",
    accent = "rgba(140, 180, 255, 0.98)",
    bg     = "rgba(10, 18, 38, 0.70)",
    border = "rgba(120, 200, 255, 0.35)"
  },

  medme = {
    label  = "/medme",
    accent = "rgba(60, 220, 170, 0.98)",
    bg     = "rgba(10, 34, 26, 0.70)",
    border = "rgba(90, 255, 205, 0.40)"
  },

  meddo = {
    label  = "/meddo",
    accent = "rgba(255, 110, 140, 0.98)",
    bg     = "rgba(40, 12, 20, 0.70)",
    border = "rgba(255, 140, 170, 0.38)"
  }
}

-- =========================================================
-- COMMAND NAMES
-- =========================================================

Config.Commands = {
  me = "me",
  do_ = "do",

  polme = "polme",
  poldo = "poldo",

  medme = "medme",
  meddo = "meddo",

  -- Toggle visibility
  toggle = "togme",

  -- Reload UI config
  reloadUi = "hbui"
}

-- =========================================================
-- PLAYER TOGGLE BEHAVIOR
-- =========================================================

Config.Toggle = {
  -- Persist toggle state using KVP
  Persist = true,

  -- Default state for new players
  DefaultOn = true,

  -- If true, toggle affects seeing bubbles from others
  AffectsReceiving = true,

  -- If true, toggle prevents sending bubbles
  AffectsSending = false
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mdevelopment.xyz/m-development-docs/documentation/md-me-do/configuration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
