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 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)); } }
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()); }
public void TryAuthenticate(string Ticket, string RemoteAddress) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { uint AuthedUid = SingleSignOnAuthenticator.TryAuthenticate(MySqlClient, Ticket, RemoteAddress); if (AuthedUid <= 0) { SessionManager.StopSession(mId); return; } CharacterInfo Info = CharacterInfoLoader.GetCharacterInfo(MySqlClient, AuthedUid, mId, true); if (Info == null || !Info.HasLinkedSession) // not marked online = CharacterInfoLoader failed somehow { SessionManager.StopSession(mId); return; } mCharacterInfo = Info; mAchieventCache = new AchievementCache(MySqlClient, CharacterId); mBadgeCache = new BadgeCache(MySqlClient, CharacterId, mAchieventCache); if (!HasRight("login")) { SessionManager.StopSession(mId); return; } mCharacterInfo.TimestampLastOnline = UnixTimestamp.GetCurrent(); CharacterResolverCache.AddToCache(mCharacterInfo.Id, mCharacterInfo.Username, true); mMessengerFriendCache = new SessionMessengerFriendCache(MySqlClient, CharacterId); mFavoriteRoomsCache = new FavoriteRoomsCache(MySqlClient, CharacterId); mRatedRoomsCache = new RatedRoomsCache(); mInventoryCache = new InventoryCache(MySqlClient, CharacterId); mIgnoreCache = new UserIgnoreCache(MySqlClient, CharacterId); mNewItemsCache = new NewItemsCache(MySqlClient, CharacterId); mAvatarEffectCache = new AvatarEffectCache(MySqlClient, CharacterId); mQuestCache = new QuestCache(MySqlClient, CharacterId); mPetCache = new PetInventoryCache(MySqlClient, CharacterId); // Subscription manager MySqlClient.SetParameter("userid", CharacterId); DataRow Row = MySqlClient.ExecuteQueryRow("SELECT * FROM user_subscriptions WHERE user_id = @userid"); mSubscriptionManager = (Row != null ? new ClubSubscription(CharacterId, (ClubSubscriptionLevel)int.Parse((Row["subscription_level"].ToString())), (double)Row["timestamp_created"], (double)Row["timestamp_expire"], (double)Row["past_time_hc"], (double)Row["past_time_vip"]) : new ClubSubscription(CharacterId, ClubSubscriptionLevel.None, 0, 0, 0, 0)); if (mSubscriptionManager.SubscriptionLevel < ClubSubscriptionLevel.VipClub) { mBadgeCache.DisableSubscriptionBadge("ACH_VipClub"); } if (mSubscriptionManager.SubscriptionLevel < ClubSubscriptionLevel.BasicClub) { mBadgeCache.DisableSubscriptionBadge("ACH_BasicClub"); } mAvatarEffectCache.CheckEffectExpiry(this); mAuthProcessed = true; SendData(AuthenticationOkComposer.Compose()); SendData(FuseRightsListComposer.Compose(this)); SendData(UserHomeRoomComposer.Compose(mCharacterInfo.HomeRoom)); SendData(UserEffectListComposer.Compose(AvatarEffectCache.Effects)); SendData(NavigatorFavoriteRoomsComposer.Compose(FavoriteRoomsCache.FavoriteRooms)); SendData(InventoryNewItemsComposer.Compose(NewItemsCache.NewItems)); SendData(AchievementDataListComposer.Compose(AchievementManager.Achievements.Values.ToList())); SendData(AvailabilityStatusMessageComposer.Compose()); SendData(InfoFeedEnableMessageComposer.Compose(1)); SendData(ActivityPointsMessageComposer.Compose()); if (HasRight("moderation_tool")) { SendData(ModerationToolComposer.Compose(this, ModerationPresets.UserMessagePresets, ModerationPresets.UserActionPresets, ModerationPresets.RoomMessagePresets)); foreach (ModerationTicket ModTicket in ModerationTicketManager.ActiveTickets) { SendData(ModerationTicketComposer.Compose(ModTicket)); } } MessengerHandler.MarkUpdateNeeded(this, 0, true); } }
public void TryAuthenticate(string Ticket, string RemoteAddress) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { uint AuthedUid = SingleSignOnAuthenticator.TryAuthenticate(MySqlClient, Ticket, RemoteAddress); if (AuthedUid <= 0) { SessionManager.StopSession(mId); return; } CharacterInfo Info = CharacterInfoLoader.GetCharacterInfo(MySqlClient, AuthedUid, mId, true); if (Info == null || !Info.HasLinkedSession) // not marked online = CharacterInfoLoader failed somehow { SessionManager.StopSession(mId); return; } mCharacterInfo = Info; mAchieventCache = new AchievementCache(MySqlClient, CharacterId); mBadgeCache = new BadgeCache(MySqlClient, CharacterId, mAchieventCache); if (!HasRight("login")) { SessionManager.StopSession(mId); return; } mCharacterInfo.TimestampLastOnline = UnixTimestamp.GetCurrent(); CharacterResolverCache.AddToCache(mCharacterInfo.Id, mCharacterInfo.Username, true); mMessengerFriendCache = new SessionMessengerFriendCache(MySqlClient, CharacterId); mFavoriteRoomsCache = new FavoriteRoomsCache(MySqlClient, CharacterId); mRatedRoomsCache = new RatedRoomsCache(); mInventoryCache = new InventoryCache(MySqlClient, CharacterId); mIgnoreCache = new UserIgnoreCache(MySqlClient, CharacterId); mNewItemsCache = new NewItemsCache(MySqlClient, CharacterId); mAvatarEffectCache = new AvatarEffectCache(MySqlClient, CharacterId); mQuestCache = new QuestCache(MySqlClient, CharacterId); mPetCache = new PetInventoryCache(MySqlClient, CharacterId); // Subscription manager MySqlClient.SetParameter("userid", CharacterId); DataRow Row = MySqlClient.ExecuteQueryRow("SELECT * FROM user_subscriptions WHERE user_id = @userid"); mSubscriptionManager = (Row != null ? new ClubSubscription(CharacterId, (ClubSubscriptionLevel)int.Parse((Row["subscription_level"].ToString())), (double)Row["timestamp_created"], (double)Row["timestamp_expire"], (double)Row["past_time_hc"], (double)Row["past_time_vip"]) : new ClubSubscription(CharacterId, ClubSubscriptionLevel.None, 0, 0, 0, 0)); if (mSubscriptionManager.SubscriptionLevel < ClubSubscriptionLevel.VipClub) { mBadgeCache.DisableSubscriptionBadge("ACH_VipClub"); } if (mSubscriptionManager.SubscriptionLevel < ClubSubscriptionLevel.BasicClub) { mBadgeCache.DisableSubscriptionBadge("ACH_BasicClub"); } mAvatarEffectCache.CheckEffectExpiry(this); mAuthProcessed = true; SendData(AuthenticationOkComposer.Compose()); SendData(FuseRightsListComposer.Compose(this)); SendData(UserHomeRoomComposer.Compose(mCharacterInfo.HomeRoom)); SendData(UserEffectListComposer.Compose(AvatarEffectCache.Effects)); SendData(NavigatorFavoriteRoomsComposer.Compose(FavoriteRoomsCache.FavoriteRooms)); SendData(InventoryNewItemsComposer.Compose(NewItemsCache.NewItems)); SendData(MessageOfTheDayComposer.Compose("Welcome to uberHotel.org BETA.\n\n\nThank you for participating in the uberHotel.org BETA test. We hope to gather relevant feedback and ideas to help make this hotel into a success.\n\nPlease submit any bugs, feedback, or ideas via:\nhttp://snowlight.uservoice.com\n\n\nHave fun, and thank you for joining us!")); SendData(AchievementDataListComposer.Compose(AchievementManager.Achievements.Values.ToList())); // This is available status packet (AvailabilityStatusMessageComposer) ServerMessage UnkMessage2 = new ServerMessage(290); UnkMessage2.AppendInt32(1); UnkMessage2.AppendInt32(0); SendData(UnkMessage2); // This is info feed packet (InfoFeedEnableMessageComposer) ServerMessage UnkMessage3 = new ServerMessage(517); UnkMessage3.AppendInt32(1); // 1 = enabled 0 = disabled (true/false) SendData(UnkMessage3); // This is activity points message (ActivityPointsMessageComposer) not sure how this is handled... ServerMessage UnkMessage4 = new ServerMessage(628); UnkMessage4.AppendInt32(1); UnkMessage4.AppendInt32(0); UnkMessage4.AppendInt32(2971); SendData(UnkMessage4); SendData(ClientConfigComposer.Compose(CharacterInfo.ConfigVolume, false)); if (HasRight("moderation_tool")) { SendData(ModerationToolComposer.Compose(this, ModerationPresets.UserMessagePresets, ModerationPresets.UserActionPresets, ModerationPresets.RoomMessagePresets)); foreach (ModerationTicket ModTicket in ModerationTicketManager.ActiveTickets) { SendData(ModerationTicketComposer.Compose(ModTicket)); } } MessengerHandler.MarkUpdateNeeded(this, 0, true); } }
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); } } } } } }