// calculate remaining jailtime public static long getRemainingTime(Players.Player causedBy) { JailRecord record = jailedPersons[causedBy]; long now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond / 1000; long remaining = record.jailTimestamp + record.jailDuration - now; return(remaining); }
// check time and release Players from jail public static void checkJailTimeLeft() { long now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond / 1000; foreach (KeyValuePair <Players.Player, JailRecord> kvp in jailedPersons) { Players.Player target = kvp.Key; JailRecord record = kvp.Value; if (record.jailTimestamp + record.jailDuration <= now) { releasePlayer(target, null); } } return; }
// load from config file public static void Load() { JSONNode jsonConfig; if (!JSON.Deserialize(ConfigfilePath, out jsonConfig, false)) { Log.Write("No {0} found inside world directory, creating default config", CONFIG_FILE); return; } Log.Write("Loading jail config from {0}", CONFIG_FILE); try { JSONNode position; if (jsonConfig.TryGetAs("position", out position)) { jailPosition.x = position.GetAs <float>("x"); jailPosition.y = position.GetAs <float>("y"); jailPosition.z = position.GetAs <float>("z"); jailRange = position.GetAs <uint>("range"); validJail = true; } else { Log.Write("Did not find a jail position, invalid config"); } JSONNode visitorPos; if (jsonConfig.TryGetAs("visitorPosition", out visitorPos)) { jailVisitorPosition.x = visitorPos.GetAs <float>("x"); jailVisitorPosition.y = visitorPos.GetAs <float>("y"); jailVisitorPosition.z = visitorPos.GetAs <float>("z"); validVisitorPos = true; } uint defaultJailTime; if (jsonConfig.TryGetAs("defaultJailTime", out defaultJailTime)) { DEFAULT_JAIL_TIME = defaultJailTime; } uint graceEscapeAttempts; if (jsonConfig.TryGetAs("graceEscapeAttempts", out graceEscapeAttempts)) { GRACE_ESCAPE_ATTEMPTS = graceEscapeAttempts; } JSONNode players; jsonConfig.TryGetAs("players", out players); foreach (JSONNode node in players.LoopArray()) { string PlayerName = node.GetAs <string>("target"); long jailTimestamp = node.GetAs <long>("time"); long jailDuration = node.GetAs <long>("duration"); string causedByName = node.GetAs <string>("jailedBy"); string reason = node.GetAs <string>("jailReason"); List <string> permissions = node.GetAs <List <string> >("permissions"); // TODO // List<string> permissions = new List<string>; // JSONNode jsonPerm; // node.TryGetAs("permissions", out jsonPerm); // foreach (string perm in jsonPerm.LoopArray()) { // permissions.Add(perm); // } Players.Player target; Players.Player causedBy; string error; // causedBy can be null in case of server actions, but target has to be a valid player PlayerHelper.TryGetPlayer(causedByName, out causedBy, out error, true); if (PlayerHelper.TryGetPlayer(PlayerName, out target, out error, true)) { JailRecord record = new JailRecord(jailTimestamp, jailDuration, causedBy, reason, permissions); jailedPersons.Add(target, record); } } } catch (Exception e) { Log.Write("Error parsing {0}: {1}", CONFIG_FILE, e.Message); } LoadLogFile(); return; }
// save to config file public static void Save() { Log.Write("Saving jail config to {0}", CONFIG_FILE); JSONNode jsonConfig = new JSONNode(); if (validJail) { JSONNode jsonPosition = new JSONNode(); jsonPosition.SetAs("x", jailPosition.x); jsonPosition.SetAs("y", jailPosition.y); jsonPosition.SetAs("z", jailPosition.z); jsonPosition.SetAs("range", jailRange); jsonConfig.SetAs("position", jsonPosition); } if (validVisitorPos) { JSONNode jsonVisitorPos = new JSONNode(); jsonVisitorPos.SetAs("x", jailVisitorPosition.x); jsonVisitorPos.SetAs("y", jailVisitorPosition.y); jsonVisitorPos.SetAs("z", jailVisitorPosition.z); jsonConfig.SetAs("visitorPosition", jsonVisitorPos); } jsonConfig.SetAs("defaultJailTime", DEFAULT_JAIL_TIME); jsonConfig.SetAs("graceEscapeAttempts", GRACE_ESCAPE_ATTEMPTS); JSONNode jsonPlayers = new JSONNode(NodeType.Array); foreach (KeyValuePair <Players.Player, JailRecord> kvp in jailedPersons) { Players.Player target = kvp.Key; JailRecord record = kvp.Value; JSONNode jsonRecord = new JSONNode(); jsonRecord.SetAs("target", target.ID.steamID); jsonRecord.SetAs("time", record.jailTimestamp); jsonRecord.SetAs("duration", record.jailDuration); jsonRecord.SetAs("jailReason", record.jailReason); if (record.jailedBy != null) { jsonRecord.SetAs("jailedBy", record.jailedBy.Name); } else { jsonRecord.SetAs("jailedBy", "Server"); } // JSONNode permissions = new JSONNode(NodeType.Array); // foreach (string perm in record.revokedPermissions) { // permissions.AddToArray(perm); // } //jsonRecord.SetAs("permissions", record.revokedPermissions.ToString()); // TODO jsonRecord.SetAs("permissions", "none"); jsonPlayers.AddToArray(jsonRecord); } jsonConfig.SetAs("players", jsonPlayers); try { JSON.Serialize(ConfigfilePath, jsonConfig); } catch (Exception e) { Log.Write("Could not save {0}: {1}", CONFIG_FILE, e.Message); } return; }
// send a player to jail public static void jailPlayer(Players.Player target, Players.Player causedBy, string reason, long jailtime) { if (!validJail) { if (causedBy == null) { Log.Write($"Cannot Jail {target.Name}: no valid jail found"); } else { Chat.Send(causedBy, "<color=yellow>No valid jail found. Unable to complete jailing</color>"); } return; } Helper.TeleportPlayer(target, jailPosition); List <string> permissions = new List <string>(); foreach (string permission in permissionList) { if (PermissionsManager.HasPermission(target, permission)) { permissions.Add(permission); // PermissionsManager.RemovePermissionOfUser(causedBy, target, permission); } } long now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond / 1000; // create/add history record JailLogRecord logRecord = new JailLogRecord(now, jailtime * 60, causedBy, reason); List <JailLogRecord> playerRecords; if (jailLog.TryGetValue(target, out playerRecords)) { playerRecords.Add(logRecord); } else { playerRecords = new List <JailLogRecord>(); playerRecords.Add(logRecord); jailLog.Add(target, playerRecords); } SaveLogFile(); // create jail record JailRecord record = new JailRecord(now, jailtime * 60, causedBy, reason, permissions); jailedPersons.Add(target, record); Save(); string sender; if (causedBy == null) { sender = "Server"; } else { sender = causedBy.Name; } Chat.Send(target, $"<color=red>{sender} threw you into jail! Reason: {reason}</color>"); Chat.Send(target, $"Remaining Jail Time: {jailtime} minutes, type /jailtime to check"); Chat.SendToConnectedBut(target, $"<color=red>{sender} threw {target.Name} into jail! Reason: {reason}</color>"); Log.Write($"{sender} threw {target.Name} into jail! Reason: {reason}"); return; }