diff options
| author | Pinapelz <yukais@pinapelz.com> | 2026-10-19 15:32:53 -0700 |
|---|---|---|
| committer | Pinapelz <yukais@pinapelz.com> | 2026-10-19 15:32:53 -0700 |
| commit | 304bd1e77a5442f614aacd2b35f330777118b2cd (patch) | |
| tree | 970e7da13bb1bd8edf1f9b453af4d0994c665e94 /src/client/Commands.hx | |
| parent | a4f3064542ddad6939598e7e60ca0090be07df60 (diff) | |
Diffstat (limited to 'src/client/Commands.hx')
| -rw-r--r-- | src/client/Commands.hx | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/client/Commands.hx b/src/client/Commands.hx new file mode 100644 index 0000000..5f1d578 --- /dev/null +++ b/src/client/Commands.hx @@ -0,0 +1,182 @@ +package client; + +enum abstract CommandId(String) { + var Help = "/help"; + var Clear = "/clear"; + var Ban = "/ban"; + var Unban = "/unban"; + var Kick = "/kick"; + var Ad = "/ad"; + var Volume = "/volume"; + var Dump = "/dump"; + var Crash = "/crash"; + var Flashback = "/fb"; + var Giveup = "/giveup"; + + public inline function toString():String { + return this; + } +} + +@:structInit +class CommandInfo { + public final name:CommandId; + public final aliases:Array<String>; + public final args:Int; + public final lang:String; + + public function new(name:CommandId, args = 0, ?aliases:Array<String>) { + this.name = name; + this.args = args; + this.aliases = aliases ?? []; + lang = getLangId(); + } + + function getLangId():String { + final withoutSlash = name.toString().substr(1); + return "cmd" + withoutSlash.charAt(0).toUpperCase() + withoutSlash.substr(1); + } +} + +typedef ParsedCommand = { + final cmd:Null<CommandInfo>; + final rawCmd:String; + final args:Array<String>; + final currentArgIndex:Int; +} + +class Commands { + static final list:Array<CommandInfo> = [ + { + name: Help, + }, + { + name: Clear, + }, + { + name: Ban, + args: 2, + }, + { + name: Unban, + args: 1, + }, + { + name: Kick, + args: 1, + }, + { + name: Ad, + }, + { + name: Volume, + args: 1, + }, + { + name: Dump, + }, + { + name: Crash, + }, + { + name: Giveup, + args: 1, + }, + { + name: Flashback, + aliases: ["/flashback"], + } + ]; + + public static function find(name:String):Null<CommandInfo> { + final lower = name.toLowerCase(); + for (c in list) { + if (c.name.toString() == lower) return c; + for (a in c.aliases) { + if (a.toLowerCase() == lower) return c; + } + } + return null; + } + + public static function parse(input:String):ParsedCommand { + if (!input.startsWith("/")) { + return { + cmd: null, + rawCmd: "", + args: [], + currentArgIndex: -1 + }; + } + final parts = input.split(" "); + final rawCmd = parts[0]; + final args = parts.slice(1); + final currentArgIndex = args.length > 0 ? args.length - 1 : -1; + + return { + cmd: find(rawCmd), + rawCmd: rawCmd, + args: args, + currentArgIndex: currentArgIndex + }; + } + + public static function filterForAutocomplete(val:String):Array<CommandInfo> { + if (!val.startsWith("/")) return []; + final parts = val.toLowerCase().split(" "); + final searchCmd = parts[0]; + final spaceCount = parts.length - 1; + + final result:Array<CommandInfo> = []; + for (c in list) { + if (spaceCount == 0) { + if (c.name.toString().startsWith(searchCmd)) { + result.push(c); + } else { + for (a in c.aliases) { + if (a.toLowerCase().startsWith(searchCmd)) { + result.push(c); + break; + } + } + } + } else { + if (spaceCount <= c.args) { + if (c.name.toString() == searchCmd) { + result.push(c); + } else { + for (a in c.aliases) { + if (a.toLowerCase() == searchCmd) { + result.push(c); + break; + } + } + } + } + } + } + return result; + } + + public static function formatDescWithHighlight(desc:String, activeArgIndex:Int):String { + desc = StringTools.htmlEscape(desc); + + var argCounter = 0; + final argRegex = ~/<[^&]+>/g; + desc = argRegex.map(desc, reg -> { + final token = reg.matched(0); + final isCurrent = (argCounter == activeArgIndex); + argCounter++; + if (isCurrent) { + return '<span class="chat-command-arg-active">' + token + '</span>'; + } else { + return token; + } + }); + + final codeRegex = ~/`([^`]+)`/g; + return codeRegex.map(desc, reg -> { + return '<span class="chat-command-code">' + reg.matched(1) + '</span>'; + }); + } +} |
