OSDN Git Service

RAD-84 progress
authorLatif Khalifa <latifer@streamgrid.net>
Sat, 13 Feb 2010 09:58:59 +0000 (09:58 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Sat, 13 Feb 2010 09:58:59 +0000 (09:58 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@467 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/Core/ChatTextManager.cs
Radegast/Core/RLV/RLVManager.cs
Radegast/Core/RLV/RLVRule.cs
Radegast/GUI/Consoles/Inventory/InventoryConsole.cs
Radegast/GUI/Consoles/MapConsole.cs
Radegast/GUI/Consoles/TabsConsole.cs
Radegast/Program.cs

index c9bcffe..a23e878 100644 (file)
@@ -226,6 +226,14 @@ namespace Radegast
         {\r
             if (string.IsNullOrEmpty(e.Message)) return;\r
 \r
+            if (instance.RLV.Enabled && e.Message.StartsWith("@"))\r
+            {\r
+                instance.RLV.TryProcessCMD(e);\r
+#if !DEBUG\r
+                return;\r
+#endif\r
+            }\r
+\r
             StringBuilder sb = new StringBuilder();\r
             // if (e.SourceType == ChatSourceType.Object) {\r
             //    sb.Append(e.Position + " ");\r
index 0ae412d..ab489be 100644 (file)
@@ -32,17 +32,18 @@ using System;
 using System.Collections.Generic;\r
 using System.Linq;\r
 using System.Text;\r
+using System.Text.RegularExpressions;\r
 using OpenMetaverse;\r
 using OpenMetaverse.StructuredData;\r
 \r
-//RestrainedLife viewer v1.20c\r
-\r
 namespace Radegast\r
 {\r
     public class RLVManager : IDisposable\r
     {\r
 \r
-        private RadegastInstance instance;\r
+        RadegastInstance instance;\r
+        Regex rlv_regex = new Regex(@"(?<behaviour>[^:=]+)(:(?<option>[^=]+))?=(?<param>\w+)", RegexOptions.Compiled);\r
+        List<RLVRule> rules = new List<RLVRule>();\r
 \r
         public bool Enabled\r
         {\r
@@ -71,5 +72,159 @@ namespace Radegast
         public void Dispose()\r
         {\r
         }\r
+\r
+        public bool TryProcessCMD(ChatEventArgs e)\r
+        {\r
+            if (!e.Message.StartsWith("@")) return false;\r
+\r
+            if (e.Message == "@clear")\r
+            {\r
+                ProcessClear(e.SourceID);\r
+                return true;\r
+            }\r
+\r
+            foreach (var cmd in e.Message.Substring(1).Split(','))\r
+            {\r
+                var m = rlv_regex.Match(cmd);\r
+                if (!m.Success) continue;\r
+                \r
+                var rule = new RLVRule();\r
+                rule.Behaviour = m.Groups["behaviour"].ToString().ToLower(); ;\r
+                rule.Option = m.Groups["option"].ToString().ToLower();\r
+                rule.Param = m.Groups["param"].ToString().ToLower();\r
+                rule.Sender = e.SourceID;\r
+                rule.SenderName = e.FromName;\r
+\r
+                Logger.DebugLog(rule.ToString());\r
+\r
+                if (rule.Param == "rem") rule.Param = "y";\r
+                if (rule.Param == "add") rule.Param = "n";\r
+\r
+                if (rule.Param == "n")\r
+                {\r
+                    lock (rules) rules.Add(rule);\r
+                    continue;\r
+                }\r
+\r
+                if (rule.Param == "y")\r
+                {\r
+                    lock (rules)\r
+                    {\r
+                        if (rule.Option == "")\r
+                        {\r
+                            rules.RemoveAll((RLVRule r) =>\r
+                                {\r
+                                    return r.Behaviour == rule.Behaviour && r.Sender == rule.Sender;\r
+                                });\r
+                        }\r
+                        else\r
+                        {\r
+                            rules.RemoveAll((RLVRule r) =>\r
+                            {\r
+                                return r.Behaviour == rule.Behaviour && r.Sender == rule.Sender && r.Option == rule.Option;\r
+                            });\r
+                        }\r
+                    }\r
+\r
+                    continue;\r
+                }\r
+\r
+\r
+                switch (rule.Behaviour)\r
+                {\r
+                    case "version":\r
+                        int chan = 0;\r
+                        if (int.TryParse(rule.Param, out chan) && chan > 0)\r
+                        {\r
+                            instance.Client.Self.Chat("RestrainedLife viewer v1.20c (" + Properties.Resources.RadegastTitle + "." + RadegastBuild.CurrentRev + ")", chan, ChatType.Normal);\r
+                        }\r
+                        break;\r
+\r
+                    case "versionnum":\r
+                        if (int.TryParse(rule.Param, out chan) && chan > 0)\r
+                        {\r
+                            instance.Client.Self.Chat("1210100", chan, ChatType.Normal);\r
+                        }\r
+                        break;\r
+\r
+                    case "sit":\r
+                        UUID sitTarget = UUID.Zero;\r
+\r
+                        if (rule.Param == "force" && UUID.TryParse(rule.Option, out sitTarget) && sitTarget != UUID.Zero)\r
+                        {\r
+                            instance.Client.Self.RequestSit(sitTarget, Vector3.Zero);\r
+                            instance.Client.Self.Sit();\r
+                        }\r
+                        break;\r
+\r
+                    case "unsit":\r
+                        if (rule.Param == "force")\r
+                        {\r
+                            instance.Client.Self.Stand();\r
+                        }\r
+                        break;\r
+\r
+                    case "setrot":\r
+                        double rot = 0.0;\r
+\r
+                        if (rule.Param == "force" && double.TryParse(rule.Option, System.Globalization.NumberStyles.Float, Utils.EnUsCulture, out rot))\r
+                        {\r
+                            instance.Client.Self.Movement.UpdateFromHeading(rot, true);\r
+                        }\r
+                        break;\r
+\r
+                    case "tpto":\r
+                        var coord = rule.Option.Split('/');\r
+                        \r
+                        try\r
+                        {\r
+                            float gx = float.Parse(coord[0], Utils.EnUsCulture);\r
+                            float gy = float.Parse(coord[1], Utils.EnUsCulture);\r
+                            float z = float.Parse(coord[2], Utils.EnUsCulture);\r
+                            float x = 0, y = 0;\r
+\r
+                            instance.TabConsole.DisplayNotificationInChat("Starting teleport...");\r
+                            ulong h = Helpers.GlobalPosToRegionHandle(gx, gy, out x, out y);\r
+                            instance.Client.Self.RequestTeleport(h, new Vector3(x, y, z));\r
+                        }\r
+                        catch (Exception) { }\r
+\r
+                        break;\r
+\r
+                }\r
+            }\r
+\r
+\r
+            return true;\r
+        }\r
+\r
+        void ProcessClear(UUID id)\r
+        {\r
+            rules.RemoveAll((RLVRule r) => { return r.Sender == id; });\r
+        }\r
+\r
+        public bool AllowDetach(AttachmentInfo a)\r
+        {\r
+            if (!Enabled || a == null) return true;\r
+\r
+            if (rules.FindAll((RLVRule r) => { return r.Behaviour == "detach" && r.Sender == a.Prim.ID; }).Count > 0)\r
+            {\r
+                return true;\r
+            }\r
+\r
+            return false;\r
+        }\r
+\r
+        public bool AutoAcceptTP(UUID agent)\r
+        {\r
+            if (!Enabled || agent == UUID.Zero) return false;\r
+\r
+            if (rules.FindAll((RLVRule r) => { return r.Behaviour == "accepttp" && (r.Option == "" || r.Option == agent.ToString()); }).Count > 0)\r
+            {\r
+                return true;\r
+            }\r
+\r
+            return false;\r
+        }\r
     }\r
 }\r
index ca9f1c3..d798c49 100644 (file)
@@ -42,5 +42,11 @@ namespace Radegast
         public string Option { set; get; }\r
         public string Param { set; get; }\r
         public UUID Sender { set; get; }\r
+        public string SenderName { set; get; }\r
+\r
+        public override string ToString()\r
+        {\r
+            return string.Format("{0}: {1}:{2}={3} [{4}]", SenderName, Behaviour, Option, Param, Sender);\r
+        }\r
     }\r
 }\r
index 5db03cc..b6df43e 100644 (file)
@@ -39,32 +39,9 @@ using OpenMetaverse;
 \r
 namespace Radegast\r
 {\r
+\r
     public partial class InventoryConsole : UserControl\r
     {\r
-        public class AttachmentInfo\r
-        {\r
-            public Primitive Prim;\r
-            public InventoryItem Item;\r
-            public UUID InventoryID;\r
-            public UUID PrimID;\r
-            public bool MarkedAttached = false;\r
-\r
-            public AttachmentPoint Point\r
-            {\r
-                get\r
-                {\r
-                    if (Prim != null)\r
-                    {\r
-                        return Prim.PrimData.AttachmentPoint;\r
-                    }\r
-                    else\r
-                    {\r
-                        return AttachmentPoint.Default;\r
-                    }\r
-                }\r
-            }\r
-        }\r
-\r
         RadegastInstance instance;\r
         GridClient client { get { return instance.Client; } }\r
         Dictionary<UUID, TreeNode> FolderNodes = new Dictionary<UUID, TreeNode>();\r
@@ -1179,7 +1156,7 @@ namespace Radegast
                     }\r
                     ctxInv.Items.Add(ctxItem);\r
 \r
-                    if (IsAttached(item))\r
+                    if (IsAttached(item) && instance.RLV.AllowDetach(attachments[item.UUID]))\r
                     {\r
                         ctxItem = new ToolStripMenuItem("Detach from yourself", null, OnInvContextClick);\r
                         ctxItem.Name = "detach";\r
@@ -1567,7 +1544,7 @@ namespace Radegast
                 }\r
             }\r
         }\r
-    \r
+\r
         #endregion\r
 \r
         private void UpdateWornLabels()\r
@@ -1895,4 +1872,30 @@ namespace Radegast
         }\r
     }\r
     #endregion\r
+\r
+    public class AttachmentInfo\r
+    {\r
+        public Primitive Prim;\r
+        public InventoryItem Item;\r
+        public UUID InventoryID;\r
+        public UUID PrimID;\r
+        public bool MarkedAttached = false;\r
+\r
+        public AttachmentPoint Point\r
+        {\r
+            get\r
+            {\r
+                if (Prim != null)\r
+                {\r
+                    return Prim.PrimData.AttachmentPoint;\r
+                }\r
+                else\r
+                {\r
+                    return AttachmentPoint.Default;\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+\r
 }\r
index b05696f..140f766 100644 (file)
@@ -187,10 +187,12 @@ namespace Radegast
                 case TeleportStatus.Failed:\r
                     InTeleport = false;\r
                     lblStatus.Text = "Failed: " + e.Message;\r
+                    instance.TabConsole.DisplayNotificationInChat("Teleport failed");\r
                     break;\r
 \r
                 case TeleportStatus.Finished:\r
                     lblStatus.Text = "Teleport complete";\r
+                    instance.TabConsole.DisplayNotificationInChat("Teleport complete");\r
                     InTeleport = false;\r
                     Network_SimChanged(null, null);\r
                     break;\r
index db86cf9..3352439 100644 (file)
@@ -293,7 +293,15 @@ namespace Radegast
                     break;\r
 \r
                 case InstantMessageDialog.RequestTeleport:\r
-                    instance.MainForm.AddNotification(new ntfTeleport(instance, e.IM));\r
+                    if (instance.RLV.AutoAcceptTP(e.IM.FromAgentID))\r
+                    {\r
+                        DisplayNotificationInChat("Auto accepting teleprot from " + e.IM.FromAgentName);\r
+                        instance.Client.Self.TeleportLureRespond(e.IM.FromAgentID, true);\r
+                    }\r
+                    else\r
+                    {\r
+                        instance.MainForm.AddNotification(new ntfTeleport(instance, e.IM));\r
+                    }\r
                     break;\r
 \r
                 case InstantMessageDialog.GroupInvitation:\r
index 83d8672..2d28b26 100644 (file)
@@ -30,7 +30,7 @@
 //\r
 using System;\r
 using System.Windows.Forms;\r
-\r
+using System.Text.RegularExpressions;\r
 namespace Radegast\r
 {\r
     static class Program\r