[MD]
# RSW Permission Manager
**LuckPerms for Bedrock. Free, one build, no caps, no paid tier.**
Runs on [Pier](https://github.com/Maskviva/Pier), so it does not link LeviLamina
directly. Pier's ABI only grows, so a BDS update does not have to wait for this plugin
to be rebuilt.
---
## ✨ Usable out of the box
The first start creates four groups, and a new player lands in `member` able to build.
| Group | What it can do |
|---|---|
| `visitor` | move and look |
| `member` | build, interact, open containers, use items, ride (**where new players land**) |
| `staff` | everything member has, plus the non-destructive world commands and the read side of `/rswperm` |
| `admin` | everything |
One line in the console, `/rswperm promote <your name>`, and the rest is a form in-game.
## 🔒 26 vanilla behaviour guards, plus a gate over 52 vanilla commands
Not a message printed afterwards — a real interception. A denied node means the action
does not happen.
| | |
|---|---|
| Blocks | break / place / interact / use-on / edit signs |
| Items | use / drop / pick up / crafting, anvil, grindstone, loom |
| Entities | attack / pvp / interact / ride / push / take arrows and tridents / armour stands / item frames |
| World | containers / pressure plates and tripwires / sleep / sneak / chat / game mode / join |
| Commands | `minecraft.command.<name>`, a gate over 52 vanilla commands |
## 🎯 Suffixes, with the semantics of `minecraft.command.*`
The node with the suffix is judged first, and only an undefined answer falls back:
```
minecraft.break break blocks, all of them
-minecraft.break.diamond_ore except diamond ore
-minecraft.projectile.ender_pearl bows are fine, ender pearls are not
-minecraft.ride.boat horses yes, boats no
-minecraft.plate.tripwire pressure plates yes, tripwires no
```
What to write in the suffix is printed next to every node by `/rswperm nodes`, so there
is no guessing from a wiki page that has drifted.
## 🖱️ All of it is in a form
Groups, players, the node catalog, template differences, status. Node editing is
**tristate** — follow / allow / deny. "Follow" writes no record at all, so a change in a
parent group carries through to the child.
## 🔍 `/rswperm why` — the most useful thing in here
"I granted it and it still does not work." Run this, and it prints **every rule that
matched, in the order they were ranked**, with the group each came from. The winner is
the first line.
## 📒 A mount ledger: a withdrawal stays withdrawn
A mod declares its nodes on every start. **Without a ledger, a node you revoked comes
back the next time that mod loads, and nothing says why.**
The ledger records the declaration and the revocation, so the next declaration sees that
you already answered. `/rswperm ledger` prints the table: what each mod declared, and
what has been withdrawn.
## 🛡️ Authority per action, not per source
The console is unconditional. A player is judged by node. **A command block, an
`/execute` or a script may send only the reading verbs.**
Placing a command block already takes operator; stepping on a pressure plate does not,
and a plate running `/rswperm promote` would otherwise promote whoever walks onto it.
This is not configurable.
## 📄 Permission templates: the group tree as files
```yaml
display: "Member"
weight: 10
track: true
parents: ["visitor"]
permissions:
- "minecraft.break"
- "minecraft.place"
- "cmd.world.tp"
```
Version-controllable, copyable between servers. **A template never applies itself**: the
start reports differences, `tplapply` writes them, and `tplaccept` records that a group
is meant to differ. The evening you spent on `staff` is not overwritten by a file you
never edited.
## 🌐 A WebUI (optional, off by default)
Edit groups, players and nodes in a browser. Three doors: token, host binding and an
address allowlist, at least one of which must be open. **A non-loopback bind with only
the host binding refuses to start** — a `Host` header is set by the client, so on a
public address it is not a door at all.
## 🗣️ English and Chinese, and the language follows the reader
The console, the logs and the wire follow `config.language`. **What a player reads
follows that player**: their own pick, then their client's code, then the server default.
Language files live in `lang/`; adding one is a file you drop in, not a release you wait
for.
## 🧱 A refusal is one sentence
A player sees `§cNo permission.` — no node name, no group name. **Naming the node hands
the shape of your permission tree to anyone who probes for it, one refusal at a time.**
The node and the reason go to `logs/rsw/`, and the operator has the whole chain from
`/rswperm why`.
## 🧰 An API for mod authors
A lane of raw function pointers plus a JSON channel, both giving the same answer.
Declare nodes, check one or many, ask why, ask what language a player reads.
**Three-state verdicts: allow, deny, undefined. Undefined is not deny.**
A native LeviLamina mod can call in too, through Pier's `pier-bridge.h`, which is
header-only and links nothing.
---
## 📦 Installing
1. Install [Pier](https://github.com/Maskviva/Pier).
2. Put `rswperms` into `plugins/`.
3. Start once, then from the console: `/rswperm promote <your name>`.
The first start creates the database and writes four templates, the config and both
language files. **Nothing is rewritten on any later start.**
## ⌨️ Commands
```
/rswperm menu the form (groups, players and nodes are all in it)
/rswperm status | groups | nodes | ledger
/rswperm info <player> | check <player> <node> | why <player> <node>
/rswperm grant <group> <node> <true|false> false writes an explicit deny
/rswperm revoke <group> <node> the ledger remembers
/rswperm newgroup | delgroup | inherit | setdefault
/rswperm user add|del <player> <group> | promote | demote
/rswperm tplstatus | tplapply <group> | tplaccept <group> | reload
```
Group names, node names and player names all complete as you type.
## 📚 Documentation
In English and Chinese: **https://rsw.maskviva.xyz/**
There is a page called "Your first setup" that walks from a fresh install to a working
server in twenty minutes, and a "Common tasks" page with twelve recipes to copy.
## 🐛 Reporting
GitHub Issues: **https://github.com/Maskviva/rsw-mod/issues**
Include the startup log, `/rswperm status` and `/rswperm why` for the action in
question. Those three save a whole round trip.
---
## ⚖️ Terms
Free to use; **the source is not public**. Distributed as a binary; see `TERMS.md` in the
package.
The permission manager writes its own SQLite database, so **back up before going live**.
Not affiliated with Mojang, Microsoft or LeviMC. Minecraft is a trademark of Mojang
Synergies AB.
[/MD]