From b17e6de43e6ea066bcfe3ab513a72c7be83a22f2 Mon Sep 17 00:00:00 2001 From: Date: Sat, 28 Jul 2007 19:41:34 +0000 Subject: [PATCH] FriendsManager.cs: * Renamed List GetFriendsList to FriendsList * Added List PendingOffers * Changed OnFriendshipOffered from a bool to a void * Added .AcceptFriendship() and .DeclineFriendship() git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@1334 52acb1d6-8a22-11de-b505-999d5b087335 --- libsecondlife/FriendsManager.cs | 97 +++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 34 deletions(-) diff --git a/libsecondlife/FriendsManager.cs b/libsecondlife/FriendsManager.cs index 4e1af727..2271ed2e 100644 --- a/libsecondlife/FriendsManager.cs +++ b/libsecondlife/FriendsManager.cs @@ -250,7 +250,7 @@ namespace libsecondlife /// full name of the agent offereing friendship /// session ID need when accepting/declining the offer /// Return true to accept the friendship, false to deny it - public delegate bool FriendshipOfferedEvent(LLUUID agentID, string agentName, LLUUID imSessionID); + public delegate void FriendshipOfferedEvent(LLUUID agentID, string agentName, LLUUID imSessionID); /// /// Trigger when your friendship offer has been excepted @@ -269,6 +269,7 @@ namespace libsecondlife private SecondLife Client; private Dictionary _Friends = new Dictionary(); + private Dictionary _Requests = new Dictionary(); /// /// This constructor is intened to for use only the the libsecondlife framework @@ -296,7 +297,7 @@ namespace libsecondlife /// in FriendsManager. Avoid calling it multiple times when it is not /// necessary to as it can be expensive memory-wise /// - public List GetFriendsList() + public List FriendsList() { List friends = new List(); @@ -309,6 +310,62 @@ namespace libsecondlife return friends; } + /// + /// Dictionary of unanswered friendship offers + /// + public Dictionary PendingOffers() + { + Dictionary requests = new Dictionary(); + + lock (_Requests) + { + foreach(KeyValuePair req in _Requests) + requests.Add(req.Key, req.Value); + } + + return requests; + } + + /// + /// Accept a friendship request + /// + /// imSessionID of the friendship request message + public void AcceptFriendship(LLUUID fromAgentID, LLUUID imSessionID) + { + LLUUID callingCardFolder = Client.Inventory.FindFolderForType(AssetType.CallingCard); + + AcceptFriendshipPacket request = new AcceptFriendshipPacket(); + request.AgentData.AgentID = Client.Network.AgentID; + request.AgentData.SessionID = Client.Network.SessionID; + request.TransactionBlock.TransactionID = imSessionID; + request.FolderData = new AcceptFriendshipPacket.FolderDataBlock[1]; + request.FolderData[0] = new AcceptFriendshipPacket.FolderDataBlock(); + request.FolderData[0].FolderID = callingCardFolder; + + Client.Network.SendPacket(request); + + FriendInfo friend = new FriendInfo(fromAgentID, RightsFlags.CanSeeOnline, + RightsFlags.CanSeeOnline); + lock (_Friends) _Friends.Add(friend.UUID, friend); + lock (_Requests) { if (_Requests.ContainsKey(fromAgentID)) _Requests.Remove(fromAgentID); } + + Client.Avatars.RequestAvatarName(fromAgentID); + } + + /// + /// Decline a friendship request + /// + /// imSessionID of the friendship request message + public void DeclineFriendship(LLUUID fromAgentID, LLUUID imSessionID) + { + DeclineFriendshipPacket request = new DeclineFriendshipPacket(); + request.AgentData.AgentID = Client.Network.AgentID; + request.AgentData.SessionID = Client.Network.SessionID; + request.TransactionBlock.TransactionID = imSessionID; + Client.Network.SendPacket(request); + + lock (_Requests) { if (_Requests.ContainsKey(fromAgentID)) _Requests.Remove(fromAgentID); } + } /// /// Offer friendship to an avatar. @@ -580,40 +637,12 @@ namespace libsecondlife { if (OnFriendshipOffered != null) { - try + lock (_Requests) { - if (OnFriendshipOffered(fromAgentID, fromAgentName, imSessionID)) - { - // Accept the offer - LLUUID callingCardFolder = Client.Inventory.FindFolderForType(AssetType.CallingCard); - - AcceptFriendshipPacket request = new AcceptFriendshipPacket(); - request.AgentData.AgentID = Client.Network.AgentID; - request.AgentData.SessionID = Client.Network.SessionID; - request.TransactionBlock.TransactionID = imSessionID; - request.FolderData = new AcceptFriendshipPacket.FolderDataBlock[1]; - request.FolderData[0] = new AcceptFriendshipPacket.FolderDataBlock(); - request.FolderData[0].FolderID = callingCardFolder; - - Client.Network.SendPacket(request); - - FriendInfo friend = new FriendInfo(fromAgentID, RightsFlags.CanSeeOnline, - RightsFlags.CanSeeOnline); - lock (_Friends) _Friends.Add(friend.UUID, friend); - - Client.Avatars.RequestAvatarName(fromAgentID); - } - else - { - // Decline the offer - DeclineFriendshipPacket request = new DeclineFriendshipPacket(); - request.AgentData.AgentID = Client.Network.AgentID; - request.AgentData.SessionID = Client.Network.SessionID; - request.TransactionBlock.TransactionID = imSessionID; - - Client.Network.SendPacket(request); - } + if (_Requests.ContainsKey(fromAgentID)) _Requests[fromAgentID] = imSessionID; + else _Requests.Add(fromAgentID, imSessionID); } + try { OnFriendshipOffered(fromAgentID, fromAgentName, imSessionID); } catch (Exception e) { Client.Log(e.ToString(), Helpers.LogLevel.Error); } } }