/* * Copyright (c) Contributors, https://github.com/jonc/osboids * See CONTRIBUTORS.TXT for a full list of copyright holders. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the OpenSimulator Project nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * 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 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ using System; using System.Collections.Generic; using log4net; using OpenMetaverse; using OpenSim.Framework; using OpenSim.Region.Framework.Scenes; using OpenSim.Framework.Console; using OpenSim.Region.Framework.Interfaces; namespace Flocking { public delegate void BoidCmdDelegate (string module,string[] args); public class BoidCmdDefn { public string Help = ""; public string Args = ""; public int NumParams = 0; string m_name; public BoidCmdDefn (string name, string args, string help) { Help = help; Args = args; m_name = name; if (args.Trim ().Length > 0) { NumParams = args.Split (",".ToCharArray ()).Length; } else { NumParams = 0; } } public string GetSyntax () { return m_name + " " + Args + " (" + Help + ")"; } } public class FlockingCommandParser { private static readonly ILog m_log = LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod ().DeclaringType); private IRegionModuleBase m_module; private Scene m_scene; private int m_chatChannel; private UUID m_owner; private Dictionary m_commandMap = new Dictionary (); private Dictionary m_syntaxMap = new Dictionary (); public FlockingCommandParser (IRegionModuleBase module, Scene scene, int channel) { m_module = module; m_scene = scene; m_chatChannel = channel; // who do we respond to in send messages m_owner = scene.RegionInfo.EstateSettings.EstateOwner; // register our event handlers m_scene.EventManager.OnChatFromClient += ProcessChatCommand; //listen for commands sent from the client IScriptModuleComms commsMod = scene.RequestModuleInterface(); commsMod.OnScriptCommand += ProcessScriptCommand; } public void Deregister () { m_scene.EventManager.OnChatFromClient -= ProcessChatCommand; IScriptModuleComms commsMod = m_scene.RequestModuleInterface(); commsMod.OnScriptCommand -= ProcessScriptCommand; } public void AddCommand (string cmd, string args, string help, CommandDelegate fn) { string argStr = ""; if (args.Trim ().Length > 0) { argStr = " <" + args + "> "; } m_commandMap.Add (cmd, new BoidCmdDelegate (fn)); m_syntaxMap.Add (cmd, new BoidCmdDefn (cmd, args, help)); // register this command with the console m_scene.AddCommand (m_module, "flock-" + cmd, "flock-" + cmd + argStr, help, fn); } #region handlers public void ProcessScriptCommand (UUID scriptId, string reqId, string module, string input, string key) { if (m_module.Name != module) { return; } string[] tokens = (input+"|