# 6078hitheday/bc-stock-mod architecture

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

- Interactive diagram: https://gitdiagram.com/6078hitheday/bc-stock-mod
- Repository: https://github.com/6078hitheday/bc-stock-mod

## Overview

BCStock is a client-side Fabric mod that brings Palaren stock-market data into Minecraft HUDs and screens, supports manual chat-command trades, and maintains local history. Its main workflow refreshes public market data and gathers personal data from game chat replies or read-only container probing, normalizes it into snapshots, and displays it for monitoring and decisions. Manual trades require quantity selection and explicit confirmation; configured automatic modes are a separate path. The README documents the major capabilities; only selected source excerpts were available, so uncertain internal wiring is omitted.

Main entry points: [`src/main/java/cn/myflycat/bcstock/data/CommandGateway.java`](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/CommandGateway.java) (Command gateway), [`src/main/java/cn/myflycat/bcstock/data/SnapshotStore.java`](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/SnapshotStore.java) (Market snapshot), [`src/main/java/cn/myflycat/bcstock/BcStockClient.java`](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/BcStockClient.java) (Client bootstrap), [`src/main/java/cn/myflycat/bcstock/data/MarketRefreshCoordinator.java`](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/MarketRefreshCoordinator.java) (Market refresh)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Client runtime"]
  node_client["Client bootstrap<br/>[BcStockClient.java]"]
  node_config["Runtime settings<br/>[ConfigRuntime.java]"]
  node_mixin["Network hooks"]
end

subgraph group_data["Market data"]
  node_refresh["Market refresh"]
  node_api["API client<br/>[ApiClient.java]"]
  node_gateway["Command gateway"]
  node_probe["Container probe<br/>[InvestProbe.java]"]
  node_snapshot[("Market snapshot<br/>[SnapshotStore.java]")]
  node_cache[("Market caches<br/>[MarketCache.java]")]
end

subgraph group_experience["Player experience"]
  node_board["Market board"]
  node_detail["Company detail<br/>[DetailScreen.java]"]
  node_hud["Quote HUD<br/>[StockHud.java]"]
  node_alerts["Local alerts"]
  node_quantity["Quantity dialog"]
  node_confirm["Trade confirmation"]
end

subgraph group_decisions["Decision and trading"]
  node_decision["Decision engine"]
  node_preset["Decision presets"]
  node_planner["Auto-trade planner"]
  node_executor["Auto-trade executor"]
end

subgraph group_history["Local history"]
  node_ledger[("Trade ledger<br/>[LedgerStore.java]")]
  node_journal[("Snapshot journal")]
end

node_player(("Player"))
node_server{{"Bilicraft server"}}
node_marketapi{{"Market HTTP API"}}

node_player -->|"opens with K"| node_board
node_player -->|"toggles with H"| node_hud
node_client -->|"starts polling"| node_refresh
node_refresh -->|"requests quotes"| node_api
node_api -->|"reads market data"| node_marketapi
node_refresh -->|"updates snapshot"| node_snapshot
node_client -->|"wires command sender"| node_gateway
node_gateway -->|"sends chat commands"| node_server
node_server -->|"sends chat and slots"| node_mixin
node_mixin -->|"forwards chat replies"| node_gateway
node_gateway -->|"applies parsed replies"| node_snapshot
node_mixin -->|"signals slot updates"| node_probe
node_probe -->|"reads container data"| node_server
node_board -->|"reads snapshot"| node_snapshot
node_detail -->|"reads company data"| node_snapshot
node_hud -->|"reads snapshot"| node_snapshot
node_alerts -->|"checks local data"| node_snapshot
node_board -->|"opens details"| node_detail
node_board -->|"starts manual trade"| node_quantity
node_quantity -->|"submits draft"| node_confirm
node_confirm -->|"sends on confirmation"| node_gateway
node_decision -->|"uses thresholds"| node_preset
node_detail -->|"shows advice"| node_decision
node_planner -->|"evaluates advice"| node_decision
node_executor -->|"requests trade plan"| node_planner
node_executor -->|"dispatches trade"| node_gateway
node_client -->|"initializes per player"| node_ledger
node_gateway -->|"records fills"| node_ledger
node_client -->|"restores snapshots"| node_journal
node_snapshot -->|"persists snapshots"| node_journal
node_refresh -->|"uses market cache"| node_cache
node_client -->|"loads settings"| node_config
node_config -->|"sets API options"| node_refresh
node_config -->|"sets trade limits"| node_planner

click node_client "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/BcStockClient.java"
click node_config "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/config/ConfigRuntime.java"
click node_refresh "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/MarketRefreshCoordinator.java"
click node_api "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/ApiClient.java"
click node_gateway "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/CommandGateway.java"
click node_mixin "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/mixin/ClientPlayNetworkHandlerMixin.java"
click node_probe "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/probe/InvestProbe.java"
click node_snapshot "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/SnapshotStore.java"
click node_cache "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/MarketCache.java"
click node_board "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/StockBoardScreen.java"
click node_detail "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/DetailScreen.java"
click node_hud "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/StockHud.java"
click node_alerts "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/LocalAlertBridge.java"
click node_decision "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/decision/DecisionEngine.java"
click node_preset "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/decision/DecisionPreset.java"
click node_planner "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/decision/AutoTradePlanner.java"
click node_executor "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/AutoTradeExecutor.java"
click node_quantity "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/QtyDialogScreen.java"
click node_confirm "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/TradeConfirmScreen.java"
click node_ledger "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/LedgerStore.java"
click node_journal "https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/SnapshotJournal.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_client,node_config,node_mixin toneBlue
class node_refresh,node_api,node_gateway,node_probe,node_snapshot,node_cache toneAmber
class node_board,node_detail,node_hud,node_alerts,node_quantity,node_confirm,node_server,node_marketapi toneMint
class node_decision,node_preset,node_planner,node_executor toneRose
class node_ledger,node_journal,node_player toneIndigo
```

## Components

### Client runtime

- [Client bootstrap](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/BcStockClient.java): `src/main/java/cn/myflycat/bcstock/BcStockClient.java`
- [Runtime settings](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/config/ConfigRuntime.java): `src/main/java/cn/myflycat/bcstock/config/ConfigRuntime.java`
- [Network hooks](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/mixin/ClientPlayNetworkHandlerMixin.java): `src/main/java/cn/myflycat/bcstock/mixin/ClientPlayNetworkHandlerMixin.java`

### Market data

- [Market refresh](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/MarketRefreshCoordinator.java): `src/main/java/cn/myflycat/bcstock/data/MarketRefreshCoordinator.java`
- [API client](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/ApiClient.java): `src/main/java/cn/myflycat/bcstock/data/ApiClient.java`
- [Command gateway](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/CommandGateway.java): `src/main/java/cn/myflycat/bcstock/data/CommandGateway.java`
- [Container probe](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/probe/InvestProbe.java): `src/main/java/cn/myflycat/bcstock/probe/InvestProbe.java`
- [Market snapshot](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/SnapshotStore.java): `src/main/java/cn/myflycat/bcstock/data/SnapshotStore.java`
- [Market caches](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/MarketCache.java): `src/main/java/cn/myflycat/bcstock/data/MarketCache.java`

### Player experience

- [Market board](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/StockBoardScreen.java): `src/main/java/cn/myflycat/bcstock/ui/StockBoardScreen.java`
- [Company detail](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/DetailScreen.java): `src/main/java/cn/myflycat/bcstock/ui/DetailScreen.java`
- [Quote HUD](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/StockHud.java): `src/main/java/cn/myflycat/bcstock/ui/StockHud.java`
- [Local alerts](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/LocalAlertBridge.java): `src/main/java/cn/myflycat/bcstock/ui/LocalAlertBridge.java`
- [Quantity dialog](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/QtyDialogScreen.java): `src/main/java/cn/myflycat/bcstock/ui/QtyDialogScreen.java`
- [Trade confirmation](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/ui/TradeConfirmScreen.java): `src/main/java/cn/myflycat/bcstock/ui/TradeConfirmScreen.java`

### Decision and trading

- [Decision engine](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/decision/DecisionEngine.java): `src/main/java/cn/myflycat/bcstock/decision/DecisionEngine.java`
- [Decision presets](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/decision/DecisionPreset.java): `src/main/java/cn/myflycat/bcstock/decision/DecisionPreset.java`
- [Auto-trade planner](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/decision/AutoTradePlanner.java): `src/main/java/cn/myflycat/bcstock/decision/AutoTradePlanner.java`
- [Auto-trade executor](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/AutoTradeExecutor.java): `src/main/java/cn/myflycat/bcstock/data/AutoTradeExecutor.java`

### Local history

- [Trade ledger](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/LedgerStore.java): `src/main/java/cn/myflycat/bcstock/data/LedgerStore.java`
- [Snapshot journal](https://github.com/6078hitheday/bc-stock-mod/blob/main/src/main/java/cn/myflycat/bcstock/data/SnapshotJournal.java): `src/main/java/cn/myflycat/bcstock/data/SnapshotJournal.java`

### Other components

- **Player**
- **Bilicraft server**
- **Market HTTP API**

## Connections

- Player → Market board: opens with K
- Player → Quote HUD: toggles with H
- Client bootstrap → Market refresh: starts polling
- Market refresh → API client: requests quotes
- API client → Market HTTP API: reads market data
- Market refresh → Market snapshot: updates snapshot
- Client bootstrap → Command gateway: wires command sender
- Command gateway → Bilicraft server: sends chat commands
- Bilicraft server → Network hooks: sends chat and slots
- Network hooks → Command gateway: forwards chat replies
- Command gateway → Market snapshot: applies parsed replies
- Network hooks → Container probe: signals slot updates
- Container probe → Bilicraft server: reads container data
- Market board → Market snapshot: reads snapshot
- Company detail → Market snapshot: reads company data
- Quote HUD → Market snapshot: reads snapshot
- Local alerts → Market snapshot: checks local data
- Market board → Company detail: opens details
- Market board → Quantity dialog: starts manual trade
- Quantity dialog → Trade confirmation: submits draft
- Trade confirmation → Command gateway: sends on confirmation
- Decision engine → Decision presets: uses thresholds
- Company detail → Decision engine: shows advice
- Auto-trade planner → Decision engine: evaluates advice
- Auto-trade executor → Auto-trade planner: requests trade plan
- Auto-trade executor → Command gateway: dispatches trade
- Client bootstrap → Trade ledger: initializes per player
- Command gateway → Trade ledger: records fills
- Client bootstrap → Snapshot journal: restores snapshots
- Market snapshot → Snapshot journal: persists snapshots
- Market refresh → Market caches: uses market cache
- Client bootstrap → Runtime settings: loads settings
- Runtime settings → Market refresh: sets API options
- Runtime settings → Auto-trade planner: sets trade limits
