OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
UserCommandsModule.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 using System;
29 using System.Collections.Generic;
30 using System.Reflection;
31 using System.Text;
32 using System.Text.RegularExpressions;
33 using log4net;
34 using Mono.Addins;
35 using NDesk.Options;
36 using Nini.Config;
37 using OpenMetaverse;
38 using OpenSim.Framework;
39 using OpenSim.Framework.Console;
40 using OpenSim.Framework.Monitoring;
41 using OpenSim.Region.Framework.Interfaces;
42 using OpenSim.Region.Framework.Scenes;
43 
44 namespace OpenSim.Region.CoreModules.Avatars.Commands
45 {
49  [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UserCommandsModule")]
51  {
52 // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
53 
54  public const string TeleportUserCommandSyntax = "teleport user <first-name> <last-name> <destination>";
55 
56  public static Regex InterRegionDestinationRegex
57  = new Regex(@"^(?<regionName>.+)/(?<x>\d+)/(?<y>\d+)/(?<z>\d+)$", RegexOptions.Compiled);
58 
59  public static Regex WithinRegionDestinationRegex
60  = new Regex(@"^(?<x>\d+)/(?<y>\d+)/(?<z>\d+)$", RegexOptions.Compiled);
61 
62  private Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>();
63 
64  public string Name { get { return "User Commands Module"; } }
65 
66  public Type ReplaceableInterface { get { return null; } }
67 
68  public void Initialise(IConfigSource source)
69  {
70 // m_log.DebugFormat("[USER COMMANDS MODULE]: INITIALIZED MODULE");
71  }
72 
73  public void PostInitialise()
74  {
75 // m_log.DebugFormat("[USER COMMANDS MODULE]: POST INITIALIZED MODULE");
76  }
77 
78  public void Close()
79  {
80 // m_log.DebugFormat("[USER COMMANDS MODULE]: CLOSED MODULE");
81  }
82 
83  public void AddRegion(Scene scene)
84  {
85 // m_log.DebugFormat("[USER COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName);
86 
87  lock (m_scenes)
88  m_scenes[scene.RegionInfo.RegionID] = scene;
89 
90  scene.AddCommand(
91  "Users",
92  this,
93  "teleport user",
94  TeleportUserCommandSyntax,
95  "Teleport a user in this simulator to the given destination",
96  "<destination> is in format [<region-name>]/<x>/<y>/<z>, e.g. regionone/20/30/40 or just 20/30/40 to teleport within same region."
97  + "\nIf the region contains a space then the whole destination must be in quotes, e.g. \"region one/20/30/40\"",
98  HandleTeleportUser);
99  }
100 
101  public void RemoveRegion(Scene scene)
102  {
103 // m_log.DebugFormat("[USER COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
104 
105  lock (m_scenes)
106  m_scenes.Remove(scene.RegionInfo.RegionID);
107  }
108 
109  public void RegionLoaded(Scene scene)
110  {
111 // m_log.DebugFormat("[USER COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
112  }
113 
114  private ScenePresence GetUser(string firstName, string lastName)
115  {
116  ScenePresence userFound = null;
117 
118  lock (m_scenes)
119  {
120  foreach (Scene scene in m_scenes.Values)
121  {
122  ScenePresence user = scene.GetScenePresence(firstName, lastName);
123  if (user != null && !user.IsChildAgent)
124  {
125  userFound = user;
126  break;
127  }
128  }
129  }
130 
131  return userFound;
132  }
133 
134  private void HandleTeleportUser(string module, string[] cmd)
135  {
136  if (cmd.Length < 5)
137  {
138  MainConsole.Instance.OutputFormat("Usage: " + TeleportUserCommandSyntax);
139  return;
140  }
141 
142  string firstName = cmd[2];
143  string lastName = cmd[3];
144  string rawDestination = cmd[4];
145 
146  ScenePresence user = GetUser(firstName, lastName);
147 
148  if (user == null)
149  {
150  MainConsole.Instance.OutputFormat("No user found with name {0} {1}", firstName, lastName);
151  return;
152  }
153 
154 // MainConsole.Instance.OutputFormat("rawDestination [{0}]", rawDestination);
155 
156  Match m = WithinRegionDestinationRegex.Match(rawDestination);
157 
158  if (!m.Success)
159  {
160  m = InterRegionDestinationRegex.Match(rawDestination);
161 
162  if (!m.Success)
163  {
164  MainConsole.Instance.OutputFormat("Invalid destination {0}", rawDestination);
165  return;
166  }
167  }
168 
169  string regionName
170  = m.Groups["regionName"].Success ? m.Groups["regionName"].Value : user.Scene.RegionInfo.RegionName;
171 
172  MainConsole.Instance.OutputFormat(
173  "Teleporting {0} to {1},{2},{3} in {4}",
174  user.Name,
175  m.Groups["x"], m.Groups["y"], m.Groups["z"],
176  regionName);
177 
178  user.Scene.RequestTeleportLocation(
179  user.ControllingClient,
180  regionName,
181  new Vector3(
182  float.Parse(m.Groups["x"].Value),
183  float.Parse(m.Groups["y"].Value),
184  float.Parse(m.Groups["z"].Value)),
185  user.Lookat,
186  (uint)TeleportFlags.ViaLocation);
187  }
188  }
189 }
OpenSim.Framework.Constants.TeleportFlags TeleportFlags
void Initialise(IConfigSource source)
This is called to initialize the region module. For shared modules, this is called exactly once...
void AddRegion(Scene scene)
This is called whenever a Scene is added. For shared modules, this can happen several times...
void PostInitialise()
This is called exactly once after all the shared region-modules have been instanciated and IRegionMod...
Interactive OpenSim region server
Definition: OpenSim.cs:55
void RegionLoaded(Scene scene)
This will be called once for every scene loaded. In a shared module this will be multiple times in on...
A module that holds commands for manipulating objects in the scene.
void RemoveRegion(Scene scene)
This is called whenever a Scene is removed. For shared modules, this can happen several times...
void Close()
This is the inverse to Initialise. After a Close(), this instance won't be usable anymore...