Store my changes

This commit is contained in:
Daniel_I_Am 2020-09-26 18:27:24 +02:00
parent 6aaa877b0e
commit 514a835233
No known key found for this signature in database
GPG Key ID: 80C428FCC9743E84
4 changed files with 44 additions and 14 deletions

View File

@ -192,7 +192,7 @@ namespace ChaosBot.Discord.Services
{ {
if (!command.IsSpecified) if (!command.IsSpecified)
{ {
LoggingFacade.Error($"Command execution failed [{context.User.Username}#{context.User.Discriminator} -> {command.Value.Name}]"); LoggingFacade.Error($"Command execution failed [{context.User.Username}#{context.User.Discriminator} -> {context.Message.Content.Split(" ").First()}]");
return; return;
} }

View File

@ -1,7 +1,10 @@
using Discord.Commands;
namespace ChaosBot.Services.ProgrammingLanguageInterpreter namespace ChaosBot.Services.ProgrammingLanguageInterpreter
{ {
public interface IProgrammingLanguageInterpreter public interface IProgrammingLanguageInterpreter
{ {
string Interpret(string content, string command); string Interpret(SocketCommandContext context, string content, string command);
void StopExecution();
} }
} }

View File

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

View File

@ -1,4 +1,6 @@
using System; using System;
using System.Threading;
using System.Threading.Tasks;
using ChaosBot.Models; using ChaosBot.Models;
using Discord.Commands; using Discord.Commands;
@ -19,7 +21,25 @@ namespace ChaosBot.Services.ProgrammingLanguageInterpreter
try try
{ {
string output = interpreter.Interpret(customCommand.Content, customCommand.Command); Thread taskThread = null;
Task<string> task = Task.Run(() =>
{
taskThread = Thread.CurrentThread;
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
return interpreter.Interpret(context, customCommand.Content, customCommand.Command);
});
const int timeout = 1000;
bool isTaskCompleted = task.Wait(TimeSpan.FromMilliseconds(timeout));
if (!isTaskCompleted)
{
interpreter.StopExecution();
taskThread.Abort();
throw new TimeoutException($"Command '{customCommand.Command}' took more than {timeout}ms to run. It has been killed.");
}
string output = task.Result;
if (output.Length > 0) if (output.Length > 0)
context.Channel.SendMessageAsync(output); context.Channel.SendMessageAsync(output);