\n \u003Ca href=\"https://github.com/WiIIiam278/HuskChat/actions/workflows/ci.yml\">\n \u003Cimg src=\"https://img.shields.io/github/actions/workflow/status/WiIIiam278/HuskChat/ci.yml?branch=master&logo=github\"/>\n \u003C/a> \n \u003Ca href=\"https://repo.william278.net/#/releases/net/william278/huskchat/\">\n \u003Cimg src=\"https://repo.william278.net/api/badge/latest/releases/net/william278/huskchat?color=00fb9a&name=Maven&prefix=v\" />\n \u003C/a> \n \u003Ca href=\"https://discord.gg/tVYhJfyDWG\">\n \u003Cimg src=\"https://img.shields.io/discord/818135932103557162.svg?label=&logo=discord&logoColor=fff&color=7389D8&labelColor=6A7EC2\" />\n \u003C/a> \n \u003Cbr/>\n \u003Cb>\n \u003Ca href=\"https://www.spigotmc.org/resources/huskchat.94496/\">Spigot\u003C/a>\n \u003C/b> —\n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/huskchat/setup\">Setup\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://william278.net/docs/huskchat/\">Docs\u003C/a>\n \u003C/b> — \n \u003Cb>\n \u003Ca href=\"https://github.com/WiIIiam278/HuskChat/issues\">Issues\u003C/a>\n \u003C/b>\n\u003C/p>\n\u003Cbr/>\n\n**HuskChat** is a no-frills, simple and customisable chat system for Minecraft networks. It supports both running on BungeeCord and Velocity frontend servers for cross-server chat, or on a single-server Spigot setup.\n\nIt's designed to be easy to configure with an elegant out-of-box setup, while also being highly configurable, suiting a variety of use cases by allowing you to define channels and manage who can send and receive messages within them.\n\n## Features\n**⭐ Works great out of the box** — Install on your Spigot server or Velocity/BungeeCord-based proxy and use right away\n\n**⭐ Placeholder support** — Hooks with LuckPerms to display user roles, PAPI support via [PAPIProxyBridge](https://william278.net/docs/huskchat/formatting)\n\n**⭐ Private messaging** — Private messages—including group DMs&mdash and replying, admin spy features\n\n**⭐ Fine-tune channels** — Set send/receive permissions for channels, send messages to a discord webhook, filter [& more](https://william278.net/docs/huskchat/channels)!\n\n**⭐ Quick and easy to use** — Super simple set of [commands](https://william278.net/docs/huskchat/commands). Define channel shortcut commands, too!\n\n**⭐ Advanced profanity checking** — Machine learning powered profanity filter\n\n**⭐ Filters & replacers** — Customisable spam limiting filter, anti-advertising & special emoji\n\n**⭐ Modern formatting** — Utilise modern formatting, with RGB and Gradient support via [MineDown](https://github.com/Phoenix616/MineDown)\n\n## Building\nTo build HuskChat, you'll need python (>=`v3.6`) with associated packages installed; `jep` and `alt-profanity-check`. \nYou can install these with `pip install jep` and `pip install alt-profanity-check`. These are needed to run the profanity filter tests.\n\nThen, simply run the following in the root of the repository:\n```\n./gradlew clean build\n```\n\n## License\nHuskChat is licensed under the Apache 2.0 license.\n\n- [License](https://github.com/WiIIiam278/HuskChat/blob/master/LICENSE)\n\n## Translations\nTranslations of the plugin locales are welcome to help make the plugin more accessible. Please submit a pull request with your translations as a `.yml` file.\n\n- [Locales Directory](https://github.com/WiIIiam278/HuskChat/tree/master/common/src/main/resources/locales)\n- [English Locales](https://github.com/WiIIiam278/HuskChat/tree/master/common/src/main/resources/locales/en-gb.yml)\n\n## Links\n- [Docs](https://william278.net/docs/huskchat/) — Read the plugin documentation!\n- [Spigot](https://www.spigotmc.org/resources/huskchat.94496/) — View the Spigot resource page (Also: [Polymart](https://polymart.org/resource/huskchat.1217), [Modrinth](https://modrinth.com/plugin/huskchat))\n- [Issues](https://github.com/WiIIiam278/HuskChat/issues) — File a bug report or feature request\n- [Discord](https://discord.gg/tVYhJfyDWG) — Get help, ask questions\n- [bStats](https://bstats.org/plugin/bungeecord/HuskChat/11882) — View plugin metrics (Also: [Velocity](https://bstats.org/plugin/velocity/HuskChat%20-%20Velocity/14187))\n\n---\n© [William278](https://william278.net/), 2024. Licensed under the Apache-2.0 License.\n",[22,25,28],{"id":23,"url":24},"spigot","https://spigotmc.org/resources/huskchat.94496",{"id":26,"url":27},"polymart","https://polymart.org/resource/huskchat.1217",{"id":29,"url":30},"modrinth","https://modrinth.com/plugin/huskchat",[32],"William278",[23,34,35,36],"paper","waterfall","velocity",0,"",[40,58,83,106],{"order":37,"name":41,"children":42},"Setup",[43,47],{"order":37,"url":44,"title":41,"icon":45,"children":46},"setup","fa6-solid:book",[],{"order":48,"url":49,"title":50,"icon":51,"children":52},1,"config-files","Config","fa6-solid:file-code",[53],{"order":37,"url":54,"title":55,"icon":56,"children":57},"translations","Locales","material-symbols:translate",[],{"order":48,"name":59,"children":60},"Features",[61,66,71,77],{"order":37,"url":62,"title":63,"icon":64,"children":65},"commands","Commands","octicon:command-palette-16",[],{"order":48,"url":67,"title":68,"icon":69,"children":70},"join-and-quit-messages","Join & Quit Messages","mdi:greeting-outline",[],{"order":72,"url":73,"title":74,"icon":75,"children":76},2,"group-messages","Group Private Messages","ic:outline-email",[],{"order":78,"url":79,"title":80,"icon":81,"children":82},3,"social-and-local-spy","Social & Local Spy","tabler:spy",[],{"order":72,"name":84,"children":85},"Chat",[86,91,96,101],{"order":37,"url":87,"title":88,"icon":89,"children":90},"channels","Chat Channels","grommet-icons:channel",[],{"order":48,"url":92,"title":93,"icon":94,"children":95},"formatting","Formatting","mdi:paint-outline",[],{"order":72,"url":97,"title":98,"icon":99,"children":100},"filters-and-replacers","Filters & Replacers","lucide:filter",[],{"order":78,"url":102,"title":103,"icon":104,"children":105},"discord-hook","Discord Hook","material-symbols:webhook",[],{"order":78,"name":107,"children":108},"Developers",[109],{"order":37,"url":18,"title":110,"icon":111,"children":112},"Source Code","fa6-solid:code",[],20,{"SVG":115,"PNG":116,"PNG_TRANSPARENT":117,"SVG_TRANSPARENT":118},"huskchat.svg","huskchat.png","huskchat-transparent.png","huskchat-transparent.svg",[],[],{"downloadCount":122,"averageRating":123,"numberOfRatings":124,"interactions":125,"onlinePlayers":37,"onlineServers":37},27898,3.892307692307692,13,79,{"data":127,"body":128},{},{"type":129,"children":130},"root",[131,139,146,605,617,623,628,641,647,652],{"type":132,"tag":133,"props":134,"children":135},"element","p",{},[136],{"type":137,"value":138},"text","HuskChat provides a number of commands, for switching channels, sending broadcasts and messaging players and groups of players. Channels can also be restricted behind send and receive permission nodes.",{"type":132,"tag":140,"props":141,"children":143},"h2",{"id":142},"list-of-commands",[144],{"type":137,"value":145},"List of Commands",{"type":132,"tag":147,"props":148,"children":149},"table",{},[150,184],{"type":132,"tag":151,"props":152,"children":153},"thead",{},[154],{"type":132,"tag":155,"props":156,"children":157},"tr",{},[158,164,169,174,179],{"type":132,"tag":159,"props":160,"children":161},"th",{},[162],{"type":137,"value":163},"Command",{"type":132,"tag":159,"props":165,"children":166},{},[167],{"type":137,"value":168},"Usage",{"type":132,"tag":159,"props":170,"children":171},{},[172],{"type":137,"value":173},"Aliases",{"type":132,"tag":159,"props":175,"children":176},{},[177],{"type":137,"value":178},"Description",{"type":132,"tag":159,"props":180,"children":181},{},[182],{"type":137,"value":183},"Permission",{"type":132,"tag":185,"props":186,"children":187},"tbody",{},[188,234,274,354,398,442,486,530,568],{"type":132,"tag":155,"props":189,"children":190},{},[191,202,211,220,225],{"type":132,"tag":192,"props":193,"children":194},"td",{},[195],{"type":132,"tag":196,"props":197,"children":199},"code",{"className":198},[],[200],{"type":137,"value":201},"/channel",{"type":132,"tag":192,"props":203,"children":204},{},[205],{"type":132,"tag":196,"props":206,"children":208},{"className":207},[],[209],{"type":137,"value":210},"/channel \u003Cname> [message]",{"type":132,"tag":192,"props":212,"children":213},{},[214],{"type":132,"tag":196,"props":215,"children":217},{"className":216},[],[218],{"type":137,"value":219},"/c",{"type":132,"tag":192,"props":221,"children":222},{},[223],{"type":137,"value":224},"Send a message or switch to a chat channel",{"type":132,"tag":192,"props":226,"children":227},{},[228],{"type":132,"tag":196,"props":229,"children":231},{"className":230},[],[232],{"type":137,"value":233},"huskchat.command.channel",{"type":132,"tag":155,"props":235,"children":236},{},[237,246,255,260,265],{"type":132,"tag":192,"props":238,"children":239},{},[240],{"type":132,"tag":196,"props":241,"children":243},{"className":242},[],[244],{"type":137,"value":245},"/huskchat",{"type":132,"tag":192,"props":247,"children":248},{},[249],{"type":132,"tag":196,"props":250,"children":252},{"className":251},[],[253],{"type":137,"value":254},"/huskchat \u003Cabout|reload>",{"type":132,"tag":192,"props":256,"children":257},{},[258],{"type":137,"value":259},"N/A",{"type":132,"tag":192,"props":261,"children":262},{},[263],{"type":137,"value":264},"View plugin information and reload",{"type":132,"tag":192,"props":266,"children":267},{},[268],{"type":132,"tag":196,"props":269,"children":271},{"className":270},[],[272],{"type":137,"value":273},"huskchat.command.huskchat",{"type":132,"tag":155,"props":275,"children":276},{},[277,286,295,340,345],{"type":132,"tag":192,"props":278,"children":279},{},[280],{"type":132,"tag":196,"props":281,"children":283},{"className":282},[],[284],{"type":137,"value":285},"/msg",{"type":132,"tag":192,"props":287,"children":288},{},[289],{"type":132,"tag":196,"props":290,"children":292},{"className":291},[],[293],{"type":137,"value":294},"/msg \u003Cplayer(s)> \u003Cmessage>",{"type":132,"tag":192,"props":296,"children":297},{},[298,304,306,312,313,319,320,326,327,333,334],{"type":132,"tag":196,"props":299,"children":301},{"className":300},[],[302],{"type":137,"value":303},"/m",{"type":137,"value":305},", ",{"type":132,"tag":196,"props":307,"children":309},{"className":308},[],[310],{"type":137,"value":311},"/tell",{"type":137,"value":305},{"type":132,"tag":196,"props":314,"children":316},{"className":315},[],[317],{"type":137,"value":318},"/w",{"type":137,"value":305},{"type":132,"tag":196,"props":321,"children":323},{"className":322},[],[324],{"type":137,"value":325},"/whisper",{"type":137,"value":305},{"type":132,"tag":196,"props":328,"children":330},{"className":329},[],[331],{"type":137,"value":332},"/message",{"type":137,"value":305},{"type":132,"tag":196,"props":335,"children":337},{"className":336},[],[338],{"type":137,"value":339},"/pm",{"type":132,"tag":192,"props":341,"children":342},{},[343],{"type":137,"value":344},"Send a private message to a player",{"type":132,"tag":192,"props":346,"children":347},{},[348],{"type":132,"tag":196,"props":349,"children":351},{"className":350},[],[352],{"type":137,"value":353},"huskchat.command.msg",{"type":132,"tag":155,"props":355,"children":356},{},[357,366,375,384,389],{"type":132,"tag":192,"props":358,"children":359},{},[360],{"type":132,"tag":196,"props":361,"children":363},{"className":362},[],[364],{"type":137,"value":365},"/reply",{"type":132,"tag":192,"props":367,"children":368},{},[369],{"type":132,"tag":196,"props":370,"children":372},{"className":371},[],[373],{"type":137,"value":374},"/reply \u003Cmessage>",{"type":132,"tag":192,"props":376,"children":377},{},[378],{"type":132,"tag":196,"props":379,"children":381},{"className":380},[],[382],{"type":137,"value":383},"/r",{"type":132,"tag":192,"props":385,"children":386},{},[387],{"type":137,"value":388},"Quickly reply to a private message",{"type":132,"tag":192,"props":390,"children":391},{},[392],{"type":132,"tag":196,"props":393,"children":395},{"className":394},[],[396],{"type":137,"value":397},"huskchat.command.msg.reply",{"type":132,"tag":155,"props":399,"children":400},{},[401,410,419,428,433],{"type":132,"tag":192,"props":402,"children":403},{},[404],{"type":132,"tag":196,"props":405,"children":407},{"className":406},[],[408],{"type":137,"value":409},"/socialspy",{"type":132,"tag":192,"props":411,"children":412},{},[413],{"type":132,"tag":196,"props":414,"children":416},{"className":415},[],[417],{"type":137,"value":418},"/socialspy [color]",{"type":132,"tag":192,"props":420,"children":421},{},[422],{"type":132,"tag":196,"props":423,"children":425},{"className":424},[],[426],{"type":137,"value":427},"/ss",{"type":132,"tag":192,"props":429,"children":430},{},[431],{"type":137,"value":432},"Lets you view other users' private messages",{"type":132,"tag":192,"props":434,"children":435},{},[436],{"type":132,"tag":196,"props":437,"children":439},{"className":438},[],[440],{"type":137,"value":441},"huskchat.command.socialspy",{"type":132,"tag":155,"props":443,"children":444},{},[445,454,463,472,477],{"type":132,"tag":192,"props":446,"children":447},{},[448],{"type":132,"tag":196,"props":449,"children":451},{"className":450},[],[452],{"type":137,"value":453},"/localspy",{"type":132,"tag":192,"props":455,"children":456},{},[457],{"type":132,"tag":196,"props":458,"children":460},{"className":459},[],[461],{"type":137,"value":462},"/localspy [color]",{"type":132,"tag":192,"props":464,"children":465},{},[466],{"type":132,"tag":196,"props":467,"children":469},{"className":468},[],[470],{"type":137,"value":471},"/ls",{"type":132,"tag":192,"props":473,"children":474},{},[475],{"type":137,"value":476},"Lets you view messages sent in other local chat channels†",{"type":132,"tag":192,"props":478,"children":479},{},[480],{"type":132,"tag":196,"props":481,"children":483},{"className":482},[],[484],{"type":137,"value":485},"huskchat.command.localspy",{"type":132,"tag":155,"props":487,"children":488},{},[489,498,507,516,521],{"type":132,"tag":192,"props":490,"children":491},{},[492],{"type":132,"tag":196,"props":493,"children":495},{"className":494},[],[496],{"type":137,"value":497},"/broadcast",{"type":132,"tag":192,"props":499,"children":500},{},[501],{"type":132,"tag":196,"props":502,"children":504},{"className":503},[],[505],{"type":137,"value":506},"/broadcast \u003Cmessage>",{"type":132,"tag":192,"props":508,"children":509},{},[510],{"type":132,"tag":196,"props":511,"children":513},{"className":512},[],[514],{"type":137,"value":515},"/alert",{"type":132,"tag":192,"props":517,"children":518},{},[519],{"type":137,"value":520},"Lets you send a broadcast across the server",{"type":132,"tag":192,"props":522,"children":523},{},[524],{"type":132,"tag":196,"props":525,"children":527},{"className":526},[],[528],{"type":137,"value":529},"huskchat.command.broadcast",{"type":132,"tag":155,"props":531,"children":532},{},[533,542,550,554,559],{"type":132,"tag":192,"props":534,"children":535},{},[536],{"type":132,"tag":196,"props":537,"children":539},{"className":538},[],[540],{"type":137,"value":541},"/optoutmsg",{"type":132,"tag":192,"props":543,"children":544},{},[545],{"type":132,"tag":196,"props":546,"children":548},{"className":547},[],[549],{"type":137,"value":541},{"type":132,"tag":192,"props":551,"children":552},{},[553],{"type":137,"value":259},{"type":132,"tag":192,"props":555,"children":556},{},[557],{"type":137,"value":558},"Lets you \"opt-out\" of a group private message you are in",{"type":132,"tag":192,"props":560,"children":561},{},[562],{"type":132,"tag":196,"props":563,"children":565},{"className":564},[],[566],{"type":137,"value":567},"huskchat.command.optoutmsg",{"type":132,"tag":155,"props":569,"children":570},{},[571,576,585,589,594],{"type":132,"tag":192,"props":572,"children":573},{},[574],{"type":137,"value":575},"Shortcut commands",{"type":132,"tag":192,"props":577,"children":578},{},[579],{"type":132,"tag":196,"props":580,"children":582},{"className":581},[],[583],{"type":137,"value":584},"/\u003Ccommand> \u003Cmessage>",{"type":132,"tag":192,"props":586,"children":587},{},[588],{"type":137,"value":259},{"type":132,"tag":192,"props":590,"children":591},{},[592],{"type":137,"value":593},"Quickly send a message in or switch to a chat channel",{"type":132,"tag":192,"props":595,"children":596},{},[597,599],{"type":137,"value":598},"Channel send permission, e.g. ",{"type":132,"tag":196,"props":600,"children":602},{"className":601},[],[603],{"type":137,"value":604},"huskchat.channel.staff.send",{"type":132,"tag":133,"props":606,"children":607},{},[608,610,615],{"type":137,"value":609},"† ",{"type":132,"tag":196,"props":611,"children":613},{"className":612},[],[614],{"type":137,"value":453},{"type":137,"value":616}," is not available on single-server Spigot setups.",{"type":132,"tag":140,"props":618,"children":620},{"id":619},"channel-send-and-receive-permissions",[621],{"type":137,"value":622},"Channel send and receive permissions",{"type":132,"tag":133,"props":624,"children":625},{},[626],{"type":137,"value":627},"Channels also have their own permission to send and receive to.",{"type":132,"tag":133,"props":629,"children":630},{},[631,633,639],{"type":137,"value":632},"You can configure these in the channel config file, but by default they are ",{"type":132,"tag":196,"props":634,"children":636},{"className":635},[],[637],{"type":137,"value":638},"huskchat.channel.\u003Cchannel>.receive",{"type":137,"value":640},". Channels without permissions set do not require the permission node to talk in.",{"type":132,"tag":140,"props":642,"children":644},{"id":643},"chat-formatting-permissions",[645],{"type":137,"value":646},"Chat formatting permissions",{"type":132,"tag":133,"props":648,"children":649},{},[650],{"type":137,"value":651},"Formatting messages also has its own permission to allow users to use minedown.",{"type":132,"tag":133,"props":653,"children":654},{},[655,657,663],{"type":137,"value":656},"You can apply the node, ",{"type":132,"tag":196,"props":658,"children":660},{"className":659},[],[661],{"type":137,"value":662},"huskchat.formatted_chat",{"type":137,"value":664},", to allow players to format there messages with any Minedown formatting. Any users attempting to use formatting without the node will simply send the format in chat as a normal message, having the format in the configuration file be used instead.",["Reactive",666],{"$snuxt-i18n-meta":667,"$sauth":-1,"$sxsrf":-1},{},["Set"],["ShallowReactive",670],{"$fD1VhuLPQfSq5Kjb6MOPBDmeZZVXLASbuQ_sxsenhdug":-1,"user":671,"mdc--kc1ii8-key":-1},["NuxtError",672],{"message":673,"statusCode":674,"statusMessage":675,"data":676},"[GET] \"https://api.william278.net/v1/users/@me\": 401 Unauthorized",401,"Unauthorized",{"error":677},"You must be logged in to perform this action.","/docs/huskchat/commands"]