/* 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 ThorServer.Data; using ThorServer.Utilities; namespace ThorServer.Game.Users { public class UserManager { public bool UserExists(string username) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@username", username); int tmpInt = db.getInt("SELECT COUNT(*) FROM Users WHERE Username = @username;"); db.sqlexecute.Parameters.Clear(); return (tmpInt > 0) ? true : false; } public int GetUserID(string username) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@username", username); int userId = db.getInt("SELECT UserID FROM Users WHERE Username = @username;"); db.sqlexecute.Parameters.Clear(); return userId; } public UserInfo GetUser(string username) { return GetUser(GetUserID(username)); } public UserInfo GetUser(int userId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@userid", userId); DataRow dr = db.GetDataSet("SELECT * FROM Users WHERE UserID = @userid;").Tables[0].Rows[0]; db.sqlexecute.Parameters.Clear(); UserInfo tmpUser = new UserInfo(); tmpUser.userId = userId; tmpUser.sUsername = dr["Username"].ToString(); tmpUser.sPassword = dr["Password"].ToString(); tmpUser.sFigure = dr["figure"].ToString(); tmpUser.sSex = dr["sex"].ToString(); tmpUser.sMission = dr["mission"].ToString(); tmpUser.sEmail = dr["email"].ToString(); tmpUser.sDOB = dr["dob"].ToString(); tmpUser.sBadge = dr["CurrentBadge"].ToString(); tmpUser.sPoolFigure = dr["poolfigure"].ToString(); tmpUser.LastIP = dr["LastIP"].ToString(); tmpUser.iCredits = int.Parse(dr["credits"].ToString()); tmpUser.iTickets = int.Parse(dr["tickets"].ToString()); tmpUser.iRole = int.Parse(dr["roleid"].ToString()); tmpUser.ClubDaysRemaining = int.Parse(dr["ClubDaysRemaining"].ToString()); tmpUser.ClubMonthsRemaining = int.Parse(dr["ClubMonthsRemaining"].ToString()); tmpUser.ClubMonthsPassed = int.Parse(dr["ClubMonthsPassed"].ToString()); tmpUser.ClubLastUpdate = (DateTime)dr["ClubLastUpdate"]; tmpUser.LastLogin = (DateTime)dr["LastLogin"]; //Work out habbo club if (tmpUser.ClubLastUpdate < DateTime.Now.AddDays(-1) && tmpUser.iRole == int.Parse(UserSettings.ClubRole)) { TimeSpan span = DateTime.Now.Subtract(tmpUser.ClubLastUpdate); for (int i = 1; i <= span.Days; i++) { tmpUser.ClubDaysRemaining--; if (tmpUser.ClubDaysRemaining <= 0) { tmpUser.ClubDaysRemaining = 0; tmpUser.ClubMonthsPassed++; if (tmpUser.ClubMonthsRemaining > 0) { tmpUser.ClubMonthsRemaining--; tmpUser.ClubDaysRemaining = 31; } } } if (tmpUser.ClubDaysRemaining > 0) { tmpUser.iRole = int.Parse(UserSettings.ClubRole); } else { tmpUser.iRole = int.Parse(UserSettings.DefaultRole); } tmpUser.ClubLastUpdate = DateTime.Now; UpdateUser(tmpUser); } tmpUser.Badges = InstanceManager.Game.Roles.GetBadges(tmpUser.iRole); return tmpUser; } public void LogLogin(UserInfo userinfo) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@userid", userinfo.userId); db.sqlexecute.Parameters.AddWithValue("@lastip", userinfo.LastIP); db.sqlexecute.Parameters.AddWithValue("@lastlogin", userinfo.LastLogin); db.ExecuteSQL("INSERT INTO Logins (UserId, IPAddress, TimeStamp) VALUES (@userid, @lastip, @lastlogin);"); } public void UpdateUser(UserInfo userinfo) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@userid", userinfo.userId); db.sqlexecute.Parameters.AddWithValue("@username", userinfo.sUsername); db.sqlexecute.Parameters.AddWithValue("@password", userinfo.sPassword); db.sqlexecute.Parameters.AddWithValue("@figure", SpecialFiltering.FilterOnlyNumbers(userinfo.sFigure)); db.sqlexecute.Parameters.AddWithValue("@sex", verifyUserSex(userinfo.sSex)); db.sqlexecute.Parameters.AddWithValue("@mission", SpecialFiltering.FilterChars("2,9,10,13", userinfo.sMission)); db.sqlexecute.Parameters.AddWithValue("@poolfigure", userinfo.sPoolFigure); db.sqlexecute.Parameters.AddWithValue("@email", SpecialFiltering.FilterChars("2,9,10,13", userinfo.sEmail)); db.sqlexecute.Parameters.AddWithValue("@dob", SpecialFiltering.FilterChars("2,9,10,13", userinfo.sDOB)); db.sqlexecute.Parameters.AddWithValue("@credits", userinfo.iCredits); db.sqlexecute.Parameters.AddWithValue("@tickets", userinfo.iTickets); db.sqlexecute.Parameters.AddWithValue("@roleid", userinfo.iRole); db.sqlexecute.Parameters.AddWithValue("@clubmonthsremaining", userinfo.ClubMonthsRemaining); db.sqlexecute.Parameters.AddWithValue("@clubmonthspassed", userinfo.ClubMonthsPassed); db.sqlexecute.Parameters.AddWithValue("@clubdaysremaining", userinfo.ClubDaysRemaining); db.sqlexecute.Parameters.AddWithValue("@lastlogin", userinfo.LastLogin); db.sqlexecute.Parameters.AddWithValue("@clublast", userinfo.ClubLastUpdate); db.sqlexecute.Parameters.AddWithValue("@lastip", userinfo.LastIP); db.ExecuteSQL("UPDATE users SET Username = @username, Password = @password, figure = @figure, sex = @sex, mission = @mission, email = @email, dob = @dob, credits = @credits, tickets = @tickets, roleid = @roleid, poolfigure = @poolfigure, LastLogin = @lastlogin, ClubLastUpdate = @clublast, ClubDaysRemaining = @clubdaysremaining, ClubMonthsRemaining = @clubmonthsremaining, ClubMonthsPassed = @clubmonthspassed, LastIP = @lastip WHERE UserID = @userid;"); db.sqlexecute.Parameters.Clear(); } public void SetBadge(int userid, string badge) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@userid", userid); db.sqlexecute.Parameters.AddWithValue("@currentbadge", badge); db.ExecuteSQL("UPDATE users SET CurrentBadge = @currentbadge WHERE UserID = @userid;"); db.sqlexecute.Parameters.Clear(); } public void CreateUser(UserInfo newUser) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@username", SpecialFiltering.FilterName( newUser.sUsername)); db.sqlexecute.Parameters.AddWithValue("@password",newUser.sPassword); db.sqlexecute.Parameters.AddWithValue("@figure", SpecialFiltering.FilterOnlyNumbers(newUser.sFigure)); db.sqlexecute.Parameters.AddWithValue("@sex", verifyUserSex(newUser.sSex)); db.sqlexecute.Parameters.AddWithValue("@mission", SpecialFiltering.FilterChars("2,9,10,13", newUser.sMission)); db.sqlexecute.Parameters.AddWithValue("@poolfigure", newUser.sPoolFigure); db.sqlexecute.Parameters.AddWithValue("@email", SpecialFiltering.FilterChars("2,9,10,13", newUser.sEmail)); db.sqlexecute.Parameters.AddWithValue("@dob", SpecialFiltering.FilterChars("2,9,10,13", newUser.sDOB)); db.sqlexecute.Parameters.AddWithValue("@credits", int.Parse(UserSettings.DefaultCredits)); db.sqlexecute.Parameters.AddWithValue("@tickets", int.Parse(UserSettings.DefaultTickets)); db.sqlexecute.Parameters.AddWithValue("@role", int.Parse(UserSettings.DefaultRole)); db.sqlexecute.Parameters.AddWithValue("@clublast", DateTime.Now); db.sqlexecute.Parameters.AddWithValue("@lastlogin", DateTime.Now); db.sqlexecute.Parameters.AddWithValue("@lastip", newUser.LastIP); db.ExecuteSQL("INSERT INTO users (Username, Password, figure, sex, mission, email, dob, credits, tickets, roleid, poolfigure, ClubLastUpdate, LastLogin, LastIP) " + "VALUES (@username, @password, @figure, @sex, @mission, @email, @dob, @credits, @tickets, @role, @poolfigure, @clublast, @lastlogin, @lastip);"); db.sqlexecute.Parameters.Clear(); } private string verifyUserSex(string sexIn) { switch (sexIn.ToUpper()) { case "M": return sexIn.ToUpper(); case "F": return sexIn.ToUpper(); default: return "M"; } } public byte UserLogin(string username, string password, string ip, ref string banMessage) { if (UserExists(username)) { UserInfo tmpUser = GetUser(username); if (tmpUser.sPassword == password) { if (InstanceManager.Game.Roles.HasRight(tmpUser.iRole, "fuse_login")) { if (InstanceManager.Game.Moderation.ModerationData.IsBanned(tmpUser.userId, ip, ref banMessage)) { return 4; //Banned } else { return 0; //OK } } else { return 3; //Bad permissions } } else { return 2; //Bad Password } } else { return 1; //Bad Username } } public List GetFavouriteRooms(int userId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@userid", userId); DataSet ds = db.GetDataSet("SELECT * FROM FavouriteRooms WHERE UserId = @userid;"); db.sqlexecute.Parameters.Clear(); List results = new List(); if (ds.Tables[0] != null) { if (ds.Tables[0].Rows.Count > 0) { foreach (DataRow dRow in ds.Tables[0].Rows) { results.Add(int.Parse(dRow["RoomID"].ToString())); } } } return results; } public void AddFavouriteRoom(int userId, int roomId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@userid", userId); db.sqlexecute.Parameters.AddWithValue("@roomid", roomId); db.ExecuteSQL("INSERT INTO FavouriteRooms (RoomID, UserId) VALUES (@roomid, @userid);"); db.sqlexecute.Parameters.Clear(); } public void DeleteFavouriteRoom(int userId, int roomId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@userid", userId); db.sqlexecute.Parameters.AddWithValue("@roomid", roomId); db.ExecuteSQL("DELETE FROM FavouriteRooms WHERE UserId = @userid AND RoomID = @roomid;"); db.sqlexecute.Parameters.Clear(); } } }