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 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 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)); }
private 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(Message.PopString()); if (MessageText.Length == 0) { return; } if (MessageText.Length > 100) { MessageText = MessageText.Substring(0, 100); } MessageText = Wordfilter.Filter(MessageText); if (MessageText.StartsWith(":") && (ChatCommands.HandleCommand(Session, MessageText) || Session.HasRight("moderation_tool"))) { return; } if (Instance.WiredManager.HandleChat(MessageText, Actor)) { Actor.Whisper(MessageText, 0); return; } Actor.Chat(MessageText, Shout, Session.HasRight("mute")); if (Instance.HumanActorCount > 1) { QuestManager.ProgressUserQuest(Session, QuestType.SOCIAL_CHAT); } }
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 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 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 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); } List <Session> Users = new List <Session>(); foreach (uint UserId in Targets) { if (!Session.MessengerFriendCache.Friends.Contains(UserId)) { continue; } Session TargetSession = SessionManager.GetSessionByCharacterId(UserId); if (TargetSession == null) { continue; } Users.Add(TargetSession); TargetSession.SendData(MessengerImInviteComposer.Compose(Session.CharacterId, Wordfilter.Filter(MessageText))); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { String to = ""; foreach (Session User in Users) { to += User.CharacterInfo.Username + " [" + User.CharacterId + "], "; } to = to.Substring(0, to.Length - 2); ModerationLogs.LogChatMessage(MySqlClient, Session.CharacterId, 0, "(INVITATION to " + to + ") " + MessageText); } }
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 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)); } TargetSession.SendData(MessengerImMessageComposer.Compose(Session.CharacterId, Wordfilter.Filter(Text))); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogChatMessage(MySqlClient, Session.CharacterId, 0, "(MESSAGE to " + TargetSession.CharacterInfo.Username + " [" + TargetSession.CharacterId + "]) " + Text); } }
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 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 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)); }
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 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 SetMotto(Session Session, ClientMessage Message) { string NewMotto = UserInputFilter.FilterString(Message.PopString().Trim()); if (NewMotto.Length > 38) { NewMotto = NewMotto.Substring(0, 38); } if (NewMotto == Session.CharacterInfo.Motto) { return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Session.CharacterInfo.UpdateMotto(MySqlClient, NewMotto); AchievementManager.ProgressUserAchievement(MySqlClient, Session, "ACH_Motto", 1); } QuestManager.ProgressUserQuest(Session, QuestType.PROFILE_CHANGE_MOTTO); Session.SendInfoUpdate(); }
public static void HandlePurchase(SqlDatabaseClient MySqlClient, Session Session, CatalogItem Item, string ItemFlags) { lock (mPurchaseSyncRoot) { string Color = "ffffff"; int TotalCreditCost = Item.CostCredits; int TotalApCost = Item.CostActivityPoints; if (Session.CharacterInfo.CreditsBalance < TotalCreditCost || Session.CharacterInfo.ActivityPointsBalance < TotalApCost) { return; } string[] PetData = null; if (Item.PresetFlags.Length > 0) { ItemFlags = Item.PresetFlags; } else { switch (Item.Definition.Behavior) { case ItemBehavior.Pet: PetData = ItemFlags.Split('\n'); if (PetData.Length != 3) { return; } string Name = PetData[0]; Color = PetData[2]; int Race = 0; int.TryParse(PetData[1], out Race); bool RaceOk = false; List <PetRaceData> Races = PetDataManager.GetRaceDataForType(Item.Definition.BehaviorData); foreach (PetRaceData RaceData in Races) { if (RaceData.Data1 == Race) { RaceOk = true; break; } } /// if (PetName.VerifyPetName(Name) != PetNameError.NameOk || Color.ToLower() != "ffffff" || !RaceOk) if (PetName.VerifyPetName(Name) != PetNameError.NameOk || !RaceOk) // WHY COLOR??? { return; } break; case ItemBehavior.PrizeTrophy: if (ItemFlags.Length > 255) { ItemFlags = ItemFlags.Substring(0, 255); } ItemFlags = Session.CharacterInfo.Username + Convert.ToChar(9) + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year + Convert.ToChar(9) + UserInputFilter.FilterString(ItemFlags.Trim(), true); break; default: ItemFlags = string.Empty; break; } } if (TotalCreditCost > 0) { Session.CharacterInfo.UpdateCreditsBalance(MySqlClient, -TotalCreditCost); Session.SendData(CreditsBalanceComposer.Compose(Session.CharacterInfo.CreditsBalance)); } if (TotalApCost > 0) { Session.CharacterInfo.UpdateActivityPointsBalance(MySqlClient, -TotalApCost); Session.SendData(ActivityPointsBalanceComposer.Compose(Session.CharacterInfo.ActivityPointsBalance, -TotalApCost)); } Dictionary <int, List <uint> > NewItems = new Dictionary <int, List <uint> >(); for (int i = 0; i < Item.Amount; i++) { switch (Item.Definition.Type) { default: List <Item> GeneratedGenericItems = new List <Item>(); double ExpireTimestamp = 0; if (Item.Definition.Behavior == ItemBehavior.Rental) { ExpireTimestamp = UnixTimestamp.GetCurrent() + 3600; } GeneratedGenericItems.Add(ItemFactory.CreateItem(MySqlClient, Item.DefinitionId, Session.CharacterId, ItemFlags, ItemFlags, ExpireTimestamp)); switch (Item.Definition.Behavior) { case ItemBehavior.Teleporter: Item LinkedItem = ItemFactory.CreateItem(MySqlClient, Item.DefinitionId, Session.CharacterId, GeneratedGenericItems[0].Id.ToString(), string.Empty, ExpireTimestamp); GeneratedGenericItems[0].Flags = LinkedItem.Id.ToString(); GeneratedGenericItems[0].SynchronizeDatabase(MySqlClient, true); GeneratedGenericItems.Add(LinkedItem); break; } foreach (Item GeneratedItem in GeneratedGenericItems) { Session.InventoryCache.Add(GeneratedItem); int TabId = GeneratedItem.Definition.Type == ItemType.FloorItem ? 1 : 2; if (!NewItems.ContainsKey(TabId)) { NewItems.Add(TabId, new List <uint>()); } NewItems[TabId].Add(GeneratedItem.Id); } break; case ItemType.AvatarEffect: AvatarEffect Effect = null; if (Session.AvatarEffectCache.HasEffect((int)Item.Definition.SpriteId)) { Effect = Session.AvatarEffectCache.GetEffect((int)Item.Definition.SpriteId); if (Effect != null) { Effect.AddToQuantity(); } } else { Effect = AvatarEffectFactory.CreateEffect(MySqlClient, Session.CharacterId, (int)Item.Definition.SpriteId, 3600); Session.AvatarEffectCache.Add(Effect); } if (Effect != null) { Session.SendData(UserEffectAddedComposer.Compose(Effect)); } break; case ItemType.Pet: Pet Pet = PetFactory.CreatePet(MySqlClient, Session.CharacterId, Item.Definition.BehaviorData, PetData[0], int.Parse(PetData[1]), Color.ToLower()); Session.PetInventoryCache.Add(Pet); Session.SendData(InventoryPetAddedComposer.Compose(Pet)); if (!NewItems.ContainsKey(3)) { NewItems.Add(3, new List <uint>()); } NewItems[3].Add(Pet.Id); break; } } Session.SendData(CatalogPurchaseResultComposer.Compose(Item)); Session.SendData(InventoryRefreshComposer.Compose()); foreach (KeyValuePair <int, List <uint> > NewItemData in NewItems) { foreach (uint NewItem in NewItemData.Value) { Session.NewItemsCache.MarkNewItem(MySqlClient, NewItemData.Key, NewItem); } } if (NewItems.Count > 0) { Session.SendData(InventoryNewItemsComposer.Compose(new Dictionary <int, List <uint> >(NewItems))); } } }
public static bool HandleCommand(Session Session, string Input) { Input = Input.Substring(1, Input.Length - 1); string[] Bits = Input.Split(' '); RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); RoomActor Actor = (Instance == null ? null : Instance.GetActorByReferenceId(Session.CharacterId)); switch (Bits[0].ToLower()) { case "commands": { Session.SendData(NotificationMessageComposer.Compose((string)LangManager.GetValue("command.commands.info") + ":\n\n:commands\n:online\n:about\n:pickall")); return(true); } case "update_catalog": { if (!Session.HasRight("hotel_admin")) { return(false); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Snowlight.Game.Catalog.CatalogManager.RefreshCatalogData(MySqlClient); } Session.SendData(NotificationMessageComposer.Compose((string)LangManager.GetValue("command.updatecatalog.success"))); return(true); } case "online": { List <string> OnlineUsers = SessionManager.ConnectedUserData.Values.ToList(); StringBuilder MessageText = new StringBuilder((string)LangManager.GetValue("command.online.part1") + " " + OnlineUsers.Count + " " + (string)LangManager.GetValue("command.online.part2") + "\n"); foreach (string OnlineUser in OnlineUsers) { MessageText.Append('\n'); MessageText.Append("- " + OnlineUser); } Session.SendData(NotificationMessageComposer.Compose(MessageText.ToString())); return(true); } case "superkick": { if (!Session.HasRight("hotel_admin")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.invalidsyntax") + " - :kick <username>", 0, ChatType.Whisper)); return(true); } string Username = UserInputFilter.FilterString(Bits[1].Trim()); Session TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(Username)); if (TargetSession == null || TargetSession.HasRight("moderation_tool") || !TargetSession.InRoom) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.targetuser") + " '" + Username + "' is offline or cannot be kicked.", 0, ChatType.Whisper)); return(true); } SessionManager.StopSession(TargetSession.Id); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Superkicked user from server (chat command)", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ")."); } return(true); } case "kick": { if (!Session.HasRight("moderation_tool")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.invalidsyntax") + " - :kick <username>", 0, ChatType.Whisper)); return(true); } string Username = UserInputFilter.FilterString(Bits[1].Trim()); Session TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(Username)); if (TargetSession == null || TargetSession.HasRight("moderation_tool") || !TargetSession.InRoom) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.targetuser") + " '" + Username + "' is offline, not in a room, or cannot be kicked.", 0, ChatType.Whisper)); return(true); } RoomManager.RemoveUserFromRoom(TargetSession, true); TargetSession.SendData(NotificationMessageComposer.Compose((string)LangManager.GetValue("command.kick.success"))); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Kicked user from room (chat command)", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ")."); } return(true); } case "roomunmute": { if (!Session.HasRight("mute")) { return(false); } if (Instance.RoomMuted) { Instance.RoomMuted = false; Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.roomunmute.success"), 0, ChatType.Whisper)); } else { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.roomunmute.error"), 0, ChatType.Whisper)); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Unmuted room", "Room '" + Instance.Info.Name + "' (ID " + Instance.RoomId + ")"); } return(true); } case "roommute": { if (!Session.HasRight("mute")) { return(false); } if (!Instance.RoomMuted) { Instance.RoomMuted = true; Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.roommute.success"), 0, ChatType.Whisper)); } else { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.roommute.error"), 0, ChatType.Whisper)); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Muted room", "Room '" + Instance.Info.Name + "' (ID " + Instance.RoomId + ")"); } return(true); } case "unmute": { if (!Session.HasRight("mute")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.invalidsyntax") + " - :unmute <username>", 0, ChatType.Whisper)); return(true); } string Username = UserInputFilter.FilterString(Bits[1].Trim()); Session TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(Username)); if (TargetSession == null) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.targetuser") + " '" + Username + "' " + (string)LangManager.GetValue("command.cannotproceedcmd3"), 0, ChatType.Whisper)); return(true); } if (!TargetSession.CharacterInfo.IsMuted) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.targetuser") + " '" + Username + "' " + (string)LangManager.GetValue("command.unmute.error"), 0, ChatType.Whisper)); return(true); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { TargetSession.CharacterInfo.Unmute(MySqlClient); } TargetSession.SendData(NotificationMessageComposer.Compose((string)LangManager.GetValue("command.unmute.sucess"))); Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.targetuser") + " '" + Username + "' " + (string)LangManager.GetValue("command.unmute.sucess2"), 0, ChatType.Whisper)); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Unmuted user", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ")."); } return(true); } case "mute": { if (!Session.HasRight("mute")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.invalidsyntax") + " - :mute <username> [length in seconds]", 0, ChatType.Whisper)); return(true); } string Username = UserInputFilter.FilterString(Bits[1].Trim()); int TimeToMute = 0; if (Bits.Length >= 3) { int.TryParse(Bits[2], out TimeToMute); } if (TimeToMute <= 0) { TimeToMute = 300; } if (TimeToMute > 3600) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.mute.error"), 0, ChatType.Whisper)); return(true); } Session TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(Username)); if (TargetSession == null || TargetSession.HasRight("mute")) { Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.targetuser") + " '" + Username + "' " + (string)LangManager.GetValue("command.cannotproceedcmd4"), 0, ChatType.Whisper)); return(true); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { TargetSession.CharacterInfo.Mute(MySqlClient, TimeToMute); ModerationLogs.LogModerationAction(MySqlClient, Session, "Muted user", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ") for " + TimeToMute + " seconds."); } TargetSession.SendData(RoomMutedComposer.Compose(TimeToMute)); Session.SendData(RoomChatComposer.Compose(Actor.Id, (string)LangManager.GetValue("command.mute.sucess.part1") + " '" + Username + "' " + (string)LangManager.GetValue("command.mute.sucess.part2") + " " + TimeToMute + " seconds.", 0, ChatType.Whisper)); return(true); } case "clipping": if (!Session.HasRight("hotel_admin")) { return(false); } Actor.OverrideClipping = !Actor.OverrideClipping; Actor.ApplyEffect(Actor.ClippingEnabled ? 0 : 23); Session.CurrentEffect = 0; return(true); case "about": Session.SendData(UserAlertModernComposer.Compose("Powered by Snowlight", "This hotel is proudly powered by Snowlight, the premium open-source Habbo Hotel emulator.\n\nhttp://www.meth0d.org/snowlight")); return(true); case "t": if (!Session.HasRight("hotel_admin")) { return(false); } Session.SendData(NotificationMessageComposer.Compose("Position: " + Actor.Position.ToString() + ", Rotation: " + Actor.BodyRotation)); return(true); case "emptyinv": if (!Session.HasRight("hotel_admin")) { return(false); } Session.InventoryCache.ClearAndDeleteAll(); Session.SendData(InventoryRefreshComposer.Compose()); Session.SendData(NotificationMessageComposer.Compose((string)LangManager.GetValue("command.emptyinv.sucess"))); return(true); case "pickall": if (!Instance.CheckUserRights(Session, true)) { Session.SendData(NotificationMessageComposer.Compose((string)LangManager.GetValue("command.pickall.error"))); return(true); } Instance.PickAllToUserInventory(Session); return(true); } return(false); }
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(); } }
public static bool HandleCommand(Session Session, string Input) { Input = Input.Substring(1, Input.Length - 1); string[] Bits = Input.Split(' '); RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); RoomActor Actor = (Instance == null ? null : Instance.GetActorByReferenceId(Session.CharacterId)); Session TargetSession = null; RoomActor TargetActor = null; String TargetName = ""; switch (Bits[0].ToLower()) { #region users #region misc case "commands": { Session.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.commands.info") + ":\n\n:commands\n:online\n:about\n:pickall")); return(true); } case "online": { List <string> OnlineUsers = SessionManager.ConnectedUserData.Values.ToList(); StringBuilder MessageText = new StringBuilder(Localization.GetValue("command.online", OnlineUsers.Count.ToString()) + "\n"); foreach (string OnlineUser in OnlineUsers) { MessageText.Append('\n'); MessageText.Append("- " + OnlineUser); } Session.SendData(NotificationMessageComposer.Compose(MessageText.ToString())); return(true); } case "about": Session.SendData(UserAlertModernComposer.Compose("Powered by Snowlight", "This hotel is proudly powered by Snowlight,\nedited by flx5. \nCredits to Meth0d.")); return(true); #endregion #region furni case "empty": case "emptyinv": if (Bits.Length > 2) { return(false); } if (!Session.HasRight("hotel_admin") && Bits.Length == 2) { return(false); } Session Targetuser = Session; if (Bits.Length == 2) { uint userid = CharacterResolverCache.GetUidFromName(Bits[1]); Targetuser = SessionManager.GetSessionByCharacterId(userid); } Targetuser.PetInventoryCache.ClearAndDeleteAll(); Targetuser.InventoryCache.ClearAndDeleteAll(); Targetuser.SendData(InventoryRefreshComposer.Compose()); Targetuser.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.emptyinv.sucess"))); return(true); case "pickall": if (!Instance.CheckUserRights(Session, true)) { Session.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.pickall.error"))); return(true); } Instance.PickAllToUserInventory(Session); return(true); #endregion #region extra case "moonwalk": if (!Session.CharacterInfo.IsPremium) { return(false); } Actor.WalkingBackwards = !Actor.WalkingBackwards; Actor.Dance(Actor.WalkingBackwards ? 4 : 0); Session.SendData(RoomChatComposer.Compose(Actor.Id, "TEST " + Actor.WalkingBackwards, 0, ChatType.Whisper)); return(true); #region push case "push": if (!Session.CharacterInfo.IsPremium || Bits.Length != 2) { return(false); } TargetName = UserInputFilter.FilterString(Bits[1].Trim()); TargetActor = Instance.GetActorByReferenceId(CharacterResolverCache.GetUidFromName(TargetName)); if (TargetActor == null || TargetActor.IsMoving) { return(false); } if ((TargetActor.Position.X == Actor.Position.X - 1) || (TargetActor.Position.X == Actor.Position.X + 1) || (TargetActor.Position.Y == Actor.Position.Y - 1) || (TargetActor.Position.Y == Actor.Position.Y + 1)) { Vector2 Newposition = null; if (TargetActor.Position.X == Actor.Position.X - 1 && TargetActor.Position.Y == Actor.Position.Y) { Newposition = new Vector2(TargetActor.Position.X - 1, TargetActor.Position.Y); } if (TargetActor.Position.X == Actor.Position.X + 1 && TargetActor.Position.Y == Actor.Position.Y) { Newposition = new Vector2(TargetActor.Position.X + 1, TargetActor.Position.Y); } if (TargetActor.Position.X == Actor.Position.X && TargetActor.Position.Y == Actor.Position.Y + 1) { Newposition = new Vector2(TargetActor.Position.X, TargetActor.Position.Y + 1); } if (TargetActor.Position.X == Actor.Position.X && TargetActor.Position.Y == Actor.Position.Y - 1) { Newposition = new Vector2(TargetActor.Position.X, TargetActor.Position.Y - 1); } if (TargetActor.Position.X == Actor.Position.X + 1 && TargetActor.Position.Y == Actor.Position.Y + 1) { Newposition = new Vector2(TargetActor.Position.X + 1, TargetActor.Position.Y + 1); } if (TargetActor.Position.X == Actor.Position.X - 1 && TargetActor.Position.Y == Actor.Position.Y - 1) { Newposition = new Vector2(TargetActor.Position.X - 1, TargetActor.Position.Y - 1); } if (TargetActor.Position.X == Actor.Position.X - 1 && TargetActor.Position.Y == Actor.Position.Y + 1) { Newposition = new Vector2(TargetActor.Position.X - 1, TargetActor.Position.Y + 1); } if (TargetActor.Position.X == Actor.Position.X + 1 && TargetActor.Position.Y == Actor.Position.Y - 1) { Newposition = new Vector2(TargetActor.Position.X + 1, TargetActor.Position.Y - 1); } if (Newposition == null || !Instance.IsValidPosition(Newposition) || (Instance.Model.DoorPosition.GetVector2().X == Newposition.X && Instance.Model.DoorPosition.GetVector2().Y == Newposition.Y)) { return(false); } TargetActor.MoveTo(Newposition); Actor.Chat("*" + Session.CharacterInfo.Username + " pushes " + Bits[1] + "*"); return(true); } else { Session.SendData(RoomChatComposer.Compose(Actor.Id, Bits[1] + " is not in your area.", 0, ChatType.Whisper)); return(false); } #endregion case "pull": if (!Session.CharacterInfo.IsPremium || Bits.Length != 2) { return(false); } TargetName = UserInputFilter.FilterString(Bits[1].Trim()); TargetActor = Instance.GetActorByReferenceId(CharacterResolverCache.GetUidFromName(TargetName)); if (TargetActor == null || TargetActor.IsMoving) { return(false); } if ((TargetActor.Position.X > Actor.Position.X - 10) && (TargetActor.Position.X < Actor.Position.X + 10) && (TargetActor.Position.Y > Actor.Position.Y - 10) && (TargetActor.Position.Y < Actor.Position.Y + 10) && (Instance.Model.DoorPosition.GetVector2().X == Actor.SquareInFront.X && Instance.Model.DoorPosition.GetVector2().Y == Actor.SquareInFront.Y)) { TargetActor.MoveTo(Actor.SquareInFront); Actor.Chat("*" + Session.CharacterInfo.Username + " pulls " + Bits[1] + "*"); return(true); } Session.SendData(RoomChatComposer.Compose(Actor.Id, Bits[1] + " is not in your area.", 0, ChatType.Whisper)); return(false); #endregion #endregion #region debugging #region items case "update_catalog": { if (!Session.HasRight("hotel_admin")) { return(false); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Snowlight.Game.Catalog.CatalogManager.RefreshCatalogData(MySqlClient); } Session.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.updatecatalog.success"))); return(true); } case "update_items": { if (!Session.HasRight("hotel_admin")) { return(false); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Snowlight.Game.Items.ItemDefinitionManager.Initialize(MySqlClient); } Session.SendData(NotificationMessageComposer.Compose("Items reloaded")); return(true); } #endregion #region rooms case "unload": if (!Session.HasRight("hotel_admin")) { return(false); } Instance.BroadcastMessage(NotificationMessageComposer.Compose("This room was unloaded!")); Instance.Unload(); return(true); case "t": if (!Session.HasRight("hotel_admin")) { return(false); } Session.SendData(NotificationMessageComposer.Compose("Position: " + Actor.Position.ToString() + ", Rotation: " + Actor.BodyRotation)); return(true); #endregion case "update_rights": if (!Session.HasRight("hotel_admin")) { return(false); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { RightsManager.RebuildCache(MySqlClient); } return(true); case "effect": if (!Session.HasRight("hotel_admin")) { return(false); } if (Bits.Length < 1) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :effect <id>", 0, ChatType.Whisper)); return(true); } int effectID; if (int.TryParse(Bits[1], out effectID)) { Actor.ApplyEffect(effectID); Session.CurrentEffect = 0; } else { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :effect <id>", 0, ChatType.Whisper)); } return(true); case "clipping": if (!Session.HasRight("hotel_admin")) { return(false); } Actor.OverrideClipping = !Actor.OverrideClipping; Actor.ApplyEffect(Actor.ClippingEnabled ? 0 : 23); Session.CurrentEffect = 0; return(true); #endregion #region moderation #region kick case "superkick": // Kick User out of the Hotel { if (!Session.HasRight("hotel_admin")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.invalidsyntax") + " - :kick <username>", 0, ChatType.Whisper)); return(true); } TargetName = UserInputFilter.FilterString(Bits[1].Trim()); TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(TargetName)); if (TargetSession == null || TargetSession.HasRight("moderation_tool") || !TargetSession.InRoom) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' is offline or cannot be kicked.", 0, ChatType.Whisper)); return(true); } SessionManager.StopSession(TargetSession.Id); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Superkicked user from server (chat command)", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ")."); } return(true); } case "kick": //kick User out of Room { if (!Session.HasRight("moderation_tool")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.invalidsyntax") + " - :kick <username>", 0, ChatType.Whisper)); return(true); } TargetName = UserInputFilter.FilterString(Bits[1].Trim()); TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(TargetName)); if (TargetSession == null || TargetSession.HasRight("moderation_tool") || !TargetSession.InRoom) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' is offline, not in a room, or cannot be kicked.", 0, ChatType.Whisper)); return(true); } RoomManager.RemoveUserFromRoom(TargetSession, true); TargetSession.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.kick.success"))); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Kicked user from room (chat command)", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ")."); } return(true); } #endregion #region mute case "roomunmute": { if (!Session.HasRight("mute")) { return(false); } if (Instance.RoomMuted) { Instance.RoomMuted = false; Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.roomunmute.success"), 0, ChatType.Whisper)); } else { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.roomunmute.error"), 0, ChatType.Whisper)); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Unmuted room", "Room '" + Instance.Info.Name + "' (ID " + Instance.RoomId + ")"); } return(true); } case "roommute": { if (!Session.HasRight("mute")) { return(false); } if (!Instance.RoomMuted) { Instance.RoomMuted = true; Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.roommute.success"), 0, ChatType.Whisper)); } else { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.roommute.error"), 0, ChatType.Whisper)); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Muted room", "Room '" + Instance.Info.Name + "' (ID " + Instance.RoomId + ")"); } return(true); } case "unmute": { if (!Session.HasRight("mute")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.invalidsyntax") + " - :unmute <username>", 0, ChatType.Whisper)); return(true); } TargetName = UserInputFilter.FilterString(Bits[1].Trim()); TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(TargetName)); if (TargetSession == null) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' " + Localization.GetValue("command.cannotproceedcmd3"), 0, ChatType.Whisper)); return(true); } if (!TargetSession.CharacterInfo.IsMuted) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' " + Localization.GetValue("command.unmute.error"), 0, ChatType.Whisper)); return(true); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { TargetSession.CharacterInfo.Unmute(MySqlClient); } TargetSession.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.unmute.sucess"))); Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' " + Localization.GetValue("command.unmute.sucess2"), 0, ChatType.Whisper)); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Unmuted user", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ")."); } return(true); } case "mute": { if (!Session.HasRight("mute")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.invalidsyntax") + " - :mute <username> [length in seconds]", 0, ChatType.Whisper)); return(true); } TargetName = UserInputFilter.FilterString(Bits[1].Trim()); int TimeToMute = 0; if (Bits.Length >= 3) { int.TryParse(Bits[2], out TimeToMute); } if (TimeToMute <= 0) { TimeToMute = 300; } if (TimeToMute > 3600) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.mute.error"), 0, ChatType.Whisper)); return(true); } TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(TargetName)); if (TargetSession == null || TargetSession.HasRight("mute")) { Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' " + Localization.GetValue("command.cannotproceedcmd4"), 0, ChatType.Whisper)); return(true); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { TargetSession.CharacterInfo.Mute(MySqlClient, TimeToMute); ModerationLogs.LogModerationAction(MySqlClient, Session, "Muted user", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ") for " + TimeToMute + " seconds."); } TargetSession.SendData(RoomMutedComposer.Compose(TimeToMute)); Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.mute.sucess.part1") + " '" + TargetName + "' " + Localization.GetValue("command.mute.sucess.part2") + " " + TimeToMute + " seconds.", 0, ChatType.Whisper)); return(true); } #endregion #region credits case "coins": case "credits": using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { if (!Session.HasRight("hotel_admin")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :" + Bits[0].ToLower() + " <user> <amount>", 0, ChatType.Whisper)); return(false); } int Valor; if (!Int32.TryParse(Bits[2], out Valor)) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Amount must be numeric!", 0, ChatType.Whisper)); return(false); } TargetName = UserInputFilter.FilterString(Bits[1].Trim()); uint UserID = CharacterResolverCache.GetUidFromName(TargetName); if (UserID == 0) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "User not found!", 0, ChatType.Whisper)); return(false); } Session TargetUser = SessionManager.GetSessionByCharacterId(UserID); if (TargetUser == null) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "User not online!", 0, ChatType.Whisper)); return(false); } TargetUser.CharacterInfo.UpdateCreditsBalance(MySqlClient, (int)Valor); TargetUser.SendData(RoomChatComposer.Compose(TargetUser.Id, "You received " + Valor + " coins!", 0, ChatType.Whisper)); Session.SendData(RoomChatComposer.Compose(Actor.Id, TargetName + " received " + Valor + " coins!", 0, ChatType.Whisper)); TargetUser.SendData(CreditsBalanceComposer.Compose(TargetUser.CharacterInfo.CreditsBalance)); return(true); } #endregion #region messages case "ha": { if (!Session.HasRight("hotel_admin")) { return(false); } string Alert = UserInputFilter.FilterString(MergeInputs(Bits, 1)); SessionManager.BroadcastPacket(UserAlertModernComposer.Compose("Important notice from Hotel Management", Alert)); return(true); } #endregion #endregion } return(false); }
private void ProcessData(byte[] Data) { if (Data.Length == 0) { return; } ASCIIEncoding enc = new ASCIIEncoding(); String command = enc.GetString(Data); command = command.Replace("\r\n", "").Trim(); String[] bits = command.Split(Convert.ToChar(1)); command = bits[0]; Session Target = null; switch (command) { case "status": SendData("1"); break; case "human": is_human = true; SendData("Welcome. To get a list of commands type commands."); break; case "close": case "exit": SendData("Bye"); stop(mId); break; case "ha": if (bits.Length < 2) { SendData("Command must be ha <message>"); break; } string Alert = UserInputFilter.FilterString(bits[1]); SessionManager.BroadcastPacket(UserAlertModernComposer.Compose("Important notice from Hotel Management", Alert)); break; case "update_catalog": using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { CatalogManager.RefreshCatalogData(MySqlClient); } break; case "update_items": using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ItemDefinitionManager.Initialize(MySqlClient); } break; case "premium": if (bits.Length < 3 || (bits[1] != "enable" && bits[1] != "disable")) { SendData("Command must be premium (enable|disable) <userid>"); break; } Target = SessionManager.GetSessionByCharacterId(Convert.ToUInt32(bits[2])); if (Target == null) { SendData("User not online"); break; } if (bits[1] == "enable" && !Target.CharacterInfo.IsPremium) { Target.CharacterInfo.IsPremium = true; Target.SendData(UserAlertModernComposer.Compose("Premium", "Your premium was activated")); ServerMessage Welcome = new ServerMessage(575); Welcome.AppendInt32(1); Welcome.AppendInt32(0); Welcome.AppendInt32(1); Target.SendData(Welcome); } else if (bits[1] == "disable" && Target.CharacterInfo.IsPremium) { ServerMessage Welcome = new ServerMessage(575); Welcome.AppendInt32(0); Welcome.AppendInt32(1); Welcome.AppendInt32(0); Target.SendData(Welcome); Target.CharacterInfo.IsPremium = false; Target.SendData(UserAlertModernComposer.Compose("Premium", "Your premium was deactivated")); } Target.SendData(CatalogUpdatedNotificationComposer.Compose()); SendData("OK"); break; case "update_badges": if (bits.Length < 2) { SendData("Command must be update_badges <userid>"); break; } Target = SessionManager.GetSessionByCharacterId(Convert.ToUInt32(bits[1])); if (Target == null) { SendData("User not online"); break; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Target.AchievementCache.ReloadCache(MySqlClient); Target.BadgeCache.ReloadCache(MySqlClient, Target.AchievementCache); RoomInstance Instance = RoomManager.GetInstanceByRoomId(Target.CurrentRoomId); if (Instance != null) { Instance.BroadcastMessage(RoomUserBadgesComposer.Compose(Target.CharacterId, Target.BadgeCache.EquippedBadges)); } } SendData("OK"); break; case "": break; default: SendData("Unknown Command."); break; } if (!is_human) { stop(mId); } }
public static bool HandleCommand(Session Session, string Input) { Input = Input.Substring(1, Input.Length - 1); string[] Bits = Input.Split(' '); RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); RoomActor Actor = (Instance == null ? null : Instance.GetActorByReferenceId(Session.CharacterId)); switch (Bits[0].ToLower()) { case "commands": { Session.SendData(NotificationMessageComposer.Compose("The following commands are available to regular users:\n\n:commands\n:online\n:about\n:pickall")); return(true); } case "online": { List <string> OnlineUsers = SessionManager.ConnectedUserData.Values.ToList(); StringBuilder MessageText = new StringBuilder("There are currently " + OnlineUsers.Count + " user(s) online:\n"); foreach (string OnlineUser in OnlineUsers) { MessageText.Append('\n'); MessageText.Append("- " + OnlineUser); } Session.SendData(NotificationMessageComposer.Compose(MessageText.ToString())); return(true); } case "superkick": { if (!Session.HasRight("hotel_admin")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :kick <username>", 0, ChatType.Whisper)); return(true); } string Username = UserInputFilter.FilterString(Bits[1].Trim()); Session TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(Username)); if (TargetSession == null || TargetSession.HasRight("moderation_tool") || !TargetSession.InRoom) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Target user '" + Username + "' is offline or cannot be kicked.", 0, ChatType.Whisper)); return(true); } SessionManager.StopSession(TargetSession.Id); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Superkicked user from server (chat command)", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ")."); } return(true); } case "kick": { if (!Session.HasRight("moderation_tool")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :kick <username>", 0, ChatType.Whisper)); return(true); } string Username = UserInputFilter.FilterString(Bits[1].Trim()); Session TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(Username)); if (TargetSession == null || TargetSession.HasRight("moderation_tool") || !TargetSession.InRoom) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Target user '" + Username + "' is offline, not in a room, or cannot be kicked.", 0, ChatType.Whisper)); return(true); } RoomManager.RemoveUserFromRoom(TargetSession, true); TargetSession.SendData(NotificationMessageComposer.Compose("You have been kicked from the room by a community staff member.")); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Kicked user from room (chat command)", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ")."); } return(true); } case "roomunmute": { if (!Session.HasRight("mute")) { return(false); } if (Instance.RoomMuted) { Instance.RoomMuted = false; Session.SendData(RoomChatComposer.Compose(Actor.Id, "The current room has been unmuted successfully.", 0, ChatType.Whisper)); } else { Session.SendData(RoomChatComposer.Compose(Actor.Id, "This room is not muted.", 0, ChatType.Whisper)); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Unmuted room", "Room '" + Instance.Info.Name + "' (ID " + Instance.RoomId + ")"); } return(true); } case "roommute": { if (!Session.HasRight("mute")) { return(false); } if (!Instance.RoomMuted) { Instance.RoomMuted = true; Session.SendData(RoomChatComposer.Compose(Actor.Id, "The current room has been muted successfully.", 0, ChatType.Whisper)); } else { Session.SendData(RoomChatComposer.Compose(Actor.Id, "This room is already muted.", 0, ChatType.Whisper)); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Muted room", "Room '" + Instance.Info.Name + "' (ID " + Instance.RoomId + ")"); } return(true); } case "unmute": { if (!Session.HasRight("mute")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :unmute <username>", 0, ChatType.Whisper)); return(true); } string Username = UserInputFilter.FilterString(Bits[1].Trim()); Session TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(Username)); if (TargetSession == null) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Target user '" + Username + "' does not exist or is not online.", 0, ChatType.Whisper)); return(true); } if (!TargetSession.CharacterInfo.IsMuted) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Target user '" + Username + "' is not muted.", 0, ChatType.Whisper)); return(true); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { TargetSession.CharacterInfo.Unmute(MySqlClient); } TargetSession.SendData(NotificationMessageComposer.Compose("You have been unmuted. Please reload the room.")); Session.SendData(RoomChatComposer.Compose(Actor.Id, "Target user '" + Username + "' was successfully unmuted.", 0, ChatType.Whisper)); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ModerationLogs.LogModerationAction(MySqlClient, Session, "Unmuted user", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ")."); } return(true); } case "mute": { if (!Session.HasRight("mute")) { return(false); } if (Bits.Length < 2) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :mute <username> [length in seconds]", 0, ChatType.Whisper)); return(true); } string Username = UserInputFilter.FilterString(Bits[1].Trim()); int TimeToMute = 0; if (Bits.Length >= 3) { int.TryParse(Bits[2], out TimeToMute); } if (TimeToMute <= 0) { TimeToMute = 300; } if (TimeToMute > 3600) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "The maximum mute time is one hour.", 0, ChatType.Whisper)); return(true); } Session TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(Username)); if (TargetSession == null || TargetSession.HasRight("mute")) { Session.SendData(RoomChatComposer.Compose(Actor.Id, "Target user '" + Username + "' does not exist, is not online, or cannot be muted.", 0, ChatType.Whisper)); return(true); } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { TargetSession.CharacterInfo.Mute(MySqlClient, TimeToMute); ModerationLogs.LogModerationAction(MySqlClient, Session, "Muted user", "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ") for " + TimeToMute + " seconds."); } TargetSession.SendData(RoomMutedComposer.Compose(TimeToMute)); Session.SendData(RoomChatComposer.Compose(Actor.Id, "User '" + Username + "' has been muted successfully for " + TimeToMute + " seconds.", 0, ChatType.Whisper)); return(true); } case "clipping": if (!Session.HasRight("hotel_admin")) { return(false); } Actor.OverrideClipping = !Actor.OverrideClipping; Actor.ApplyEffect(Actor.ClippingEnabled ? 0 : 23); Session.CurrentEffect = 0; return(true); case "about": Session.SendData(UserAlertModernComposer.Compose("Powered by Snowlight", "This hotel is proudly powered by Snowlight, the premium open-source Habbo Hotel emulator.\n\nhttp://www.meth0d.org/snowlight")); return(true); case "t": if (!Session.HasRight("hotel_admin")) { return(false); } Session.SendData(NotificationMessageComposer.Compose("Position: " + Actor.Position.ToString() + ", Rotation: " + Actor.BodyRotation)); return(true); case "emptyinv": if (!Session.HasRight("hotel_admin")) { return(false); } Session.InventoryCache.ClearAndDeleteAll(); Session.SendData(InventoryRefreshComposer.Compose()); Session.SendData(NotificationMessageComposer.Compose("Your inventory has been emptied.")); return(true); case "pickall": if (!Instance.CheckUserRights(Session, true)) { Session.SendData(NotificationMessageComposer.Compose("You do not have rights to pickall in this room.")); return(true); } Instance.PickAllToUserInventory(Session); return(true); } return(false); }
private static void PerformSearch(Session Session, ClientMessage Message) { 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); }