diff --git a/Core/Commands/Script/scriptHttp.cs b/Core/Commands/Script/scriptHttp.cs new file mode 100644 index 0000000..064a56b --- /dev/null +++ b/Core/Commands/Script/scriptHttp.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using BetterSecondBotShared.Static; +using OpenMetaverse; +using RestSharp; + +namespace BSB.Commands.script +{ + public class ScriptHttp : CoreCommand_2arg + { + public override string[] ArgTypes { get { return new[] { "TEXT", "Avatar" }; } } + public override string[] ArgHints { get { return new[] { "File endpoint", "Avatar Name/UUID to recive script" }; } } + public override string Helpfile { get { return "[StreamAdmin]\nThis command is part of the streamadmin commands set\n No end user support will be given."; } } + public override bool CallFunction(string[] args) + { + if (base.CallFunction(args) == true) + { + string attempt_endpoint = args[0]; + + if(attempt_endpoint.Contains("https://github.com/")) + { + attempt_endpoint.Replace("https://github.com/", "https://raw.githubusercontent.com/"); + } + + var client = new RestClient(attempt_endpoint); + var request = new RestRequest("", Method.GET); + request.AddHeader("content-type", "application/x-www-form-urlencoded"); + IRestResponse endpoint_checks = client.Get(request); + if (endpoint_checks.StatusCode == System.Net.HttpStatusCode.OK) + { + try + { + if (endpoint_checks.IsSuccessful == true) + { + if (endpoint_checks.Content.Length > 3) + { + if (UUID.TryParse(args[1], out UUID Avatar)) + { + return bot.SendScript(attempt_endpoint.Split('/').LastOrDefault(), endpoint_checks.Content, Avatar); + } + else + { + Failed("Avatar UUID not valid"); + } + } + else + { + Failed("script title is to short"); + } + } + return Failed(endpoint_checks.ErrorMessage); + } + catch (Exception e) + { + return Failed("Error: " + e.Message + ""); + } + } + else + { + return Failed("HTTP error DataObject broken Status:" + endpoint_checks.StatusCode.ToString() + " @ " + attempt_endpoint + ""); + } + } + return false; + } + } + + public class scriptendpoint : endpoint + { + public string AvatarUUID { get; set; } + public string scriptTitle { get; set; } + public string scriptContent { get; set; } + } + + public class endpoint + { + public bool status { get; set; } + public string message { get; set; } + } +} diff --git a/Core/Commands/Script/scriptSend.cs b/Core/Commands/Script/scriptSend.cs new file mode 100644 index 0000000..45b6929 --- /dev/null +++ b/Core/Commands/Script/scriptSend.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Text; +using BetterSecondBotShared.Static; +using OpenMetaverse; + +namespace BSB.Commands.Script +{ + class ScriptSend : CoreCommand_2arg + { + public override string[] ArgTypes { get { return new[] { "Avatar","Text","Text" }; } } + public override string[] ArgHints { get { return new[] { "Avatar [UUID or Firstname Lastname]", "Collection","Script name" }; } } + public override string Helpfile { get { return "Creats and send a Script to [ARG 1]
" + + " using the collection [ARG 2] as the content
" + + " Optional: You can name the Script using [ARG 3]"; } } + + public override bool CallFunction(string[] args) + { + if (base.CallFunction(args) == true) + { + // target UUID,Script storage id,["Script title" or defaults to: New Script for ] + if (UUID.TryParse(args[0], out UUID target) == true) + { + string content = bot.GetScriptContent(args[1]); + if (content != null) + { + bot.ClearScriptStorage(args[1]); + string Script_name = "New Script for " + args[0] + " " + helpers.UnixTimeNow().ToString() + ""; + if (args.Length == 3) + { + Script_name = args[2] + " " + helpers.UnixTimeNow().ToString() + ""; + } + return bot.SendScript(Script_name, content, target); + } + else + { + return Failed("No content in Script storage " + args[1]); + } + } + else + { + return Failed("Arg 0 not a UUID"); + } + } + return false; + } + } +} diff --git a/Core/bottypes/CommandsBot.cs b/Core/bottypes/CommandsBot.cs index 368c121..3c16955 100644 --- a/Core/bottypes/CommandsBot.cs +++ b/Core/bottypes/CommandsBot.cs @@ -82,6 +82,7 @@ namespace BSB.bottypes public Commands.CoreCommandsInterface GetCommandsInterface { get { return CommandsInterface; } } protected Commands.CoreCommandsInterface CommandsInterface; + protected Dictionary Scripts_content = new Dictionary(); protected Dictionary notecards_content = new Dictionary(); protected Dictionary group_invite_lockout_timer = new Dictionary(); protected long last_cleanup_commands; @@ -254,5 +255,93 @@ namespace BSB.bottypes ); return returnstatus; } + public void ScriptAddContent(string target_Script_storage_id, string content) + { + ScriptAddContent(target_Script_storage_id, content, true, "\n\r"); + } + public void ScriptAddContent(string target_Script_storage_id, string content, bool add_newline) + { + ScriptAddContent(target_Script_storage_id, content, add_newline, "\n\r"); + } + public void ScriptAddContent(string target_Script_storage_id, string content, bool add_newline, string newlinevalue) + { + if (Scripts_content.ContainsKey(target_Script_storage_id) == false) + { + Scripts_content.Add(target_Script_storage_id, ""); + } + if (add_newline == true) + { + content = "" + newlinevalue + "" + content; + } + Scripts_content[target_Script_storage_id] = Scripts_content[target_Script_storage_id] + "" + content; + } + public string GetScriptContent(string target_Script_storage_id) + { + if (Scripts_content.ContainsKey(target_Script_storage_id) == true) + { + return Scripts_content[target_Script_storage_id]; + } + return null; + } + + public void ClearScriptStorage(string target_Script_storage_id) + { + if (Scripts_content.ContainsKey(target_Script_storage_id) == true) + { + Scripts_content.Remove(target_Script_storage_id); + } + } + + public bool SendScript(string name, string content, UUID sendToUUID) + { + bool returnstatus = true; + name = name + " " + DateTime.Now; + Client.Inventory.RequestCreateItem( + Client.Inventory.FindFolderForType(AssetType.LSLText), + name, + name + " Created via SecondBot Script API", + AssetType.LSLText, + UUID.Random(), + InventoryType.LSL, + PermissionMask.All, + (bool Success, InventoryItem item) => + { + if (Success) + { + AssetScriptText empty = new AssetScriptText { Source = "\n" }; + empty.Encode(); + Client.Inventory.RequestUpdateScriptAgentInventory(new byte[] { }, item.UUID, true, + (bool uploadSuccess, string uploadStatus, bool compileSuccess, List compileMessages, UUID itemID, UUID assetID) => + { + if (uploadSuccess) + { + empty.AssetData = Encoding.ASCII.GetBytes(content); + Client.Inventory.RequestUpdateScriptAgentInventory(empty.AssetData, itemID,true, + (bool finaluploadSuccess, string finaluploadStatus, bool finalcompileSuccess, List finalcompileMessages, UUID finalitemID, UUID finalassetID) => + { + if (finalcompileSuccess == false) + { + ConsoleLog.Warn("Script failed to compile, sending anyway."); + } + Client.Inventory.GiveItem(finalitemID, name, AssetType.LSLText, sendToUUID, false); + + }); + } + else + { + ConsoleLog.Crit("The fuck empty success Script create"); + returnstatus = false; + } + }); + } + else + { + ConsoleLog.Warn("Unable to find default Scripts folder"); + returnstatus = false; + } + } + ); + return returnstatus; + } } }