using System; using System.Data; using System.Collections.Generic; using System.Collections.ObjectModel; using SnowLight.Storage; using SnowLight.Game.Rooms; using SnowLight.Specialized; using SnowLight.Game.Sessions; using SnowLight.Config; namespace SnowLight.Game.Moderation { public static class ModerationLogs { public static void LogChatMessage(SqlDatabaseClient MySqlClient, uint UserId, uint RoomId, string Message) { MySqlClient.SetParameter("userid", UserId); MySqlClient.SetParameter("roomid", RoomId); MySqlClient.SetParameter("message", Message); MySqlClient.SetParameter("timestamp", UnixTimestamp.GetCurrent()); MySqlClient.ExecuteNonQuery("INSERT INTO moderation_chatlogs (user_id,room_id,message,timestamp) VALUES (@userid,@roomid,@message,@timestamp)"); } public static void LogRoomEntry(uint UserId, uint RoomId) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { double Stamp = UnixTimestamp.GetCurrent(); MySqlClient.SetParameter("userid", UserId); MySqlClient.SetParameter("timestamp", Stamp); MySqlClient.ExecuteNonQuery("UPDATE room_visits SET timestamp_left = @timestamp WHERE user_id = @userid AND timestamp_left = 0 LIMIT 1"); MySqlClient.SetParameter("userid", UserId); MySqlClient.SetParameter("roomid", RoomId); MySqlClient.SetParameter("timestamp", Stamp); MySqlClient.ExecuteNonQuery("INSERT INTO room_visits (user_id,room_id,timestamp_entered) VALUES (@userid,@roomid,@timestamp)"); } } public static ReadOnlyCollection GetRoomVistsForUser(uint UserId, double FromTimestamp) { List Visits = new List(); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { MySqlClient.SetParameter("userid", UserId); MySqlClient.SetParameter("timestamp", FromTimestamp); DataTable Table = MySqlClient.ExecuteQueryTable("SELECT room_id,timestamp_entered,timestamp_left FROM room_visits WHERE user_id = @userid AND timestamp_entered >= @timestamp ORDER BY timestamp_entered DESC"); foreach (DataRow Row in Table.Rows) { Visits.Add(new ModerationRoomVisit((uint)Row["room_id"], (double)Row["timestamp_entered"], (double)Row["timestamp_left"])); } } return Visits.AsReadOnly(); } public static Dictionary> GetLogsForUser(uint UserId, double FromTimestamp) { Dictionary> Entries = new Dictionary>(); ReadOnlyCollection Visits = GetRoomVistsForUser(UserId, FromTimestamp); foreach (ModerationRoomVisit Visit in Visits) { Entries.Add(Visit, GetLogsForRoom(Visit.RoomId, Visit.TimestampEntered, Visit.TimestampLeft > 0 ? Visit.TimestampLeft : UnixTimestamp.GetCurrent())); } return new Dictionary>(Entries); } public static ReadOnlyCollection GetLogsForRoom(uint RoomId, double FromTimestamp, double ToTimestamp) { List Entries = new List(); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { MySqlClient.SetParameter("roomid", RoomId); MySqlClient.SetParameter("timestamp_from", FromTimestamp); MySqlClient.SetParameter("timestamp_to", ToTimestamp); DataTable Table = MySqlClient.ExecuteQueryTable("SELECT user_id,room_id,timestamp,message FROM moderation_chatlogs WHERE room_id = @roomid AND timestamp >= @timestamp_from AND timestamp <= @timestamp_to ORDER BY timestamp DESC"); foreach (DataRow Row in Table.Rows) { Entries.Add(new ModerationChatlogEntry((uint)Row["user_id"], (uint)Row["room_id"], (double)Row["timestamp"], (string)Row["message"])); } } return Entries.AsReadOnly(); } public static void LogModerationAction(SqlDatabaseClient MySqlClient, Session Session, string ActionDescr, string ActionDetail) { MySqlClient.SetParameter("userid", Session.CharacterId); MySqlClient.SetParameter("username", Session.CharacterInfo.Username); MySqlClient.SetParameter("timestamp", UnixTimestamp.GetCurrent()); MySqlClient.SetParameter("actiondescr", ActionDescr); MySqlClient.SetParameter("actiondetail", ActionDetail); MySqlClient.ExecuteNonQuery("INSERT INTO moderation_action_log (moderator_id,moderator_name,action_descr,action_detail,timestamp) VALUES (@userid,@username,@actiondescr,@actiondetail,@timestamp)"); } } }