You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

401 lines
19 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProxyCore.Output;
using System.Text.RegularExpressions;
using ProxyCore.Input;
namespace ProxyCore.Scripting
{
public class Plugin
{
protected Plugin(string keyword, string name)
{
Keyword = keyword;
Name = name;
}
/// <summary>
/// Set this to be your configuration file if you want your plugin to have one. This is optional.
/// </summary>
public ConfigFile Config
{
get;
protected set;
}
/// <summary>
/// Name of your plugin. You must set this or your plugin will not be loaded.
/// </summary>
public readonly string Name;
/// <summary>
/// This is the keyword for your plugin. You must set this or your plugin will not be loaded.
/// This must be unique. If two or more plugins with the same keyword are found then the plugin
/// with the highest version number is loaded.
/// </summary>
public readonly string Keyword;
/// <summary>
/// Creator of the plugin, this is your name / character's name. This is optional.
/// </summary>
public string Author
{
get;
protected set;
}
/// <summary>
/// Version of your plugin. This is optional.
/// </summary>
public int Version
{
get;
protected set;
}
/// <summary>
/// Description about your plugin. You should explain here what it does and how to handle it.
/// This will be displayed if user requests information about your plugin. This is optional.
/// </summary>
public string Description
{
get;
protected set;
}
/// <summary>
/// Enter a website for this plugin if you wish. Mostly used to see documentation and updates.
/// </summary>
public string Website
{
get;
protected set;
}
/// <summary>
/// Enter the URL for update checking txt file. For example "www.duckbat.com/plugins/update.moons.txt".
/// In the text file enter the number of last version. For example whole contents of the txt file can be "3".
/// Indicating that the last version for this plugin is 3. If version is greater than user's version and
/// they have update checking on then they will be notified that there is a more up to date version out there.
/// </summary>
public string UpdateUrl
{
get;
protected set;
}
/// <summary>
/// Does this plugin require a certain version of core? Set this if there was an update and your plugin requires it.
/// Plugin is not loaded if an older version core than this is used and user will be notified.
/// </summary>
public int RequiredCoreVersion
{
get;
protected set;
}
/// <summary>
/// Register a new trigger.
/// </summary>
/// <param name="Name">Unique identifier for the trigger.</param>
/// <param name="Pattern">Regex pattern for the trigger.</param>
/// <param name="Function">Function that will be called if this trigger fires.</param>
protected void RegisterTrigger(string Name, string Pattern, TriggerFunction Function)
{
RegisterTrigger(Name, Pattern, Function, TriggerFlags.None);
}
/// <summary>
/// Register a new trigger.
/// </summary>
/// <param name="Name">Unique identifier for the trigger.</param>
/// <param name="Pattern">Regex pattern for the trigger.</param>
/// <param name="Function">Function that will be called if this trigger fires.</param>
/// <param name="Flags">Options for the trigger.</param>
protected void RegisterTrigger(string Name, string Pattern, TriggerFunction Function, TriggerFlags Flags)
{
RegisterTrigger(Name, Pattern, Function, Flags, 1000);
}
/// <summary>
/// Register a new trigger.
/// </summary>
/// <param name="Name">Unique identifier for the trigger.</param>
/// <param name="Pattern">Regex pattern for the trigger.</param>
/// <param name="Function">Function that will be called if this trigger fires.</param>
/// <param name="Flags">Options for the trigger.</param>
/// <param name="Priority">Lower priority triggers get matched first.</param>
protected void RegisterTrigger(string Name, string Pattern, TriggerFunction Function, TriggerFlags Flags, int Priority)
{
RegisterTrigger(Name, Pattern, Function, Flags, Priority, 0);
}
/// <summary>
/// Register a new trigger.
/// </summary>
/// <param name="Name">Unique identifier for the trigger.</param>
/// <param name="Pattern">Regex pattern for the trigger.</param>
/// <param name="Function">Function that will be called if this trigger fires.</param>
/// <param name="Flags">Options for the trigger.</param>
/// <param name="Priority">Lower priority triggers get matched first.</param>
/// <param name="Arg">Custom argument that will be passed to trigger data.</param>
protected void RegisterTrigger(string Name, string Pattern, TriggerFunction Function, TriggerFlags Flags, int Priority, int Arg)
{
TriggerHandler.RegisterTrigger(Keyword.ToLower().Trim() + "." + Name, Pattern, Function, Flags, Priority, Arg, Keyword.ToLower().Trim());
}
/// <summary>
/// Unregister a trigger by name.
/// </summary>
/// <param name="Name">Name of the trigger you wish to unregister.</param>
protected void UnregisterTrigger(string Name)
{
TriggerHandler.UnregisterTrigger(Keyword.ToLower().Trim() + "." + Name);
}
/// <summary>
/// Register a new command or overwrite a previous one.
/// </summary>
/// <param name="Cmd">Command to register.</param>
/// <param name="Args">Arguments to match (regex pattern). This can be set to null or empty string
/// if you don't want to capture anything or plan to do so in the function yourself.</param>
/// <param name="f">Function of command.</param>
protected void RegisterCommand(string Cmd, string Args, CmdFunction f)
{
RegisterCommand(Cmd, Args, f, 0);
}
/// <summary>
/// Register a new command or overwrite a previous one.
/// </summary>
/// <param name="Cmd">Command to register.</param>
/// <param name="Args">Arguments to match (regex pattern). This can be set to null or empty string
/// if you don't want to capture anything or plan to do so in the function yourself.</param>
/// <param name="f">Function of command.</param>
/// <param name="MinLength">Minimum length of command typed required to activate. For example if command is "plugins" and this is 6 then "plugin" and "plugins" both activate this command but "plugi" won't. Enter 0 to disable this behaviour.</param>
protected void RegisterCommand(string Cmd, string Args, CmdFunction f, int MinLength)
{
RegisterCommand(Cmd, Args, f, MinLength, CMDFlags.None);
}
/// <summary>
/// Register a new command or overwrite a previous one.
/// </summary>
/// <param name="Cmd">Command to register.</param>
/// <param name="Args">Arguments to match (regex pattern). This can be set to null or empty string
/// if you don't want to capture anything or plan to do so in the function yourself.</param>
/// <param name="f">Function of command.</param>
/// <param name="MinLength">Minimum length of command typed required to activate. For example if command is "plugins" and this is 6 then "plugin" and "plugins" both activate this command but "plugi" won't. Enter 0 to disable this behaviour.</param>
/// <param name="flags">Options for command.</param>
protected void RegisterCommand(string Cmd, string Args, CmdFunction f, int MinLength, CMDFlags flags)
{
RegisterCommand(Cmd, Args, f, MinLength, flags, null);
}
/// <summary>
/// Register a new command or overwrite a previous one.
/// </summary>
/// <param name="Cmd">Command to register.</param>
/// <param name="Args">Arguments to match (regex pattern). This can be set to null or empty string
/// if you don't want to capture anything or plan to do so in the function yourself.</param>
/// <param name="f">Function of command.</param>
/// <param name="MinLength">Minimum length of command typed required to activate. For example if command is "plugins" and this is 6 then "plugin" and "plugins" both activate this command but "plugi" won't. Enter 0 to disable this behaviour.</param>
/// <param name="flags">Options for command.</param>
/// <param name="parent">Parent command (if you want to create a subcommand). You can enter commands separated with space if it's nested.</param>
protected void RegisterCommand(string Cmd, string Args, CmdFunction f, int MinLength, CMDFlags flags, string parent)
{
RegisterCommand(Cmd, Args, f, MinLength, flags, parent, 0);
}
/// <summary>
/// Register a new command or overwrite a previous one.
/// </summary>
/// <param name="Cmd">Command to register.</param>
/// <param name="Args">Arguments to match (regex pattern). This can be set to null or empty string
/// if you don't want to capture anything or plan to do so in the function yourself.</param>
/// <param name="f">Function of command.</param>
/// <param name="MinLength">Minimum length of command typed required to activate. For example if command is "plugins" and this is 6 then "plugin" and "plugins" both activate this command but "plugi" won't. Enter 0 to disable this behaviour.</param>
/// <param name="flags">Options for command.</param>
/// <param name="parent">Parent command (if you want to create a subcommand). You can enter commands separated with space if it's nested.</param>
/// <param name="Arg">Custom argument to pass to function handler. This way you can register multiple commands to a same
/// function handler only differentiating them with this custom argument.</param>
protected void RegisterCommand(string Cmd, string Args, CmdFunction f, int MinLength, CMDFlags flags, string parent, int Arg)
{
RegisterCommand(Cmd, Args, f, MinLength, flags, parent, Arg, ulong.MaxValue);
}
/// <summary>
/// Register a new command or overwrite a previous one.
/// </summary>
/// <param name="Cmd">Command to register.</param>
/// <param name="Args">Arguments to match (regex pattern). This can be set to null or empty string
/// if you don't want to capture anything or plan to do so in the function yourself.</param>
/// <param name="f">Function of command.</param>
/// <param name="flags">Options for command.</param>
/// <param name="parent">Parent command (if you want to create a subcommand). You can enter commands separated with space if it's nested.</param>
/// <param name="Arg">Custom argument to pass to function handler. This way you can register multiple commands to a same
/// function handler only differentiating them with this custom argument.</param>
/// <param name="AuthMask">Mask of allowed auth levels to access this command. Default ulong.MaxValue (meaning all auth levels are allowed).
/// Enter 3 for example to allow only auth level 1 and 2 to access this command.</param>
/// <param name="MinLength">Minimum length of command typed required to activate. For example if command is "plugins" and this is 6 then "plugin" and "plugins" both activate this command but "plugi" won't. Enter 0 to disable this behaviour.</param>
protected void RegisterCommand(string Cmd, string Args, CmdFunction f, int MinLength, CMDFlags flags, string parent, int Arg, ulong AuthMask)
{
InputHandler.RegisterCommand(Cmd, Args, f, flags, parent, Arg, AuthMask, Keyword.ToLower().Trim(), MinLength);
}
/// <summary>
/// Unregister a command.
/// </summary>
/// <param name="Cmd">Command to unregister. If you want to unregister a nested command
/// separate commands with a space.</param>
protected void UnregisterCommand(string Cmd)
{
InputHandler.UnregisterCommand(Cmd);
}
/// <summary>
/// This will be called when character enters the game. Either by log in or reconnect.
/// </summary>
public virtual void OnLogin()
{
}
/// <summary>
/// This will be called when we disconnect from Aardwolf.
/// </summary>
public virtual void OnDisconnect()
{
}
/// <summary>
/// This will be called when we connect to Aardwolf.
/// </summary>
public virtual void OnConnect()
{
}
/// <summary>
/// This is called when program shuts down. Write any code you need to shut down your plugin.
/// </summary>
public virtual void Shutdown()
{
}
/// <summary>
/// This is called on every loop of world update. You can use it as your main loop for
/// the plugin if you need one.
/// </summary>
/// <param name="msTime">Current time since program startup.</param>
public virtual void Update(long msTime)
{
}
/// <summary>
/// This is called when we receive a line from MUD. It is called AFTER triggers are done with it. If
/// a trigger gagged the line this will not be called.
/// </summary>
/// <param name="Msg"></param>
public virtual void OnReceivedLineAfter(Messages.Message Msg)
{
}
/// <summary>
/// This is called when we receive a line from MUD. It is called BEFORE triggers are done with it.
/// </summary>
/// <param name="Msg"></param>
public virtual void OnReceivedLineBefore(Messages.Message Msg)
{
}
/// <summary>
/// This is called when user enters a command and inputhandler did not handle the command. So it
/// is called AFTER we check for aliases and commands and we are about to send command to MUD.
/// </summary>
/// <param name="Msg">Command that was entered. You can change this in the function. If you set null
/// then nothing will be sent to MUD.</param>
/// <param name="ClientId">Client who entered the command. If this is 0 it was executed from a plugin.</param>
/// <param name="AuthLevel">Auth level of who entered the command.</param>
public virtual void OnEnteredCommandAfter(ref string Msg, uint ClientId, int AuthLevel)
{
}
/// <summary>
/// This is called when user enters a command. It is called BEFORE we check for aliases and commands.
/// </summary>
/// <param name="Msg">Command that was entered. You can change this in the function. If you set null
/// then nothing will be sent to MUD and nothing will be checked for aliases or commands.</param>
/// <param name="ClientId">Client who entered the command. If this is 0 it was executed from a plugin.</param>
/// <param name="AuthLevel">Auth level of who entered the command.</param>
public virtual void OnEnteredCommandBefore(ref string Msg, uint ClientId, int AuthLevel)
{
}
/// <summary>
/// Enter required player config options here. This will be displayed if user requests info about a plugin.
/// For example you may enter here "echocommands ON" and "statmon ON" etc. Whatever your plugin requires.
/// This doesn't actually change the settings in game it is only for plugin info command.
/// </summary>
public readonly List<string> RequiredPlayerConfig = new List<string>();
/// <summary>
/// This is the class name of script. For example moons has this set to "MoonScript.MoonScript".
/// Only needed by developers who want to use another plugin in their plugin.
/// </summary>
internal string ClassName;
/// <summary>
/// Called when we load a configuration file.
/// </summary>
/// <param name="Success">Did the loading succeed? If not then the config file wasn't present and we created a new one.</param>
public virtual void OnLoadedConfig(bool Success)
{
}
/// <summary>
/// Disable all triggers with this priority. Disabling triggers from a plugin will make them not work until
/// you enable them from the same plugin again. If triggers have been disabled from multiple plugins then
/// all plugins will have to enable them again until they start working. Disabling triggers will make all
/// triggers with this priority to not work not only triggers in current plugin!
/// </summary>
/// <param name="Priority">Priority of triggers to disable.</param>
protected void DisableTriggers(int Priority)
{
DisableTriggers(Priority, Priority);
}
/// <summary>
/// Disable all triggers with this priority. Disabling triggers from a plugin will make them not work until
/// you enable them from the same plugin again. If triggers have been disabled from multiple plugins then
/// all plugins will have to enable them again until they start working. Disabling triggers will make all
/// triggers with this priority to not work not only triggers in current plugin!
/// </summary>
/// <param name="MinPriority">Minimum priority of triggers to disable.</param>
/// <param name="MaxPriority">Maximum priority of triggers to disable.</param>
protected void DisableTriggers(int MinPriority, int MaxPriority)
{
TriggerHandler.DisableTriggers(Keyword, MinPriority, MaxPriority);
}
/// <summary>
/// Enable all previously disabled triggers with this priority.
/// </summary>
/// <param name="Priority">Priority of triggers to enable.</param>
protected void EnableTriggers(int Priority)
{
EnableTriggers(Priority, Priority);
}
/// <summary>
/// Enable all previously disabled triggers with this priority.
/// </summary>
/// <param name="MinPriority">Minimum priority of triggers to enable.</param>
/// <param name="MaxPriority">Maximum priority of triggers to enable.</param>
protected void EnableTriggers(int MinPriority, int MaxPriority)
{
TriggerHandler.EnableTriggers(Keyword, MinPriority, MaxPriority);
}
}
}