attempt to fix the muliple repeat problem (that sdague is getting) in the IRC chat bridge code.

afrisby
MW 2007-10-22 14:20:59 +00:00
parent 155005cba6
commit 22e330c1a0
2 changed files with 211 additions and 208 deletions

View File

@ -1,214 +1,214 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright * * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the * * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules; using OpenSim.Region.Environment.Modules;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using Nini.Config; using Nini.Config;
namespace OpenSim.Region.Environment namespace OpenSim.Region.Environment
{ {
public class ModuleLoader public class ModuleLoader
{ {
public Dictionary<string, Assembly> LoadedAssemblys = new Dictionary<string, Assembly>(); public Dictionary<string, Assembly> LoadedAssemblys = new Dictionary<string, Assembly>();
public List<IRegionModule> LoadedModules = new List<IRegionModule>(); public List<IRegionModule> LoadedModules = new List<IRegionModule>();
public Dictionary<string, IRegionModule> LoadedSharedModules = new Dictionary<string, IRegionModule>(); public Dictionary<string, IRegionModule> LoadedSharedModules = new Dictionary<string, IRegionModule>();
private readonly LogBase m_log; private readonly LogBase m_log;
private IConfigSource m_config; private IConfigSource m_config;
public ModuleLoader(LogBase log, IConfigSource config) public ModuleLoader(LogBase log, IConfigSource config)
{ {
m_log = log; m_log = log;
m_config = config; m_config = config;
} }
public void PickupModules(Scene scene, string moduleDir) public void PickupModules(Scene scene, string moduleDir)
{ {
DirectoryInfo dir = new DirectoryInfo(moduleDir); DirectoryInfo dir = new DirectoryInfo(moduleDir);
foreach (FileInfo fileInfo in dir.GetFiles("*.dll")) foreach (FileInfo fileInfo in dir.GetFiles("*.dll"))
{ {
LoadRegionModules(fileInfo.FullName, scene); LoadRegionModules(fileInfo.FullName, scene);
} }
} }
public void LoadDefaultSharedModules() public void LoadDefaultSharedModules()
{ {
DynamicTextureModule dynamicModule = new DynamicTextureModule(); DynamicTextureModule dynamicModule = new DynamicTextureModule();
LoadedSharedModules.Add(dynamicModule.Name, dynamicModule); LoadedSharedModules.Add(dynamicModule.Name, dynamicModule);
ChatModule chat = new ChatModule(); ChatModule chat = new ChatModule();
LoadedSharedModules.Add(chat.Name, chat); LoadedSharedModules.Add(chat.Name, chat);
InstantMessageModule imMod = new InstantMessageModule(); InstantMessageModule imMod = new InstantMessageModule();
LoadedSharedModules.Add(imMod.Name, imMod); LoadedSharedModules.Add(imMod.Name, imMod);
LoadImageURLModule loadMod = new LoadImageURLModule(); LoadImageURLModule loadMod = new LoadImageURLModule();
LoadedSharedModules.Add(loadMod.Name, loadMod); LoadedSharedModules.Add(loadMod.Name, loadMod);
} }
public void InitialiseSharedModules(Scene scene) public void InitialiseSharedModules(Scene scene)
{ {
foreach (IRegionModule module in LoadedSharedModules.Values) foreach (IRegionModule module in LoadedSharedModules.Values)
{ {
module.Initialise(scene, m_config); module.Initialise(scene, m_config);
scene.AddModule(module.Name, module); //should be doing this? scene.AddModule(module.Name, module); //should be doing this?
} }
} }
public void InitializeModule(IRegionModule module, Scene scene) public void InitializeModule(IRegionModule module, Scene scene)
{ {
module.Initialise(scene, m_config); module.Initialise(scene, m_config);
scene.AddModule(module.Name, module); scene.AddModule(module.Name, module);
LoadedModules.Add(module); LoadedModules.Add(module);
} }
/// <summary> /// <summary>
/// Loads/initialises a Module instance that can be used by mutliple Regions /// Loads/initialises a Module instance that can be used by mutliple Regions
/// </summary> /// </summary>
/// <param name="dllName"></param> /// <param name="dllName"></param>
/// <param name="moduleName"></param> /// <param name="moduleName"></param>
/// <param name="scene"></param> /// <param name="scene"></param>
public void LoadSharedModule(string dllName, string moduleName) public void LoadSharedModule(string dllName, string moduleName)
{ {
IRegionModule module = LoadModule(dllName, moduleName); IRegionModule module = LoadModule(dllName, moduleName);
if (module != null) if (module != null)
{ {
LoadedSharedModules.Add(module.Name, module); LoadedSharedModules.Add(module.Name, module);
} }
} }
public void LoadRegionModules(string dllName, Scene scene) public void LoadRegionModules(string dllName, Scene scene)
{ {
IRegionModule[] modules = LoadModules(dllName); IRegionModule[] modules = LoadModules(dllName);
if (modules.Length > 0) if (modules.Length > 0)
{ {
m_log.Verbose("MODULES", "Found Module Library [{0}]", dllName ); m_log.Verbose("MODULES", "Found Module Library [{0}]", dllName );
foreach (IRegionModule module in modules) foreach (IRegionModule module in modules)
{ {
if (!module.IsSharedModule) if (!module.IsSharedModule)
{ {
m_log.Verbose("MODULES", " [{0}]: Initializing.", module.Name); m_log.Verbose("MODULES", " [{0}]: Initializing.", module.Name);
InitializeModule(module, scene); InitializeModule(module, scene);
} }
} }
} }
} }
public void LoadRegionModule(string dllName, string moduleName, Scene scene) public void LoadRegionModule(string dllName, string moduleName, Scene scene)
{ {
IRegionModule module = LoadModule(dllName, moduleName); IRegionModule module = LoadModule(dllName, moduleName);
if (module != null) if (module != null)
{ {
InitializeModule(module, scene); InitializeModule(module, scene);
} }
} }
/// <summary> /// <summary>
/// Loads a external Module (if not already loaded) and creates a new instance of it. /// Loads a external Module (if not already loaded) and creates a new instance of it.
/// </summary> /// </summary>
/// <param name="dllName"></param> /// <param name="dllName"></param>
/// <param name="moduleName"></param> /// <param name="moduleName"></param>
/// <param name="scene"></param> /// <param name="scene"></param>
public IRegionModule LoadModule(string dllName, string moduleName) public IRegionModule LoadModule(string dllName, string moduleName)
{ {
IRegionModule[] modules = LoadModules(dllName); IRegionModule[] modules = LoadModules(dllName);
foreach (IRegionModule module in modules) foreach (IRegionModule module in modules)
{ {
if ((module != null) && (module.Name == moduleName)) if ((module != null) && (module.Name == moduleName))
{ {
return module; return module;
} }
} }
return null; return null;
} }
public IRegionModule[] LoadModules(string dllName) public IRegionModule[] LoadModules(string dllName)
{ {
List<IRegionModule> modules = new List<IRegionModule>(); List<IRegionModule> modules = new List<IRegionModule>();
Assembly pluginAssembly; Assembly pluginAssembly;
if (!LoadedAssemblys.TryGetValue(dllName, out pluginAssembly )) if (!LoadedAssemblys.TryGetValue(dllName, out pluginAssembly ))
{ {
try try
{ {
pluginAssembly = Assembly.LoadFrom(dllName); pluginAssembly = Assembly.LoadFrom(dllName);
LoadedAssemblys.Add(dllName, pluginAssembly); LoadedAssemblys.Add(dllName, pluginAssembly);
} }
catch( BadImageFormatException e ) catch( BadImageFormatException e )
{ {
m_log.Warn( "MODULES", "The file [{0}] is not a module assembly.", e.FileName ); m_log.Warn( "MODULES", "The file [{0}] is not a module assembly.", e.FileName );
} }
} }
if (pluginAssembly != null) if (pluginAssembly != null)
{ {
foreach (Type pluginType in pluginAssembly.GetTypes()) foreach (Type pluginType in pluginAssembly.GetTypes())
{ {
if (pluginType.IsPublic) if (pluginType.IsPublic)
{ {
if (!pluginType.IsAbstract) if (!pluginType.IsAbstract)
{ {
if( pluginType.GetInterface("IRegionModule") != null ) if( pluginType.GetInterface("IRegionModule") != null )
{ {
modules.Add((IRegionModule) Activator.CreateInstance(pluginType)); modules.Add((IRegionModule) Activator.CreateInstance(pluginType));
} }
} }
} }
} }
} }
return modules.ToArray(); return modules.ToArray();
} }
public void PostInitialise() public void PostInitialise()
{ {
foreach (IRegionModule module in LoadedSharedModules.Values) foreach (IRegionModule module in LoadedSharedModules.Values)
{ {
module.PostInitialise(); module.PostInitialise();
} }
foreach (IRegionModule module in LoadedModules) foreach (IRegionModule module in LoadedModules)
{ {
module.PostInitialise(); module.PostInitialise();
} }
} }
public void ClearCache() public void ClearCache()
{ {
LoadedAssemblys.Clear(); LoadedAssemblys.Clear();
} }
} }
} }

View File

@ -344,11 +344,14 @@ namespace OpenSim.Region.Environment.Modules
string mess = inputLine.Substring(inputLine.IndexOf(m_channel)); string mess = inputLine.Substring(inputLine.IndexOf(m_channel));
foreach (Scene m_scene in m_scenes) foreach (Scene m_scene in m_scenes)
{ {
m_scene.Broadcast(delegate(IClientAPI client) m_scene.ForEachScenePresence(delegate(ScenePresence avatar)
{ {
client.SendChatMessage( if (!avatar.IsChildAgent)
Helpers.StringToField(mess), 255, pos, "IRC:", {
LLUUID.Zero); avatar.ControllingClient.SendChatMessage(
Helpers.StringToField(mess), 255, pos, "IRC:",
LLUUID.Zero);
}
}); });
} }
} }