private static void ReleaseTicket(Session Session, ClientMessage Message) { if (!Session.HasRight("moderation_tickets")) { return; } int Amount = Message.PopWiredInt32(); lock (mSyncRoot) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { for (int i = 0; i < Amount; i++) { ModerationTicket Ticket = GetTicket(Message.PopWiredUInt32()); if (Ticket == null || Ticket.Status != ModerationTicketStatus.Assigned || Ticket.ModeratorUserId != Session.CharacterId) { continue; } Ticket.AssignTo(MySqlClient, 0); SendDataToAllModerators(ModerationTicketComposer.Compose(Ticket)); } } } }
private static void GetTicketChatlog(Session Session, ClientMessage Message) { if (!Session.HasRight("moderation_tool")) { return; } ModerationTicket Ticket = ModerationTicketManager.GetTicket(Message.PopWiredUInt32()); if (Ticket == null || Ticket.ModeratorUserId != Session.CharacterId) { Session.SendData(NotificationMessageComposer.Compose("Ticket not found or ticket is not assigned to you.")); return; } RoomInfo Info = null; if (Ticket.RoomId > 0) { Info = RoomInfoLoader.GetRoomInfo(Ticket.RoomId); } Session.SendData(ModerationTicketChatlogsComposer.Compose(Ticket, Info, ModerationLogs.GetLogsForRoom(Ticket.RoomId, (Ticket.CreatedTimestamp - 600), UnixTimestamp.GetCurrent()))); }
public static ServerMessage Compose(ModerationTicket Ticket, RoomInfo Info, ReadOnlyCollection<ModerationChatlogEntry> Entries) { ServerMessage Message = new ServerMessage(OpcodesOut.MODERATION_CHATLOGS_TICKET); Message.AppendUInt32(Ticket.Id); Message.AppendUInt32(Ticket.ReporteeUserId); Message.AppendUInt32(Ticket.ReportedUserId); Message.AppendUInt32(Ticket.Id); // Number to display in title. Chatlog ID? Message.AppendBoolean(Info != null ? Info.Type == RoomType.Public : false); Message.AppendUInt32(Info != null ? Info.Id : 0); Message.AppendStringWithBreak(Info != null ? Info.Name : "(Unknown room)"); Message.AppendInt32(Entries.Count); foreach (ModerationChatlogEntry Entry in Entries) { DateTime Time = UnixTimestamp.GetDateTimeFromUnixTimestamp(Entry.Timestamp); Message.AppendInt32(Time.Hour); Message.AppendInt32(Time.Minute); Message.AppendUInt32(Entry.UserId); Message.AppendStringWithBreak(Entry.UserName); Message.AppendStringWithBreak(Entry.Message); } return Message; }
private static void PickTicket(Session Session, ClientMessage Message) { if (!Session.HasRight("moderation_tickets")) { return; } int Unknown1 = Message.PopWiredInt32(); lock (mSyncRoot) { ModerationTicket Ticket = GetTicket(Message.PopWiredUInt32()); if (Ticket == null || Ticket.Status != ModerationTicketStatus.OpenTicket) { Session.SendData(ModerationPickingErrorComposer.Compose()); return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Ticket.AssignTo(MySqlClient, Session.CharacterId); } SendDataToAllModerators(ModerationTicketComposer.Compose(Ticket)); } }
public static ServerMessage Compose(ModerationTicket Ticket) { string DisplayRoomName = string.Empty; if (Ticket.RoomId > 0) { RoomInfo Info = RoomInfoLoader.GetRoomInfo(Ticket.RoomId); DisplayRoomName = Info == null ? "(Unknown room " + Ticket.RoomId + ")" : Info.Name; } ServerMessage Message = new ServerMessage(OpcodesOut.MODERATION_TICKET); Message.AppendUInt32(Ticket.Id); Message.AppendUInt32(Ticket.TabId); Message.AppendUInt32(11); // ?? unknown Message.AppendUInt32(Ticket.CategoryId); Message.AppendUInt32(11); // ?? unknown Message.AppendUInt32(Ticket.Score); Message.AppendUInt32(Ticket.ReporteeUserId); Message.AppendStringWithBreak(CharacterResolverCache.GetNameFromUid(Ticket.ReporteeUserId)); Message.AppendUInt32(Ticket.ReportedUserId); Message.AppendStringWithBreak(CharacterResolverCache.GetNameFromUid(Ticket.ReportedUserId)); Message.AppendUInt32(Ticket.ModeratorUserId); Message.AppendStringWithBreak(CharacterResolverCache.GetNameFromUid(Ticket.ModeratorUserId)); Message.AppendStringWithBreak(Ticket.Message); Message.AppendUInt32(Ticket.RoomId); Message.AppendStringWithBreak(DisplayRoomName); return Message; }
private static void HandleIncomingTicket(Session Session, ClientMessage Message) { if (GetPendingTicketForUser(Session.CharacterId) != null) { Session.SendData(HelpSubmitCfhResultComposer.Compose(CfhErrorCode.AlreadyHaveCall)); return; } if (Session.CharacterInfo.ModerationTicketsCooldownSeconds > 0) { Session.SendData(HelpSubmitCfhResultComposer.Compose(CfhErrorCode.AbusiveCooldown)); return; } string TicketBody = UserInputFilter.FilterString(Message.PopString()); uint Unknown = Message.PopWiredUInt32(); uint Category = Message.PopWiredUInt32(); uint ReportedUser = Message.PopWiredUInt32(); uint RoomId = Session.CurrentRoomId; double Timestamp = UnixTimestamp.GetCurrent(); lock (mSyncRoot) { uint GeneratedId = 0; using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { MySqlClient.SetParameter("category", Category); MySqlClient.SetParameter("reporteduid", ReportedUser); MySqlClient.SetParameter("reporteeuid", Session.CharacterId); MySqlClient.SetParameter("roomid", RoomId); MySqlClient.SetParameter("timestamp", Timestamp); MySqlClient.SetParameter("message", TicketBody); string GeneratedResult = MySqlClient.ExecuteScalar("INSERT INTO moderation_tickets (category,reported_user_id,reportee_user_id,room_id,timestamp,message) VALUES (@category,@reporteduid,@reporteeuid,@roomid,@timestamp,@message); SELECT LAST_INSERT_ID();").ToString(); uint.TryParse(GeneratedResult, out GeneratedId); } if (GeneratedId > 0) { ModerationTicket NewTicket = new ModerationTicket(GeneratedId, Category, ModerationTicketStatus.OpenTicket, ReportedUser, Session.CharacterId, 0, RoomId, Timestamp, TicketBody); mTickets.Add(GeneratedId, NewTicket); ServerMessage TicketMessage = ModerationTicketComposer.Compose(NewTicket); SendDataToAllModerators(TicketMessage); Session.CharacterInfo.ModerationTickets++; } } Session.SendData(HelpSubmitCfhResultComposer.Compose(CfhErrorCode.Ok)); }
private static void DeletePendingTicket(Session Session, ClientMessage Message) { ModerationTicket OldTicket = GetPendingTicketForUser(Session.CharacterId); if (OldTicket == null) { return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { OldTicket.UpdateStatus(MySqlClient, ModerationTicketStatus.DeletedByUser); } SendDataToAllModerators(ModerationTicketComposer.Compose(OldTicket)); Session.SendData(HelpCfhDeletedOkComposer.Compose()); }
private static void HandleIncomingTicket(Session Session, ClientMessage Message) { if (GetPendingTicketForUser(Session.CharacterId) != null) { Session.SendData(HelpSubmitCfhResultComposer.Compose(CfhErrorCode.AlreadyHaveCall)); return; } if (Session.CharacterInfo.ModerationTicketsCooldownSeconds > 0) { Session.SendData(HelpSubmitCfhResultComposer.Compose(CfhErrorCode.AbusiveCooldown)); return; } string TicketBody = UserInputFilter.FilterString(Message.PopString()); uint Unknown = Message.PopWiredUInt32(); uint Category = Message.PopWiredUInt32(); uint ReportedUser = Message.PopWiredUInt32(); uint RoomId = Session.CurrentRoomId; double Timestamp = UnixTimestamp.GetCurrent(); lock (mSyncRoot) { uint GeneratedId = 0; using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { MySqlClient.SetParameter("category", Category); MySqlClient.SetParameter("reporteduid", ReportedUser); MySqlClient.SetParameter("reporteeuid", Session.CharacterId); MySqlClient.SetParameter("roomid", RoomId); MySqlClient.SetParameter("timestamp", Timestamp); MySqlClient.SetParameter("message", TicketBody); string GeneratedResult = MySqlClient.ExecuteScalar("INSERT INTO moderation_tickets (category,reported_user_id,reportee_user_id,room_id,timestamp,message) VALUES (@category,@reporteduid,@reporteeuid,@roomid,@timestamp,@message); SELECT LAST_INSERT_ID();").ToString(); uint.TryParse(GeneratedResult, out GeneratedId); } if (GeneratedId > 0) { ModerationTicket NewTicket = new ModerationTicket(GeneratedId, Category, ModerationTicketStatus.OpenTicket, ReportedUser, Session.CharacterId, 0, RoomId, Timestamp, TicketBody); mTickets.Add(GeneratedId, NewTicket); ServerMessage TicketMessage = ModerationTicketComposer.Compose(NewTicket); SendDataToAllModerators(TicketMessage); Session.CharacterInfo.ModerationTickets++; } } Session.SendData(HelpSubmitCfhResultComposer.Compose(CfhErrorCode.Ok)); }
private static void CloseTicket(Session Session, ClientMessage Message) { if (!Session.HasRight("moderation_tickets")) { return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { int ResultCode = Message.PopWiredInt32(); int Unknown1 = Message.PopWiredInt32(); lock (mSyncRoot) { ModerationTicket Ticket = GetTicket(Message.PopWiredUInt32()); if (Ticket == null || Ticket.Status != ModerationTicketStatus.Assigned || Ticket.ModeratorUserId != Session.CharacterId) { return; } ModerationTicketStatus ResultStatus = ModerationTicketStatus.Resolved; Session TargetSession = SessionManager.GetSessionByCharacterId(Ticket.ReporteeUserId); switch (ResultCode) { case 1: ResultStatus = ModerationTicketStatus.ClosedInvalid; break; case 2: ResultStatus = ModerationTicketStatus.ClosedAbusive; break; } Ticket.UpdateStatus(MySqlClient, ResultStatus); SendDataToAllModerators(ModerationTicketComposer.Compose(Ticket)); if (TargetSession != null && !Ticket.ModeratorResponded) { TargetSession.SendData(HelpCfhClosedResultComposer.Compose(ResultCode)); } if (ResultStatus == ModerationTicketStatus.ClosedAbusive) { CharacterInfo TargetInfo = TargetSession == null?CharacterInfoLoader.GetCharacterInfo(MySqlClient, Ticket.ReporteeUserId) : TargetSession.CharacterInfo; if (TargetInfo != null) { TargetInfo.ModerationTicketsCooldownSeconds = 600; TargetInfo.ModerationTicketsAbusive++; // Sync our new statistics manually if this will not happen by session closure if (TargetSession == null) { TargetInfo.SynchronizeStatistics(MySqlClient); } } } } } }