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); }
}
}