From 5b6afeafbc249ba88dcc20d1fbc98ce12418b21b Mon Sep 17 00:00:00 2001
From: gareth
Date: Tue, 8 May 2007 00:10:04 +0000
Subject: Brought in TestClient code for teh fork

---
 ExportBot/Commands/CloneProfileCommand.cs | 131 ++++++++++++++++++++++++++++++
 1 file changed, 131 insertions(+)
 create mode 100644 ExportBot/Commands/CloneProfileCommand.cs

(limited to 'ExportBot/Commands/CloneProfileCommand.cs')

diff --git a/ExportBot/Commands/CloneProfileCommand.cs b/ExportBot/Commands/CloneProfileCommand.cs
new file mode 100644
index 0000000..d7fb5fc
--- /dev/null
+++ b/ExportBot/Commands/CloneProfileCommand.cs
@@ -0,0 +1,131 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using libsecondlife;
+using libsecondlife.Packets;
+
+namespace libsecondlife.TestClient
+{
+    public class CloneProfileCommand : Command
+    {
+        Avatar.AvatarProperties Properties;
+        Avatar.Interests Interests;
+        List<LLUUID> Groups = new List<LLUUID>();
+        bool ReceivedProperties = false;
+        bool ReceivedInterests = false;
+        bool ReceivedGroups = false;
+        ManualResetEvent ReceivedProfileEvent = new ManualResetEvent(false);
+
+        public CloneProfileCommand(TestClient testClient)
+        {
+            testClient.Avatars.OnAvatarInterests += new AvatarManager.AvatarInterestsCallback(Avatars_OnAvatarInterests);
+            testClient.Avatars.OnAvatarProperties += new AvatarManager.AvatarPropertiesCallback(Avatars_OnAvatarProperties);
+            testClient.Avatars.OnAvatarGroups += new AvatarManager.AvatarGroupsCallback(Avatars_OnAvatarGroups);
+            testClient.Self.OnJoinGroup += new MainAvatar.JoinGroupCallback(Self_OnJoinGroup);
+
+            Name = "cloneprofile";
+            Description = "Clones another avatars profile as closely as possible. WARNING: This command will " +
+                "destroy your existing profile! Usage: cloneprofile [targetuuid]";
+        }
+
+        public override string Execute(string[] args, LLUUID fromAgentID)
+        {
+            if (args.Length != 1)
+                return Description;
+
+            LLUUID targetID;
+            ReceivedProperties = false;
+            ReceivedInterests = false;
+            ReceivedGroups = false;
+
+            try
+            {
+                targetID = new LLUUID(args[0]);
+            }
+            catch (Exception)
+            {
+                return Description;
+            }
+
+            // Request all of the packets that make up an avatar profile
+            Client.Avatars.RequestAvatarProperties(targetID);
+
+            // Wait for all the packets to arrive
+            ReceivedProfileEvent.Reset();
+            ReceivedProfileEvent.WaitOne(5000, false);
+
+            // Check if everything showed up
+            if (!ReceivedInterests || !ReceivedProperties || !ReceivedGroups)
+                return "Failed to retrieve a complete profile for that UUID";
+
+            // Synchronize our profile
+            Client.Self.ProfileInterests = Interests;
+            Client.Self.ProfileProperties = Properties;
+            Client.Self.SetAvatarInformation();
+
+            // TODO: Leave all the groups we're currently a member of? This could
+            // break TestClient connectivity that might be relying on group authentication
+
+            // Attempt to join all the groups
+            foreach (LLUUID groupID in Groups)
+            {
+                Client.Self.RequestJoinGroup(groupID);
+            }
+
+            return "Synchronized our profile to the profile of " + targetID.ToStringHyphenated();
+        }
+
+        void Avatars_OnAvatarProperties(LLUUID avatarID, Avatar.AvatarProperties properties)
+        {
+            lock (ReceivedProfileEvent)
+            {
+                Properties = properties;
+                ReceivedProperties = true;
+
+                if (ReceivedInterests && ReceivedProperties && ReceivedGroups)
+                    ReceivedProfileEvent.Set();
+            }
+        }
+
+        void Avatars_OnAvatarInterests(LLUUID avatarID, Avatar.Interests interests)
+        {
+            lock (ReceivedProfileEvent)
+            {
+                Interests = interests;
+                ReceivedInterests = true;
+
+                if (ReceivedInterests && ReceivedProperties && ReceivedGroups)
+                    ReceivedProfileEvent.Set();
+            }
+        }
+
+        void Avatars_OnAvatarGroups(LLUUID avatarID, AvatarGroupsReplyPacket.GroupDataBlock[] groups)
+        {
+            lock (ReceivedProfileEvent)
+            {
+                foreach (AvatarGroupsReplyPacket.GroupDataBlock block in groups)
+                {
+                    Groups.Add(block.GroupID);
+                }
+
+                ReceivedGroups = true;
+
+                if (ReceivedInterests && ReceivedProperties && ReceivedGroups)
+                    ReceivedProfileEvent.Set();
+            }
+        }
+
+        void Self_OnJoinGroup(LLUUID groupID, bool success)
+        {
+            Console.WriteLine(Client.ToString() + (success ? " joined " : " failed to join ") + 
+                groupID.ToStringHyphenated());
+
+            if (success)
+            {
+                Console.WriteLine(Client.ToString() + " setting " + groupID.ToStringHyphenated() + 
+                    " as the active group");
+                Client.Self.ActivateGroup(groupID);
+            }
+        }
+    }
+}
-- 
cgit v1.1