Beispiel #1
0
        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("");
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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 }
            });
        }
Beispiel #4
0
        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);
            }
        }