diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs | 387 |
1 files changed, 296 insertions, 91 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index 57025bf..3890bb2 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs | |||
@@ -57,6 +57,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
57 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UserProfilesModule")] | 57 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UserProfilesModule")] |
58 | public class UserProfileModule : IProfileModule, INonSharedRegionModule | 58 | public class UserProfileModule : IProfileModule, INonSharedRegionModule |
59 | { | 59 | { |
60 | const double PROFILECACHEEXPIRE = 300; | ||
60 | /// <summary> | 61 | /// <summary> |
61 | /// Logging | 62 | /// Logging |
62 | /// </summary> | 63 | /// </summary> |
@@ -67,6 +68,8 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
67 | // count. The entries are removed when the interest count reaches 0. | 68 | // count. The entries are removed when the interest count reaches 0. |
68 | Dictionary<UUID, UUID> m_classifiedCache = new Dictionary<UUID, UUID>(); | 69 | Dictionary<UUID, UUID> m_classifiedCache = new Dictionary<UUID, UUID>(); |
69 | Dictionary<UUID, int> m_classifiedInterest = new Dictionary<UUID, int>(); | 70 | Dictionary<UUID, int> m_classifiedInterest = new Dictionary<UUID, int>(); |
71 | ExpiringCache<UUID, UserProfileCacheEntry> m_profilesCache = new ExpiringCache<UUID, UserProfileCacheEntry>(); | ||
72 | IImprovedAssetCache m_assetCache; | ||
70 | 73 | ||
71 | private JsonRpcRequestManager rpc = new JsonRpcRequestManager(); | 74 | private JsonRpcRequestManager rpc = new JsonRpcRequestManager(); |
72 | private bool m_allowUserProfileWebURLs = true; | 75 | private bool m_allowUserProfileWebURLs = true; |
@@ -128,7 +131,6 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
128 | get; private set; | 131 | get; private set; |
129 | } | 132 | } |
130 | 133 | ||
131 | |||
132 | #region IRegionModuleBase implementation | 134 | #region IRegionModuleBase implementation |
133 | /// <summary> | 135 | /// <summary> |
134 | /// This is called to initialize the region module. For shared modules, this is called exactly once, after | 136 | /// This is called to initialize the region module. For shared modules, this is called exactly once, after |
@@ -185,22 +187,11 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
185 | Scene = scene; | 187 | Scene = scene; |
186 | Scene.RegisterModuleInterface<IProfileModule>(this); | 188 | Scene.RegisterModuleInterface<IProfileModule>(this); |
187 | Scene.EventManager.OnNewClient += OnNewClient; | 189 | Scene.EventManager.OnNewClient += OnNewClient; |
188 | Scene.EventManager.OnMakeRootAgent += HandleOnMakeRootAgent; | 190 | Scene.EventManager.OnClientClosed += OnClientClosed; |
189 | 191 | ||
190 | UserManagementModule = Scene.RequestModuleInterface<IUserManagement>(); | 192 | UserManagementModule = Scene.RequestModuleInterface<IUserManagement>(); |
191 | } | 193 | } |
192 | 194 | ||
193 | void HandleOnMakeRootAgent (ScenePresence obj) | ||
194 | { | ||
195 | if(obj.PresenceType == PresenceType.Npc) | ||
196 | return; | ||
197 | |||
198 | Util.FireAndForget(delegate | ||
199 | { | ||
200 | GetImageAssets(((IScenePresence)obj).UUID); | ||
201 | }, null, "UserProfileModule.GetImageAssets"); | ||
202 | } | ||
203 | |||
204 | /// <summary> | 195 | /// <summary> |
205 | /// Removes the region. | 196 | /// Removes the region. |
206 | /// </summary> | 197 | /// </summary> |
@@ -211,6 +202,10 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
211 | { | 202 | { |
212 | if(!Enabled) | 203 | if(!Enabled) |
213 | return; | 204 | return; |
205 | |||
206 | m_profilesCache.Clear(); | ||
207 | m_classifiedCache.Clear(); | ||
208 | m_classifiedInterest.Clear(); | ||
214 | } | 209 | } |
215 | 210 | ||
216 | /// <summary> | 211 | /// <summary> |
@@ -226,6 +221,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
226 | { | 221 | { |
227 | if(!Enabled) | 222 | if(!Enabled) |
228 | return; | 223 | return; |
224 | m_assetCache = Scene.RequestModuleInterface<IImprovedAssetCache>(); | ||
229 | } | 225 | } |
230 | 226 | ||
231 | /// <summary> | 227 | /// <summary> |
@@ -297,6 +293,40 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
297 | client.OnUserInfoRequest += UserPreferencesRequest; | 293 | client.OnUserInfoRequest += UserPreferencesRequest; |
298 | client.OnUpdateUserInfo += UpdateUserPreferences; | 294 | client.OnUpdateUserInfo += UpdateUserPreferences; |
299 | } | 295 | } |
296 | |||
297 | void OnClientClosed(UUID AgentId, Scene scene) | ||
298 | { | ||
299 | ScenePresence sp = scene.GetScenePresence(AgentId); | ||
300 | IClientAPI client = sp.ControllingClient; | ||
301 | if (client == null) | ||
302 | return; | ||
303 | |||
304 | //Profile | ||
305 | client.OnRequestAvatarProperties -= RequestAvatarProperties; | ||
306 | client.OnUpdateAvatarProperties -= AvatarPropertiesUpdate; | ||
307 | client.OnAvatarInterestUpdate -= AvatarInterestsUpdate; | ||
308 | |||
309 | // Classifieds | ||
310 | // client.r GenericPacketHandler("avatarclassifiedsrequest", ClassifiedsRequest); | ||
311 | client.OnClassifiedInfoUpdate -= ClassifiedInfoUpdate; | ||
312 | client.OnClassifiedInfoRequest -= ClassifiedInfoRequest; | ||
313 | client.OnClassifiedDelete -= ClassifiedDelete; | ||
314 | |||
315 | // Picks | ||
316 | // client.AddGenericPacketHandler("avatarpicksrequest", PicksRequest); | ||
317 | // client.AddGenericPacketHandler("pickinforequest", PickInfoRequest); | ||
318 | client.OnPickInfoUpdate -= PickInfoUpdate; | ||
319 | client.OnPickDelete -= PickDelete; | ||
320 | |||
321 | // Notes | ||
322 | // client.AddGenericPacketHandler("avatarnotesrequest", NotesRequest); | ||
323 | client.OnAvatarNotesUpdate -= NotesUpdate; | ||
324 | |||
325 | // Preferences | ||
326 | client.OnUserInfoRequest -= UserPreferencesRequest; | ||
327 | client.OnUpdateUserInfo -= UpdateUserPreferences; | ||
328 | } | ||
329 | |||
300 | #endregion Region Event Handlers | 330 | #endregion Region Event Handlers |
301 | 331 | ||
302 | #region Classified | 332 | #region Classified |
@@ -332,6 +362,34 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
332 | return; | 362 | return; |
333 | } | 363 | } |
334 | 364 | ||
365 | UserProfileCacheEntry uce = null; | ||
366 | lock(m_profilesCache) | ||
367 | { | ||
368 | if(m_profilesCache.TryGetValue(targetID, out uce) && uce != null) | ||
369 | { | ||
370 | if(uce.classifiedsLists != null) | ||
371 | { | ||
372 | foreach(KeyValuePair<UUID,string> kvp in uce.classifiedsLists) | ||
373 | { | ||
374 | UUID kvpkey = kvp.Key; | ||
375 | classifieds[kvpkey] = kvp.Value; | ||
376 | lock (m_classifiedCache) | ||
377 | { | ||
378 | if (!m_classifiedCache.ContainsKey(kvpkey)) | ||
379 | { | ||
380 | m_classifiedCache.Add(kvpkey,targetID); | ||
381 | m_classifiedInterest.Add(kvpkey, 0); | ||
382 | } | ||
383 | |||
384 | m_classifiedInterest[kvpkey]++; | ||
385 | } | ||
386 | } | ||
387 | remoteClient.SendAvatarClassifiedReply(targetID, uce.classifiedsLists); | ||
388 | return; | ||
389 | } | ||
390 | } | ||
391 | } | ||
392 | |||
335 | string serverURI = string.Empty; | 393 | string serverURI = string.Empty; |
336 | GetUserProfileServerURI(targetID, out serverURI); | 394 | GetUserProfileServerURI(targetID, out serverURI); |
337 | if(string.IsNullOrWhiteSpace(serverURI)) | 395 | if(string.IsNullOrWhiteSpace(serverURI)) |
@@ -380,6 +438,13 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
380 | } | 438 | } |
381 | } | 439 | } |
382 | 440 | ||
441 | if(uce == null) | ||
442 | uce = new UserProfileCacheEntry(); | ||
443 | uce.classifiedsLists = classifieds; | ||
444 | |||
445 | lock(m_profilesCache) | ||
446 | m_profilesCache.AddOrUpdate(targetID, uce, PROFILECACHEEXPIRE); | ||
447 | |||
383 | remoteClient.SendAvatarClassifiedReply(targetID, classifieds); | 448 | remoteClient.SendAvatarClassifiedReply(targetID, classifieds); |
384 | } | 449 | } |
385 | 450 | ||
@@ -404,9 +469,29 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
404 | } | 469 | } |
405 | } | 470 | } |
406 | } | 471 | } |
407 | 472 | ||
473 | UserProfileCacheEntry uce = null; | ||
474 | lock(m_profilesCache) | ||
475 | { | ||
476 | if(m_profilesCache.TryGetValue(target, out uce) && uce != null) | ||
477 | { | ||
478 | if(uce.classifieds != null && uce.classifieds.ContainsKey(queryClassifiedID)) | ||
479 | { | ||
480 | ad = uce.classifieds[queryClassifiedID]; | ||
481 | Vector3 gPos = new Vector3(); | ||
482 | Vector3.TryParse(ad.GlobalPos, out gPos); | ||
483 | |||
484 | remoteClient.SendClassifiedInfoReply(ad.ClassifiedId, ad.CreatorId, (uint)ad.CreationDate, | ||
485 | (uint)ad.ExpirationDate, (uint)ad.Category, ad.Name, ad.Description, | ||
486 | ad.ParcelId, (uint)ad.ParentEstate, ad.SnapshotId, ad.SimName, | ||
487 | gPos, ad.ParcelName, ad.Flags, ad.Price); | ||
488 | return; | ||
489 | } | ||
490 | } | ||
491 | } | ||
492 | |||
408 | string serverURI = string.Empty; | 493 | string serverURI = string.Empty; |
409 | GetUserProfileServerURI(target, out serverURI); | 494 | bool foreign = GetUserProfileServerURI(target, out serverURI); |
410 | if(string.IsNullOrWhiteSpace(serverURI)) | 495 | if(string.IsNullOrWhiteSpace(serverURI)) |
411 | { | 496 | { |
412 | return; | 497 | return; |
@@ -424,6 +509,18 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
424 | if(ad.CreatorId == UUID.Zero) | 509 | if(ad.CreatorId == UUID.Zero) |
425 | return; | 510 | return; |
426 | 511 | ||
512 | if(foreign) | ||
513 | cacheForeignImage(target, ad.SnapshotId); | ||
514 | |||
515 | if(uce == null) | ||
516 | uce = new UserProfileCacheEntry(); | ||
517 | if(uce.classifieds == null) | ||
518 | uce.classifieds = new Dictionary<UUID, UserClassifiedAdd>(); | ||
519 | uce.classifieds[ad.ClassifiedId] = ad; | ||
520 | |||
521 | lock(m_profilesCache) | ||
522 | m_profilesCache.AddOrUpdate(ad.ClassifiedId, uce, PROFILECACHEEXPIRE); | ||
523 | |||
427 | Vector3 globalPos = new Vector3(); | 524 | Vector3 globalPos = new Vector3(); |
428 | Vector3.TryParse(ad.GlobalPos, out globalPos); | 525 | Vector3.TryParse(ad.GlobalPos, out globalPos); |
429 | 526 | ||
@@ -473,6 +570,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
473 | uint queryParentEstate, UUID querySnapshotID, Vector3 queryGlobalPos, byte queryclassifiedFlags, | 570 | uint queryParentEstate, UUID querySnapshotID, Vector3 queryGlobalPos, byte queryclassifiedFlags, |
474 | int queryclassifiedPrice, IClientAPI remoteClient) | 571 | int queryclassifiedPrice, IClientAPI remoteClient) |
475 | { | 572 | { |
573 | |||
476 | Scene s = (Scene)remoteClient.Scene; | 574 | Scene s = (Scene)remoteClient.Scene; |
477 | Vector3 pos = remoteClient.SceneAgent.AbsolutePosition; | 575 | Vector3 pos = remoteClient.SceneAgent.AbsolutePosition; |
478 | ILandObject land = s.LandChannel.GetLandObject(pos.X, pos.Y); | 576 | ILandObject land = s.LandChannel.GetLandObject(pos.X, pos.Y); |
@@ -486,6 +584,17 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
486 | return; | 584 | return; |
487 | } | 585 | } |
488 | 586 | ||
587 | // just flush cache for now | ||
588 | UserProfileCacheEntry uce = null; | ||
589 | lock(m_profilesCache) | ||
590 | { | ||
591 | if(m_profilesCache.TryGetValue(remoteClient.AgentId, out uce) && uce != null) | ||
592 | { | ||
593 | uce.classifieds = null; | ||
594 | uce.classifiedsLists = null; | ||
595 | } | ||
596 | } | ||
597 | |||
489 | OSDMap parameters = new OSDMap {{"creatorId", OSD.FromUUID(creatorId)}}; | 598 | OSDMap parameters = new OSDMap {{"creatorId", OSD.FromUUID(creatorId)}}; |
490 | OSD Params = (OSD)parameters; | 599 | OSD Params = (OSD)parameters; |
491 | if (!rpc.JsonRpcRequest(ref Params, "avatarclassifiedsrequest", serverURI, UUID.Random().ToString())) | 600 | if (!rpc.JsonRpcRequest(ref Params, "avatarclassifiedsrequest", serverURI, UUID.Random().ToString())) |
@@ -549,6 +658,17 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
549 | /// </param> | 658 | /// </param> |
550 | public void ClassifiedDelete(UUID queryClassifiedID, IClientAPI remoteClient) | 659 | public void ClassifiedDelete(UUID queryClassifiedID, IClientAPI remoteClient) |
551 | { | 660 | { |
661 | // just flush cache for now | ||
662 | UserProfileCacheEntry uce = null; | ||
663 | lock(m_profilesCache) | ||
664 | { | ||
665 | if(m_profilesCache.TryGetValue(remoteClient.AgentId, out uce) && uce != null) | ||
666 | { | ||
667 | uce.classifieds = null; | ||
668 | uce.classifiedsLists = null; | ||
669 | } | ||
670 | } | ||
671 | |||
552 | string serverURI = string.Empty; | 672 | string serverURI = string.Empty; |
553 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 673 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
554 | if(string.IsNullOrWhiteSpace(serverURI)) | 674 | if(string.IsNullOrWhiteSpace(serverURI)) |
@@ -605,6 +725,19 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
605 | return; | 725 | return; |
606 | } | 726 | } |
607 | 727 | ||
728 | UserProfileCacheEntry uce = null; | ||
729 | lock(m_profilesCache) | ||
730 | { | ||
731 | if(m_profilesCache.TryGetValue(targetId, out uce) && uce != null) | ||
732 | { | ||
733 | if(uce != null && uce.picksList != null) | ||
734 | { | ||
735 | remoteClient.SendAvatarPicksReply(targetId, uce.picksList); | ||
736 | return; | ||
737 | } | ||
738 | } | ||
739 | } | ||
740 | |||
608 | string serverURI = string.Empty; | 741 | string serverURI = string.Empty; |
609 | GetUserProfileServerURI(targetId, out serverURI); | 742 | GetUserProfileServerURI(targetId, out serverURI); |
610 | if(string.IsNullOrWhiteSpace(serverURI)) | 743 | if(string.IsNullOrWhiteSpace(serverURI)) |
@@ -637,6 +770,14 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
637 | string name = m["name"].AsString(); | 770 | string name = m["name"].AsString(); |
638 | picks[cid] = name; | 771 | picks[cid] = name; |
639 | } | 772 | } |
773 | |||
774 | if (uce == null) | ||
775 | uce = new UserProfileCacheEntry(); | ||
776 | uce.picksList = picks; | ||
777 | |||
778 | lock(m_profilesCache) | ||
779 | m_profilesCache.AddOrUpdate(targetId, uce, PROFILECACHEEXPIRE); | ||
780 | |||
640 | remoteClient.SendAvatarPicksReply(targetId, picks); | 781 | remoteClient.SendAvatarPicksReply(targetId, picks); |
641 | } | 782 | } |
642 | 783 | ||
@@ -667,8 +808,27 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
667 | if(!UUID.TryParse (args [1], out pick.PickId)) | 808 | if(!UUID.TryParse (args [1], out pick.PickId)) |
668 | return; | 809 | return; |
669 | 810 | ||
811 | IClientAPI remoteClient = (IClientAPI)sender; | ||
812 | UserProfileCacheEntry uce = null; | ||
813 | lock(m_profilesCache) | ||
814 | { | ||
815 | if(m_profilesCache.TryGetValue(targetID, out uce) && uce != null) | ||
816 | { | ||
817 | if(uce != null && uce.picks != null && uce.picks.ContainsKey(pick.PickId)) | ||
818 | { | ||
819 | pick = uce.picks[pick.PickId]; | ||
820 | Vector3 gPos = new Vector3(Vector3.Zero); | ||
821 | Vector3.TryParse(pick.GlobalPos, out gPos); | ||
822 | remoteClient.SendPickInfoReply(pick.PickId,pick.CreatorId,pick.TopPick,pick.ParcelId,pick.Name, | ||
823 | pick.Desc,pick.SnapshotId,pick.ParcelName,pick.OriginalName,pick.SimName, | ||
824 | gPos,pick.SortOrder,pick.Enabled); | ||
825 | return; | ||
826 | } | ||
827 | } | ||
828 | } | ||
829 | |||
670 | string serverURI = string.Empty; | 830 | string serverURI = string.Empty; |
671 | GetUserProfileServerURI (targetID, out serverURI); | 831 | bool foreign = GetUserProfileServerURI (targetID, out serverURI); |
672 | if(string.IsNullOrWhiteSpace(serverURI)) | 832 | if(string.IsNullOrWhiteSpace(serverURI)) |
673 | { | 833 | { |
674 | return; | 834 | return; |
@@ -676,8 +836,6 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
676 | 836 | ||
677 | string theirGatekeeperURI; | 837 | string theirGatekeeperURI; |
678 | GetUserGatekeeperURI(targetID, out theirGatekeeperURI); | 838 | GetUserGatekeeperURI(targetID, out theirGatekeeperURI); |
679 | |||
680 | IClientAPI remoteClient = (IClientAPI)sender; | ||
681 | 839 | ||
682 | object Pick = (object)pick; | 840 | object Pick = (object)pick; |
683 | if (!rpc.JsonRpcRequest (ref Pick, "pickinforequest", serverURI, UUID.Random ().ToString ())) { | 841 | if (!rpc.JsonRpcRequest (ref Pick, "pickinforequest", serverURI, UUID.Random ().ToString ())) { |
@@ -686,6 +844,8 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
686 | return; | 844 | return; |
687 | } | 845 | } |
688 | pick = (UserProfilePick)Pick; | 846 | pick = (UserProfilePick)Pick; |
847 | if(foreign) | ||
848 | cacheForeignImage(targetID, pick.SnapshotId); | ||
689 | 849 | ||
690 | Vector3 globalPos = new Vector3(Vector3.Zero); | 850 | Vector3 globalPos = new Vector3(Vector3.Zero); |
691 | Vector3.TryParse(pick.GlobalPos, out globalPos); | 851 | Vector3.TryParse(pick.GlobalPos, out globalPos); |
@@ -716,6 +876,16 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
716 | 876 | ||
717 | m_log.DebugFormat("[PROFILES]: PickInfoRequest: {0} : {1}", pick.Name.ToString(), pick.SnapshotId.ToString()); | 877 | m_log.DebugFormat("[PROFILES]: PickInfoRequest: {0} : {1}", pick.Name.ToString(), pick.SnapshotId.ToString()); |
718 | 878 | ||
879 | pick.GlobalPos = globalPos.ToString(); | ||
880 | if (uce == null) | ||
881 | uce = new UserProfileCacheEntry(); | ||
882 | if(uce.picks == null) | ||
883 | uce.picks = new Dictionary<UUID, UserProfilePick>(); | ||
884 | uce.picks[pick.PickId] = pick; | ||
885 | |||
886 | lock(m_profilesCache) | ||
887 | m_profilesCache.AddOrUpdate(targetID, uce, PROFILECACHEEXPIRE); | ||
888 | |||
719 | // Pull the rabbit out of the hat | 889 | // Pull the rabbit out of the hat |
720 | remoteClient.SendPickInfoReply(pick.PickId,pick.CreatorId,pick.TopPick,pick.ParcelId,pick.Name, | 890 | remoteClient.SendPickInfoReply(pick.PickId,pick.CreatorId,pick.TopPick,pick.ParcelId,pick.Name, |
721 | pick.Desc,pick.SnapshotId,pick.ParcelName,pick.OriginalName,pick.SimName, | 891 | pick.Desc,pick.SnapshotId,pick.ParcelName,pick.OriginalName,pick.SimName, |
@@ -757,6 +927,17 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
757 | //TODO: See how this works with NPC, May need to test | 927 | //TODO: See how this works with NPC, May need to test |
758 | m_log.DebugFormat("[PROFILES]: Start PickInfoUpdate Name: {0} PickId: {1} SnapshotId: {2}", name, pickID.ToString(), snapshotID.ToString()); | 928 | m_log.DebugFormat("[PROFILES]: Start PickInfoUpdate Name: {0} PickId: {1} SnapshotId: {2}", name, pickID.ToString(), snapshotID.ToString()); |
759 | 929 | ||
930 | // flush cache for now | ||
931 | UserProfileCacheEntry uce = null; | ||
932 | lock(m_profilesCache) | ||
933 | { | ||
934 | if(m_profilesCache.TryGetValue(remoteClient.AgentId, out uce) && uce != null) | ||
935 | { | ||
936 | uce.picks = null; | ||
937 | uce.picksList = null; | ||
938 | } | ||
939 | } | ||
940 | |||
760 | UserProfilePick pick = new UserProfilePick(); | 941 | UserProfilePick pick = new UserProfilePick(); |
761 | string serverURI = string.Empty; | 942 | string serverURI = string.Empty; |
762 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 943 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
@@ -791,7 +972,6 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
791 | avaPos.X, avaPos.Y, p.Scene.Name); | 972 | avaPos.X, avaPos.Y, p.Scene.Name); |
792 | } | 973 | } |
793 | 974 | ||
794 | |||
795 | pick.PickId = pickID; | 975 | pick.PickId = pickID; |
796 | pick.CreatorId = creatorID; | 976 | pick.CreatorId = creatorID; |
797 | pick.TopPick = topPick; | 977 | pick.TopPick = topPick; |
@@ -828,6 +1008,17 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
828 | /// </param> | 1008 | /// </param> |
829 | public void PickDelete(IClientAPI remoteClient, UUID queryPickID) | 1009 | public void PickDelete(IClientAPI remoteClient, UUID queryPickID) |
830 | { | 1010 | { |
1011 | // flush cache for now | ||
1012 | UserProfileCacheEntry uce = null; | ||
1013 | lock(m_profilesCache) | ||
1014 | { | ||
1015 | if(m_profilesCache.TryGetValue(remoteClient.AgentId, out uce) && uce != null) | ||
1016 | { | ||
1017 | uce.picks = null; | ||
1018 | uce.picksList = null; | ||
1019 | } | ||
1020 | } | ||
1021 | |||
831 | string serverURI = string.Empty; | 1022 | string serverURI = string.Empty; |
832 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 1023 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
833 | if(string.IsNullOrWhiteSpace(serverURI)) | 1024 | if(string.IsNullOrWhiteSpace(serverURI)) |
@@ -1025,6 +1216,16 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1025 | /// </param> | 1216 | /// </param> |
1026 | public void AvatarInterestsUpdate(IClientAPI remoteClient, uint wantmask, string wanttext, uint skillsmask, string skillstext, string languages) | 1217 | public void AvatarInterestsUpdate(IClientAPI remoteClient, uint wantmask, string wanttext, uint skillsmask, string skillstext, string languages) |
1027 | { | 1218 | { |
1219 | // flush cache for now | ||
1220 | UserProfileCacheEntry uce = null; | ||
1221 | lock(m_profilesCache) | ||
1222 | { | ||
1223 | if(m_profilesCache.TryGetValue(remoteClient.AgentId, out uce) && uce != null) | ||
1224 | { | ||
1225 | uce.props = null; | ||
1226 | } | ||
1227 | } | ||
1228 | |||
1028 | UserProfileProperties prop = new UserProfileProperties(); | 1229 | UserProfileProperties prop = new UserProfileProperties(); |
1029 | 1230 | ||
1030 | prop.UserId = remoteClient.AgentId; | 1231 | prop.UserId = remoteClient.AgentId; |
@@ -1067,6 +1268,27 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1067 | 0, "Getting into trouble", "Droidspeak"); | 1268 | 0, "Getting into trouble", "Droidspeak"); |
1068 | return; | 1269 | return; |
1069 | } | 1270 | } |
1271 | UserProfileProperties props; | ||
1272 | UserProfileCacheEntry uce = null; | ||
1273 | lock(m_profilesCache) | ||
1274 | { | ||
1275 | if(m_profilesCache.TryGetValue(avatarID, out uce) && uce != null) | ||
1276 | { | ||
1277 | if(uce.props != null) | ||
1278 | { | ||
1279 | props = uce.props; | ||
1280 | remoteClient.SendAvatarProperties(props.UserId, props.AboutText, | ||
1281 | uce.born, uce.membershipType , props.FirstLifeText, uce.flags, | ||
1282 | props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId); | ||
1283 | |||
1284 | |||
1285 | remoteClient.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, | ||
1286 | props.WantToText, (uint)props.SkillsMask, | ||
1287 | props.SkillsText, props.Language); | ||
1288 | return; | ||
1289 | } | ||
1290 | } | ||
1291 | } | ||
1070 | 1292 | ||
1071 | string serverURI = string.Empty; | 1293 | string serverURI = string.Empty; |
1072 | bool foreign = GetUserProfileServerURI(avatarID, out serverURI); | 1294 | bool foreign = GetUserProfileServerURI(avatarID, out serverURI); |
@@ -1118,13 +1340,13 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1118 | } | 1340 | } |
1119 | } | 1341 | } |
1120 | 1342 | ||
1121 | UserProfileProperties props = new UserProfileProperties(); | 1343 | props = new UserProfileProperties(); |
1122 | props.UserId = avatarID; | 1344 | props.UserId = avatarID; |
1123 | 1345 | ||
1124 | string result = string.Empty; | 1346 | string result = string.Empty; |
1125 | if(!GetProfileData(ref props, foreign, out result)) | 1347 | if(!GetProfileData(ref props, foreign, serverURI, out result)) |
1126 | { | 1348 | { |
1127 | props.AboutText ="Profile not avaible at this time. User may still be unknown to this grid"; | 1349 | props.AboutText ="Profile not available at this time. User may still be unknown to this grid"; |
1128 | } | 1350 | } |
1129 | 1351 | ||
1130 | // if on same region force online | 1352 | // if on same region force online |
@@ -1134,10 +1356,19 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1134 | if(!m_allowUserProfileWebURLs) | 1356 | if(!m_allowUserProfileWebURLs) |
1135 | props.WebUrl =""; | 1357 | props.WebUrl =""; |
1136 | 1358 | ||
1359 | if(uce == null) | ||
1360 | uce = new UserProfileCacheEntry(); | ||
1361 | uce.props = props; | ||
1362 | uce.born = born; | ||
1363 | uce.membershipType = membershipType; | ||
1364 | uce.flags = flags; | ||
1365 | |||
1366 | lock(m_profilesCache) | ||
1367 | m_profilesCache.AddOrUpdate(props.UserId, uce, PROFILECACHEEXPIRE); | ||
1368 | |||
1137 | remoteClient.SendAvatarProperties(props.UserId, props.AboutText, born, membershipType , props.FirstLifeText, flags, | 1369 | remoteClient.SendAvatarProperties(props.UserId, props.AboutText, born, membershipType , props.FirstLifeText, flags, |
1138 | props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId); | 1370 | props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId); |
1139 | 1371 | ||
1140 | |||
1141 | remoteClient.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, props.WantToText, (uint)props.SkillsMask, | 1372 | remoteClient.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, props.WantToText, (uint)props.SkillsMask, |
1142 | props.SkillsText, props.Language); | 1373 | props.SkillsText, props.Language); |
1143 | } | 1374 | } |
@@ -1155,6 +1386,16 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1155 | { | 1386 | { |
1156 | if (remoteClient.AgentId == newProfile.ID) | 1387 | if (remoteClient.AgentId == newProfile.ID) |
1157 | { | 1388 | { |
1389 | // flush cache for now | ||
1390 | UserProfileCacheEntry uce = null; | ||
1391 | lock(m_profilesCache) | ||
1392 | { | ||
1393 | if(m_profilesCache.TryGetValue(remoteClient.AgentId, out uce) && uce != null) | ||
1394 | { | ||
1395 | uce.props = null; | ||
1396 | } | ||
1397 | } | ||
1398 | |||
1158 | UserProfileProperties prop = new UserProfileProperties(); | 1399 | UserProfileProperties prop = new UserProfileProperties(); |
1159 | 1400 | ||
1160 | prop.UserId = remoteClient.AgentId; | 1401 | prop.UserId = remoteClient.AgentId; |
@@ -1189,24 +1430,8 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1189 | /// <returns> | 1430 | /// <returns> |
1190 | /// The profile data. | 1431 | /// The profile data. |
1191 | /// </returns> | 1432 | /// </returns> |
1192 | bool GetProfileData(ref UserProfileProperties properties, bool foreign, out string message) | 1433 | bool GetProfileData(ref UserProfileProperties properties, bool foreign, string serverURI, out string message) |
1193 | { | 1434 | { |
1194 | // Can't handle NPC yet... | ||
1195 | ScenePresence p = FindPresence(properties.UserId); | ||
1196 | |||
1197 | if (null != p) | ||
1198 | { | ||
1199 | if (p.PresenceType == PresenceType.Npc) | ||
1200 | { | ||
1201 | message = "Id points to NPC"; | ||
1202 | return false; | ||
1203 | } | ||
1204 | } | ||
1205 | |||
1206 | string serverURI = string.Empty; | ||
1207 | GetUserProfileServerURI(properties.UserId, out serverURI); | ||
1208 | // This is checking a friend on the home grid | ||
1209 | // Not HG friend | ||
1210 | if (String.IsNullOrEmpty(serverURI)) | 1435 | if (String.IsNullOrEmpty(serverURI)) |
1211 | { | 1436 | { |
1212 | message = "User profile service unknown at this time"; | 1437 | message = "User profile service unknown at this time"; |
@@ -1247,10 +1472,14 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1247 | 1472 | ||
1248 | return false; | 1473 | return false; |
1249 | } | 1474 | } |
1250 | // else, continue below | ||
1251 | } | 1475 | } |
1252 | 1476 | ||
1253 | properties = (UserProfileProperties)Prop; | 1477 | properties = (UserProfileProperties)Prop; |
1478 | if(foreign) | ||
1479 | { | ||
1480 | cacheForeignImage(properties.UserId, properties.ImageId); | ||
1481 | cacheForeignImage(properties.UserId, properties.FirstLifeImageId); | ||
1482 | } | ||
1254 | 1483 | ||
1255 | message = "Success"; | 1484 | message = "Success"; |
1256 | return true; | 1485 | return true; |
@@ -1258,49 +1487,6 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1258 | #endregion Avatar Properties | 1487 | #endregion Avatar Properties |
1259 | 1488 | ||
1260 | #region Utils | 1489 | #region Utils |
1261 | bool GetImageAssets(UUID avatarId) | ||
1262 | { | ||
1263 | string profileServerURI = string.Empty; | ||
1264 | string assetServerURI = string.Empty; | ||
1265 | |||
1266 | bool foreign = GetUserProfileServerURI(avatarId, out profileServerURI); | ||
1267 | |||
1268 | if(!foreign) | ||
1269 | return true; | ||
1270 | |||
1271 | assetServerURI = UserManagementModule.GetUserServerURL(avatarId, "AssetServerURI"); | ||
1272 | |||
1273 | if(string.IsNullOrEmpty(profileServerURI) || string.IsNullOrEmpty(assetServerURI)) | ||
1274 | return false; | ||
1275 | |||
1276 | OSDMap parameters= new OSDMap(); | ||
1277 | parameters.Add("avatarId", OSD.FromUUID(avatarId)); | ||
1278 | OSD Params = (OSD)parameters; | ||
1279 | if(!rpc.JsonRpcRequest(ref Params, "image_assets_request", profileServerURI, UUID.Random().ToString())) | ||
1280 | { | ||
1281 | return false; | ||
1282 | } | ||
1283 | |||
1284 | parameters = (OSDMap)Params; | ||
1285 | |||
1286 | if (parameters.ContainsKey("result")) | ||
1287 | { | ||
1288 | OSDArray list = (OSDArray)parameters["result"]; | ||
1289 | |||
1290 | foreach (OSD asset in list) | ||
1291 | { | ||
1292 | OSDString assetId = (OSDString)asset; | ||
1293 | |||
1294 | Scene.AssetService.Get(string.Format("{0}/{1}", assetServerURI, assetId.AsString())); | ||
1295 | } | ||
1296 | return true; | ||
1297 | } | ||
1298 | else | ||
1299 | { | ||
1300 | m_log.ErrorFormat("[PROFILES]: Problematic response for image_assets_request from {0}", profileServerURI); | ||
1301 | return false; | ||
1302 | } | ||
1303 | } | ||
1304 | 1490 | ||
1305 | /// <summary> | 1491 | /// <summary> |
1306 | /// Gets the user account data. | 1492 | /// Gets the user account data. |
@@ -1451,6 +1637,27 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1451 | } | 1637 | } |
1452 | } | 1638 | } |
1453 | 1639 | ||
1640 | void cacheForeignImage(UUID agent, UUID imageID) | ||
1641 | { | ||
1642 | if(imageID == null || imageID == UUID.Zero) | ||
1643 | return; | ||
1644 | |||
1645 | string assetServerURI = UserManagementModule.GetUserServerURL(agent, "AssetServerURI"); | ||
1646 | if(string.IsNullOrWhiteSpace(assetServerURI)) | ||
1647 | return; | ||
1648 | |||
1649 | string imageIDstr = imageID.ToString(); | ||
1650 | |||
1651 | |||
1652 | if(m_assetCache != null && m_assetCache.Check(imageIDstr)) | ||
1653 | return; | ||
1654 | |||
1655 | if(Scene.AssetService.Get(imageIDstr) != null) | ||
1656 | return; | ||
1657 | |||
1658 | Scene.AssetService.Get(string.Format("{0}/{1}", assetServerURI, imageIDstr)); | ||
1659 | } | ||
1660 | |||
1454 | /// <summary> | 1661 | /// <summary> |
1455 | /// Finds the presence. | 1662 | /// Finds the presence. |
1456 | /// </summary> | 1663 | /// </summary> |
@@ -1519,9 +1726,8 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1519 | webRequest.ContentType = "application/json-rpc"; | 1726 | webRequest.ContentType = "application/json-rpc"; |
1520 | webRequest.Method = "POST"; | 1727 | webRequest.Method = "POST"; |
1521 | 1728 | ||
1522 | Stream dataStream = webRequest.GetRequestStream(); | 1729 | using(Stream dataStream = webRequest.GetRequestStream()) |
1523 | dataStream.Write(content, 0, content.Length); | 1730 | dataStream.Write(content,0,content.Length); |
1524 | dataStream.Close(); | ||
1525 | 1731 | ||
1526 | WebResponse webResponse = null; | 1732 | WebResponse webResponse = null; |
1527 | try | 1733 | try |
@@ -1601,9 +1807,8 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
1601 | webRequest.ContentType = "application/json-rpc"; | 1807 | webRequest.ContentType = "application/json-rpc"; |
1602 | webRequest.Method = "POST"; | 1808 | webRequest.Method = "POST"; |
1603 | 1809 | ||
1604 | Stream dataStream = webRequest.GetRequestStream(); | 1810 | using(Stream dataStream = webRequest.GetRequestStream()) |
1605 | dataStream.Write(content, 0, content.Length); | 1811 | dataStream.Write(content,0,content.Length); |
1606 | dataStream.Close(); | ||
1607 | 1812 | ||
1608 | WebResponse webResponse = null; | 1813 | WebResponse webResponse = null; |
1609 | try | 1814 | try |