using System; using System.Linq; using System.Text; using System.Text.RegularExpressions; using Discord.Commands; using Neo.IronLua; using NLog; namespace ChaosBot.Services.ProgrammingLanguageInterpreter { internal class LuaProgrammingLanguageInterpreter : IProgrammingLanguageInterpreter { private static readonly ILogger Logger = Program.GetLogger(); private readonly StringBuilder _outputBuilder = new StringBuilder(); private Lua _lua; public string Interpret(SocketCommandContext context, string content, string command) { using (_lua = new Lua()) { // This needs to be dynamic if we want to call // functions from within the lua environment // This is a runtime type check dynamic env = _lua.CreateEnvironment(); ParamsDelegate printDel = Print; env.print = printDel; env.context = context; string code = content; env.dochunk(code, $"{command}.lua"); return _outputBuilder.ToString(); } } public void StopExecution() { _lua.Dispose(); } private delegate void ParamsDelegate(params object[] parameters); private void Print(params object[] parameters) { string str = string.Join(" ", from param in parameters select param == null ? string.Empty : param.ToString()); _outputBuilder.Append(str); } } }