public string ExecuteRazorPage(string page) { try { if (AvailableScripts.hasKey(page)) { var csFile = AvailableScripts[page]; var fileContents = csFile.fileContents(); var fileContentsHash = fileContents.hash(); if (TemplateService.HasTemplate(csFile).isFalse() || ScriptContentHashes.contains(fileContentsHash).isFalse()) { Razor.Compile(fileContents, csFile); ScriptContentHashes.add(fileContentsHash); } return(Razor.Run(csFile, TmRest)); } } catch (Exception ex) { if (ex.Message == "Thread was being aborted.") { return(""); } ex.log("[TBot Brain] [ExecuteRazorPage] {0} : {1}".format(page, ex.Message)); return("Opps: Something went wrong: {0}".format(ex.Message)); } return(""); }
public Stream List() { var filesHtml = AvailableScripts.Aggregate("Here are the commands I found:<ul>", (current, items) => current + "<li><a href='/rest/tbot/run/{0}'>{0}</a> - {1}</li>" .format(items.Key, items.Value.fileContents().hash())); filesHtml += "</ul>"; return(GetHtml(filesHtml, false, -1)); }
private void GrabAllFiles(string startFrom) { Queue <string> folders = new Queue <string>(); folders.Enqueue(startFrom); while (folders.Count != 0) { string currentFolder = folders.Dequeue(); try { string[] filesInCurrent = Directory.GetFiles(currentFolder, "*.*", SearchOption.TopDirectoryOnly); foreach (var file in filesInCurrent) { AvailableScripts.Add(file); } } catch { } try { string[] foldersInCurrent = Directory.GetDirectories(currentFolder, "*.*", SearchOption.TopDirectoryOnly); foreach (string current in foldersInCurrent) { folders.Enqueue(current); } } catch { } } new DataSavor("desktop", AvailableScriptsFileName, false).SaveScripts(new Dictionary <string, List <string> > { { startFrom, AvailableScripts } }); }
private void CompileScripts() { if (!Directory.Exists(ScriptsPath)) { Directory.CreateDirectory(ScriptsPath); return; } try { var files = Directory.GetFiles(ScriptsPath, "*.cs"); AvailableScripts = files.ToDictionary(f => f, ScriptInfo.FromTextFile); Logger.Info($"Found {files.Length} scripts to compile"); var md5 = MD5.Create(); var scriptDict = new Dictionary <string, byte[]>(); foreach (var scriptFile in files) { var data = File.ReadAllBytes(scriptFile); md5.TransformBlock(data, 0, data.Length, null, 0); scriptDict[scriptFile] = data; } md5.TransformFinalBlock(new byte[0], 0, 0); var hash = Convert.ToBase64String(md5.Hash); if (hash == _lastCompilationHash) { Logger.Info("No changes detected! Skipping compilation!"); return; } foreach (var scriptFile in files) { if (!AvailableScripts.TryGetValue(scriptFile, out var info)) { continue; } foreach (var infoReference in info.References) { Assembly.LoadFile(infoReference); } } var ass = MonoCompiler.Compile(scriptDict, _loggerTextWriter); if (ass == null) { _lastCompilationHash = null; Logger.Error("Skipping loading scripts because of errors above."); return; } if (_lastCompilationAssembly != null) { foreach (var type in _lastCompilationAssembly.GetTypes()) { Api.CommandManager.UnregisterCommand(type); var method = type.GetMethods(BindingFlags.Static | BindingFlags.Public) .FirstOrDefault(m => m.Name == "Unload" && m.GetParameters().Length == 0); if (method == null) { continue; } SixModLoader.SixModLoader.Instance.EventManager.UnregisterStatic(type); Logger.Info($"Unloading {type.Name}"); method.Invoke(null, new object[0]); } } _lastCompilationAssembly = ass; _lastCompilationHash = hash; foreach (var type in ass.GetTypes()) { Api.CommandManager.RegisterCommand(type); var method = type.GetMethods(BindingFlags.Static | BindingFlags.Public) .FirstOrDefault(m => m.Name == "Main" && m.GetParameters().Length == 0); if (method == null) { continue; } SixModLoader.SixModLoader.Instance.EventManager.RegisterStatic(type); Logger.Info($"Running {type.Name}"); method.Invoke(null, new object[0]); } } catch (Exception e) { Logger.Error("Failed compiling scripts\n" + e); } }