/*
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.Game.Users;
using ThorServer.Utilities;
using ThorServer.Session;
namespace ThorServer.Game.Messenger
{
public class MessengerManager
{
public List GetBuddyList(int userId)
{
Database db = new Database();
db.sqlexecute.Parameters.AddWithValue("@userid", userId);
int count = db.getInt("SELECT COUNT(*) FROM MessengerBuddies WHERE (User1 = @userid OR User2 = @userid) AND Accepted = 1 AND @userid IN (SELECT UserID From Users);");
if (count > 0)
{
List result = new List();
DataTable dt = db.GetDataSet("SELECT * FROM MessengerBuddies WHERE (User1 = @userid OR User2 = @userid) AND Accepted = 1 AND @userid IN (SELECT UserID From Users);").Tables[0];
foreach (DataRow dRow in dt.Rows)
{
result.Add(new MessengerBuddy((int)dRow["User1"], (int)dRow["User2"], (bool)dRow["Accepted"]));
}
return result;
}
return null;
}
public List GetRequests(int userId)
{
Database db = new Database();
db.sqlexecute.Parameters.AddWithValue("@userid", userId);
int count = db.getInt("SELECT COUNT(*) FROM MessengerBuddies WHERE User2 = @userid AND Accepted = 0 AND @userid IN (SELECT UserID From Users);");
if (count > 0)
{
List result = new List();
DataTable dt = db.GetDataSet("SELECT * FROM MessengerBuddies WHERE (User1 = @userid OR User2 = @userid) AND Accepted = 0 AND @userid IN (SELECT UserID From Users);").Tables[0];
foreach (DataRow dRow in dt.Rows)
{
result.Add(new MessengerBuddy((int)dRow["User1"], (int)dRow["User2"], (bool)dRow["Accepted"]));
}
return result;
}
return null;
}
public MessengerBuddy GetBuddy(int myid, int userId)
{
Database db = new Database();
db.sqlexecute.Parameters.AddWithValue("@myid", myid);
db.sqlexecute.Parameters.AddWithValue("@userid", userId);
int count = db.getInt("SELECT COUNT(*) FROM MessengerBuddies WHERE (User1 = @userid OR User2 = @userid) AND (User1 = @myid OR User2 = @myid) AND Accepted = 1 AND @userid IN (SELECT UserID From Users);");
if (count > 0)
{
List result = new List();
DataRow dRow = db.GetDataSet("SELECT * FROM MessengerBuddies WHERE (User1 = @userid OR User2 = @userid) AND (User1 = @myid OR User2 = @myid) AND Accepted = 1 AND @userid IN (SELECT UserID From Users);").Tables[0].Rows[0];
return (new MessengerBuddy((int)dRow["User1"], (int)dRow["User2"], (bool)dRow["Accepted"]));
}
return null;
}
public void AddBuddy(int myid, int userid)
{
Database db = new Database();
db.sqlexecute.Parameters.AddWithValue("@myid", myid);
db.sqlexecute.Parameters.AddWithValue("@userid", userid);
db.ExecuteSQL("INSERT INTO MessengerBuddies (User1, User2, Accepted) VALUES (@myid, @userid, 0);");
db.sqlexecute.Parameters.Clear();
}
public void RejectBuddy(int myid, int userid)
{
Database db = new Database();
db.sqlexecute.Parameters.AddWithValue("@myid", myid);
db.sqlexecute.Parameters.AddWithValue("@userid", userid);
db.ExecuteSQL("DELETE FROM MessengerBuddies WHERE User1 = @userid AND User2 = @myid AND Accepted = 0;");
db.sqlexecute.Parameters.Clear();
}
public void AcceptBuddy(int myid, int userid)
{
Database db = new Database();
db.sqlexecute.Parameters.AddWithValue("@myid", myid);
db.sqlexecute.Parameters.AddWithValue("@userid", userid);
db.ExecuteSQL("UPDATE MessengerBuddies SET Accepted = 1 WHERE User1 = @userid AND User2 = @myid;");
db.sqlexecute.Parameters.Clear();
}
public void RejectAllBuddys(int myid)
{
Database db = new Database();
db.sqlexecute.Parameters.AddWithValue("@myid", myid);
db.ExecuteSQL("DELETE FROM MessengerBuddies WHERE User2 = @myid AND Accepted = 0;");
db.sqlexecute.Parameters.Clear();
}
public void DeleteBuddy(int myid, int userId)
{
Database db = new Database();
db.sqlexecute.Parameters.AddWithValue("@userid", userId);
db.sqlexecute.Parameters.AddWithValue("@myid", myid);
db.ExecuteSQL("DELETE FROM MessengerBuddies WHERE (User1 = @userid AND User2 = @myid) OR (User1 = @myid AND User2 = @userid) ");
db.sqlexecute.Parameters.Clear();
}
public string BuildSearchResponse(string username)
{
ClientMessage mMessage = new ClientMessage();
mMessage.Init(128); //B@
mMessage.appendString("MESSENGER");
mMessage.appendChar(2);
if (InstanceManager.Game.Users.UserExists(username))
{
UserInfo user = InstanceManager.Game.Users.GetUser(username);
mMessage.appendArgumentInt(user.userId);
mMessage.appendString(user.sUsername);
mMessage.appendChar(2);
SessionHandler sess = InstanceManager.Sessions.GetSession(InstanceManager.Sessions.GetSessionFromUser(user.userId));
if (user.sSex == "M") mMessage.appendArgumentInt(1);
if (user.sSex == "F") mMessage.appendArgumentInt(0);
if (sess != null)
{
mMessage.appendChar(2);
mMessage.appendArgumentInt(1);
mMessage.appendString("Online");
mMessage.appendChar(2);
}
else
{
mMessage.appendChar(2);
mMessage.appendArgumentInt(0);
mMessage.appendString(InstanceManager.Game.Externals.GetTextValue("BuddyNotHere"));
mMessage.appendChar(2);
}
mMessage.appendString(user.LastLogin.ToString("dd-MM-yyyy HH:mm:ss"));
mMessage.appendChar(2);
mMessage.appendString(user.sFigure);
mMessage.appendChar(2);
}
else
{
mMessage.appendArgumentInt(0);
}
return mMessage.ToString();
}
public string BuildBuddyList(int userId)
{
List buddies = GetBuddyList(userId);
StringBuilder sb = new StringBuilder();
if (buddies != null)
{
foreach (MessengerBuddy buddy in buddies)
{
UserInfo buddyUser = buddy.User1Info;
if (buddyUser.userId == userId) buddyUser = buddy.User2Info;
sb.Append(BuildMessengerBuddyResponse(buddyUser));
}
return sb.ToString();
}
return null;
}
public string BuildMessengerBuddyResponse(UserInfo buddyUser)
{
ClientMessage mMessage = new ClientMessage();
SessionHandler sess = InstanceManager.Sessions.GetSession(InstanceManager.Sessions.GetSessionFromUser(buddyUser.userId));
mMessage.Init(137); //BI
mMessage.appendArgumentInt(buddyUser.userId);
mMessage.appendString(buddyUser.sUsername);
mMessage.appendChar(2);
mMessage.appendString(buddyUser.MessengerStatus);
mMessage.appendChar(2);
if (sess != null)
{
mMessage.appendArgumentInt(1);
if (sess.mRoomID == 0)
{
mMessage.appendString(InstanceManager.Game.Externals.GetTextValue("BuddyEntry"));
}
else
{
mMessage.appendString(InstanceManager.Game.Rooms.GetRoom(sess.mRoomID).RoomName);
}
mMessage.appendChar(2);
}
else
{
mMessage.appendArgumentInt(0);
mMessage.appendChar(2);
mMessage.appendString(buddyUser.LastLogin.ToString("dd-MM-yyyy HH:mm:ss"));
mMessage.appendChar(2);
}
return mMessage.ToString();
}
public class MessengerBuddy
{
public MessengerBuddy(int user1, int user2, bool accepted)
{
User1 = user1;
User2 = user2;
Accepted = accepted;
User1Info = InstanceManager.Game.Users.GetUser(User1);
User2Info = InstanceManager.Game.Users.GetUser(User2);
}
public int User1;
public int User2;
public bool Accepted;
public UserInfo User1Info;
public UserInfo User2Info;
}
}
}