OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
BasicSearchModule.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 using System;
28 using System.Collections.Generic;
29 using System.IO;
30 using System.Reflection;
31 using System.Threading;
32 
33 using OpenSim.Framework;
34 using OpenSim.Framework.Console;
35 using OpenSim.Framework.Monitoring;
36 using OpenSim.Region.ClientStack.LindenUDP;
37 using OpenSim.Region.Framework;
38 using OpenSim.Region.Framework.Interfaces;
39 using OpenSim.Region.Framework.Scenes;
40 using OpenSim.Services.Interfaces;
41 using OpenSim.Services.Connectors.Hypergrid;
42 
43 using OpenMetaverse;
44 using OpenMetaverse.Packets;
45 using log4net;
46 using Nini.Config;
47 using Mono.Addins;
48 
50 
51 namespace OpenSim.Region.CoreModules.Framework.Search
52 {
53  [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BasicSearchModule")]
55  {
56  private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
57 
58  protected bool m_Enabled;
59  protected List<Scene> m_Scenes = new List<Scene>();
60 
61  private IGroupsModule m_GroupsService = null;
62 
63  #region ISharedRegionModule
64 
65  public void Initialise(IConfigSource config)
66  {
67  string umanmod = config.Configs["Modules"].GetString("SearchModule", Name);
68  if (umanmod == Name)
69  {
70  m_Enabled = true;
71  m_log.DebugFormat("[BASIC SEARCH MODULE]: {0} is enabled", Name);
72  }
73  }
74 
75  public bool IsSharedModule
76  {
77  get { return true; }
78  }
79 
80  public virtual string Name
81  {
82  get { return "BasicSearchModule"; }
83  }
84 
85  public Type ReplaceableInterface
86  {
87  get { return null; }
88  }
89 
90  public void AddRegion(Scene scene)
91  {
92  if (m_Enabled)
93  {
94  m_Scenes.Add(scene);
95 
96  scene.EventManager.OnMakeRootAgent += new Action<ScenePresence>(EventManager_OnMakeRootAgent);
97  scene.EventManager.OnMakeChildAgent += new EventManager.OnMakeChildAgentDelegate(EventManager_OnMakeChildAgent);
98  }
99  }
100 
101  public void RemoveRegion(Scene scene)
102  {
103  if (m_Enabled)
104  {
105  m_Scenes.Remove(scene);
106 
107  scene.EventManager.OnMakeRootAgent -= new Action<ScenePresence>(EventManager_OnMakeRootAgent);
108  scene.EventManager.OnMakeChildAgent -= new EventManager.OnMakeChildAgentDelegate(EventManager_OnMakeChildAgent);
109  }
110  }
111 
112  public void RegionLoaded(Scene s)
113  {
114  if (!m_Enabled)
115  return;
116 
117  if (m_GroupsService == null)
118  {
119  m_GroupsService = s.RequestModuleInterface<IGroupsModule>();
120 
121  // No Groups Service Connector, then group search won't work...
122  if (m_GroupsService == null)
123  m_log.Warn("[BASIC SEARCH MODULE]: Could not get IGroupsModule");
124  }
125  }
126 
127  public void PostInitialise()
128  {
129  }
130 
131  public void Close()
132  {
133  m_Scenes.Clear();
134  }
135 
136  #endregion ISharedRegionModule
137 
138 
139  #region Event Handlers
140 
141  void EventManager_OnMakeRootAgent(ScenePresence sp)
142  {
143  sp.ControllingClient.OnDirFindQuery += OnDirFindQuery;
144  }
145 
146  void EventManager_OnMakeChildAgent(ScenePresence sp)
147  {
148  sp.ControllingClient.OnDirFindQuery -= OnDirFindQuery;
149  }
150 
151  void OnDirFindQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, int queryStart)
152  {
153  queryText = queryText.Trim();
154 
155  if (((DirFindFlags)queryFlags & DirFindFlags.People) == DirFindFlags.People)
156  {
157  if (string.IsNullOrEmpty(queryText))
158  remoteClient.SendDirPeopleReply(queryID, new DirPeopleReplyData[0]);
159 
160  List<UserAccount> accounts = m_Scenes[0].UserAccountService.GetUserAccounts(m_Scenes[0].RegionInfo.ScopeID, queryText);
161  DirPeopleReplyData[] hits = new DirPeopleReplyData[accounts.Count];
162  int i = 0;
163  foreach (UserAccount acc in accounts)
164  {
166  d.agentID = acc.PrincipalID;
167  d.firstName = acc.FirstName;
168  d.lastName = acc.LastName;
169  d.online = false;
170 
171  hits[i++] = d;
172  }
173 
174  // TODO: This currently ignores pretty much all the query flags including Mature and sort order
175  remoteClient.SendDirPeopleReply(queryID, hits);
176  }
177  else if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups)
178  {
179  if (m_GroupsService == null)
180  {
181  m_log.Warn("[BASIC SEARCH MODULE]: Groups service is not available. Unable to search groups.");
182  remoteClient.SendAlertMessage("Groups search is not enabled");
183  return;
184  }
185 
186  if (string.IsNullOrEmpty(queryText))
187  remoteClient.SendDirGroupsReply(queryID, new DirGroupsReplyData[0]);
188 
189  // TODO: This currently ignores pretty much all the query flags including Mature and sort order
190  remoteClient.SendDirGroupsReply(queryID, m_GroupsService.FindGroups(remoteClient, queryText).ToArray());
191  }
192 
193  }
194 
195  #endregion Event Handlers
196 
197  }
198 
199 }
void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data)
void Initialise(IConfigSource config)
This is called to initialize the region module. For shared modules, this is called exactly once...
void Close()
This is the inverse to Initialise. After a Close(), this instance won't be usable anymore...
void RegionLoaded(Scene s)
This will be called once for every scene loaded. In a shared module this will be multiple times in on...
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 SendDirGroupsReply(UUID queryID, DirGroupsReplyData[] data)
OpenMetaverse.DirectoryManager.DirFindFlags DirFindFlags
void AddRegion(Scene scene)
This is called whenever a Scene is added. For shared modules, this can happen several times...
void RemoveRegion(Scene scene)
This is called whenever a Scene is removed. For shared modules, this can happen several times...
OpenMetaverse.DirectoryManager.DirFindFlags DirFindFlags
Definition: GroupsModule.cs:41