Ejemplo n.º 1
0
        internal static void BeginClient(Client client)
        {
            Logger.Log(client.Username + " has logged in", false, "user");
            Clients.Add(client);

            try {
                while (client.Stream.Connected) {
                    var msg = client.Stream.Read();
                    if (msg == null) {
                        Debug.WriteLine(client.Stream.LastError);
                        break;
                    }
                    CommandHandler.HandleCommand(client, msg);
                }
            } catch (Exception e) {
                Debug.WriteLine(e);
            }
        }
Ejemplo n.º 2
0
        internal static void HandleCommand(Client sender, string message)
        {
            var cmdsplit = message.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            if (BuiltInCmds(sender, message, cmdsplit)) {
                return;
            }

            if ((message.StartsWith("/") || message.StartsWith("#")) && Hooks.ContainsKey(cmdsplit[0])) {
                try {
                    if (Hooks[cmdsplit[0]].OnCommand(message, sender)) {
                        Logger.Log("<" + sender.Username + "> " + message, true, "command");
                    }
                    return;
                } catch (Exception ex) {
                    Logger.Log("Error executing command " + cmdsplit[0] + "\r\n" + ex);
                    return;
                }
            }

            if (message.StartsWith("/")) {
                if (!sender.HasPermission(cmdsplit[0], true)) {
                    sender.Stream.Write("\u001B[31mYou do not have permission to do that\u001B[0m");
                    return;
                }
                if (Server.Instance.Command(message.Remove(0, 1))) {
                    Logger.Log("<" + sender.Username + "> " + message, true, "command");
                } else {
                    sender.Stream.Write(Escape("31") + "The server is not running" + LineEnd);
                }
                return;
            }

            if (message.StartsWith("#")) {
                if (message.Length < 2) return;
                var chatcmd = string.Format(Main.config["chat-format"], sender.Username, message.Substring(1));
                Logger.Log("ServerChat: <" + sender.Username + "> " + message, false, "command");
                Server.Instance.Command(chatcmd);
                return;
            }

            Logger.Log("<" + sender.Username + "> " + message, true, "command");
        }
Ejemplo n.º 3
0
 public override bool OnCommand(string cmd, Client sender)
 {
     if (sender.HasPermission("autosave.change")) {
         var split = cmd.Split(' ');
         if (split.Length < 2) {
             sender.Stream.Write("Too few parameters\r\n");
             return true;
         }
         int i;
         if (!int.TryParse(split[1], out i)) {
             sender.Stream.Write("Number expected; string given\r\n");
             return true;
         }
         interval = i;
         timer.Change(interval * 1000 * 60, interval * 1000 * 60);
         Log("AutoSave interval set to " + interval);
     } else {
         sender.Stream.Write("\u001B[31mYou do not have permission change the interval\u001B[0m\r\n");
     }
     return true;
 }
Ejemplo n.º 4
0
 public virtual bool OnCommand(string command, Client sender)
 {
     return false;
 }
Ejemplo n.º 5
0
        private static bool BuiltInCmds(Client sender, string message, IList<string> split)
        {
            switch (split[0]) {
                case "/reloadplugins":
                    if (!sender.HasPermission("builtin.reloadplugs")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    PluginLoader.UnloadPlugins();
                    PluginLoader.LoadPlugins();
                    Logger.Log("Plugins reloaded");
                    return true;
                case "/changepass":
                    if (split.Count != 3) {
                        sender.Stream.Write("\u001B[33mUsage: /changepass [old_password] [new_password]" + LineEnd);
                        return true;
                    }
                    if (!NewClientHandler.CheckUserPass(sender.Username, split[1])) {
                        sender.Stream.Write("\u001B[31mIncorrect Password" + LineEnd);
                        return true;
                    }

                    NewClientHandler.Userconf["user." + sender.Username + ".hash"] = NewClientHandler.Hash(split[2]);

                    return true;
                case "/setpass":
                    if (!sender.HasPermission("builtin.setpass")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    if (split.Count != 3) {
                        sender.Stream.Write("\u001B[33mUsage: /setpass [username] [new_password]" + LineEnd);
                        return true;
                    }

                    NewClientHandler.Userconf["user." + split[1] + ".hash"] = NewClientHandler.Hash(split[2]);
                    sender.Stream.Write("\u001B[32mChanged the password successfully!" + LineEnd);
                    return true;
                case "/config":
                    if (!sender.HasPermission("builtin.viewconfig")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    var sp = message.Split(new[] { ' ' }, 4, StringSplitOptions.RemoveEmptyEntries);
                    if (sp.Length < 2) {
                        sender.Stream.Write("\u001B[33mValid configs: main, user, perm, string" + LineEnd);
                        return true;
                    }
                    Config c;
                    switch (sp[1]) {
                        case "main":
                            c = Main.config;
                            break;
                        case "user":
                            c = NewClientHandler.Userconf;
                            break;
                        case "perm":
                            c = Util.PermissionsConfig;
                            break;
                        case "string":
                            c = Main.strings;
                            break;
                        default:
                            sender.Stream.Write("\u001B[31mCould not find config '" + sp[1] + "'" + LineEnd);
                            sender.Stream.Write("\u001B[33mValid configs: main, user, perm, string" + LineEnd);
                            return true;
                    }
                    if (sp.Length < 3) {
                        sender.Stream.Write("\u001B[32m");
                        foreach (var kvp in c.Data) {
                            sender.Stream.Write(kvp.Key + ": " + kvp.Value + "\r\n");
                        }
                        sender.Stream.Write("\u001B[0m");
                        return true;
                    }
                    if (sp.Length < 4) {
                        sender.Stream.Write("\u001B[32m" + sp[2] + ": " + c[sp[2]] + LineEnd);
                        return true;
                    }

                    if (!sender.HasPermission("builtin.editconfig")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    if (sp[2].Equals("Delete", StringComparison.InvariantCultureIgnoreCase)) {
                        sender.Stream.Write(c.DeleteKey(sp[3])
                                                ? "\u001B[33mKey deleted!" + LineEnd
                                                : "\u001B[31mKey did not exist." + LineEnd);
                        Logger.Log(sender.Username + " changed the config: Deleted '" + sp[3] + "'", false, "config");
                        return true;
                    }

                    c[sp[2]] = sp[3];
                    sender.Stream.Write("\u001B[32m" + sp[2] + " has been changed to " + sp[3] + LineEnd);
                    Logger.Log(sender.Username + " changed the config: Changed '" + sp[2] + "' to '" + sp[3] + "'", false, "config");

                    return true;
                case "/createuser":
                    if (!sender.HasPermission("builtin.createuser")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    split = message.Split(new[] { ' ' }, 4, StringSplitOptions.RemoveEmptyEntries);
                    if (split.Count != 4) {
                        sender.Stream.Write("\u001B[33mUsage: /createuser [username] [security_level] [password]" + LineEnd);
                        return true;
                    }
                    int sec;
                    if (!int.TryParse(split[2], out sec)) {
                        sender.Stream.Write("\u001B[33mSecurity level must be a 32-bit integer" + LineEnd);
                        return true;
                    }
                    if (sec >= sender.SecurityLevel) {
                        sender.Stream.Write(
                            Escape("31") + "You are not allowed to create accounts with a security level greater than yours" + LineEnd);
                        return true;
                    }
                    NewClientHandler.Userconf["user." + split[1] + ".enabled"] = "true";
                    NewClientHandler.Userconf["user." + split[1] + ".hash"] = NewClientHandler.Hash(split[3]);
                    NewClientHandler.Userconf["user." + split[1] + ".sec"] = sec.ToString(CultureInfo.InvariantCulture);
                    sender.Stream.Write(Escape("32") + "User created successfully!" + LineEnd);
                    Logger.Log("User '" + split[1] + "' created by '" + sender.Username + "'", false, "user");
                    return true;
                case "#status":
                    if (!Server.Instance.IsRunning) {
                        sender.Stream.Write(Escape("33") + "Server is offline" + LineEnd);
                        return true;
                    }
                    Server.Instance.Process.Refresh();
                    sender.Stream.Write(Escape("32") + "Memory: " + Server.Instance.Process.WorkingSet64 + LineEnd);
                    sender.Stream.Write(Escape("32") + "Online: " + (DateTime.Now - Server.Instance.LastStarted) + LineEnd);
                    return true;
                case "/start":
                    if (Server.restartinprogress) {
                        return true;
                    }
                    if (!sender.HasPermission("server.start")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    if (Server.Instance.IsRunning) {
                        sender.Stream.Write(Escape("33") + "The server is already running" + LineEnd);
                        return true;
                    }
                    Server.Instance.Start();
                    return true;
                case "/stop":
                    if (Server.restartinprogress) {
                        return true;
                    }
                    if (!sender.HasPermission("server.stop")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    if (!Server.Instance.IsRunning) {
                        sender.Stream.Write(Escape("33") + "The server is not running" + LineEnd);
                        return true;
                    }
                    var msg = "";
                    for (var i = 1; i < split.Count; ++i) {
                        msg += split[i] + " ";
                    }
                    Server.Instance.Command("bsc_kick_all " + msg);
                    Server.Instance.Command("save-all");
                    Server.Instance.Command("stop");
                    return true;
                case "/restart":
                    if (Server.restartinprogress) {
                        return true;
                    }
                    if (!sender.HasPermission("server.restart")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    if (!Server.Instance.IsRunning) {
                        Server.Instance.Start();
                        return true;
                    }
                    Server.restartinprogress = true;
                    var msg2 = "";
                    for (var i = 1; i < split.Count; ++i) {
                        msg2 += split[i] + " ";
                    }
                    Server.Instance.Command("bsc_kick_all " + msg2);
                    Thread.Sleep(50);
                    Server.Instance.Command("save-all");
                    Server.Instance.Command("stop");
                    new Thread(
                        () => {
                            Server.Instance.WaitForStop();
                            Server.Instance.Start();
                            Server.restartinprogress = false;
                        }).Start();
                    return true;
                case "#ckick":
                    if (!sender.HasPermission("console.kick")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    if (split.Count != 2) {
                        sender.Stream.Write("\u001B[33mUsage: #ckick [name]");
                        return true;
                    }
                    foreach (var client in ClientLoop.Clients.
                        Where(client => client.
                        Username.Equals(split[1],
                        StringComparison.InvariantCultureIgnoreCase))
                        .ToArray()) {
                        sender.Stream.Write("\u001b[32mKicked: " + client.Username + ", logged in from " + client.Ip + "\u001b[0m\r\n");
                        client.Stream.Close();
                    }
                    return true;
                case "#consoleusers":
                    foreach (var client in ClientLoop.Clients) {
                        sender.Stream.Write("\u001b[32m" + client.Username + ", logged in from " + client.Ip + "\u001b[0m\r\n");
                    }
                    return true;
                case "#kill":
                    if (killables.Contains(sender.Username)) {
                        if (Server.Instance.IsRunning) {
                            Server.Instance.Process.Kill();
                        }
                        return true;
                    }
                    if (!sender.HasPermission("server.kill")) {
                        sender.Stream.Write("\u001B[31mYou do not have permission to do that." + LineEnd);
                        return true;
                    }
                    sender.Stream.Write("\u001B[31mAre you sure? Type #kill again to kill the server.\u001B[0m\r\n");
                    killables.Add(sender.Username);
                    new Thread(() => {
                        var usr = sender.Username;
                        Thread.Sleep(10000);
                        killables.Remove(usr);
                    }).Start();
                    return true;
                case "#serverip":
                    sender.Stream.Write(Main.config["serverip"]);
                    return true;
                case "###pong":
                    return true;
            }

            return false;
        }