From 1ee10d919aae59e8b97b7f24dff14a16cb50e8df Mon Sep 17 00:00:00 2001 From: Homer Horwitz Date: Sun, 19 Oct 2008 16:49:10 +0000 Subject: Added calling cards. Fixes Mantis#2409 and part of #1515. --- OpenSim/Framework/IClientAPI.cs | 13 ++- .../Region/ClientStack/LindenUDP/LLClientView.cs | 68 +++++++++++ .../Modules/Avatar/Friends/FriendsModule.cs | 124 +++++++++++++++++++-- .../Environment/Modules/World/NPC/NPCAvatar.cs | 16 +++ .../Region/Examples/SimpleModule/MyNpcCharacter.cs | 16 +++ 5 files changed, 229 insertions(+), 8 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 0bb790c..bf31a78 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -324,6 +324,10 @@ namespace OpenSim.Framework public delegate void MapItemRequest(IClientAPI remoteClient, uint flags, uint EstateID, bool godlike, uint itemtype, ulong regionhandle); + public delegate void OfferCallingCard(IClientAPI remoteClient, UUID destID, UUID transactionID); + public delegate void AcceptCallingCard(IClientAPI remoteClient, UUID transactionID, UUID folderID); + public delegate void DeclineCallingCard(IClientAPI remoteClient, UUID transactionID); + #endregion public struct DirPlacesReplyData @@ -625,6 +629,9 @@ namespace OpenSim.Framework event MapItemRequest OnMapItemRequest; + event OfferCallingCard OnOfferCallingCard; + event AcceptCallingCard OnAcceptCallingCard; + event DeclineCallingCard OnDeclineCallingCard; // void ActivateGesture(UUID assetId, UUID gestureId); @@ -894,7 +901,11 @@ namespace OpenSim.Framework void SendEventInfoReply(EventData info); void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags); - + + void SendOfferCallingCard(UUID srcID, UUID transactionID); + void SendAcceptCallingCard(UUID transactionID); + void SendDeclineCallingCard(UUID transactionID); + void KillEndDone(); } } diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 412f969..19983dc 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -1009,6 +1009,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event MapItemRequest OnMapItemRequest; + public event OfferCallingCard OnOfferCallingCard; + public event AcceptCallingCard OnAcceptCallingCard; + public event DeclineCallingCard OnDeclineCallingCard; + // voire si c'est necessaire public void ActivateGesture(UUID assetId, UUID gestureId) { @@ -6447,6 +6451,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime); } break; + + case PacketType.OfferCallingCard: + OfferCallingCardPacket offerCallingCardPacket = (OfferCallingCardPacket)Pack; + if (OnOfferCallingCard != null) + { + OnOfferCallingCard(this, + offerCallingCardPacket.AgentBlock.DestID, + offerCallingCardPacket.AgentBlock.TransactionID); + } + break; + + case PacketType.AcceptCallingCard: + AcceptCallingCardPacket acceptCallingCardPacket = (AcceptCallingCardPacket)Pack; + // according to http://wiki.secondlife.com/wiki/AcceptCallingCard FolderData should + // contain exactly one entry + if (OnAcceptCallingCard != null && acceptCallingCardPacket.FolderData.Length > 0) + { + OnAcceptCallingCard(this, + acceptCallingCardPacket.TransactionBlock.TransactionID, + acceptCallingCardPacket.FolderData[0].FolderID); + } + break; + + case PacketType.DeclineCallingCard: + DeclineCallingCardPacket declineCallingCardPacket = (DeclineCallingCardPacket)Pack; + if (OnDeclineCallingCard != null) + { + OnDeclineCallingCard(this, + declineCallingCardPacket.TransactionBlock.TransactionID); + } + break; + default: m_log.Warn("[CLIENT]: unhandled packet " + Pack.ToString()); break; @@ -7161,6 +7197,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP } + public void SendOfferCallingCard(UUID srcID, UUID transactionID) + { + // a bit special, as this uses AgentID to store the source instead + // of the destination. The destination (the receiver) goes into destID + OfferCallingCardPacket p = (OfferCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.OfferCallingCard); + p.AgentData.AgentID = srcID; + p.AgentData.SessionID = UUID.Zero; + p.AgentBlock.DestID = AgentId; + p.AgentBlock.TransactionID = transactionID; + OutPacket(p, ThrottleOutPacketType.Task); + } + + public void SendAcceptCallingCard(UUID transactionID) + { + AcceptCallingCardPacket p = (AcceptCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.AcceptCallingCard); + p.AgentData.AgentID = AgentId; + p.AgentData.SessionID = UUID.Zero; + p.FolderData = new AcceptCallingCardPacket.FolderDataBlock[1]; + p.FolderData[0] = new AcceptCallingCardPacket.FolderDataBlock(); + p.FolderData[0].FolderID = UUID.Zero; + OutPacket(p, ThrottleOutPacketType.Task); + } + + public void SendDeclineCallingCard(UUID transactionID) + { + DeclineCallingCardPacket p = (DeclineCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.DeclineCallingCard); + p.AgentData.AgentID = AgentId; + p.AgentData.SessionID = UUID.Zero; + p.TransactionBlock.TransactionID = transactionID; + OutPacket(p, ThrottleOutPacketType.Task); + } + public void KillEndDone() { KillPacket kp = new KillPacket(); 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 private Dictionary m_rootAgents = new Dictionary(); private Dictionary> StoredFriendListUpdates = new Dictionary>(); + private Dictionary m_pendingCallingcardRequests = new Dictionary(); + private List m_scene = new List(); #region IRegionModule Members @@ -109,7 +111,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends UUID.TryParse((string)requestData["agent_id"], out notifyAboutAgentId); m_log.InfoFormat("[PRESENCE]: Got presence update for {0}, and we're telling {1}, with a status {2}", notifyAboutAgentId.ToString(), notifyAgentId.ToString(), notifyOnlineStatus.ToString()); - ScenePresence avatar = GetPresenceFromAgentID(notifyAgentId); + ScenePresence avatar = GetRootPresenceFromAgentID(notifyAgentId); if (avatar != null) { if (avatar.IsChildAgent) @@ -184,6 +186,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends client.OnApproveFriendRequest += OnApprovedFriendRequest; client.OnDenyFriendRequest += OnDenyFriendRequest; client.OnTerminateFriendship += OnTerminateFriendship; + client.OnOfferCallingCard += OnOfferCallingCard; + client.OnAcceptCallingCard += OnAcceptCallingCard; + client.OnDeclineCallingCard += OnDeclineCallingCard; doFriendListUpdateOnline(client.AgentId); @@ -228,7 +233,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends } foreach (UUID user in UpdateUsers) { - ScenePresence av = GetPresenceFromAgentID(user); + ScenePresence av = GetRootPresenceFromAgentID(user); if (av != null) { List usrfl = new List(); @@ -257,7 +262,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends if (UpdateUsers.Count > 0) { - ScenePresence avatar = GetPresenceFromAgentID(AgentId); + ScenePresence avatar = GetRootPresenceFromAgentID(AgentId); if (avatar != null) { avatar.ControllingClient.SendAgentOnline(UpdateUsers.ToArray()); @@ -349,7 +354,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends for (int i = 0; i < updateUsers.Count; i++) { - ScenePresence av = GetPresenceFromAgentID(updateUsers[i]); + ScenePresence av = GetRootPresenceFromAgentID(updateUsers[i]); if (av != null) { UUID[] agents = new UUID[1]; @@ -427,7 +432,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends } } - private ScenePresence GetPresenceFromAgentID(UUID AgentID) + private ScenePresence GetRootPresenceFromAgentID(UUID AgentID) { ScenePresence returnAgent = null; lock (m_scene) @@ -449,6 +454,25 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends return returnAgent; } + private ScenePresence GetAnyPresenceFromAgentID(UUID AgentID) + { + ScenePresence returnAgent = null; + lock (m_scene) + { + ScenePresence queryagent = null; + for (int i = 0; i < m_scene.Count; i++) + { + queryagent = m_scene[i].GetScenePresence(AgentID); + if (queryagent != null) + { + returnAgent = queryagent; + break; + } + } + } + return returnAgent; + } + #region FriendRequestHandling private void OnInstantMessage(IClientAPI client, UUID fromAgentID, @@ -520,7 +544,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends Scene SceneAgentIn = m_scene[0]; // Found Pending Friend Request with that Transaction.. - ScenePresence agentpresence = GetPresenceFromAgentID(agentID); + ScenePresence agentpresence = GetRootPresenceFromAgentID(agentID); if (agentpresence != null) { SceneAgentIn = agentpresence.Scene; @@ -564,7 +588,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends Scene SceneAgentIn = m_scene[0]; // Found Pending Friend Request with that Transaction.. - ScenePresence agentpresence = GetPresenceFromAgentID(agentID); + ScenePresence agentpresence = GetRootPresenceFromAgentID(agentID); if (agentpresence != null) { SceneAgentIn = agentpresence.Scene; @@ -607,8 +631,94 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends } #endregion + + #region CallingCards + + private void OnOfferCallingCard(IClientAPI client, UUID destID, UUID transactionID) + { + m_log.DebugFormat("[CALLING CARD]: got offer from {0} for {1}, transaction {2}", + client.AgentId, destID, transactionID); + // This might be slightly wrong. On a multi-region server, we might get the child-agent instead of the root-agent + // (or the root instead of the child) + ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); + if (destAgent == null) + { + client.SendAlertMessage("The person you have offered a card to can't be found anymore."); + return; + } + + m_pendingCallingcardRequests[transactionID] = client.AgentId; + // inform the destination agent about the offer + destAgent.ControllingClient.SendOfferCallingCard(client.AgentId, transactionID); + } + + private void CreateCallingCard(IClientAPI client, UUID creator, UUID folder, string name) + { + InventoryItemBase item = new InventoryItemBase(); + item.AssetID = UUID.Zero; + item.AssetType = (int)AssetType.CallingCard; + item.BasePermissions = (uint)PermissionMask.Copy; + item.CreationDate = Util.UnixTimeSinceEpoch(); + item.Creator = creator; + item.CurrentPermissions = item.BasePermissions; + item.Description = ""; + item.EveryOnePermissions = (uint)PermissionMask.None; + item.Flags = 0; + item.Folder = folder; + item.GroupID = UUID.Zero; + item.GroupOwned = false; + item.ID = UUID.Random(); + item.InvType = (int)InventoryType.CallingCard; + item.Name = name; + item.NextPermissions = item.EveryOnePermissions; + item.Owner = client.AgentId; + item.SalePrice = 10; + item.SaleType = (byte)SaleType.Not; + ((Scene)client.Scene).AddInventoryItem(client, item); + } + + private void OnAcceptCallingCard(IClientAPI client, UUID transactionID, UUID folderID) + { + m_log.DebugFormat("[CALLING CARD]: User {0} ({1} {2}) accepted tid {3}, folder {4}", + client.AgentId, + client.FirstName, client.LastName, + transactionID, folderID); + UUID destID; + if (m_pendingCallingcardRequests.TryGetValue(transactionID, out destID)) + { + m_pendingCallingcardRequests.Remove(transactionID); + + ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); + // inform sender of the card that destination declined the offer + if (destAgent != null) destAgent.ControllingClient.SendAcceptCallingCard(transactionID); + + // put a calling card into the inventory of receiver + CreateCallingCard(client, destID, folderID, destAgent.Name); + } + else m_log.WarnFormat("[CALLING CARD]: Got a AcceptCallingCard from {0} {1} without an offer before.", + client.FirstName, client.LastName); + } + + private void OnDeclineCallingCard(IClientAPI client, UUID transactionID) + { + m_log.DebugFormat("[CALLING CARD]: User {0} declined card, tid {2}", + client.AgentId, transactionID); + UUID destID; + if (m_pendingCallingcardRequests.TryGetValue(transactionID, out destID)) + { + m_pendingCallingcardRequests.Remove(transactionID); + + ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); + // inform sender of the card that destination declined the offer + if (destAgent != null) destAgent.ControllingClient.SendDeclineCallingCard(transactionID); + } + else m_log.WarnFormat("[CALLING CARD]: Got a DeclineCallingCard from {0} {1} without an offer before.", + client.FirstName, client.LastName); + } } + #endregion + public struct StoredFriendListUpdate { public UUID storedFor; diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs index 52a2792..9aa0403 100644 --- a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs @@ -334,6 +334,10 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public event MapItemRequest OnMapItemRequest; + public event OfferCallingCard OnOfferCallingCard; + public event AcceptCallingCard OnAcceptCallingCard; + public event DeclineCallingCard OnDeclineCallingCard; + #pragma warning restore 67 @@ -939,5 +943,17 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public void SendEventInfoReply (EventData info) { } + + public void SendOfferCallingCard (UUID destID, UUID transactionID) + { + } + + public void SendAcceptCallingCard (UUID transactionID) + { + } + + public void SendDeclineCallingCard (UUID transactionID) + { + } } } diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index af60323..5e7523f 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -229,6 +229,10 @@ namespace OpenSim.Region.Examples.SimpleModule public event MapItemRequest OnMapItemRequest; + public event OfferCallingCard OnOfferCallingCard; + public event AcceptCallingCard OnAcceptCallingCard; + public event DeclineCallingCard OnDeclineCallingCard; + #pragma warning restore 67 @@ -938,5 +942,17 @@ namespace OpenSim.Region.Examples.SimpleModule public void SendEventInfoReply (EventData info) { } + + public void SendOfferCallingCard (UUID destID, UUID transactionID) + { + } + + public void SendAcceptCallingCard (UUID transactionID) + { + } + + public void SendDeclineCallingCard (UUID transactionID) + { + } } } -- cgit v1.1