/* Thor Server Project Copyright 2008 Joe Hegarty This file is part of The Thor Server Project. The Thor Server Project is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The Thor Server Project is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with The Thor Server Project. If not, see . */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using ThorServer.Utilities; using ThorServer.Game.Users; namespace ThorServer.Game.Rooms { public class Navigator { public string GetOwnRoomSearchResult(int userId) { StringBuilder sb = new StringBuilder(); List roomInfoList = InstanceManager.Game.Rooms.GetUserRoomList(userId); UserInfo user = InstanceManager.Game.Users.GetUser(userId); if (roomInfoList.Count > 0) { foreach (RoomInfo roomInfo in roomInfoList) { sb.Append(formSpecialRoomDefinition(roomInfo, user)); } return sb.ToString(); } return null; } public string GetRoomSearchResult(string searchCrit, int userId) { StringBuilder sb = new StringBuilder(); List roomInfoList = InstanceManager.Game.Rooms.GetSearchRoomList(searchCrit); UserInfo user = InstanceManager.Game.Users.GetUser(userId); if (roomInfoList.Count > 0) { foreach (RoomInfo roomInfo in roomInfoList) { sb.Append(formSpecialRoomDefinition(roomInfo, user)); } return sb.ToString(); } return null; } public string GetFavouriteSearchResult(int userId, int roleId) { List favouriteRooms = InstanceManager.Game.Users.GetFavouriteRooms(userId); UserInfo userInfo = InstanceManager.Game.Users.GetUser(userId); int gRooms = 0; StringBuilder sbGuest = new StringBuilder(); StringBuilder sbPublic = new StringBuilder(); foreach (int roomId in favouriteRooms) { if (InstanceManager.Game.Rooms.RoomExists(roomId)) { RoomInfo info = InstanceManager.Game.Rooms.GetRoom(roomId); int categoryType = InstanceManager.Game.Rooms.GetCategory(info.RoomCategory).RoomCategoryType; if (categoryType == 2) sbGuest.Append(BuildRoomResponse(info, userInfo, 0)); if (categoryType == 0) sbPublic.Append(BuildRoomResponse(info, userInfo, 0)); if (categoryType == 2) gRooms++; } else { InstanceManager.Game.Users.DeleteFavouriteRoom(userId, roomId); } } StringBuilder final = new StringBuilder(); final.Append("H" + "H" + "J" + Convert.ToChar(2) + "HHH"); final.Append(ArgumentEncoding.encodeInt(gRooms)); final.Append(sbGuest.ToString()); final.Append(sbPublic.ToString()); return final.ToString(); } private string formSpecialRoomDefinition(RoomInfo roomInfo, UserInfo user) { StringBuilder sb = new StringBuilder(); char tab = Convert.ToChar(9); sb.Append(roomInfo.RoomID.ToString()); sb.Append(tab); sb.Append(roomInfo.RoomName); sb.Append(tab); if (roomInfo.ShowOwner == 1 || InstanceManager.Game.Roles.HasRight(user.iRole, "fuse_see_all_roomowners")) { sb.Append(InstanceManager.Game.Users.GetUser(roomInfo.RoomOwner).sUsername); } else { sb.Append("-"); } sb.Append(tab); sb.Append(roomInfo.RoomStatus); sb.Append(tab); sb.Append("x"); sb.Append(tab); sb.Append(roomInfo.CurrentUsers.ToString()); sb.Append(tab); sb.Append(roomInfo.MaxUsers.ToString()); sb.Append(tab); sb.Append("null"); sb.Append(tab); sb.Append(roomInfo.RoomDescription); sb.Append(tab); sb.Append(roomInfo.RoomDescription); sb.Append(tab); sb.Append(Convert.ToChar(13)); return sb.ToString(); } public string GetNavigatorResponse(int navID, int hideFull, UserInfo user) { StringBuilder sb = new StringBuilder(); RoomCategory category = InstanceManager.Game.Rooms.GetCategory(navID); if (category != null) { List rooms = InstanceManager.Game.Rooms.GetRoomListByCategory(navID); sb.Append(BuildCategoryResponse(category, hideFull, rooms.Count)); if (rooms.Count > 0) { foreach (RoomInfo room in rooms) { sb.Append(BuildRoomResponse(room, user, hideFull)); } } List subcategories = InstanceManager.Game.Rooms.GetSubCategoryList(navID); if (subcategories.Count > 0) { foreach (RoomCategory subcat in subcategories) { sb.Append(BuildSubCategoryList(subcat, user.iRole)); } } } return sb.ToString(); } private string BuildSubCategoryList(RoomCategory category, int userRole) { List rooms = InstanceManager.Game.Rooms.GetRoomListByCategory(category.CategoryID); StringBuilder sb = new StringBuilder(); if (category.IsVisible || (category.SystemCategory && InstanceManager.Game.Roles.HasRight(userRole, "fuse_see_system_categories"))) { sb.Append(ArgumentEncoding.encodeInt(category.CategoryID)); sb.Append(ArgumentEncoding.encodeInt(0)); sb.Append(category.CategoryName); sb.Append(Convert.ToChar(2)); int maxUsers = 0; int currentUsers = 0; if (rooms.Count > 0) { foreach (RoomInfo room in rooms) { maxUsers += room.MaxUsers; currentUsers += room.CurrentUsers; } } sb.Append(ArgumentEncoding.encodeInt(currentUsers)); sb.Append(ArgumentEncoding.encodeInt(maxUsers)); sb.Append(ArgumentEncoding.encodeInt(category.ParentCategory)); } return sb.ToString(); } private string BuildCategoryResponse(RoomCategory category, int hideFull, int roomCount) { StringBuilder sb = new StringBuilder(); sb.Append(ArgumentEncoding.encodeInt(hideFull)); sb.Append(ArgumentEncoding.encodeInt(category.CategoryID)); sb.Append(ArgumentEncoding.encodeInt(category.RoomCategoryType)); sb.Append(category.CategoryName); // Name sb.Append(Convert.ToChar(2)); sb.Append(ArgumentEncoding.encodeInt(0)); sb.Append(ArgumentEncoding.encodeInt(10000)); sb.Append(ArgumentEncoding.encodeInt(category.ParentCategory)); if (category.RoomCategoryType == 2) //Guest { sb.Append(ArgumentEncoding.encodeInt(roomCount)); } return sb.ToString(); } private string BuildRoomResponse(RoomInfo room, UserInfo user, int hideFull) { int categoryType = InstanceManager.Game.Rooms.GetCategory(room.RoomCategory).RoomCategoryType; StringBuilder sb = new StringBuilder(); if (hideFull == 1 && room.CurrentUsers >= room.MaxUsers) { return ""; } if (categoryType == 2) // Guest { sb.Append(ArgumentEncoding.encodeInt(room.RoomID)); sb.Append(room.RoomName); sb.Append(Convert.ToChar(2)); if (room.ShowOwner == 1 || InstanceManager.Game.Roles.HasRight(user.iRole, "fuse_see_all_roomowners")) { sb.Append(InstanceManager.Game.Users.GetUser(room.RoomOwner).sUsername); } else { sb.Append("-"); } sb.Append(Convert.ToChar(2)); sb.Append(room.RoomStatus); sb.Append(Convert.ToChar(2)); sb.Append(ArgumentEncoding.encodeInt(room.CurrentUsers)); sb.Append(ArgumentEncoding.encodeInt(room.MaxUsers)); sb.Append(room.RoomDescription); sb.Append(Convert.ToChar(2)); } if (categoryType == 0) //Public { sb.Append(ArgumentEncoding.encodeInt(room.RoomID)); sb.Append(ArgumentEncoding.encodeInt(1)); sb.Append(room.RoomName); sb.Append(Convert.ToChar(2)); sb.Append(ArgumentEncoding.encodeInt(room.CurrentUsers)); sb.Append(ArgumentEncoding.encodeInt(room.MaxUsers)); sb.Append(ArgumentEncoding.encodeInt(room.RoomCategory)); sb.Append(room.RoomDescription); sb.Append(Convert.ToChar(2)); sb.Append(ArgumentEncoding.encodeInt(room.RoomID)); sb.Append(ArgumentEncoding.encodeInt(0)); sb.Append(room.CCTs); sb.Append(Convert.ToChar(2)); sb.Append(ArgumentEncoding.encodeInt(0)); sb.Append(ArgumentEncoding.encodeInt(1)); } return sb.ToString(); } public string BuildPrivateCategoryResponse() { StringBuilder sb = new StringBuilder(); int catCount = 0; List subcategories = InstanceManager.Game.Rooms.GetSubCategoryList(4); if (subcategories.Count > 0) { foreach (RoomCategory subcat in subcategories) { if (subcat.PlayerCategory) { catCount++; sb.Append(ArgumentEncoding.encodeInt(subcat.CategoryID)); sb.Append(subcat.CategoryName); sb.Append(Convert.ToChar(2)); } } } StringBuilder result = new StringBuilder(ArgumentEncoding.encodeInt(catCount)); result.Append(sb.ToString()); return result.ToString(); } } }