private static void AlertRoom(Session Session, ClientMessage Message) { if (!Session.HasRight("moderation_tool")) { return; } RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { Session.SendData(NotificationMessageComposer.Compose("Could not send room alert.")); return; } int Unknown1 = Message.PopWiredInt32(); int AlertMode = Message.PopWiredInt32(); string AlertMessage = Message.PopString(); bool IsCaution = AlertMode != 3; Instance.SendModerationAlert(AlertMessage, IsCaution); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Sent room " + (IsCaution ? "caution" : "message"), "Room " + Instance.Info.Name + " (ID " + Instance.RoomId + "): '" + AlertMessage + "'"); } }
private static void BanUser(Session Session, ClientMessage Message) { if (!Session.HasRight("moderation_tool")) { return; } uint UserId = Message.PopWiredUInt32(); string MessageText = Message.PopString(); double Length = (Message.PopWiredInt32() * 3600); Session TargetSession = SessionManager.GetSessionByCharacterId(UserId); if (TargetSession == null || TargetSession.HasRight("moderation_tool")) { Session.SendData(NotificationMessageComposer.Compose("This user is not online or you do not have permission to ban them.\nPlease use housekeeping to ban users that are offline.")); return; } SessionManager.StopSession(TargetSession.Id); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationBanManager.BanUser(MySqlClient, UserId, MessageText, Session.CharacterId, Length); ModerationLogs.LogModerationAction(MySqlClient, Session, "Banned user", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ") for " + Length + " hours: '" + MessageText + "'"); } }
private static void SsoLogin(Session Session, ClientMessage Message) { if (Session.Authenticated) { return; } string Ticket = UserInputFilter.FilterString(Message.PopString()); Session.TryAuthenticate(Ticket, Session.RemoteAddress.ToString()); }
private static void OnUserAgent(Session Session, ClientMessage Message) { string UserAgent = Message.PopString(); if (UserAgent.Length > 2000) { UserAgent = UserAgent.Substring(0, 2000); } Session.UserAgent = UserAgent; }
private static void SetFigure(Session Session, ClientMessage Message) { // todo: verify data(!!!!) string NewGender = Message.PopString().ToLower(); string NewFigure = UserInputFilter.FilterString(Message.PopString()); if (NewGender != "m" && NewGender != "f") { NewGender = "m"; } if (NewFigure.Length == 0 || (NewFigure == Session.CharacterInfo.Figure)) { return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Session.CharacterInfo.UpdateFigure(MySqlClient, NewGender, NewFigure); AchievementManager.ProgressUserAchievement(MySqlClient, Session, "ACH_AvatarLooks", 1); } QuestManager.ProgressUserQuest(Session, QuestType.PROFILE_CHANGE_LOOK); Session.SendInfoUpdate(); }
private static void GetPopularRooms(Session Session, ClientMessage Message) { if (Session.HasRight("hotel_admin")) { ServerMessage Response = TryGetResponseFromCache(0, Message); if (Response != null) { Session.SendData(Response); return; } int Category = -1; int.TryParse(Message.PopString(), out Category); IEnumerable<RoomInstance> Rooms = (from RoomInstance in RoomManager.RoomInstances where RoomInstance.Value.Info.Type == RoomType.Flat && RoomInstance.Value.CachedNavigatorUserCount > 0 && (Category == -1 || RoomInstance.Value.Info.CategoryId == Category) orderby RoomInstance.Value.CachedNavigatorUserCount descending select RoomInstance.Value).Take(50); Response = NavigatorRoomListComposer.Compose(Category, 1, string.Empty, Rooms.ToList()); AddToCacheIfNeeded(0, Message, Response); Session.SendData(Response); } }
private static void UpdateMoodlight(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session, true)) { return; } Item Item = Instance.MoodlightItem; if (Item == null) { return; } MoodlightData Data = MoodlightData.GenerateFromFlags(Item.Flags); int PresetId = Message.PopWiredInt32(); MoodlightPreset Preset = null; if (Data.Presets.ContainsKey(PresetId)) { Preset = Data.Presets[PresetId]; } if (Preset == null) { return; } Preset.BackgroundOnly = !Message.PopWiredBoolean(); Preset.ColorCode = UserInputFilter.FilterString(Message.PopString().Trim()); Preset.ColorIntensity = Message.PopWiredInt32(); if (!MoodlightData.IsValidColor(Preset.ColorCode)) { return; } Item.Flags = Data.ToItemFlagData(); Item.DisplayFlags = Data.ToDisplayData(); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.SynchronizeDatabase(MySqlClient, true); } Item.BroadcastStateUpdate(Instance); }
private static void SaveBranding(Session Session, ClientMessage Message) { uint ItemId = Message.PopWiredUInt32(); uint Data = Message.PopWiredUInt32(); string Brand = Message.PopString(); string Brand2 = Message.PopString(); string Brand3 = Message.PopString(); string Brand4 = Message.PopString(); string Brand5 = Message.PopString(); string Brand6 = Message.PopString(); string Brand7 = Message.PopString(); string Brand8 = Message.PopString(); string Brand9 = Message.PopString(); string Brand10 = Message.PopString(); string BrandData = Brand + "=" + Brand2 + Convert.ToChar(9) + Brand3 + "=" + Brand4 + Convert.ToChar(9) + Brand5 + "=" + Brand6 + Convert.ToChar(9) + Brand7 + "=" + Brand8 + Convert.ToChar(9) + Brand9 + "=" + Brand10 + Convert.ToChar(9) + "state=0"; RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); Item Item = Instance.GetItem(ItemId); Item.Flags = BrandData; Item.DisplayFlags = BrandData; RoomManager.MarkWriteback(Item, true); Item.BroadcastStateUpdate(Instance); Instance.RegenerateRelativeHeightmap(); }
private static void MoveWallItem(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session)) { return; } Item Item = Instance.GetItem(Message.PopWiredUInt32()); if (Item == null || Item.Definition.Type != ItemType.WallItem) { return; } string RawPlacementData = Message.PopString(); string WallPos = Instance.SetWallItem(Session, RawPlacementData, Item); if (WallPos.Length > 0) { Item.MoveToRoom(null, Instance.RoomId, new Vector3(0, 0, 0), 0, WallPos); RoomManager.MarkWriteback(Item, false); Instance.BroadcastMessage(RoomWallItemMovedComposer.Compose(Item)); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Moved); } }
private static void OnSendIm(Session Session, ClientMessage Message) { uint UserId = Message.PopWiredUInt32(); string Text = UserInputFilter.FilterString(Message.PopString()).Trim(); if (UserId <= 0 || Text.Length < 1) { return; } if (Session.CharacterInfo.IsMuted) { Session.SendData(MessengerImErrorComposer.Compose(4, UserId)); return; } if (!Session.MessengerFriendCache.Friends.Contains(UserId)) { Session.SendData(MessengerImErrorComposer.Compose(6, UserId)); return; } Session TargetSession = SessionManager.GetSessionByCharacterId(UserId); if (TargetSession == null) { Session.SendData(MessengerImErrorComposer.Compose(5, UserId)); return; } if (TargetSession.CharacterInfo.IsMuted) { Session.SendData(MessengerImErrorComposer.Compose(3, UserId)); return; } TargetSession.SendData(MessengerImMessageComposer.Compose(Session.CharacterId, Text)); if (Text == ":restart") { if (!Session.HasRight("hotel_admin")) { } else { string reason = "[SYS] Forced update"; SessionManager.BroadcastPacket(NotificationMessageComposer.Compose("The server is restarting for an update! \nPlease log back in when you logout.\n\nUpdates don't take long at RealityRP.\n\nReason for Update:\n" + reason)); System.Threading.Thread.Sleep(15000); if (System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe" == "Reality.exe") { Process.Start(Environment.CurrentDirectory + "\\Reality1.exe", "\"delay 4000\""); } else { Process.Start(Environment.CurrentDirectory + "\\Reality.exe", "\"delay 4000\""); } Program.Stop(); Program.Stop(); } } }
private static void OnMessengerSearch(Session Session, ClientMessage Message) { string SearchQuery = UserInputFilter.FilterString(Message.PopString().Replace('%', ' ')); if (SearchQuery.Length < 1) { return; } List<CharacterInfo> Results = new List<CharacterInfo>(); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { MySqlClient.SetParameter("query", SearchQuery + "%"); DataTable Table = MySqlClient.ExecuteQueryTable("SELECT id FROM characters WHERE username LIKE @query LIMIT 50"); foreach (DataRow Row in Table.Rows) { Results.Add(CharacterInfoLoader.GetCharacterInfo(MySqlClient, (uint)Row["id"])); } } ReadOnlyCollection<uint> CurrentFriends = Session.MessengerFriendCache.Friends; List<CharacterInfo> Friends = new List<CharacterInfo>(); List<CharacterInfo> NonFriends = new List<CharacterInfo>(); foreach (CharacterInfo Info in Results) { if (CurrentFriends.Contains(Info.Id)) { Friends.Add(Info); continue; } NonFriends.Add(Info); } Session.SendData(MessengerSearchResultsComposer.Compose(Friends, NonFriends)); }
private static void OnInvite(Session Session, ClientMessage Message) { int Count = Message.PopWiredInt32(); List<uint> Targets = new List<uint>(); for (int i = 0; (i < Count && i < 50); i++) { Targets.Add(Message.PopWiredUInt32()); } string MessageText = UserInputFilter.FilterString(Message.PopString()); if (MessageText.Length > 121) { MessageText = MessageText.Substring(0, 121); } foreach (uint UserId in Targets) { if (!Session.MessengerFriendCache.Friends.Contains(UserId)) { continue; } Session TargetSession = SessionManager.GetSessionByCharacterId(UserId); if (TargetSession == null) { continue; } TargetSession.SendData(MessengerImInviteComposer.Compose(Session.CharacterId, MessageText)); } }
private static void OnFriendRequest(Session Session, ClientMessage Message) { string RequestName = UserInputFilter.FilterString(Message.PopString()); uint TargetId = CharacterResolverCache.GetUidFromName(RequestName); if (TargetId < 1 || TargetId == Session.CharacterId) { return; } CharacterInfo TargetUserInfo = null; using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { TargetUserInfo = CharacterInfoLoader.GetCharacterInfo(MySqlClient, TargetId); if (!TargetUserInfo.PrivacyAcceptFriends) { Session.SendData(MessengerErrorEvent.Compose(39, 3)); return; } if (FriendshipExists(MySqlClient, Session.CharacterId, TargetUserInfo.Id, false)) { return; } CreateFriendship(MySqlClient, Session.CharacterId, TargetUserInfo.Id, false); } Session NotifySession = SessionManager.GetSessionByCharacterId(TargetUserInfo.Id); if (NotifySession != null) { NotifySession.SendData(MessengerRequestNoficiationComposer.Compose(Session.CharacterId, Session.CharacterInfo.Username)); } QuestManager.ProgressUserQuest(Session, QuestType.SOCIAL_FRIEND); }
private static void SetFigure(Session Session, ClientMessage Message) { // todo: verify data(!!!!) if (Session.CurrentRoomId == 3) { string NewGender = Message.PopString().ToLower(); string NewFigure = UserInputFilter.FilterString(Message.PopString()); if (NewGender != "m" && NewGender != "f") { NewGender = "m"; } if (NewFigure.Length == 0 || (NewFigure == Session.CharacterInfo.Figure)) { return; } else { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Session.CharacterInfo.UpdateFigure(MySqlClient, NewGender, NewFigure); AchievementManager.ProgressUserAchievement(MySqlClient, Session, "ACH_AvatarLooks", 1); int newamount = Session.CharacterInfo.CreditsBalance - 4; } QuestManager.ProgressUserQuest(Session, QuestType.PROFILE_CHANGE_LOOK); RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); RoomActor Actor = (Instance == null ? null : Instance.GetActorByReferenceId(Session.CharacterId)); Session.SendData(UserInfoUpdateComposer.Compose(Actor.Id, Actor.Figure, Session.CharacterInfo.Gender, Session.CharacterInfo.Motto, Session.CharacterInfo.Score)); Instance.BroadcastMessage(UserInfoUpdateComposer.Compose(Actor.Id, Actor.Figure, Session.CharacterInfo.Gender, Session.CharacterInfo.Motto, Session.CharacterInfo.Score)); Session.SendInfoUpdate(); Instance.BroadcastMessage(RoomChatComposer.Compose(Actor.Id, "*Freshens up their looks*", 0, ChatType.Shout)); } } else { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); RoomActor Actor = (Instance == null ? null : Instance.GetActorByReferenceId(Session.CharacterId)); Session.SendData(RoomChatComposer.Compose(Actor.Id, "You must be in Fitted Clothing [3] to buy clothes!", 0, ChatType.Whisper)); } }
public void HandleSave(Session Session, ClientMessage Message) { uint ItemId = Message.PopWiredUInt32(); if (!mInstance.CheckUserRights(Session) || !mWired.ContainsKey(ItemId)) { return; } Item item = mInstance.GetItem(ItemId); if (item == null) { return; } WiredData data = mWired[ItemId]; String Data1 = ""; int Data2 = 0; int Data3 = 0; int Data4 = 0; int Time = 0; String Data5 = ""; Message.PopWiredInt32(); Data2 = Message.PopWiredInt32(); Boolean Simple = true; if (item.Definition.Behavior == ItemBehavior.WiredEffect) { switch (WiredTypesUtil.EffectFromInt(item.Definition.BehaviorData)) { case WiredEffectTypes.match_to_sshot: case WiredEffectTypes.move_rotate: case WiredEffectTypes.teleport_to: case WiredEffectTypes.toggle_state: Simple = false; break; } } if (item.Definition.Behavior == ItemBehavior.WiredTrigger) { switch (WiredTypesUtil.TriggerFromInt(item.Definition.BehaviorData)) { case WiredTriggerTypes.state_changed: case WiredTriggerTypes.walks_off_furni: case WiredTriggerTypes.walks_on_furni: Simple = false; break; case WiredTriggerTypes.periodically: item.RequestUpdate(Data2); break; } } if (!Simple) { Data3 = Message.PopWiredInt32(); if (item.Definition.Behavior == ItemBehavior.WiredEffect && WiredTypesUtil.EffectFromInt(item.Definition.BehaviorData) == WiredEffectTypes.match_to_sshot) { Data4 = Message.PopWiredInt32(); } Message.PopString(); int c = Message.PopWiredInt32(); for (int i = 0; i < c; i++) { uint tmp = Message.PopWiredUInt32(); if (mInstance.GetItem(tmp) == null) { continue; } if (tmp != 0) { Data1 += "" + tmp.ToString() + "|"; } } Time = Message.PopWiredInt32(); } else { Data1 = Message.PopString(); Data3 = Message.PopWiredInt32(); } if (item.Definition.Behavior == ItemBehavior.WiredEffect) { switch (WiredTypesUtil.EffectFromInt(item.Definition.BehaviorData)) { case WiredEffectTypes.match_to_sshot: String[] Selected = Data1.Split('|'); foreach (String ItemIdS in Selected) { uint SelectedItemId; uint.TryParse(ItemIdS, out SelectedItemId); Item Item = mInstance.GetItem(SelectedItemId); if (Item == null) { continue; } Data5 += Item.Id + "#" + Item.RoomPosition.ToString() + "#" + Item.RoomRotation + "#" + Item.Flags + "+"; } break; } } if (data.Data1 == Data1 && data.Data2 == Data2 && data.Data3 == Data3 && data.Data4 == Data4 && data.Time == Time && data.Data5 == Data5) { return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { data.Data1 = Data1; data.Data2 = Data2; data.Data3 = Data3; data.Data4 = Data4; data.Data5 = Data5; data.Time = Time; data.SynchronizeDatabase(MySqlClient); } if (item.Definition.Behavior == ItemBehavior.WiredTrigger) { switch (WiredTypesUtil.TriggerFromInt(item.Definition.BehaviorData)) { case WiredTriggerTypes.at_given_time: item.RequestUpdate(Data2); break; case WiredTriggerTypes.walks_on_furni: case WiredTriggerTypes.walks_off_furni: DeRegisterWalkItems(item.Id); RegisterWalkItems(item.Id); break; } } }
private static void OnCreateRoom(Session Session, ClientMessage Message) { string Name = UserInputFilter.FilterString(Message.PopString()); string ModelName = Message.PopString().ToLower(); if (Name.Length < 3) { return; } RoomModel Model = RoomManager.GetModel(ModelName); if (Model == null || !Model.IsUsableBySession(Session) || Session.CharacterInfo.GetRoomCount() >= Navigator.MaxRoomsPerUser) { return; } uint RoomId = RoomManager.CreateRoom(Session.CharacterId, Name, ModelName); if (RoomId > 0) { Session.SendData(RoomCreateResultComposer.Compose(RoomId, Name)); } }
private static void OpenFlatConnection(Session Session, ClientMessage Message) { uint RoomId = Message.PopWiredUInt32(); string Password = Message.PopString(); PrepareRoom(Session, RoomId, Password); }
private static void UnignoreUser(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } uint UserId = CharacterResolverCache.GetUidFromName(Message.PopString()); if (UserId > 0) { Session.IgnoreCache.MarkUserUnignored(UserId); Session.SendData(RoomIgnoreResultComposer.Compose(3)); } }
private static void PlaceItem(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } uint ItemId = 0; string[] Data = null; if (Message.Id == OpcodesIn.ROOM_ITEM_PLACE_STICKY) { ItemId = Message.PopWiredUInt32(); string RawData = Message.PopString(); string[] TmpData = RawData.Split(' '); Data = new string[TmpData.Length + 1]; Data[0] = string.Empty; Data[1] = TmpData[0]; Data[2] = TmpData[1]; Data[3] = TmpData[2]; } else { string RawData = Message.PopString(); Data = RawData.Split(' '); uint.TryParse(Data[0], out ItemId); } Item Item = Session.InventoryCache.GetItem(ItemId); if (Item == null) { return; } bool HasPlacementRights = Instance.CheckUserRights(Session); bool IsPlacingGuestStickie = false; if (Item.Definition.Behavior == ItemBehavior.StickyNote && !HasPlacementRights && Instance.GuestsCanPlaceStickies) { IsPlacingGuestStickie = true; } else if (!HasPlacementRights) { Session.SendData(RoomItemPlacementErrorComposer.Compose(RoomItemPlacementErrorCode.InsufficientRights)); return; } if (Item.PendingExpiration && Item.ExpireTimeLeft <= 0) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.RemovePermanently(MySqlClient); } Session.InventoryCache.RemoveItem(Item.Id); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); return; } switch (Item.Definition.Type) { default: case ItemType.FloorItem: if (Data.Length != 4) { return; } int X = 0; int Y = 0; int Rotation = 0; int.TryParse(Data[1], out X); int.TryParse(Data[2], out Y); int.TryParse(Data[3], out Rotation); Vector3 FinalizedPosition = Instance.SetFloorItem(Session, Item, new Vector2(X, Y), Rotation); if (FinalizedPosition != null) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.MoveToRoom(MySqlClient, Instance.RoomId, FinalizedPosition, Rotation); } Instance.RegenerateRelativeHeightmap(); Session.InventoryCache.RemoveItem(Item.Id); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Placed); Instance.BroadcastMessage(RoomFloorItemPlacedComposer.Compose(Item)); QuestManager.ProgressUserQuest(Session, QuestType.FURNI_PLACE); if (FinalizedPosition.Z > Instance.Model.Heightmap.FloorHeight[FinalizedPosition.X, FinalizedPosition.Y]) { QuestManager.ProgressUserQuest(Session, QuestType.FURNI_STACK); } } break; case ItemType.WallItem: string[] CorrectedData = new string[Data.Length - 1]; for (int i = 1; i < Data.Length; i++) { CorrectedData[i - 1] = Data[i]; } string WallPos = Instance.SetWallItem(Session, CorrectedData, Item); if (WallPos.Length > 0) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.MoveToRoom(MySqlClient, Instance.RoomId, new Vector3(0, 0, 0), 0, WallPos); } Session.InventoryCache.RemoveItem(Item.Id); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Placed); Instance.BroadcastMessage(RoomWallItemPlacedComposer.Compose(Item)); if (IsPlacingGuestStickie) { Instance.GiveTemporaryStickieRights(Item.Id, Session.CharacterId); Session.SendData(StickyDataComposer.Compose(Item)); } } break; } }
private static void UserWhisper(Session Session, ClientMessage Message) { if (Session.CharacterInfo.IsMuted) { return; } RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } RoomActor Actor = Instance.GetActorByReferenceId(Session.CharacterId); if (Actor == null) { return; } string MessageText = UserInputFilter.FilterString(Message.PopString().Trim()); if (MessageText.Length == 0) { return; } if (MessageText.Length > 100) { MessageText = MessageText.Substring(0, 100); } string[] Bits = MessageText.Split(' '); if (Bits.Length < 2) { return; } string UserBit = Bits[0]; MessageText = MessageText.Substring(UserBit.Length + 1); uint UserId = CharacterResolverCache.GetUidFromName(UserBit); if (UserId > 0) { Actor.Whisper(MessageText, UserId); } }
private static void SaveSticky(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } Item Item = Instance.GetItem(Message.PopWiredUInt32()); if (Item == null || Item.Definition.Behavior != ItemBehavior.StickyNote) { return; } StickieEditingRights Rights = Instance.GetStickieEditingRights(Session, Item); if (Rights == StickieEditingRights.ReadOnly) { return; } string RawData = Message.PopString(); string[] Bits = RawData.Split(' '); if (Bits.Length < 2) { return; } string Color = Bits[0].ToUpper().Trim(); string Text = UserInputFilter.FilterString(RawData.Substring(Color.Length + 1, RawData.Length - (Color.Length + 1))).Trim(); if (Color != "FFFF33" && Color != "FF9CFF" && Color != "9CCEFF" && Color != "9CFF9C" || Text.Length > 391) { return; } Item.Flags = RawData; Item.DisplayFlags = Color; if (Rights == StickieEditingRights.GuestEdit) { Item.Flags += "\n-----\n" + Session.CharacterInfo.Username + "\n" + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); } Instance.RevokeTemporaryStickieRights(Item.Id); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.SynchronizeDatabase(MySqlClient, true); } Instance.BroadcastMessage(RoomWallItemMovedComposer.Compose(Item)); }
public static void UserChat(Session Session, ClientMessage Message) { if (Session.CharacterInfo.IsMuted) { return; } RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } RoomActor Actor = Instance.GetActorByReferenceId(Session.CharacterId); if (Actor == null) { return; } bool Shout = (Message.Id == OpcodesIn.ROOM_CHAT_SHOUT); string MessageText = UserInputFilter.FilterString(Wordfilter.Filter(Message.PopString())); bool done = Instance.WiredManager.HandleChat(MessageText, Actor); if (MessageText.Length == 0) { return; } if (MessageText.Length > 100) { MessageText = MessageText.Substring(0, 100); } if (MessageText.StartsWith(":") && (ChatCommands.HandleCommand(Session, MessageText) || Session.HasRight("moderation_tool"))) { return; } if (!done) { Actor.Chat(MessageText, Shout, Session.HasRight("mute")); } else { Session.SendData(RoomChatComposer.Compose(Actor.Id, MessageText, 0, ChatType.Whisper)); } if (Instance.HumanActorCount > 1) { QuestManager.ProgressUserQuest(Session, QuestType.SOCIAL_CHAT); } }
private static void GetEventRooms(Session Session, ClientMessage Message) { if (Session.HasRight("hotel_admin")) { ServerMessage Response = TryGetResponseFromCache(0, Message); if (Response != null) { Session.SendData(Response); return; } int Category = -1; int.TryParse(Message.PopString(), out Category); IEnumerable<RoomInstance> Rooms = (from RoomInstance in RoomManager.RoomInstances where (RoomInstance.Value.HasOngoingEvent && (Category == -1 || RoomInstance.Value.Event.CategoryId == Category)) orderby RoomInstance.Value.Event.TimestampStarted descending select RoomInstance.Value).Take(50); Response = NavigatorRoomListComposer.Compose(Category, 12, string.Empty, Rooms.ToList(), true); AddToCacheIfNeeded(0, Message, Response); Session.SendData(Response); } }
private static void AnswerDoorbell(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session)) { return; } string Name = Message.PopString(); bool Accept = (Message.ReadBytes(1)[0] == 65); Session TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(Name)); if (TargetSession == null || TargetSession.AbsoluteRoomId != Instance.RoomId || TargetSession.RoomAuthed) { return; } if (Accept) { TargetSession.RoomAuthed = true; TargetSession.SendData(RoomDoorbellAcceptedComposer.Compose()); return; } TargetSession.SendData(RoomDoorbellNoResponseComposer.Compose()); RoomManager.RemoveUserFromRoom(TargetSession, false); }
private static void PerformSearch(Session Session, ClientMessage Message) { if (Session.HasRight("hotel_admin")) { ServerMessage Response = TryGetResponseFromCache(0, Message); if (Response != null) { Session.SendData(Response); return; } Dictionary<uint, RoomInfo> Rooms = new Dictionary<uint, RoomInfo>(); string Query = UserInputFilter.FilterString(Message.PopString()).ToLower().Trim(); int SearchEventCatId = 0; if (mEventSearchQueries.ContainsKey(Query.ToLower())) { SearchEventCatId = mEventSearchQueries[Query.ToLower()]; } // Limit query length. just a precaution. if (Query.Length > 64) { Query = Query.Substring(0, 64); } if (Query.Length > 0) { IEnumerable<RoomInstance> InstanceMatches = (from RoomInstance in RoomManager.RoomInstances where RoomInstance.Value.HumanActorCount > 0 && RoomInstance.Value.Info.Type == RoomType.Flat && (RoomInstance.Value.Info.OwnerName.StartsWith(Query) || RoomInstance.Value.SearchableTags.Contains(Query) || RoomInstance.Value.Info.Name.Contains(Query) || (RoomInstance.Value.HasOngoingEvent && (RoomInstance.Value.Event.Name.StartsWith(Query) || (SearchEventCatId > 0 && RoomInstance.Value.Event.CategoryId == SearchEventCatId)))) orderby RoomInstance.Value.HumanActorCount descending select RoomInstance.Value).Take(50); foreach (RoomInstance Instance in InstanceMatches) { Rooms.Add(Instance.RoomId, Instance.Info); } if (Rooms.Count < 50) // need db results? { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { MySqlClient.SetParameter("query", Query + "%"); MySqlClient.SetParameter("fquery", "%" + Query + "%"); uint ToUid = CharacterResolverCache.GetUidFromName(Query); if (ToUid > 0) { MySqlClient.SetParameter("owneruid", ToUid); } DataTable Table = MySqlClient.ExecuteQueryTable("SELECT * FROM rooms WHERE name LIKE @query AND type = 'flat' OR tags LIKE @fquery AND type = 'flat'" + (ToUid > 0 ? " OR owner_id = @owneruid AND type = 'flat'" : string.Empty) + " LIMIT 50"); foreach (DataRow Row in Table.Rows) { uint RoomId = (uint)Row["id"]; if (!Rooms.ContainsKey(RoomId)) { Rooms.Add(RoomId, RoomInfoLoader.GenerateRoomInfoFromRow(Row)); } } } } } Response = NavigatorRoomListComposer.Compose(1, 9, Query, Rooms.Values.Take(50).ToList()); AddToCacheIfNeeded(0, Message, Response); Session.SendData(Response); } }
private static void CreateOrEditEvent(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session, true) || Instance.Info.AccessType != RoomAccessType.Open) { return; } int CategoryId = Message.PopWiredInt32(); string Name = UserInputFilter.FilterString(Message.PopString()).Trim(); string Description = UserInputFilter.FilterString(Message.PopString()).Trim(); int TagCount = Message.PopWiredInt32(); List<string> Tags = new List<string>(); for (int i = 0; (i < TagCount && i < 2); i++) { string Tag = UserInputFilter.FilterString(Message.PopString()).Trim().ToLower(); if (Tag.Length > 25) { Tag = Tag.Substring(0, 25); } if (Tag.Length > 0 && !Tags.Contains(Tag)) { Tags.Add(Tag); } } if (!Instance.HasOngoingEvent) { Session.MessengerFriendCache.BroadcastToFriends(MessengerFriendEventComposer.Compose(Session.CharacterId, MessengerFriendEventType.EventStarted, Name)); } Instance.StartOrUpdateEvent(Name, Description, CategoryId, Tags); }
private static void SetBadgeOrder(Session Session, ClientMessage Message) { int i = 0; Dictionary<int, Badge> NewSettings = new Dictionary<int, Badge>(); while (Message.RemainingLength > 0) { if (i > 5) { continue; } int SlotId = Message.PopWiredInt32(); string BadgeCode = Message.PopString(); Badge BadgeRef = RightsManager.GetBadgeByCode(BadgeCode); if (BadgeRef == null || !Session.BadgeCache.ContainsCode(BadgeCode) || SlotId >= 6 || SlotId <= 0 || NewSettings.ContainsKey(SlotId)) { continue; } NewSettings.Add(SlotId, BadgeRef); i++; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Session.BadgeCache.UpdateBadgeOrder(MySqlClient, NewSettings); } RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } Instance.BroadcastMessage(RoomUserBadgesComposer.Compose(Session.CharacterId, Session.BadgeCache.EquippedBadges)); QuestManager.ProgressUserQuest(Session, QuestType.PROFILE_BADGE); }
private static void EditRoom(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session, true)) { return; } // FQJ@LRoy's Office@fThis is where I handle business. Yeah.J@@RBIJ@Foffice@IbuttsechsAAAA uint Id = Message.PopWiredUInt32(); if (Id != Instance.RoomId) { return; } string Name = UserInputFilter.FilterString(Message.PopString()).Trim(); string Description = UserInputFilter.FilterString(Message.PopString()).Trim(); RoomAccessType AccessType = (RoomAccessType)Message.PopWiredInt32(); string Password = UserInputFilter.FilterString(Message.PopString()).Trim(); int UserLimit = Message.PopWiredInt32(); int CategoryId = Message.PopWiredInt32(); int TagCount = Message.PopWiredInt32(); List<string> Tags = new List<string>(); for (int i = 0; (i < TagCount && i < 2); i++) { string Tag = UserInputFilter.FilterString(Message.PopString()).Trim().ToLower(); if (Tag.Length > 32) { Tag = Tag.Substring(0, 32); } if (Tag.Length > 0 && !Tags.Contains(Tag)) { Tags.Add(Tag); } } bool AllowPets = (Message.ReadBytes(1)[0] == 65); bool AllowPetEating = (Message.ReadBytes(1)[0] == 65); bool AllowBlocking = (Message.ReadBytes(1)[0] == 65); bool HideWalls = (Message.ReadBytes(1)[0] == 65); int WallThickness = Message.PopWiredInt32(); int FloorThickness = Message.PopWiredInt32(); if (WallThickness < -2 || WallThickness > 1) { WallThickness = 0; } if (FloorThickness < -2 || FloorThickness > 1) { FloorThickness = 0; } if (HideWalls && !Session.HasRight("club_vip")) { HideWalls = false; } if (Name.Length > 60) // was 25 { Name = Name.Substring(0, 60); } if (Description.Length > 128) { Description = Description.Substring(0, 128); } if (Password.Length > 64) { Password = Password.Substring(0, 64); } if (UserLimit > Instance.Model.MaxUsers) { UserLimit = Instance.Model.MaxUsers; } if (Name.Length == 0) { Name = "Room"; } if (AccessType == RoomAccessType.PasswordProtected && Password.Length == 0) { AccessType = RoomAccessType.Open; } Instance.Info.EditRoom(Name, Description, AccessType, Password, UserLimit, CategoryId, Tags, AllowPets, AllowPetEating, AllowBlocking, HideWalls, WallThickness, FloorThickness); Session.SendData(RoomUpdatedNotification1Composer.Compose(Instance.RoomId)); Instance.BroadcastMessage(RoomUpdatedNotification2Composer.Compose(Instance.RoomId)); Instance.BroadcastMessage(RoomWallsStatusComposer.Compose(Instance.Info.HideWalls, Instance.Info.WallThickness, Instance.Info.FloorThickness)); //Instance.BroadcastMessage(RoomInfoComposer.Compose(Instance.Info, false)); if (Instance.Info.AccessType != RoomAccessType.Open && Instance.HasOngoingEvent) { Instance.StopEvent(); } }
private static void SetWardrobe(Session Session, ClientMessage Message) { int SlotAmount = GetWardrobeSlotAmountForSession(Session); int SlotId = Message.PopWiredInt32(); string Figure = Message.PopString(); CharacterGender Gender = (Message.PopString() == "M" ? CharacterGender.Male : CharacterGender.Female); if (SlotId <= 0 || SlotId > SlotAmount) { return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Session.CharacterInfo.SetWardrobeSlot(MySqlClient, SlotId, Figure, Gender); } }
private static void IgnoreUser(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } uint UserId = CharacterResolverCache.GetUidFromName(Message.PopString()); if (UserId == 0) { return; } Session TargetSession = SessionManager.GetSessionByCharacterId(UserId); if (TargetSession != null) { if (TargetSession.HasRight("cannot_ignore")) { Session.SendData(NotificationMessageComposer.Compose("You can not ignore this user.")); return; } Session.IgnoreCache.MarkUserIgnored(TargetSession.CharacterId); Session.SendData(RoomIgnoreResultComposer.Compose(1)); } }