Plugins can also add custom components to the macro builder. Regular plugin api functions can be used within the Execute method. This page describes how to make a plugin that registers new components.
PluginCore.cs
[Plugin(1, "Extra Macro Component Plugin", "Adds new macro components to the macro builder!")]
public class PluginCore : IStartPlugin
{
/// <summary>
/// Should be used to check compatability with the
/// current version of the bot.
/// </summary>
public override void OnLoad(int version, int subversion, int buildversion) { }
public override PluginResponse OnEnable(IBotSettings botSettings) {
/* Regular plugin content */
return base.OnEnable(botSettings);
}
}
public class TestMacroComponent : IExternalMacroComponent {
public TestMacroComponent() {
this.Category = MacroComponentCategory.Misc;
this.Outputs = new IMacroOutputCollection(
new KeyValuePair<string, ExternalMacroOutput>("success", new ExternalMacroOutput("Success", "This output gets called once the call finishes", true)),
new KeyValuePair<string, ExternalMacroOutput>("output_internal_name", new ExternalMacroOutput("Error", "This output will never get called", false))
);
this.Variables = new IMacroVariableCollection(
new KeyValuePair<string, ExternalMacroVariable>("variable_internal_name1", new ExternalMacroVariable(typeof(string), "Message", "What message should we send to chat?", "my default message!"))
);
}
public override string GetName() {
return "Test macro component";
}
public override string GetInternalName() {
return "ex:test_macro_component";
}
public override string GetDescription() {
return "This is a test macro component";
}
public override string GetInteractiveDescription() {
var variableValue = GetVariable<string>("variable_internal_name1");
return
string.IsNullOrWhiteSpace(variableValue) ? GetDescription()
: $"I will say {variableValue}.";
}
public override string Execute(IBotContext Context) {
Context.Functions.Chat("My message: " + GetVariable<string>("variable_internal_name1"));
return "success"; // or return "output_internal_name"
}
}
Outputs
Outputs refer to possible paths that the macro component will lead to. The execute method should return a name of one of the registered outputs. These should be registered in the constructor, as can be seen here:
public TestMacroComponent() {
...
this.Outputs = new IMacroOutputCollection(
new KeyValuePair<string, ExternalMacroOutput>("success", new ExternalMacroOutput("Success", "This output gets called once the call finishes", true)),
new KeyValuePair<string, ExternalMacroOutput>("output_internal_name", new ExternalMacroOutput("Error", "This output will never get called", false))
);
...
}