diff --git a/.travis.yml b/.travis.yml index 622133dc..e7357131 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,3 +3,5 @@ solution: ./TShockAPI/TShockAPI.csproj notifications: hipchat: secure: hpRLWiHF2j6O2qJOVs++aqAmryN6G5kY0SF26/rKCpQ7klhMlDZIgI1V1dbkKqlculFtW1neS0EBJyV9lmcV5b26H+KhlZYGN0j7q1VcOTM3rvtU6wW0Ap22uRLl2RrnA4kEsgDAsNouPOkyLZ19hlHAISlsId6G4+Rfqg6k+zQ= + slack: + secure: O4Nibe2fdaUa2ZxuETUg6WEoQKvNM2CotnfaIVgm3fjfe61dfE1P+EgTpbwDG8646jSmpTqMDw8Z6I/WJwGTlXV/ZQsbwu63Cps4MgOTvPHZ0Lsye5azySlJZs1iI4ItYSj2czXfcnJ+qAl1SOOkXJrjB5uyTMWtDpCrSCFB3MA= diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index c04f2b00..8835ee64 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1285,11 +1285,11 @@ namespace TShockAPI { if (args.Silent) { - args.Player.SendInfoMessage("[broken name] was {1}banned for '{2}'.", force ? "force " : "", reason); + args.Player.SendInfoMessage("[broken name] was {0}banned for '{1}'.", force ? "force " : "", reason); } else { - TSPlayer.All.SendInfoMessage("{0} {1}banned [broken name] for '{3}'.", args.Player.Name, force ? "force " : "", reason); + TSPlayer.All.SendInfoMessage("{0} {1}banned [broken name] for '{2}'.", args.Player.Name, force ? "force " : "", reason); } } } @@ -4449,7 +4449,7 @@ namespace TShockAPI args.Player.SendSuccessMessage("Your new account has been verified, and the /auth system has been turned off."); args.Player.SendSuccessMessage("You can always use the /user command to manage players. Don't just delete the auth.lck."); - args.Player.SendSuccessMessage("Thank you for using TShock! http://tshock.co/ & http://github.com/TShock/TShock"); + args.Player.SendSuccessMessage("Thank you for using TShock! https://tshock.co/ & https://github.com/TShock/TShock"); FileTools.CreateFile(Path.Combine(TShock.SavePath, "auth.lck")); File.Delete(Path.Combine(TShock.SavePath, "authcode.txt")); TShock.AuthToken = 0; diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index b8d0c4a2..c817705d 100755 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -110,6 +110,45 @@ namespace TShockAPI.DB return 1 == ret.Count() ? ret.ElementAt(0) : null; } + /// + /// Adds group with name and permissions if it does not exist. + /// + /// name of group + /// parent of group + /// permissions + /// chatcolor + public void AddGroup(String name, string parentname, String permissions, String chatcolor) + { + if (GroupExists(name)) + { + throw new GroupExistsException(name); + } + + var group = new Group(name, null, chatcolor); + group.Permissions = permissions; + if (!string.IsNullOrWhiteSpace(parentname)) + { + var parent = groups.FirstOrDefault(gp => gp.Name == parentname); + if (parent == null || name == parentname) + { + var error = "Invalid parent {0} for group {1}".SFormat(parentname, group.Name); + TShock.Log.ConsoleError(error); + throw new GroupManagerException(error); + } + group.Parent = parent; + } + + string query = (TShock.Config.StorageType.ToLower() == "sqlite") + ? "INSERT OR IGNORE INTO GroupList (GroupName, Parent, Commands, ChatColor) VALUES (@0, @1, @2, @3);" + : "INSERT IGNORE INTO GroupList SET GroupName=@0, Parent=@1, Commands=@2, ChatColor=@3"; + if (database.Query(query, name, parentname, permissions, chatcolor) == 1) + { + groups.Add(group); + } + else + throw new GroupManagerException("Failed to add group '" + name + ".'"); + } + /// /// Adds group with name and permissions if it does not exist. /// @@ -118,13 +157,14 @@ namespace TShockAPI.DB /// permissions /// chatcolor /// exceptions true indicates use exceptions for errors false otherwise + [Obsolete("Use AddGroup(name, parentname, permissions, chatcolor) instead.")] public String AddGroup(String name, string parentname, String permissions, String chatcolor = Group.defaultChatColor, bool exceptions = false) { if (GroupExists(name)) { if (exceptions) throw new GroupExistsException(name); - return "Error: Group already exists. Use /modgroup to change permissions."; + return "Error: Group already exists; unable to add group."; } var group = new Group(name, null, chatcolor); diff --git a/TShockAPI/DB/SqlTable.cs b/TShockAPI/DB/SqlTable.cs index 5245e04c..8a9a9c2d 100755 --- a/TShockAPI/DB/SqlTable.cs +++ b/TShockAPI/DB/SqlTable.cs @@ -73,10 +73,10 @@ namespace TShockAPI.DB } /// - /// Ensures a table exists and that its structure is correct + /// Ensures a table exists and that its structure is correct /// /// The table name - [Obsolete("This method will be replaced by EnsureTableExists.")] + [Obsolete("This method will be replaced by EnsureTableStructure.")] public void EnsureExists(SqlTable table) { EnsureTableStructure(table); diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index 32afbe74..9e1ba90f 100755 --- a/TShockAPI/Properties/AssemblyInfo.cs +++ b/TShockAPI/Properties/AssemblyInfo.cs @@ -53,5 +53,5 @@ using System.Runtime.InteropServices; // Also, be sure to release on github with the exact assembly version tag as below // so that the update manager works correctly (via the Github releases api and mimic) -[assembly: AssemblyVersion("4.2.7")] -[assembly: AssemblyFileVersion("4.2.7")] +[assembly: AssemblyVersion("4.2.8")] +[assembly: AssemblyFileVersion("4.2.8")] diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 4374c295..e7c605fe 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -483,7 +483,7 @@ namespace TShockAPI if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) { SavePath = path; - Log.ConsoleInfo("Config path has been set to " + path); + ServerApi.LogWriter.PluginWriteLine(this, "Config path has been set to " + path, TraceLevel.Info); } break; @@ -492,7 +492,7 @@ namespace TShockAPI if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) { Main.WorldPath = path; - Log.ConsoleInfo("World path has been set to " + path); + ServerApi.LogWriter.PluginWriteLine(this, "World path has been set to " + path, TraceLevel.Info); } break; @@ -501,7 +501,7 @@ namespace TShockAPI if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1) { LogPath = path; - Log.ConsoleInfo("Log path has been set to " + path); + ServerApi.LogWriter.PluginWriteLine(this, "Log path has been set to " + path, TraceLevel.Info); } break; @@ -1229,7 +1229,7 @@ namespace TShockAPI if (Main.ServerSideCharacter) { player.SendErrorMessage( - player.IgnoreActionsForInventory = "Server side characters is enabled! Please {0}register or {0}login to play!", Commands.Specifier); + player.IgnoreActionsForInventory = String.Format("Server side characters is enabled! Please {0}register or {0}login to play!", Commands.Specifier)); player.LoginHarassed = true; } else if (Config.RequireLogin) diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index a4884856..873b2ee7 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -63,28 +63,6 @@ namespace TShockAPI return mess.Split(':')[0]; } - /// - /// Used for some places where a list of players might be used. - /// - /// String of players seperated by commas. - [Obsolete("Use GetPlayers and manually create strings. This should never have been kept as far as actual functions go.")] - public string GetPlayers() - { - var sb = new StringBuilder(); - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active) - { - if (sb.Length != 0) - { - sb.Append(", "); - } - sb.Append(player.Name); - } - } - return sb.ToString(); - } - /// /// Returns a list of current players on the server /// @@ -112,30 +90,6 @@ namespace TShockAPI return players; } - /// - /// Used for some places where a list of players might be used. - /// - /// String of players and their id seperated by commas. - [Obsolete("Use GetPlayers and manually create strings. This should never have been kept as far as actual functions go.")] - public string GetPlayersWithIds() - { - var sb = new StringBuilder(); - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active) - { - if (sb.Length != 0) - { - sb.Append(", "); - } - sb.Append(player.Name); - string id = "(ID: " + Convert.ToString(TShock.Users.GetUserID(player.UserAccountName)) + ", IX:" + player.Index + ")"; - sb.Append(id); - } - } - return sb.ToString(); - } - /// /// Finds a player and gets IP as string /// @@ -697,7 +651,7 @@ namespace TShockAPI } foo = foo.Replace("%map%", Main.worldName); - foo = foo.Replace("%players%", GetPlayers()); + foo = foo.Replace("%players%", String.Join(",", GetPlayers(false))); Regex reg = new Regex("%\\s*(?\\d{1,3})\\s*,\\s*(?\\d{1,3})\\s*,\\s*(?\\d{1,3})\\s*%"); var matches = reg.Matches(foo); Color c = Color.White;