ClassiCube/ClassicalSharp/Commands/CommandList.cs
UnknownShadow200 98d435b110 fix licensing
2017-01-20 09:12:04 +11:00

111 lines
3.1 KiB
C#

// Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
using System;
using System.Collections.Generic;
namespace ClassicalSharp.Commands {
public class CommandList : IGameComponent {
const string prefix = "/client";
public bool IsCommandPrefix(string input) {
if (game.Server.IsSinglePlayer && Utils.CaselessStarts(input, "/"))
return true;
return Utils.CaselessStarts(input, prefix + " ")
|| Utils.CaselessEquals(input, prefix);
}
protected Game game;
public List<Command> RegisteredCommands = new List<Command>();
public void Init(Game game) {
this.game = game;
Register(new CommandsCommand());
Register(new GpuInfoCommand());
Register(new HelpCommand());
Register(new RenderTypeCommand());
if (!game.Server.IsSinglePlayer) return;
Register(new ModelCommand());
Register(new CuboidCommand());
}
public void Ready(Game game) { }
public void Reset(Game game) { }
public void OnNewMap(Game game) { }
public void OnNewMapLoaded(Game game) { }
public void Register(Command command) {
command.game = game;
for (int i = 0; i < RegisteredCommands.Count; i++) {
Command cmd = RegisteredCommands[i];
if (Utils.CaselessEquals(cmd.Name, command.Name))
throw new InvalidOperationException("Another command already has name : " + command.Name);
}
RegisteredCommands.Add(command);
}
public Command GetMatch(string cmdName) {
Command match = null;
for (int i = 0; i < RegisteredCommands.Count; i++) {
Command cmd = RegisteredCommands[i];
if (!Utils.CaselessStarts(cmd.Name, cmdName)) continue;
if (match != null) {
game.Chat.Add("&e/client: Multiple commands found that start with: \"&f" + cmdName + "&e\".");
return null;
}
match = cmd;
}
if (match == null)
game.Chat.Add("&e/client: Unrecognised command: \"&f" + cmdName + "&e\".");
return match;
}
static char[] splitChar = { ' ' };
public void Execute(string text) {
if (Utils.CaselessStarts(text, prefix)) { // /client command args
text = text.Substring(prefix.Length).TrimStart(splitChar);
} else { // /command args
text = text.Substring(1);
}
if (text.Length == 0) { // only / or /client
game.Chat.Add("&eList of client commands:");
PrintDefinedCommands(game);
game.Chat.Add("&eTo see a particular command's help, type /client help [cmd name]");
return;
}
string[] args = text.Split(splitChar);
Command cmd = GetMatch(args[0]);
if (cmd == null) return;
cmd.Execute(args);
}
public void PrintDefinedCommands(Game game) {
StringBuffer sb = new StringBuffer(Utils.StringLength);
int index = 0;
for (int i = 0; i < RegisteredCommands.Count; i++) {
Command cmd = RegisteredCommands[i];
string name = cmd.Name;
if ((sb.Length + name.Length + 2) > sb.Capacity) {
game.Chat.Add(sb.ToString());
sb.Clear();
index = 0;
}
sb.Append(ref index, name);
sb.Append(ref index, ", ");
}
if (sb.Length > 0)
game.Chat.Add(sb.ToString());
}
public void Dispose() {
RegisteredCommands.Clear();
}
}
}