OSDN Git Service

More typofixes.
[radegast/radegast.git] / Radegast / Core / Commands / TPComand.cs
1 // 
2 // Radegast Metaverse Client
3 // Copyright (c) 2009, Radegast Development Team
4 // All rights reserved.
5 // 
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
8 // 
9 //     * Redistributions of source code must retain the above copyright notice,
10 //       this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above copyright
12 //       notice, this list of conditions and the following disclaimer in the
13 //       documentation and/or other materials provided with the distribution.
14 //     * Neither the name of the application "Radegast", nor the names of its
15 //       contributors may be used to endorse or promote products derived from
16 //       this software without specific prior written permission.
17 // 
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 //
29 // $Id$
30 //
31 using System;
32 using System.Collections.Generic;
33 using System.Text;
34 using System.Text.RegularExpressions;
35 using System.Windows.Forms;
36
37 using OpenMetaverse;
38
39 namespace Radegast.Commands
40 {
41     public class TPCommand : RadegastCommand
42     {
43         TabsConsole TC { get { return Instance.TabConsole; } }
44         public static string FolderName = "Radegast Landmarks";
45         Inventory Inv { get { return Client.Inventory.Store; } }
46
47         public TPCommand(RadegastInstance instance)
48             : base(instance)
49         {
50             Name = "tp";
51             Description = @"Teleport to a named landmark from ""{1}"" inventory folder";
52             Usage = "tp (list|landmark name|landmark number|help) (type \"" + CommandsManager.CmdPrefix + "tp help\" for full usage)";
53             
54         }
55
56         public override void Dispose()
57         {
58             base.Dispose();
59         }
60
61         void PrintUsage()
62         {
63             TC.DisplayNotificationInChat("Wrong arguments for \"tp\" command. For detailed description type: " + CommandsManager.CmdPrefix + "tp help");
64         }
65
66         void PrintFullUsage()
67         {
68             TC.DisplayNotificationInChat(string.Format(@"Usage:
69 {0}tp (list|landmark name|landmark number|help)
70
71 List mode:
72 Lists landmarks in ""{1}"" folder
73 Example:
74 {0}tp list
75
76 Landmark name mode:
77 Specifies name of the landmark to teleport to
78 Example:
79 {0}tp Latif's place -- teleports to a landmark whose name begins with ""Latif's place""
80
81 Landmark number mode:
82 Teleport to landmark number specified
83 Example:
84 {0}tp 3 -- teleports to landmark number 3 as printed in {0}tp list output", CommandsManager.CmdPrefix, FolderName));
85         }
86
87         public override void Execute(string name, string[] cmdArgs, ConsoleWriteLine WriteLine)
88         {
89             InventoryFolder folder = (InventoryFolder)Inv.GetContents(Inv.RootFolder).Find((InventoryBase b) => { return b.Name == FolderName && b is InventoryFolder; });
90             if (folder == null)
91             {
92                 Client.Inventory.CreateFolder(Inv.RootFolder.UUID, FolderName);
93                 WriteLine(@"Could not find ""{0}"" folder in the inventory, creating one.", FolderName);
94                 return;
95             }
96
97             if (cmdArgs.Length == 0) { PrintUsage(); return; }
98
99             List<InventoryLandmark> landmarks = new List<InventoryLandmark>();
100             Inv.GetContents(folder)
101                 .FindAll((InventoryBase b) => { return b is InventoryLandmark; })
102                 .ForEach((InventoryBase l) => { landmarks.Add((InventoryLandmark)l); });
103
104             if (landmarks.Count == 0)
105             {
106                 WriteLine(@"""{0}"" folder is empty, nothing to do.", FolderName);
107                 return;
108             }
109
110             string cmd = string.Join(" ", cmdArgs);
111
112             if (cmd == "help")
113             {
114                 PrintFullUsage();
115                 return;
116             }
117
118             landmarks.Sort(new LMSorter());
119
120             if (cmd == "list")
121             {
122                 StringBuilder sb = new StringBuilder();
123                 sb.AppendLine("Landmarks:");
124                 for (int i = 0; i < landmarks.Count; i++)
125                 {
126                     sb.AppendLine(string.Format("{0}. {1}", i + 1, landmarks[i].Name));
127                 }
128                 WriteLine(sb.ToString());
129                 return;
130             }
131
132             int lmnr;
133             if (int.TryParse(cmd, out lmnr))
134             {
135                 if (lmnr >= 1 && lmnr <= landmarks.Count)
136                 {
137                     WriteLine("Teleporting to {0}", landmarks[lmnr - 1].Name);
138                     Client.Self.RequestTeleport(landmarks[lmnr - 1].AssetUUID);
139                 }
140                 else
141                 {
142                     WriteLine("Valid landmark number is between 1 and {0}", landmarks.Count);
143                 }
144                 return;
145             }
146
147             InventoryLandmark lm = landmarks.Find((InventoryLandmark l) => { return l.Name.ToLower().StartsWith(cmd.ToLower()); });
148             if (lm == null)
149             {
150                 WriteLine("Could not find landmark {0}, try {1}tp list", cmd, CommandsManager.CmdPrefix);
151                 return;
152             }
153             else
154             {
155                 WriteLine("Teleporting to {0}", lm.Name);
156                 Client.Self.RequestTeleport(lm.AssetUUID);
157                 return;
158             }
159         }
160
161         class LMSorter : IComparer<InventoryLandmark>
162         {
163             public int Compare(InventoryLandmark lm1, InventoryLandmark lm2)
164             {
165                 return DateTime.Compare(lm1.CreationDate, lm2.CreationDate);
166             }
167         }
168     }
169 }