# thegabr0/playtimemanager architecture

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

- Interactive diagram: https://gitdiagram.com/thegabr0/playtimemanager
- Repository: https://github.com/thegabr0/playtimemanager

## Overview

PlayTimeManager is a Minecraft server plugin for tracking player playtime and turning it into statistics, rewards, and administrative actions. The main workflow starts with server lifecycle and player events, maintains online and cached player state, and persists that state through configurable database backends. Separate product branches provide goals, join-streak rewards, commands and GUIs, placeholders, AFK detection, and LuckPerms actions. The supplied excerpts and source index show some wiring directly; links for documented but unsampled capabilities are marked dashed and unverified.

Main entry points: [`src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java) (Plugin lifecycle), [`src/main/java/me/thegabro/playtimemanager/Users/OnlineUsersManager.java`](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Users/OnlineUsersManager.java) (Online user manager), [`src/main/java/me/thegabro/playtimemanager/Database/DatabaseHandler.java`](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Database/DatabaseHandler.java) (Database access), [`src/main/java/me/thegabro/playtimemanager/Goals/GoalsManager.java`](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Goals/GoalsManager.java) (Playtime goals)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Plugin runtime"]
  node_plugin["Plugin lifecycle"]
  node_config["Configuration<br/>[Configuration.java]"]
  node_updates["Data and config upgrades<br/>[UpdateManager.java]"]
end

subgraph group_tracking["Player tracking"]
  node_events["Player events"]
  node_online["Online player state<br/>[OnlineUser.java]"]
  node_online_mgr["Online user manager"]
  node_offline_mgr["Cached player records"]
end

subgraph group_rewards["Goals and rewards"]
  node_goals["Playtime goals<br/>[GoalsManager.java]"]
  node_goal_model["Goal rules<br/>[Goal.java]"]
  node_streaks["Join-streak rewards"]
  node_reward_registry["Reward registry"]
end

subgraph group_interface["Player and admin interfaces"]
  node_commands["Commands"]
  node_guis["Admin and player GUIs"]
  node_formats["Playtime formatting"]
end

subgraph group_integrations["Integrations and storage"]
  node_placeholders["PlaceholderAPI expansion"]
  node_afk["AFK detection<br/>[AFKManager.java]"]
  node_luckperms["LuckPerms actions"]
  node_db_handler["Database access"]
  node_db_backends[("SQL backends")]
end

node_server(("Minecraft server"))

node_server -.->|"loads plugin"| node_plugin
node_plugin -->|"loads config"| node_config
node_plugin -->|"initializes updates"| node_updates
node_plugin -->|"registers commands"| node_commands
node_plugin -->|"initializes detection"| node_afk
node_plugin -->|"registers expansion"| node_placeholders
node_plugin -->|"initializes tracking"| node_online_mgr
node_plugin -->|"opens database"| node_db_handler
node_plugin -.->|"registers listeners"| node_events
node_events -.->|"updates player state"| node_online_mgr
node_online_mgr -->|"checks player goals"| node_goals
node_goals -->|"loads and checks"| node_goal_model
node_commands -->|"requests player data"| node_offline_mgr
node_online -->|"persists player state"| node_db_handler
node_offline_mgr -->|"loads player records"| node_db_handler
node_db_handler -.->|"creates backend"| node_db_backends
node_plugin -.->|"initializes rewards"| node_streaks
node_streaks -->|"loads reward definitions"| node_reward_registry
node_plugin -.->|"registers interfaces"| node_guis
node_plugin -->|"initializes formats"| node_formats
node_afk -.->|"excludes idle time"| node_online
node_goals -.->|"grants configured rewards"| node_luckperms
node_streaks -.->|"grants configured rewards"| node_luckperms
node_placeholders -.->|"reads player state"| node_online_mgr
node_commands -.->|"formats playtime"| node_formats

click node_plugin "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java"
click node_config "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Configuration.java"
click node_events "https://github.com/thegabr0/playtimemanager/tree/main/src/main/java/me/thegabro/playtimemanager/Events"
click node_online "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Users/OnlineUser.java"
click node_online_mgr "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Users/OnlineUsersManager.java"
click node_offline_mgr "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Users/DBUsersManager.java"
click node_goals "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Goals/GoalsManager.java"
click node_goal_model "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Goals/Goal.java"
click node_streaks "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/JoinStreaks/ManagingClasses/JoinStreaksManager.java"
click node_reward_registry "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/JoinStreaks/ManagingClasses/RewardRegistry.java"
click node_commands "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Commands/PlayTimeCommandManager/PlayTimeCommandManager.java"
click node_guis "https://github.com/thegabr0/playtimemanager/tree/main/src/main/java/me/thegabro/playtimemanager/GUIs"
click node_formats "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Customizations/PlaytimeFormats/PlaytimeFormat.java"
click node_placeholders "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/ExternalPluginSupport/PlaceHolders/PlayTimePlaceHolders.java"
click node_afk "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/ExternalPluginSupport/AFKManager.java"
click node_luckperms "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/ExternalPluginSupport/LuckPerms/LuckPermsManager.java"
click node_db_handler "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Database/DatabaseHandler.java"
click node_db_backends "https://github.com/thegabr0/playtimemanager/tree/main/src/main/java/me/thegabro/playtimemanager/Database/DatabaseTypes"
click node_updates "https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Updates/UpdateManager.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_plugin,node_config,node_updates toneBlue
class node_events,node_online,node_online_mgr,node_offline_mgr toneAmber
class node_goals,node_goal_model,node_streaks,node_reward_registry,node_server toneMint
class node_commands,node_guis,node_formats toneRose
class node_placeholders,node_afk,node_luckperms,node_db_handler,node_db_backends toneIndigo
```

## Components

### Plugin runtime

- [Plugin lifecycle](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java): `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`
- [Configuration](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Configuration.java): `src/main/java/me/thegabro/playtimemanager/Configuration.java`
- [Data and config upgrades](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Updates/UpdateManager.java): `src/main/java/me/thegabro/playtimemanager/Updates/UpdateManager.java`

### Player tracking

- [Player events](https://github.com/thegabr0/playtimemanager/tree/main/src/main/java/me/thegabro/playtimemanager/Events): `src/main/java/me/thegabro/playtimemanager/Events`
- [Online player state](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Users/OnlineUser.java): `src/main/java/me/thegabro/playtimemanager/Users/OnlineUser.java`
- [Online user manager](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Users/OnlineUsersManager.java): `src/main/java/me/thegabro/playtimemanager/Users/OnlineUsersManager.java`
- [Cached player records](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Users/DBUsersManager.java): `src/main/java/me/thegabro/playtimemanager/Users/DBUsersManager.java`

### Goals and rewards

- [Playtime goals](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Goals/GoalsManager.java): `src/main/java/me/thegabro/playtimemanager/Goals/GoalsManager.java`
- [Goal rules](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Goals/Goal.java): `src/main/java/me/thegabro/playtimemanager/Goals/Goal.java`
- [Join-streak rewards](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/JoinStreaks/ManagingClasses/JoinStreaksManager.java): `src/main/java/me/thegabro/playtimemanager/JoinStreaks/ManagingClasses/JoinStreaksManager.java`
- [Reward registry](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/JoinStreaks/ManagingClasses/RewardRegistry.java): `src/main/java/me/thegabro/playtimemanager/JoinStreaks/ManagingClasses/RewardRegistry.java`

### Player and admin interfaces

- [Commands](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Commands/PlayTimeCommandManager/PlayTimeCommandManager.java): `src/main/java/me/thegabro/playtimemanager/Commands/PlayTimeCommandManager/PlayTimeCommandManager.java`
- [Admin and player GUIs](https://github.com/thegabr0/playtimemanager/tree/main/src/main/java/me/thegabro/playtimemanager/GUIs): `src/main/java/me/thegabro/playtimemanager/GUIs`
- [Playtime formatting](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Customizations/PlaytimeFormats/PlaytimeFormat.java): `src/main/java/me/thegabro/playtimemanager/Customizations/PlaytimeFormats/PlaytimeFormat.java`

### Integrations and storage

- [PlaceholderAPI expansion](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/ExternalPluginSupport/PlaceHolders/PlayTimePlaceHolders.java): `src/main/java/me/thegabro/playtimemanager/ExternalPluginSupport/PlaceHolders/PlayTimePlaceHolders.java`
- [AFK detection](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/ExternalPluginSupport/AFKManager.java): `src/main/java/me/thegabro/playtimemanager/ExternalPluginSupport/AFKManager.java`
- [LuckPerms actions](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/ExternalPluginSupport/LuckPerms/LuckPermsManager.java): `src/main/java/me/thegabro/playtimemanager/ExternalPluginSupport/LuckPerms/LuckPermsManager.java`
- [Database access](https://github.com/thegabr0/playtimemanager/blob/main/src/main/java/me/thegabro/playtimemanager/Database/DatabaseHandler.java): `src/main/java/me/thegabro/playtimemanager/Database/DatabaseHandler.java`
- [SQL backends](https://github.com/thegabr0/playtimemanager/tree/main/src/main/java/me/thegabro/playtimemanager/Database/DatabaseTypes): `src/main/java/me/thegabro/playtimemanager/Database/DatabaseTypes`

### Other components

- **Minecraft server**

## Connections

- Minecraft server → Plugin lifecycle: loads plugin
- Plugin lifecycle → Configuration: loads config (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Plugin lifecycle → Data and config upgrades: initializes updates (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Plugin lifecycle → Commands: registers commands (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Plugin lifecycle → AFK detection: initializes detection (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Plugin lifecycle → PlaceholderAPI expansion: registers expansion (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Plugin lifecycle → Online user manager: initializes tracking (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Plugin lifecycle → Database access: opens database (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Plugin lifecycle → Player events: registers listeners (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Player events → Online user manager: updates player state (evidence: `src/main/java/me/thegabro/playtimemanager/Events/QuitEventManager.java`)
- Online user manager → Playtime goals: checks player goals (evidence: `src/main/java/me/thegabro/playtimemanager/Users/OnlineUsersManager.java`)
- Playtime goals → Goal rules: loads and checks (evidence: `src/main/java/me/thegabro/playtimemanager/Goals/GoalsManager.java`)
- Commands → Cached player records: requests player data (evidence: `src/main/java/me/thegabro/playtimemanager/Commands/PlayTimeCommandManager/PlayTimeCommandManager.java`)
- Online player state → Database access: persists player state (evidence: `src/main/java/me/thegabro/playtimemanager/Users/OnlineUser.java`)
- Cached player records → Database access: loads player records (evidence: `src/main/java/me/thegabro/playtimemanager/Users/DBUsersManager.java`)
- Database access → SQL backends: creates backend
- Plugin lifecycle → Join-streak rewards: initializes rewards (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Join-streak rewards → Reward registry: loads reward definitions (evidence: `src/main/java/me/thegabro/playtimemanager/JoinStreaks/ManagingClasses/JoinStreaksManager.java`)
- Plugin lifecycle → Admin and player GUIs: registers interfaces (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- Plugin lifecycle → Playtime formatting: initializes formats (evidence: `src/main/java/me/thegabro/playtimemanager/PlayTimeManager.java`)
- AFK detection → Online player state: excludes idle time
- Playtime goals → LuckPerms actions: grants configured rewards
- Join-streak rewards → LuckPerms actions: grants configured rewards
- PlaceholderAPI expansion → Online user manager: reads player state
- Commands → Playtime formatting: formats playtime
