Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ VotingPlugin Control is designed to manage and troubleshoot a VotingPlugin netwo
### Configuration

- Edit VotingPlugin's supported YAML files from the WebUI.
- Use **Full YAML** editing for advanced settings while automatically hiding known passwords, tokens, and other secrets.
- Use **Full YAML** editing for advanced settings while automatically hiding known passwords, tokens, and other secrets. Its node selector is independent of the workspace source and preserves guided setup drafts.
- Edit **General Settings** with a simple visual editor.
- Add, edit, and remove **Vote Sites** with a visual editor.
- Edit inline Vote Site rewards and supported named **Rewards/*.yml** files.
Expand Down Expand Up @@ -311,6 +311,12 @@ The disposable running-connector and packaged-browser validation boundaries are
at most 64 MiB, Control validates the ZIP structure and root `plugin.yml`, and every node re-verifies the SHA-256 before
staging. Staging never reloads or restarts a server; success is reported as `RESTART_REQUIRED`. Interrupted Control attempts
become failed durable history and require an explicit retry, preventing a pre-restart lease from authorizing a download.
Capability absence is not proof that the connector is old: proxy staging is unavailable on Windows, and a connector can
withhold the capability when it cannot prepare a safe local staging target. HTTP staging requires a literal local/private
Control endpoint, while HTTPS is strongly recommended because connector credentials and plugin artifacts otherwise cross
the network unencrypted. Bootstrap by installing a current VotingPlugin JAR manually once. The browser cannot add missing
staging code to an old node by itself. If a current node still omits the capability, check its log for the connector's
staging-unavailable warning; a node-side staging path or loaded-JAR discovery failure may need correction.

`data.inspect.v1` is a separate read-only lane for overview, vote-site health (including persisted unconfigured service
observations), exact-player data, bounded VoteLog summary/search/correlation trace, non-creating service-site resolution,
Expand Down
11 changes: 11 additions & 0 deletions docs/control-management.md
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,17 @@ configured site's `ServiceSite`; its separate truncation flag reports overflow.
VoteLogging is disabled and when automatic site creation is turned off. It is an inbox for review, not an automatic create
or approval action.

VotingPlugin stores that observation list at `VotingPlugin.GottenServiceSites` in `ServerData.yml`. Control reads it only
through the bounded inspection capability. The Vote Sites page and health results can copy one observed service into the
existing `vote-site` preset; the administrator must finish its fields and complete READ/PREVIEW/APPROVE/APPLY before the
site is created.

The Full YAML workbench has its own explicit single connected-node selector, independent of the multi-backend workspace
target set. Bukkit targets expose the fixed managed files and
existing named `Rewards/*.yml` files through their respective capabilities; proxy targets expose only the complete
`bungeeconfig.yml`. Named reward files are discovered by the Rewards inventory and opened in the same source-preserving,
redacted editor. The selector never grants arbitrary path access.

The dedicated `vote-logging` quick setup owns only `VoteLogging.Enabled`, `VoteLogging.PurgeDays` (`-1` disables automatic
purging, otherwise `1`–`3650`; `0` and other negatives are invalid), and `VoteLogging.UseMainMySQL`. It rejects unknown
options and never accepts or returns database connection fields or credentials. Its READ form takes no options and
Expand Down
18 changes: 9 additions & 9 deletions src/main/resources/web/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -179,13 +179,14 @@ p { line-height: 1.55; }
.setting-icon { display: grid; width: 39px; height: 39px; margin-bottom: 16px; place-items: center; border: 1px solid #37628d; border-radius: 10px; background: var(--blue-soft); color: #a9d4ff; font-size: 1.1rem; }
.editor-card { padding: 0; overflow: hidden; }
.editor-card > .section-title { padding: 21px 22px 17px; border-bottom: 1px solid var(--border); }
.editor-toolbar { display: grid; grid-template-columns: auto minmax(180px, 280px) 1fr; align-items: center; gap: 12px; padding: 12px 18px; border-bottom: 1px solid var(--border); background: #091421; }
.editor-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; padding: 12px 18px; border-bottom: 1px solid var(--border); background: #091421; }
.editor-field { display: flex; flex: 1 1 320px; flex-wrap: wrap; align-items: center; gap: 12px; min-width: 0; }
.editor-toolbar label { margin: 0; }
.editor-toolbar select { margin: 0; }
.editor-toolbar > span { justify-self: end; color: var(--muted); font-size: .78rem; }
.yaml-search-toolbar { display: grid; grid-template-columns: auto minmax(180px, 340px) auto auto 1fr auto; align-items: center; gap: 9px; padding: 10px 18px; border-bottom: 1px solid var(--border); background: #0b1726; }
.editor-toolbar select { flex: 1 1 180px; min-width: 0; max-width: 100%; margin: 0; }
.editor-toolbar > span { flex: 1 1 100%; overflow-wrap: anywhere; color: var(--muted); font-size: .78rem; }
.yaml-search-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 9px; padding: 10px 18px; border-bottom: 1px solid var(--border); background: #0b1726; }
.yaml-search-toolbar label { margin: 0; }
.yaml-search-toolbar input { margin: 0; }
.yaml-search-toolbar input { flex: 1 1 180px; min-width: 0; max-width: 100%; margin: 0; }
.yaml-search-toolbar output { color: var(--muted); font-size: .78rem; }
.yaml-workbench { display: grid; grid-template-columns: auto minmax(0, 1fr); min-height: 520px; overflow: hidden; background: #050c16; }
.yaml-line-numbers { min-width: 54px; height: 520px; margin: 0; padding: 20px 12px; overflow: hidden; border-right: 1px solid var(--border); background: #08111d; color: #62748a; text-align: right; user-select: none; font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace; font-size: .88rem; line-height: 1.55; }
Expand Down Expand Up @@ -307,10 +308,9 @@ li span { color: var(--muted); font-size: .9rem; }
.metrics, .settings-grid, .feature-grid, .checklist { grid-template-columns: 1fr; }
.metrics article { min-height: 92px; }
.subtabs button { padding-inline: 8px; }
.editor-toolbar { grid-template-columns: 1fr; }
.editor-toolbar > span { justify-self: start; }
.yaml-search-toolbar { grid-template-columns: 1fr 1fr; }
.yaml-search-toolbar label, .yaml-search-toolbar input, .yaml-search-toolbar output { grid-column: 1 / -1; }
.editor-field { flex-basis: 100%; flex-direction: column; align-items: stretch; }
.editor-toolbar select { flex-basis: auto; width: 100%; }
.yaml-search-toolbar label, .yaml-search-toolbar input, .yaml-search-toolbar output { flex-basis: 100%; }
.yaml-workbench { min-height: 420px; }
.yaml-line-numbers { height: 420px; min-width: 46px; padding: 16px 9px; }
.yaml-editor { height: 420px; min-height: 420px; padding: 16px; }
Expand Down
Loading
Loading