using System;
using System.Data;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using Holo.Managers;
using Holo.Virtual;
using Holo.Virtual.Users;
using Holo.Virtual.Rooms;
using Ion.Storage;
namespace Holo.Virtual.Users.Messenger
{
///
/// Represents the messenger for a virtual user, which provides keeping buddy lists, instant messaging, inviting friends to a user's virtual room and various other features. The virtual messenger object provides voids for updating status of friends, instant messaging and more.
///
class virtualMessenger
{
#region Declares
///
/// The database ID of the parent virtual user.
///
private int userID;
private Hashtable Buddies;
#endregion
#region Constructors/destructors
///
/// Initializes the virtual messenger for the parent virtual user, generating friendlist, friendrequests etc.
///
/// The database ID of the parent virtual user.
internal virtualMessenger(int userID)
{
this.userID = userID;
this.Buddies = new Hashtable();
}
internal string friendList()
{
DataTable TagetUsers;
using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient())
{
TagetUsers = dbClient.getTable("SELECT u.name as user_name , f.name as friend_name FROM messenger_friendships INNER JOIN users AS u ON u.id = userid INNER JOIN users AS f ON f.id = friendid WHERE '" + userID + "' = friendid UNION ALL SELECT u.name as user_name , f.name as friend_name FROM messenger_friendships INNER JOIN users AS u ON u.id = userid INNER JOIN users AS f ON f.id = friendid WHERE " + userID + " = userid");
}
//Out.WriteLine(TagetUsers.Rows.Count.ToString());
//int[] userIDs = userManager.getUserFriendIDs(userID);
StringBuilder Buddylist = new StringBuilder(Encoding.encodeVL64(200) + Encoding.encodeVL64(200) + Encoding.encodeVL64(600) + "H" + Encoding.encodeVL64(TagetUsers.Rows.Count));
virtualBuddy Me = new virtualBuddy(userID);
DataRow dRow;
foreach (DataRow TargetUserNames in TagetUsers.Rows)
{
int _ID = 0;
using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient())
{
_ID = dbClient.getInt("SELECT id FROM users WHERE name = '" + TargetUserNames["user_name"] + "'");
}
if (_ID != userID && _ID > 0)
{
//Out.WriteLine(_ID.ToString());
virtualBuddy Buddy = new virtualBuddy(_ID);
try
{
if (Buddy.Online)
{
userManager.getUser(_ID).Messenger.addBuddy(Me, true);
}
}
catch { }
if (Buddies.Contains(_ID) == false)
Buddies.Add(_ID, Buddy);
using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient())
{
dRow = dbClient.getRow("SELECT lastvisit,mission FROM users WHERE id = " + _ID + " LIMIT 1");
}
Buddylist.Append(Buddy.ToString(true));
Buddylist.Append(Convert.ToString(dRow[1]) + Convert.ToChar(2));
Buddylist.Append(Convert.ToString(dRow[0]));
Buddylist.Append(Convert.ToChar(2));
}
}
Buddylist.Append(Encoding.encodeVL64(100) + "H");
return Buddylist.ToString();
}
internal string friendRequests()
{
DataColumn dCol;
using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient())
{
dCol = dbClient.getColumn("SELECT userid_from,requestid FROM messenger_friendrequests WHERE userid_to = '" + this.userID + "' ORDER by requestid ASC");
}
StringBuilder Requests = new StringBuilder(Encoding.encodeVL64(dCol.Table.Rows.Count) + Encoding.encodeVL64(dCol.Table.Rows.Count));
if (dCol.Table.Rows.Count > 0)
{
int i = 0;
foreach (DataRow dRow in dCol.Table.Rows)
{
using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient())
{
Requests.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["requestid"])) + dbClient.getString("SELECT name FROM users WHERE id = '" + Convert.ToString(dRow["userid_from"]) + "'") + Convert.ToChar(2) + Convert.ToString(dRow["userid_from"]) + Convert.ToChar(2));
}
i++;
}
}
return Requests.ToString();
}
internal void Clear()
{
foreach (virtualMessenger EndUser in Buddies)
{
EndUser.removeBuddy(this.userID);
}
Buddies.Clear();
this.userID = 0;
}
internal void addBuddy(virtualBuddy Buddy, bool Update)
{
if (Buddies.ContainsKey(Buddy.userID) == false)
Buddies.Add(Buddy.userID, Buddy);
if (Update)
User.sendData("@MHII" + Buddy.ToString(true));
}
///
/// Deletes a buddy from the friendlist and virtual messenger of this user, but leaves the database row untouched.
///
/// The database ID of the buddy to delete from the friendlist.
internal void removeBuddy(int ID)
{
User.sendData("@MHI" + "M" + Encoding.encodeVL64(ID));
if (Buddies.Contains(ID))
Buddies.Remove(ID);
}
#region does not need update!!!
internal string getUpdates()
{
int i = 0;
StringBuilder builder = new StringBuilder();
try
{
foreach (virtualBuddy buddy in Buddies.Values)
{
if (buddy.Updated)
{
i++;
builder.Append("H" + buddy.ToString(false));
//Out.WriteLine(buddy.ToString(false));
}
}
return ("H" + Encoding.encodeVL64(i) + builder.ToString());
}
catch
{
return "HH";
}
}
#endregion
#endregion
///
/// Returns a boolean that indicates if the messenger contains a certain buddy, and this buddy is online.
///
/// The database ID of the buddy to check.
internal bool containsOnlineBuddy(int userID)
{
if (Buddies.ContainsKey(userID) == false)
return false;
else
return userManager.containsUser(userID);
}
///
/// Returns a bool that indicates if there is a friendship between the parent virtual user and a certain user.
///
/// The database ID of the user to check.
internal bool hasFriendship(int userID)
{
return Buddies.ContainsKey(userID);
}
///
/// Returns a bool that indicates if there are friend requests hinth and forth between the the parent virtual user and a certain user.
///
/// The database ID of the user to check.
internal bool hasFriendRequests(int userID)
{
using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient())
{
return dbClient.findsResult("SELECT requestid FROM messenger_friendrequests WHERE (userid_to = '" + this.userID + "' AND userid_from = '" + userID + "') OR (userid_to = '" + userID + "' AND userid_from = '" + this.userID + "')");
}
}
#region Object management
///
/// Returns the parent virtual user instance of this virtual messenger.
///
internal virtualUser User
{
get
{
return userManager.getUser(this.userID);
}
}
#endregion
}
}