Ejemplo n.º 1
0
        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));
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 4
0
        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));
            }
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
        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));
        }
Ejemplo n.º 7
0
        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());
        }
Ejemplo n.º 8
0
        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));
        }
Ejemplo n.º 9
0
        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);
                            }
                        }
                    }
                }
            }
        }