/* 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 System.Data; using System.Data.SqlClient; using ThorServer.Data; using ThorServer.Core; namespace ThorServer.Game.Rooms { public class RoomManager { private Dictionary mRoomInstances; public RoomManager() { mRoomInstances = new Dictionary(); ResetUsers(); } public int CreateRoom(string roomName, string roomModel, string roomState, int showOwner, int owner) { int roomType = GetRoomType(roomModel); Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomname", roomName); db.sqlexecute.Parameters.AddWithValue("@roomtype", roomType); db.sqlexecute.Parameters.AddWithValue("@roomstate", roomState); db.sqlexecute.Parameters.AddWithValue("@showowner", showOwner); db.sqlexecute.Parameters.AddWithValue("@owner", owner); SqlParameter identity = new SqlParameter("@identity", SqlDbType.Int); identity.Value = 0; identity.Direction = ParameterDirection.Output; db.sqlexecute.Parameters.Add(identity); db.ExecuteSQL("INSERT INTO Rooms (RoomName, RoomType, RoomStatus, ShowOwner, RoomOwner) VALUES (@roomname, @roomtype, @roomstate, @showowner, @owner); SET @identity = @@identity;"); db.sqlexecute.Parameters.Clear(); return (int) identity.Value; } public void UpdateRoom(RoomInfo room) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", room.RoomID); db.sqlexecute.Parameters.AddWithValue("@roomname", room.RoomName); db.sqlexecute.Parameters.AddWithValue("@roomtype", room.RoomType); db.sqlexecute.Parameters.AddWithValue("@roomstate", room.RoomStatus); db.sqlexecute.Parameters.AddWithValue("@showowner", room.ShowOwner); db.sqlexecute.Parameters.AddWithValue("@owner", room.RoomOwner); db.sqlexecute.Parameters.AddWithValue("@description", room.RoomDescription); db.sqlexecute.Parameters.AddWithValue("@password", room.Password); db.sqlexecute.Parameters.AddWithValue("@superusers", room.SuperUsers); db.sqlexecute.Parameters.AddWithValue("@wallpaper", room.Wallpaper); db.sqlexecute.Parameters.AddWithValue("@floor", room.Floor); db.sqlexecute.Parameters.AddWithValue("@category", room.RoomCategory); db.sqlexecute.Parameters.AddWithValue("@maxusers", room.MaxUsers); db.ExecuteSQL("UPDATE Rooms SET RoomName = @roomname, RoomType = @roomtype, RoomStatus = @roomstate, ShowOwner = @showowner, RoomOwner = @owner, RoomDescription = @description, Password = @password, SuperUsers = @superusers,Wallpaper = @wallpaper, Floor = @floor, CategoryID = @category, MaxUsers = @maxusers WHERE RoomID = @roomid;"); db.sqlexecute.Parameters.Clear(); if (InstanceExists(room.RoomID)) { GetRoomInstance(room.RoomID).RoomInfo = GetRoom(room.RoomID); } } public RoomInfo GetRoom(int roomid) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomid); DataRow dRow = db.GetDataSet("SELECT * FROM Rooms JOIN RoomTypes ON Rooms.RoomType = RoomTypes.RoomTypeID WHERE Rooms.RoomID = @roomid;").Tables[0].Rows[0]; db.sqlexecute.Parameters.Clear(); return ProduceRoomFromRow(dRow); } public void DeleteRoom(int roomid) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomid); db.ExecuteSQL("DELETE FROM Furni WHERE RoomID = @roomid;"); db.ExecuteSQL("DELETE FROM Rooms WHERE RoomID = @roomid;"); db.sqlexecute.Parameters.Clear(); } public bool RoomExists(int roomid) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomid); int rowCount = db.getInt("SELECT COUNT(*) FROM Rooms WHERE RoomID = @roomid;"); db.sqlexecute.Parameters.Clear(); return (rowCount > 0); } public List GetRoomList() { Database db = new Database(); List results = new List(); DataTable dTable = db.GetDataSet("SELECT * FROM Rooms JOIN RoomTypes ON Rooms.RoomType = RoomTypes.RoomTypeID WHERE CategoryID = @category ORDER BY RoomOrder ASC, CurrentUsers DESC;").Tables[0]; foreach (DataRow dRow in dTable.Rows) { results.Add(ProduceRoomFromRow(dRow)); } return results; } public List GetRoomListByCategory(int categoryId) { Database db = new Database(); List results = new List(); db.sqlexecute.Parameters.AddWithValue("@catid", categoryId); DataTable dTable = db.GetDataSet("SELECT TOP 50 * FROM Rooms JOIN RoomTypes ON Rooms.RoomType = RoomTypes.RoomTypeID WHERE CategoryID = @catid ORDER BY RoomOrder ASC, CurrentUsers DESC;").Tables[0]; db.sqlexecute.Parameters.Clear(); foreach (DataRow dRow in dTable.Rows) { results.Add(ProduceRoomFromRow(dRow)); } return results; } public void UpdateUsers(int roomId, int currentUsers) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomId); db.sqlexecute.Parameters.AddWithValue("@currentusers", currentUsers); db.ExecuteSQL("UPDATE Rooms SET CurrentUsers = @currentusers WHERE RoomID = @roomid;"); db.sqlexecute.Parameters.Clear(); } public void ResetUsers() { Database db = new Database(); db.ExecuteSQL("UPDATE Rooms SET CurrentUsers = 0;"); db.sqlexecute.Parameters.Clear(); } public List GetUserRoomList(int userId) { Database db = new Database(); List results = new List(); db.sqlexecute.Parameters.AddWithValue("@userid", userId); DataTable dTable = db.GetDataSet("SELECT TOP 50 * FROM Rooms JOIN RoomTypes ON Rooms.RoomType = RoomTypes.RoomTypeID WHERE RoomOwner = @userid ORDER BY CurrentUsers DESC;").Tables[0]; db.sqlexecute.Parameters.Clear(); foreach (DataRow dRow in dTable.Rows) { results.Add(ProduceRoomFromRow(dRow)); } return results; } public List GetSearchRoomList(string criteria) { Database db = new Database(); List results = new List(); db.sqlexecute.Parameters.AddWithValue("@criteria", criteria); db.sqlexecute.Parameters.AddWithValue("@plain", criteria.Replace("%", "")); DataTable dTable = db.GetDataSet("SELECT TOP 50 * FROM Rooms JOIN RoomTypes ON Rooms.RoomType = RoomTypes.RoomTypeID JOIN Users ON Users.UserID = Rooms.RoomOwner WHERE (Username = @plain OR RoomName LIKE @criteria) AND RoomOwner > 0 ORDER BY CurrentUsers DESC;").Tables[0]; db.sqlexecute.Parameters.Clear(); foreach (DataRow dRow in dTable.Rows) { results.Add(ProduceRoomFromRow(dRow)); } return results; } private RoomInfo ProduceRoomFromRow(DataRow dRow) { RoomInfo roomInfo = new RoomInfo(); roomInfo.RoomID = int.Parse(dRow["RoomID"].ToString()); roomInfo.RoomName = dRow["RoomName"].ToString(); roomInfo.RoomDescription = dRow["RoomDescription"].ToString(); roomInfo.RoomStatus = dRow["RoomStatus"].ToString(); roomInfo.RoomOwner = int.Parse(dRow["RoomOwner"].ToString()); roomInfo.RoomType = int.Parse(dRow["RoomType"].ToString()); roomInfo.RoomCategory = int.Parse(dRow["CategoryID"].ToString()); roomInfo.TypeName = dRow["FriendlyName"].ToString(); roomInfo.RoomModel = dRow["RoomModel"].ToString(); roomInfo.DefaultHeightmap = dRow["DefaultHeightmap"].ToString().Replace('|', Convert.ToChar(13)); roomInfo.StartX = int.Parse(dRow["StartX"].ToString()); roomInfo.StartY = int.Parse(dRow["StartY"].ToString()); roomInfo.StartZ = int.Parse(dRow["StartZ"].ToString()); roomInfo.MaxUsers = int.Parse(dRow["MaxUsers"].ToString()); roomInfo.Wallpaper = int.Parse(dRow["Wallpaper"].ToString()); roomInfo.Floor = int.Parse(dRow["Floor"].ToString()); roomInfo.ReactorType = dRow["ReactorType"].ToString(); roomInfo.CCTs = dRow["CCTs"].ToString(); roomInfo.IsGuestRoom = bool.Parse(dRow["Guest"].ToString()); roomInfo.SuperUsers = int.Parse(dRow["SuperUsers"].ToString()); roomInfo.ShowOwner = int.Parse(dRow["ShowOwner"].ToString()); roomInfo.UserType = int.Parse(dRow["UserType"].ToString()); roomInfo.Password = dRow["Password"].ToString(); roomInfo.CurrentUsers = int.Parse(dRow["CurrentUsers"].ToString()); roomInfo.UserType = int.Parse(dRow["UserType"].ToString()); roomInfo.MaxAscend = float.Parse(dRow["MaxAscend"].ToString()); roomInfo.MaxDescend = float.Parse(dRow["MaxDescend"].ToString()); return roomInfo; } public RoomInstance GetRoomInstance(int roomId) { if (!InstanceExists(roomId)) { Logging.LogEvent("Creating room instance " + roomId.ToString(), Logging.LogLevel.Info); mRoomInstances.Add(roomId, new RoomInstance(roomId)); } return mRoomInstances[roomId]; } public bool InstanceExists(int roomId) { return mRoomInstances.ContainsKey(roomId); } public void DestroyRoomInstance(int roomId) { if (InstanceExists(roomId)) { Logging.LogEvent("Destroying room instance " + roomId.ToString(), Logging.LogLevel.Info); mRoomInstances[roomId].DestroyRoom(); mRoomInstances[roomId] = null; mRoomInstances.Remove(roomId); } } public List GetCategoryList() { Database db = new Database(); List results = new List(); DataTable dTable = db.GetDataSet("SELECT * FROM RoomCategories;").Tables[0]; foreach (DataRow dRow in dTable.Rows) { results.Add(ProduceCategoryFromRow(dRow)); } return results; } public List GetSubCategoryList(int parentId) { Database db = new Database(); List results = new List(); db.sqlexecute.Parameters.AddWithValue("@parent", parentId); DataTable dTable = db.GetDataSet("SELECT * FROM RoomCategories WHERE RoomCategoryParent = @parent ORDER BY CategoryOrder ASC;").Tables[0]; db.sqlexecute.Parameters.Clear(); foreach (DataRow dRow in dTable.Rows) { results.Add(ProduceCategoryFromRow(dRow)); } return results; } public int GetRoomType(string modelName) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@modelname", modelName); int rest = db.getInt("SELECT RoomTypeID FROM RoomTypes WHERE RoomModel = @modelname;"); db.sqlexecute.Parameters.Clear(); return rest; } public bool UserRoomExists(string modelName) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@modelname", modelName); int rest = db.getInt("SELECT COUNT(RoomTypeID) FROM RoomTypes WHERE RoomModel = @modelname AND Guest = 1;"); db.sqlexecute.Parameters.Clear(); return rest > 0; } public int GetUserType(string modelName) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@modelname", modelName); int rest = db.getInt("SELECT UserType FROM RoomTypes WHERE RoomModel = @modelname;"); db.sqlexecute.Parameters.Clear(); return rest; } public RoomCategory GetCategory(int catId) { try { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@catid", catId); DataRow dRow = db.GetDataSet("SELECT * FROM RoomCategories WHERE RoomCategoryID = @catid;").Tables[0].Rows[0]; db.sqlexecute.Parameters.Clear(); return ProduceCategoryFromRow(dRow); } catch { return null; } } private RoomCategory ProduceCategoryFromRow(DataRow dRow) { try { RoomCategory roomCat = new RoomCategory(); roomCat.CategoryID = int.Parse(dRow["RoomCategoryID"].ToString()); roomCat.CategoryName = dRow["RoomCategoryName"].ToString(); roomCat.ParentCategory = int.Parse(dRow["RoomCategoryParent"].ToString()); roomCat.RoomCategoryType = int.Parse(dRow["RoomCategoryType"].ToString()); roomCat.CanTrade = int.Parse(dRow["CanTrade"].ToString()); roomCat.IsVisible = (bool)dRow["IsVisible"]; roomCat.PlayerCategory = (bool)dRow["PlayerCategory"]; roomCat.SystemCategory = (bool)dRow["SystemCategory"]; return roomCat; } catch { return null; } } public int GetRoomStateInt(string state) { switch (state) { case "open": return 0; case "closed": return 1; case "password": return 2; default: return -1; } } public string GetRoomStateString(int state) { switch(state) { case 0: return "open"; case 1: return "closed"; case 2: return "password"; default: return "unknown"; } } public bool HasRights(int roomid, int userid) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomid); db.sqlexecute.Parameters.AddWithValue("@userid", userid); int rowCount = db.getInt("SELECT COUNT(*) FROM RoomRights WHERE RoomID = @roomid AND UserID = @userid;"); db.sqlexecute.Parameters.Clear(); return (rowCount > 0); } public void AddRights(int roomid, int userid) { if (HasRights(roomid, userid)) return; Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomid); db.sqlexecute.Parameters.AddWithValue("@userid", userid); db.ExecuteSQL("INSERT INTO RoomRights (RoomID, UserID) VALUES (@roomid, @userid);"); db.sqlexecute.Parameters.Clear(); } public void DeleteRights(int roomid, int userid) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomid); db.sqlexecute.Parameters.AddWithValue("@userid", userid); db.ExecuteSQL("DELETE FROM RoomRights WHERE RoomID = @roomid AND UserID = @userid;"); db.sqlexecute.Parameters.Clear(); } public void DeleteAllRights(int roomid) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomid); db.ExecuteSQL("DELETE FROM RoomRights WHERE RoomID = @roomid;"); db.sqlexecute.Parameters.Clear(); } } }