|
| 1 | +# Werchat |
| 2 | + |
| 3 | +[](https://github.com/HyperSystemsDev/Werchat/releases) |
| 4 | +[](LICENSE) |
| 5 | +[](https://discord.gg/SNPjyfkYPc) |
| 6 | +[](https://github.com/HyperSystemsDev/Werchat) |
| 7 | + |
| 8 | +**Channel-based chat system for Hytale servers.** Multiple channels, quick-chat routing, private messaging, nicknames, and moderation — all in one plugin. |
| 9 | + |
| 10 | +**[Discord](https://discord.gg/SNPjyfkYPc)** |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | +## Features |
| 15 | + |
| 16 | +**Channel System** — Multiple channels with custom colors, nicknames, distance-based and world-restricted delivery. |
| 17 | + |
| 18 | +**Quick Chat** — Prefix symbols to route messages to any channel without switching. `!` for Global, `~` for Trade. |
| 19 | + |
| 20 | +**Private Messaging** — `/msg` and `/r` with reply tracking, ignore lists, and offline detection. |
| 21 | + |
| 22 | +**Player Nicknames** — Custom display names up to 20 characters with hex colors and two-color gradients. |
| 23 | + |
| 24 | +**Mention System** — `@player` highlighting with configurable color and bold formatting. |
| 25 | + |
| 26 | +**Moderation Tools** — Per-channel ban, mute, moderators, word filter (censor/block modes), and chat cooldown. |
| 27 | + |
| 28 | +**Permission Integration** — HyperPerms and LuckPerms prefix/suffix support with hex color codes. |
| 29 | + |
| 30 | +**Message Colors** — Independent message text colors and gradients, separate from nickname colors. |
| 31 | + |
| 32 | +**Persistent Storage** — JSON-based data with auto-save every 5 minutes and immediate save on changes. |
| 33 | + |
| 34 | +## Quick Start |
| 35 | + |
| 36 | +1. Drop `Werchat-1.1.8.jar` in your `mods/` folder |
| 37 | +2. Start your server — four default channels are created automatically |
| 38 | +3. Use `/ch list` to see channels, `/ch join <channel>` to join one |
| 39 | +4. Type `!hello` to quick-chat in Global or `~hello` for Trade |
| 40 | + |
| 41 | +``` |
| 42 | +/ch list # List all channels |
| 43 | +/ch global # Switch to Global channel |
| 44 | +/ch join trade # Join the Trade channel |
| 45 | +/msg Steve Hey! # Send a private message |
| 46 | +/ch playernick CoolName # Set your nickname |
| 47 | +``` |
| 48 | + |
| 49 | +## Default Channels |
| 50 | + |
| 51 | +| Channel | Nick | Color | Range | Auto-Join | Quick-Chat Symbol | |
| 52 | +|---------|------|-------|-------|-----------|-------------------| |
| 53 | +| Global | Global | White (`#ffffff`) | Unlimited | Yes | `!` | |
| 54 | +| Local | Local | Gray (`#808080`) | 100 blocks | Yes | — | |
| 55 | +| Trade | Trade | Gold (`#ffd700`) | Unlimited | Yes | `~` | |
| 56 | +| Support | Support | Green (`#00ff00`) | Unlimited | Yes | — | |
| 57 | + |
| 58 | +## Commands |
| 59 | + |
| 60 | +### Player Commands |
| 61 | + |
| 62 | +| Command | Aliases | Description | |
| 63 | +|---------|---------|-------------| |
| 64 | +| `/ch list` | `/ch l` | List all channels | |
| 65 | +| `/ch join <channel> [password]` | `/ch j` | Join a channel | |
| 66 | +| `/ch leave <channel>` | — | Leave a channel | |
| 67 | +| `/ch <channel>` | — | Switch active channel | |
| 68 | +| `/ch who <channel>` | `/ch w` | View channel members | |
| 69 | +| `/ch info <channel>` | — | View channel details | |
| 70 | +| `/ch create <name> [nick]` | — | Create a new channel | |
| 71 | +| `/ch playernick <name> [#color] [#gradient]` | `/ch pnick`, `/ch nickname` | Set your nickname | |
| 72 | +| `/ch msgcolor <#color> [#gradient]` | `/ch chatcolor` | Set your message color | |
| 73 | +| `/ch help` | `/ch ?` | Show command help | |
| 74 | + |
| 75 | +### Messaging Commands |
| 76 | + |
| 77 | +| Command | Aliases | Description | |
| 78 | +|---------|---------|-------------| |
| 79 | +| `/msg <player> <message>` | `/whisper`, `/w`, `/tell`, `/pm` | Send a private message | |
| 80 | +| `/r <message>` | `/reply` | Reply to last PM | |
| 81 | +| `/ignore <player>` | — | Toggle ignore on a player | |
| 82 | +| `/ignorelist` | — | List ignored players | |
| 83 | + |
| 84 | +### Admin / Moderator Commands |
| 85 | + |
| 86 | +| Command | Aliases | Description | |
| 87 | +|---------|---------|-------------| |
| 88 | +| `/ch color <channel> <#hex> [#hex]` | — | Set channel tag color (and optional message color) | |
| 89 | +| `/ch nick <channel> <nick>` | — | Set channel shortcut name | |
| 90 | +| `/ch rename <channel> <newname>` | — | Rename a channel | |
| 91 | +| `/ch password <channel> [password]` | `/ch pass` | Set or clear channel password | |
| 92 | +| `/ch distance <channel> <blocks>` | `/ch range` | Set range (0 = unlimited) | |
| 93 | +| `/ch world <channel> add\|remove <world>` | — | Restrict channel to worlds | |
| 94 | +| `/ch mod <channel> <player>` | `/ch moderator` | Add a channel moderator | |
| 95 | +| `/ch unmod <channel> <player>` | — | Remove a channel moderator | |
| 96 | +| `/ch ban <channel> <player>` | — | Ban a player from a channel | |
| 97 | +| `/ch unban <channel> <player>` | — | Unban a player | |
| 98 | +| `/ch mute <channel> <player>` | — | Mute a player in a channel | |
| 99 | +| `/ch unmute <channel> <player>` | — | Unmute a player | |
| 100 | +| `/ch remove <channel>` | `/ch delete`, `/ch del` | Delete a channel | |
| 101 | + |
| 102 | +Channel moderators can use admin commands on their own channels without needing global permission nodes. |
| 103 | + |
| 104 | +<details> |
| 105 | +<summary><strong>All Permissions</strong></summary> |
| 106 | + |
| 107 | +| Permission | Description | |
| 108 | +|------------|-------------| |
| 109 | +| `werchat.*` | All Werchat permissions (wildcard) | |
| 110 | +| `werchat.list` | List channels | |
| 111 | +| `werchat.join` | Join channels | |
| 112 | +| `werchat.leave` | Leave channels | |
| 113 | +| `werchat.create` | Create channels | |
| 114 | +| `werchat.who` | View channel members | |
| 115 | +| `werchat.info` | View channel info | |
| 116 | +| `werchat.switch` | Switch active channel | |
| 117 | +| `werchat.color` | Set channel colors | |
| 118 | +| `werchat.nick` | Set channel nick | |
| 119 | +| `werchat.password` | Set channel password | |
| 120 | +| `werchat.rename` | Rename channels | |
| 121 | +| `werchat.remove` | Delete channels | |
| 122 | +| `werchat.mod` | Manage channel moderators | |
| 123 | +| `werchat.distance` | Set channel range | |
| 124 | +| `werchat.ban` | Ban/unban from channels | |
| 125 | +| `werchat.mute` | Mute/unmute in channels | |
| 126 | +| `werchat.world` | Set world restrictions | |
| 127 | +| `werchat.msg` | Send private messages | |
| 128 | +| `werchat.ignore` | Ignore players | |
| 129 | +| `werchat.quickchat` | Use quick-chat symbols | |
| 130 | +| `werchat.playernick` | Set own nickname | |
| 131 | +| `werchat.playernick.others` | Set other players' nicknames | |
| 132 | +| `werchat.nickcolor` | Set nickname color/gradient | |
| 133 | +| `werchat.msgcolor` | Set own message color | |
| 134 | +| `werchat.msgcolor.others` | Set other players' message color | |
| 135 | +| `werchat.cooldown.bypass` | Bypass chat cooldown | |
| 136 | + |
| 137 | +Players with `werchat.*` or `*` also bypass cooldowns and the word filter. |
| 138 | + |
| 139 | +</details> |
| 140 | + |
| 141 | +## Configuration |
| 142 | + |
| 143 | +Config file: `mods/com.werchat_Werchat/config.json` |
| 144 | + |
| 145 | +<details> |
| 146 | +<summary><strong>View full config</strong></summary> |
| 147 | + |
| 148 | +```json |
| 149 | +{ |
| 150 | + "defaultChannelName": "Global", |
| 151 | + "autoJoinDefault": true, |
| 152 | + "showJoinLeaveMessages": true, |
| 153 | + "allowPrivateMessages": true, |
| 154 | + "banMessage": "You have been banned from {channel}", |
| 155 | + "muteMessage": "You have been muted in {channel}", |
| 156 | + "wordFilter": { |
| 157 | + "enabled": false, |
| 158 | + "mode": "censor", |
| 159 | + "replacement": "***", |
| 160 | + "notifyPlayer": true, |
| 161 | + "warningMessage": "Your message contained inappropriate language.", |
| 162 | + "words": ["..."] |
| 163 | + }, |
| 164 | + "cooldown": { |
| 165 | + "enabled": false, |
| 166 | + "seconds": 3, |
| 167 | + "message": "Please wait {seconds}s before sending another message.", |
| 168 | + "bypassPermission": "werchat.cooldown.bypass" |
| 169 | + }, |
| 170 | + "mentions": { |
| 171 | + "enabled": true, |
| 172 | + "color": "#FFFF55" |
| 173 | + }, |
| 174 | + "ignoreChatCancellations": false |
| 175 | +} |
| 176 | +``` |
| 177 | + |
| 178 | +| Key | Default | Description | |
| 179 | +|-----|---------|-------------| |
| 180 | +| `defaultChannelName` | `"Global"` | Default channel players are placed in | |
| 181 | +| `autoJoinDefault` | `true` | Auto-join default channel on connect | |
| 182 | +| `showJoinLeaveMessages` | `true` | Broadcast join/leave messages to channels | |
| 183 | +| `allowPrivateMessages` | `true` | Whether `/msg` is enabled | |
| 184 | +| `banMessage` | `"You have been banned from {channel}"` | Message shown to banned players | |
| 185 | +| `muteMessage` | `"You have been muted in {channel}"` | Message shown to muted players | |
| 186 | +| `wordFilter.enabled` | `false` | Enable the word filter | |
| 187 | +| `wordFilter.mode` | `"censor"` | `censor` replaces bad words, `block` rejects the message | |
| 188 | +| `wordFilter.replacement` | `"***"` | Replacement string in censor mode | |
| 189 | +| `wordFilter.notifyPlayer` | `true` | Warn the player when filtered | |
| 190 | +| `wordFilter.warningMessage` | `"Your message contained..."` | Warning message text | |
| 191 | +| `wordFilter.words` | (default list) | Words to filter (case-insensitive) | |
| 192 | +| `cooldown.enabled` | `false` | Enable chat cooldown | |
| 193 | +| `cooldown.seconds` | `3` | Seconds between messages | |
| 194 | +| `cooldown.message` | `"Please wait {seconds}s..."` | Cooldown message | |
| 195 | +| `cooldown.bypassPermission` | `"werchat.cooldown.bypass"` | Permission to bypass cooldown | |
| 196 | +| `mentions.enabled` | `true` | Enable @mention highlighting | |
| 197 | +| `mentions.color` | `"#FFFF55"` | Hex color for mention highlights | |
| 198 | +| `ignoreChatCancellations` | `false` | Process chat even if cancelled by other plugins | |
| 199 | + |
| 200 | +</details> |
| 201 | + |
| 202 | +<details> |
| 203 | +<summary><strong>Channel Format Placeholders</strong></summary> |
| 204 | + |
| 205 | +Custom channel message formats support these placeholders: |
| 206 | + |
| 207 | +| Placeholder | Description | |
| 208 | +|-------------|-------------| |
| 209 | +| `{name}` | Full channel name | |
| 210 | +| `{nick}` | Channel nick/abbreviation | |
| 211 | +| `{color}` | Channel color code | |
| 212 | +| `{sender}` | Player display name | |
| 213 | +| `{msg}` | Message content | |
| 214 | +| `{prefix}` | Player's permission prefix (HyperPerms/LuckPerms) | |
| 215 | +| `{suffix}` | Player's permission suffix (HyperPerms/LuckPerms) | |
| 216 | + |
| 217 | +Default format: `{nick} {sender}: {msg}` |
| 218 | + |
| 219 | +</details> |
| 220 | + |
| 221 | +<details> |
| 222 | +<summary><strong>Building from Source</strong></summary> |
| 223 | + |
| 224 | +**Requirements:** Java 25, Gradle 9.3+ |
| 225 | + |
| 226 | +```bash |
| 227 | +./gradlew shadowJar |
| 228 | +# Output: build/libs/Werchat-1.1.8.jar |
| 229 | +``` |
| 230 | + |
| 231 | +</details> |
| 232 | + |
| 233 | +## Links |
| 234 | + |
| 235 | +- [Discord](https://discord.gg/SNPjyfkYPc) — Support & community |
| 236 | +- [Issues](https://github.com/HyperSystemsDev/Werchat/issues) — Bug reports & features |
| 237 | +- [Releases](https://github.com/HyperSystemsDev/Werchat/releases) — Downloads |
| 238 | + |
| 239 | +--- |
| 240 | + |
| 241 | +Part of the **HyperSystems** suite: [HyperPerms](https://github.com/HyperSystemsDev/HyperPerms) | [HyperHomes](https://github.com/HyperSystemsDev/HyperHomes) | [HyperFactions](https://github.com/HyperSystemsDev/HyperFactions) | [Werchat](https://github.com/HyperSystemsDev/Werchat) |
0 commit comments