From 3a1ce2715a522dcb1971944af17ad10d2263c7ab Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Tue, 28 Oct 2014 23:00:49 +0000 Subject: Add "wearables check" console command This checks that all the wearable assets and any assets for a given logged in avatar exist in the asset service --- .../Avatar/Appearance/AppearanceInfoModule.cs | 96 ++++++++++++++++++++-- 1 file changed, 87 insertions(+), 9 deletions(-) (limited to 'OpenSim/Region/OptionalModules') diff --git a/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs b/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs index 51dfd47..f67f613 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs @@ -51,7 +51,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private Dictionary m_scenes = new Dictionary(); + private List m_scenes = new List(); + // private IAvatarFactoryModule m_avatarFactory; public string Name { get { return "Appearance Information Module"; } } @@ -83,7 +84,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance // m_log.DebugFormat("[APPEARANCE INFO MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); lock (m_scenes) - m_scenes.Remove(scene.RegionInfo.RegionID); + m_scenes.Remove(scene); } public void RegionLoaded(Scene scene) @@ -91,7 +92,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance // m_log.DebugFormat("[APPEARANCE INFO MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); lock (m_scenes) - m_scenes[scene.RegionInfo.RegionID] = scene; + m_scenes.Add(scene); scene.AddCommand( "Users", this, "show appearance", @@ -140,6 +141,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance "If no avatar name is given then a general summary for all avatars in the scene is shown.\n" + "If an avatar name is given then specific information about current wearables is shown.", HandleShowWearablesCommand); + + scene.AddCommand( + "Users", this, "wearables check", + "wearables check ", + "Check that the wearables of a given avatar in the scene are valid.", + "This currently checks that the wearable assets themselves and any assets referenced by them exist.", + HandleCheckWearablesCommand); } private void HandleSendAppearanceCommand(string module, string[] cmd) @@ -163,7 +171,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance lock (m_scenes) { - foreach (Scene scene in m_scenes.Values) + foreach (Scene scene in m_scenes) { if (targetNameSupplied) { @@ -215,7 +223,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance lock (m_scenes) { - foreach (Scene scene in m_scenes.Values) + foreach (Scene scene in m_scenes) { if (targetNameSupplied) { @@ -251,7 +259,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance lock (m_scenes) { - foreach (Scene scene in m_scenes.Values) + foreach (Scene scene in m_scenes) { ScenePresence sp = scene.GetScenePresence(firstname, lastname); if (sp != null && !sp.IsChildAgent) @@ -285,7 +293,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance lock (m_scenes) { - foreach (Scene scene in m_scenes.Values) + foreach (Scene scene in m_scenes) { scene.ForEachRootScenePresence( sp => @@ -338,7 +346,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance { lock (m_scenes) { - foreach (Scene scene in m_scenes.Values) + foreach (Scene scene in m_scenes) { ScenePresence sp = scene.GetScenePresence(optionalTargetFirstName, optionalTargetLastName); if (sp != null && !sp.IsChildAgent) @@ -354,7 +362,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance lock (m_scenes) { - foreach (Scene scene in m_scenes.Values) + foreach (Scene scene in m_scenes) { scene.ForEachRootScenePresence( sp => @@ -376,6 +384,76 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance MainConsole.Instance.Output(sb.ToString()); } + private void HandleCheckWearablesCommand(string module, string[] cmd) + { + if (cmd.Length != 4) + { + MainConsole.Instance.OutputFormat("Usage: wearables check "); + return; + } + + string firstname = cmd[2]; + string lastname = cmd[3]; + + StringBuilder sb = new StringBuilder(); + UuidGatherer uuidGatherer = new UuidGatherer(m_scenes[0].AssetService); + + lock (m_scenes) + { + foreach (Scene scene in m_scenes) + { + ScenePresence sp = scene.GetScenePresence(firstname, lastname); + if (sp != null && !sp.IsChildAgent) + { + sb.AppendFormat("Wearables checks for {0}\n\n", sp.Name); + + for (int i = (int)WearableType.Shape; i < (int)WearableType.Physics; i++) + { + AvatarWearable aw = sp.Appearance.Wearables[i]; + + if (aw.Count > 0) + { + sb.Append(Enum.GetName(typeof(WearableType), i)); + sb.Append("\n"); + + for (int j = 0; j < aw.Count; j++) + { + WearableItem wi = aw[j]; + + ConsoleDisplayList cdl = new ConsoleDisplayList(); + cdl.Indent = 2; + cdl.AddRow("Item UUID", wi.ItemID); + cdl.AddRow("Assets", ""); + sb.Append(cdl.ToString()); + + Dictionary assetUuids = new Dictionary(); + uuidGatherer.GatherAssetUuids(wi.AssetID, assetUuids); + string[] assetStrings + = Array.ConvertAll(assetUuids.Keys.ToArray(), u => u.ToString()); + + bool[] existChecks = scene.AssetService.AssetsExist(assetStrings); + + ConsoleDisplayTable cdt = new ConsoleDisplayTable(); + cdt.Indent = 4; + cdt.AddColumn("Type", 10); + cdt.AddColumn("UUID", ConsoleDisplayUtil.UuidSize); + cdt.AddColumn("Found", 5); + + for (int k = 0; k < existChecks.Length; k++) + cdt.AddRow((AssetType)assetUuids[new UUID(assetStrings[k])], assetStrings[k], existChecks[k] ? "yes" : "no"); + + sb.Append(cdt.ToString()); + sb.Append("\n"); + } + } + } + } + } + } + + MainConsole.Instance.Output(sb.ToString()); + } + private void AppendWearablesDetailReport(ScenePresence sp, StringBuilder sb) { sb.AppendFormat("\nWearables for {0}\n", sp.Name); -- cgit v1.1