diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs | 124 |
1 files changed, 117 insertions, 7 deletions
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs index 0be540d..c51bcc1 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs | |||
@@ -48,6 +48,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
48 | private Dictionary<UUID, ulong> m_rootAgents = new Dictionary<UUID, ulong>(); | 48 | private Dictionary<UUID, ulong> m_rootAgents = new Dictionary<UUID, ulong>(); |
49 | private Dictionary<UUID, List<StoredFriendListUpdate>> StoredFriendListUpdates = new Dictionary<UUID, List<StoredFriendListUpdate>>(); | 49 | private Dictionary<UUID, List<StoredFriendListUpdate>> StoredFriendListUpdates = new Dictionary<UUID, List<StoredFriendListUpdate>>(); |
50 | 50 | ||
51 | private Dictionary<UUID, UUID> m_pendingCallingcardRequests = new Dictionary<UUID,UUID>(); | ||
52 | |||
51 | private List<Scene> m_scene = new List<Scene>(); | 53 | private List<Scene> m_scene = new List<Scene>(); |
52 | 54 | ||
53 | #region IRegionModule Members | 55 | #region IRegionModule Members |
@@ -109,7 +111,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
109 | 111 | ||
110 | UUID.TryParse((string)requestData["agent_id"], out notifyAboutAgentId); | 112 | UUID.TryParse((string)requestData["agent_id"], out notifyAboutAgentId); |
111 | m_log.InfoFormat("[PRESENCE]: Got presence update for {0}, and we're telling {1}, with a status {2}", notifyAboutAgentId.ToString(), notifyAgentId.ToString(), notifyOnlineStatus.ToString()); | 113 | m_log.InfoFormat("[PRESENCE]: Got presence update for {0}, and we're telling {1}, with a status {2}", notifyAboutAgentId.ToString(), notifyAgentId.ToString(), notifyOnlineStatus.ToString()); |
112 | ScenePresence avatar = GetPresenceFromAgentID(notifyAgentId); | 114 | ScenePresence avatar = GetRootPresenceFromAgentID(notifyAgentId); |
113 | if (avatar != null) | 115 | if (avatar != null) |
114 | { | 116 | { |
115 | if (avatar.IsChildAgent) | 117 | if (avatar.IsChildAgent) |
@@ -184,6 +186,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
184 | client.OnApproveFriendRequest += OnApprovedFriendRequest; | 186 | client.OnApproveFriendRequest += OnApprovedFriendRequest; |
185 | client.OnDenyFriendRequest += OnDenyFriendRequest; | 187 | client.OnDenyFriendRequest += OnDenyFriendRequest; |
186 | client.OnTerminateFriendship += OnTerminateFriendship; | 188 | client.OnTerminateFriendship += OnTerminateFriendship; |
189 | client.OnOfferCallingCard += OnOfferCallingCard; | ||
190 | client.OnAcceptCallingCard += OnAcceptCallingCard; | ||
191 | client.OnDeclineCallingCard += OnDeclineCallingCard; | ||
187 | 192 | ||
188 | doFriendListUpdateOnline(client.AgentId); | 193 | doFriendListUpdateOnline(client.AgentId); |
189 | 194 | ||
@@ -228,7 +233,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
228 | } | 233 | } |
229 | foreach (UUID user in UpdateUsers) | 234 | foreach (UUID user in UpdateUsers) |
230 | { | 235 | { |
231 | ScenePresence av = GetPresenceFromAgentID(user); | 236 | ScenePresence av = GetRootPresenceFromAgentID(user); |
232 | if (av != null) | 237 | if (av != null) |
233 | { | 238 | { |
234 | List<FriendListItem> usrfl = new List<FriendListItem>(); | 239 | List<FriendListItem> usrfl = new List<FriendListItem>(); |
@@ -257,7 +262,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
257 | 262 | ||
258 | if (UpdateUsers.Count > 0) | 263 | if (UpdateUsers.Count > 0) |
259 | { | 264 | { |
260 | ScenePresence avatar = GetPresenceFromAgentID(AgentId); | 265 | ScenePresence avatar = GetRootPresenceFromAgentID(AgentId); |
261 | if (avatar != null) | 266 | if (avatar != null) |
262 | { | 267 | { |
263 | avatar.ControllingClient.SendAgentOnline(UpdateUsers.ToArray()); | 268 | avatar.ControllingClient.SendAgentOnline(UpdateUsers.ToArray()); |
@@ -349,7 +354,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
349 | 354 | ||
350 | for (int i = 0; i < updateUsers.Count; i++) | 355 | for (int i = 0; i < updateUsers.Count; i++) |
351 | { | 356 | { |
352 | ScenePresence av = GetPresenceFromAgentID(updateUsers[i]); | 357 | ScenePresence av = GetRootPresenceFromAgentID(updateUsers[i]); |
353 | if (av != null) | 358 | if (av != null) |
354 | { | 359 | { |
355 | UUID[] agents = new UUID[1]; | 360 | UUID[] agents = new UUID[1]; |
@@ -427,7 +432,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
427 | } | 432 | } |
428 | } | 433 | } |
429 | 434 | ||
430 | private ScenePresence GetPresenceFromAgentID(UUID AgentID) | 435 | private ScenePresence GetRootPresenceFromAgentID(UUID AgentID) |
431 | { | 436 | { |
432 | ScenePresence returnAgent = null; | 437 | ScenePresence returnAgent = null; |
433 | lock (m_scene) | 438 | lock (m_scene) |
@@ -449,6 +454,25 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
449 | return returnAgent; | 454 | return returnAgent; |
450 | } | 455 | } |
451 | 456 | ||
457 | private ScenePresence GetAnyPresenceFromAgentID(UUID AgentID) | ||
458 | { | ||
459 | ScenePresence returnAgent = null; | ||
460 | lock (m_scene) | ||
461 | { | ||
462 | ScenePresence queryagent = null; | ||
463 | for (int i = 0; i < m_scene.Count; i++) | ||
464 | { | ||
465 | queryagent = m_scene[i].GetScenePresence(AgentID); | ||
466 | if (queryagent != null) | ||
467 | { | ||
468 | returnAgent = queryagent; | ||
469 | break; | ||
470 | } | ||
471 | } | ||
472 | } | ||
473 | return returnAgent; | ||
474 | } | ||
475 | |||
452 | #region FriendRequestHandling | 476 | #region FriendRequestHandling |
453 | 477 | ||
454 | private void OnInstantMessage(IClientAPI client, UUID fromAgentID, | 478 | private void OnInstantMessage(IClientAPI client, UUID fromAgentID, |
@@ -520,7 +544,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
520 | Scene SceneAgentIn = m_scene[0]; | 544 | Scene SceneAgentIn = m_scene[0]; |
521 | 545 | ||
522 | // Found Pending Friend Request with that Transaction.. | 546 | // Found Pending Friend Request with that Transaction.. |
523 | ScenePresence agentpresence = GetPresenceFromAgentID(agentID); | 547 | ScenePresence agentpresence = GetRootPresenceFromAgentID(agentID); |
524 | if (agentpresence != null) | 548 | if (agentpresence != null) |
525 | { | 549 | { |
526 | SceneAgentIn = agentpresence.Scene; | 550 | SceneAgentIn = agentpresence.Scene; |
@@ -564,7 +588,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
564 | Scene SceneAgentIn = m_scene[0]; | 588 | Scene SceneAgentIn = m_scene[0]; |
565 | 589 | ||
566 | // Found Pending Friend Request with that Transaction.. | 590 | // Found Pending Friend Request with that Transaction.. |
567 | ScenePresence agentpresence = GetPresenceFromAgentID(agentID); | 591 | ScenePresence agentpresence = GetRootPresenceFromAgentID(agentID); |
568 | if (agentpresence != null) | 592 | if (agentpresence != null) |
569 | { | 593 | { |
570 | SceneAgentIn = agentpresence.Scene; | 594 | SceneAgentIn = agentpresence.Scene; |
@@ -607,8 +631,94 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends | |||
607 | } | 631 | } |
608 | 632 | ||
609 | #endregion | 633 | #endregion |
634 | |||
635 | #region CallingCards | ||
636 | |||
637 | private void OnOfferCallingCard(IClientAPI client, UUID destID, UUID transactionID) | ||
638 | { | ||
639 | m_log.DebugFormat("[CALLING CARD]: got offer from {0} for {1}, transaction {2}", | ||
640 | client.AgentId, destID, transactionID); | ||
641 | // This might be slightly wrong. On a multi-region server, we might get the child-agent instead of the root-agent | ||
642 | // (or the root instead of the child) | ||
643 | ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); | ||
644 | if (destAgent == null) | ||
645 | { | ||
646 | client.SendAlertMessage("The person you have offered a card to can't be found anymore."); | ||
647 | return; | ||
648 | } | ||
649 | |||
650 | m_pendingCallingcardRequests[transactionID] = client.AgentId; | ||
651 | // inform the destination agent about the offer | ||
652 | destAgent.ControllingClient.SendOfferCallingCard(client.AgentId, transactionID); | ||
653 | } | ||
654 | |||
655 | private void CreateCallingCard(IClientAPI client, UUID creator, UUID folder, string name) | ||
656 | { | ||
657 | InventoryItemBase item = new InventoryItemBase(); | ||
658 | item.AssetID = UUID.Zero; | ||
659 | item.AssetType = (int)AssetType.CallingCard; | ||
660 | item.BasePermissions = (uint)PermissionMask.Copy; | ||
661 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
662 | item.Creator = creator; | ||
663 | item.CurrentPermissions = item.BasePermissions; | ||
664 | item.Description = ""; | ||
665 | item.EveryOnePermissions = (uint)PermissionMask.None; | ||
666 | item.Flags = 0; | ||
667 | item.Folder = folder; | ||
668 | item.GroupID = UUID.Zero; | ||
669 | item.GroupOwned = false; | ||
670 | item.ID = UUID.Random(); | ||
671 | item.InvType = (int)InventoryType.CallingCard; | ||
672 | item.Name = name; | ||
673 | item.NextPermissions = item.EveryOnePermissions; | ||
674 | item.Owner = client.AgentId; | ||
675 | item.SalePrice = 10; | ||
676 | item.SaleType = (byte)SaleType.Not; | ||
677 | ((Scene)client.Scene).AddInventoryItem(client, item); | ||
678 | } | ||
679 | |||
680 | private void OnAcceptCallingCard(IClientAPI client, UUID transactionID, UUID folderID) | ||
681 | { | ||
682 | m_log.DebugFormat("[CALLING CARD]: User {0} ({1} {2}) accepted tid {3}, folder {4}", | ||
683 | client.AgentId, | ||
684 | client.FirstName, client.LastName, | ||
685 | transactionID, folderID); | ||
686 | UUID destID; | ||
687 | if (m_pendingCallingcardRequests.TryGetValue(transactionID, out destID)) | ||
688 | { | ||
689 | m_pendingCallingcardRequests.Remove(transactionID); | ||
690 | |||
691 | ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); | ||
692 | // inform sender of the card that destination declined the offer | ||
693 | if (destAgent != null) destAgent.ControllingClient.SendAcceptCallingCard(transactionID); | ||
694 | |||
695 | // put a calling card into the inventory of receiver | ||
696 | CreateCallingCard(client, destID, folderID, destAgent.Name); | ||
697 | } | ||
698 | else m_log.WarnFormat("[CALLING CARD]: Got a AcceptCallingCard from {0} {1} without an offer before.", | ||
699 | client.FirstName, client.LastName); | ||
700 | } | ||
701 | |||
702 | private void OnDeclineCallingCard(IClientAPI client, UUID transactionID) | ||
703 | { | ||
704 | m_log.DebugFormat("[CALLING CARD]: User {0} declined card, tid {2}", | ||
705 | client.AgentId, transactionID); | ||
706 | UUID destID; | ||
707 | if (m_pendingCallingcardRequests.TryGetValue(transactionID, out destID)) | ||
708 | { | ||
709 | m_pendingCallingcardRequests.Remove(transactionID); | ||
710 | |||
711 | ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); | ||
712 | // inform sender of the card that destination declined the offer | ||
713 | if (destAgent != null) destAgent.ControllingClient.SendDeclineCallingCard(transactionID); | ||
714 | } | ||
715 | else m_log.WarnFormat("[CALLING CARD]: Got a DeclineCallingCard from {0} {1} without an offer before.", | ||
716 | client.FirstName, client.LastName); | ||
717 | } | ||
610 | } | 718 | } |
611 | 719 | ||
720 | #endregion | ||
721 | |||
612 | public struct StoredFriendListUpdate | 722 | public struct StoredFriendListUpdate |
613 | { | 723 | { |
614 | public UUID storedFor; | 724 | public UUID storedFor; |