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;