# lundlucenany9/velochat architecture

> Architecture diagram of the GitHub repository lundlucenany9/velochat, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/lundlucenany9/velochat
- Repository: https://github.com/lundlucenany9/velochat

## Overview

Velochat is a Velocity proxy chat plugin. Players send public chat, private messages, or visual replies; the plugin filters and formats messages, routes them to recipients, and can bridge chat and replies with Discord or other proxy servers. Moderation and player block relationships affect delivery, while TOML configuration and message templates shape behavior. The map retains the README’s command capabilities; several command implementations and startup/configuration sources were not sampled, so uncertain call links are omitted.

Main entry points: [`src/main/java/de/lundlucenany9/velochat/ReplyService.java`](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/ReplyService.java) (Reply delivery), [`src/main/java/de/lundlucenany9/velochat/Velochat.java`](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/Velochat.java) (Plugin runtime), [`src/main/java/de/lundlucenany9/velochat/commands/MsgCommand.java`](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/MsgCommand.java) (Private messages), [`src/main/java/de/lundlucenany9/velochat/discord/MessageReceiveListener.java`](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/discord/MessageReceiveListener.java) (Discord ingress)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_chat["Chat and filtering"]
  node_chat_listener["Chat listener<br/>[ChatListener.java]"]
  node_filter["Message filters"]
  node_parser["Chat parser<br/>[FormatParser.java]"]
  node_messages["Public messages<br/>[MessageUtil.java]"]
end

subgraph group_commands["Player and moderator commands"]
  node_msg_command["Private messages<br/>[MsgCommand.java]"]
  node_reply_command["Public replies<br/>[ReplyCommand.java]"]
  node_broadcast_command["Broadcast"]
  node_mute_commands["Mute controls<br/>[MuteCommand.java]"]
  node_block_commands["Block controls<br/>[BlockCommand.java]"]
  node_reload_command["Configuration reload<br/>[ReloadCommand.java]"]
end

subgraph group_state["Reply and moderation state"]
  node_reply_service["Reply delivery<br/>[ReplyService.java]"]
  node_reply_registry[("Reply contexts<br/>[ReplyRegistry.java]")]
  node_mute_manager[("Mute state<br/>[MuteManager.java]")]
  node_block_manager[("Block relationships<br/>[BlockManager.java]")]
  node_spam_manager["Spam detection<br/>[SpamManager.java]"]
end

subgraph group_integrations["Configuration and integrations"]
  node_plugin["Plugin runtime<br/>[Velochat.java]"]
  node_config["TOML settings<br/>[Config.java]"]
  node_message_templates["Message templates<br/>[Messages.java]"]
  node_transport["Proxy transport"]
  node_discord_listener["Discord ingress"]
  node_discord_bot["Discord bot"]
  node_discord_service["Discord service<br/>[DiscordBot.java]"]
end

node_players(("Players"))
node_discord_users(("Discord users"))
node_discord(("Discord"))

node_players -->|"send chat"| node_chat_listener
node_chat_listener -->|"filter text"| node_filter
node_chat_listener -->|"forward chat"| node_parser
node_players -->|"send privately"| node_msg_command
node_msg_command -->|"check blocks"| node_block_manager
node_msg_command -->|"format message"| node_parser
node_msg_command -->|"register context"| node_reply_registry
node_players -->|"request reply"| node_reply_command
node_reply_command -->|"filter text"| node_filter
node_reply_command -->|"send reply"| node_reply_service
node_reply_service -->|"register context"| node_reply_registry
node_reply_service -->|"format reply"| node_parser
node_reply_service -->|"check blocks"| node_block_manager
node_players -->|"broadcast"| node_broadcast_command
node_players -->|"moderate players"| node_mute_commands
node_mute_commands -->|"set mute"| node_mute_manager
node_players -->|"manage blocks"| node_block_commands
node_block_commands -->|"change blocks"| node_block_manager
node_players -->|"reload settings"| node_reload_command
node_plugin -->|"load settings"| node_config
node_plugin -->|"load templates"| node_message_templates
node_plugin -->|"register listener"| node_chat_listener
node_plugin -->|"initialize transport"| node_transport
node_discord -->|"send messages"| node_discord_listener
node_discord_listener -->|"filter text"| node_filter
node_discord_listener -->|"forward chat"| node_parser
node_discord_listener -->|"send reply"| node_reply_service
node_reply_service -.->|"send Discord reply"| node_discord_service
node_discord_service -->|"implemented by"| node_discord_bot
node_discord_bot -->|"send messages"| node_discord
node_transport -.->|"deliver proxy messages"| node_players

click node_chat_listener "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/listeners/ChatListener.java"
click node_filter "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/MessageFilterUtil.java"
click node_parser "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/FormatParser.java"
click node_messages "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/MessageUtil.java"
click node_msg_command "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/MsgCommand.java"
click node_reply_command "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/ReplyCommand.java"
click node_broadcast_command "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/BroadcastCommand.java"
click node_mute_commands "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/MuteCommand.java"
click node_block_commands "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/BlockCommand.java"
click node_reload_command "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/ReloadCommand.java"
click node_reply_service "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/ReplyService.java"
click node_reply_registry "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/ReplyRegistry.java"
click node_mute_manager "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/MuteManager.java"
click node_block_manager "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/BlockManager.java"
click node_spam_manager "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/SpamManager.java"
click node_plugin "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/Velochat.java"
click node_config "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/Config.java"
click node_message_templates "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/Messages.java"
click node_transport "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/MessageHandler.java"
click node_discord_listener "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/discord/MessageReceiveListener.java"
click node_discord_bot "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/discord/EnabledDiscordBot.java"
click node_discord_service "https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/discord/DiscordBot.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_chat_listener,node_filter,node_parser,node_messages,node_discord_users toneBlue
class node_msg_command,node_reply_command,node_broadcast_command,node_mute_commands,node_block_commands,node_reload_command toneAmber
class node_reply_service,node_reply_registry,node_mute_manager,node_block_manager,node_spam_manager toneMint
class node_plugin,node_config,node_message_templates,node_transport,node_discord_listener,node_discord_bot,node_discord_service toneRose
class node_players,node_discord toneIndigo
```

## Components

### Chat and filtering

- [Chat listener](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/listeners/ChatListener.java): `src/main/java/de/lundlucenany9/velochat/listeners/ChatListener.java`
- [Message filters](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/MessageFilterUtil.java): `src/main/java/de/lundlucenany9/velochat/MessageFilterUtil.java`
- [Chat parser](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/FormatParser.java): `src/main/java/de/lundlucenany9/velochat/FormatParser.java`
- [Public messages](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/MessageUtil.java): `src/main/java/de/lundlucenany9/velochat/MessageUtil.java`

### Player and moderator commands

- [Private messages](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/MsgCommand.java): `src/main/java/de/lundlucenany9/velochat/commands/MsgCommand.java`
- [Public replies](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/ReplyCommand.java): `src/main/java/de/lundlucenany9/velochat/commands/ReplyCommand.java`
- [Broadcast](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/BroadcastCommand.java): `src/main/java/de/lundlucenany9/velochat/commands/BroadcastCommand.java`
- [Mute controls](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/MuteCommand.java): `src/main/java/de/lundlucenany9/velochat/commands/MuteCommand.java`
- [Block controls](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/BlockCommand.java): `src/main/java/de/lundlucenany9/velochat/commands/BlockCommand.java`
- [Configuration reload](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/commands/ReloadCommand.java): `src/main/java/de/lundlucenany9/velochat/commands/ReloadCommand.java`

### Reply and moderation state

- [Reply delivery](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/ReplyService.java): `src/main/java/de/lundlucenany9/velochat/ReplyService.java`
- [Reply contexts](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/ReplyRegistry.java): `src/main/java/de/lundlucenany9/velochat/ReplyRegistry.java`
- [Mute state](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/MuteManager.java): `src/main/java/de/lundlucenany9/velochat/MuteManager.java`
- [Block relationships](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/BlockManager.java): `src/main/java/de/lundlucenany9/velochat/BlockManager.java`
- [Spam detection](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/SpamManager.java): `src/main/java/de/lundlucenany9/velochat/SpamManager.java`

### Configuration and integrations

- [Plugin runtime](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/Velochat.java): `src/main/java/de/lundlucenany9/velochat/Velochat.java`
- [TOML settings](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/Config.java): `src/main/java/de/lundlucenany9/velochat/Config.java`
- [Message templates](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/Messages.java): `src/main/java/de/lundlucenany9/velochat/Messages.java`
- [Proxy transport](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/MessageHandler.java): `src/main/java/de/lundlucenany9/velochat/MessageHandler.java`
- [Discord ingress](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/discord/MessageReceiveListener.java): `src/main/java/de/lundlucenany9/velochat/discord/MessageReceiveListener.java`
- [Discord bot](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/discord/EnabledDiscordBot.java): `src/main/java/de/lundlucenany9/velochat/discord/EnabledDiscordBot.java`
- [Discord service](https://github.com/lundlucenany9/velochat/blob/main/src/main/java/de/lundlucenany9/velochat/discord/DiscordBot.java): `src/main/java/de/lundlucenany9/velochat/discord/DiscordBot.java`

### Other components

- **Players**
- **Discord users**
- **Discord**

## Connections

- Players → Chat listener: send chat
- Chat listener → Message filters: filter text
- Chat listener → Chat parser: forward chat
- Players → Private messages: send privately
- Private messages → Block relationships: check blocks
- Private messages → Chat parser: format message
- Private messages → Reply contexts: register context
- Players → Public replies: request reply
- Public replies → Message filters: filter text
- Public replies → Reply delivery: send reply
- Reply delivery → Reply contexts: register context
- Reply delivery → Chat parser: format reply
- Reply delivery → Block relationships: check blocks
- Players → Broadcast: broadcast
- Players → Mute controls: moderate players
- Mute controls → Mute state: set mute
- Players → Block controls: manage blocks
- Block controls → Block relationships: change blocks
- Players → Configuration reload: reload settings
- Plugin runtime → TOML settings: load settings
- Plugin runtime → Message templates: load templates
- Plugin runtime → Chat listener: register listener
- Plugin runtime → Proxy transport: initialize transport
- Discord → Discord ingress: send messages
- Discord ingress → Message filters: filter text
- Discord ingress → Chat parser: forward chat
- Discord ingress → Reply delivery: send reply
- Reply delivery → Discord service: send Discord reply
- Discord service → Discord bot: implemented by
- Discord bot → Discord: send messages
- Proxy transport → Players: deliver proxy messages
