public static void AddQueue(ScriptList ListItems, UUID Requester, string GitOwner = "OpenCollarTeam", string GitBranch = "master") { Queue inst = Queue.Instance; List <Queue.QueueType> Queued = new List <Queue.QueueType>(); foreach (KeyValuePair <string, ScriptList.ScriptListFlags> kvp in ListItems.Scripts) { Queue.QueueType QT = new Queue.QueueType(); QT.Name = kvp.Value.ScriptName; QT.GitOwner = GitOwner; HttpWebRequest hwr = null; HttpWebResponse hwresp = null; try { hwr = (HttpWebRequest)HttpWebRequest.Create("https://raw.githubusercontent.com/" + GitOwner + "/OpenCollar/" + GitBranch + "/src/" + kvp.Value.Container + "/" + kvp.Value.ScriptName + kvp.Value.FileExt); hwr.Method = "GET"; hwresp = (HttpWebResponse)hwr.GetResponse(); } catch (Exception e) { } if (hwresp.StatusCode == HttpStatusCode.NotFound) { MH(Destinations.DEST_AGENT, Requester, "ALERT: BDF Entry: " + kvp.Value.ScriptName + kvp.Value.FileExt + "; Does not exist on the server!"); continue; } else if (hwresp.StatusCode == HttpStatusCode.OK) { // Get the file text and add to queued items StreamReader sr = new StreamReader(hwresp.GetResponseStream()); QT.Text = sr.ReadToEnd(); //Console.WriteLine("Generating ZHX for string with length : "+QT.Text.Length.ToString()); Console.WriteLine("MD5 [" + QT.Name + "] : " + Tools.MD5Hash(QT.Text)); QT.Hash = Tools.MD5Hash(QT.Text); //Console.WriteLine("ZHX [" + QT.Name + "] : " + QT.Hash); QT.GitBranch = GitBranch; QT.Container = kvp.Value.Container; QT.ItemType = kvp.Value.Type; QT.FileExt = kvp.Value.FileExt; Queued.Add(QT); } } inst.ActualQueue.Add(Requester, Queued); }
// This class executes 1 queue item when called upon public static void run() { Queue X = Queue.Instance; // Get first queued item Queue.Instance.invItem = null; if (X.ActualQueue.Count == 0) { return; } KeyValuePair <UUID, List <Queue.QueueType> > kvp = X.ActualQueue.First(); InventoryManager inv = BotSession.Instance.grid.Inventory; UUID GitOwnerFolder = UUID.Zero; UUID Branch = UUID.Zero; UUID Recipient = kvp.Key; UUID Container = UUID.Zero; UUID ParentFolder = inv.FindFolderForType(AssetType.Folder); Queue.QueueType QT = kvp.Value.First(); InventoryBase GitOwnerFolderBase = null; try { GitOwnerFolderBase = inv.LocalFind(ParentFolder, new[] { QT.GitOwner }, 0, false).First(); GitOwnerFolder = GitOwnerFolderBase.UUID; } catch (Exception e) { } if (GitOwnerFolder == UUID.Zero || GitOwnerFolder == ParentFolder) { GitOwnerFolder = inv.CreateFolder(ParentFolder, QT.GitOwner); } InventoryBase GitBranchBase = null; try { GitBranchBase = inv.LocalFind(GitOwnerFolder, new[] { QT.GitBranch }, 0, false).First(); Branch = GitBranchBase.UUID; } catch (Exception e) { } if (Branch == UUID.Zero || Branch == ParentFolder) { Branch = inv.CreateFolder(GitOwnerFolder, QT.GitBranch); } InventoryBase GitContainer = null; try { GitContainer = inv.LocalFind(Branch, new[] { QT.Container }, 0, false).First(); Container = GitContainer.UUID; }catch (Exception e) { } if (Container == UUID.Zero || Container == ParentFolder) { Container = inv.CreateFolder(Branch, QT.Container); } Queue.FinalQueueData Finals = new Queue.FinalQueueData(); Dictionary <UUID, Queue.FinalQueueData> FQI = Queue.Instance.FinalQueue; if (FQI.ContainsKey(Recipient)) { Finals = FQI[Recipient]; if (Finals.Folders.ContainsKey(QT.Container)) { // do nothing } else { Finals.Folders.Add(QT.Container, Container); } FQI[Recipient] = Finals; Queue.Instance.FinalQueue = FQI; } Console.WriteLine("Git Owner Folder: " + GitOwnerFolder.ToString()); Console.WriteLine("Branch: " + Branch.ToString()); Console.WriteLine("Container: " + Container.ToString()); // Locate the Script or Notecard InventoryBase importedItem = null; UUID ItemID = UUID.Zero; try { if (QT.ItemType == "script") { importedItem = inv.LocalFind(Container, new[] { QT.Name }, 1, true).First(); } else if (QT.ItemType == "notecard") { importedItem = inv.LocalFind(Container, new[] { QT.Name + QT.FileExt }, 1, false).First(); } ItemID = importedItem.UUID; } catch (Exception e) { } if (ItemID == UUID.Zero || ItemID == null) { Queue.Instance.invItem = null; } else { Queue.Instance.ARE = new AutoResetEvent(false); inv.ItemReceived += Inv_ItemReceived; while (!Queue.Instance.ARE.WaitOne(TimeSpan.FromMinutes(1))) { Queue.Instance.ARE.Reset(); inv.RequestFetchInventory(ItemID, importedItem.OwnerID); } } // Check that invItem is instantiated AssetType itemType = AssetType.Folder; InventoryType InvType = InventoryType.Animation; if (QT.ItemType == "notecard") { InvType = InventoryType.Notecard; itemType = AssetType.Notecard; } else if (QT.ItemType == "script") { InvType = InventoryType.LSL; itemType = AssetType.LSLText; } if (Queue.Instance.invItem == null) { // We can safely create the inventory item now string FinalName = QT.Name; if (InvType == InventoryType.Notecard) { FinalName += QT.FileExt; } UUID Transaction = UUID.Random(); inv.RequestCreateItem(Container, FinalName, QT.Hash, itemType, Transaction, InvType, PermissionMask.All, delegate(bool success, InventoryItem ii) { if (success) { Queue.Instance.invItem = ii; Queue.Instance.ARE.Set(); } }); Queue.Instance.ARE.WaitOne(TimeSpan.FromSeconds(10)); InventoryItem actualItem = Queue.Instance.invItem; if (itemType == AssetType.LSLText) { inv.RequestUpdateScriptAgentInventory(EncodeScript(QT.Text), actualItem.UUID, true, delegate(bool uploaded, string uploadstatus, bool compileSuccess, List <string> msgs, UUID itemID, UUID assetID) { Queue.Instance.compileMessages = msgs; Queue.Instance.CompileSuccess = compileSuccess; Queue.Instance.UploadSuccess = uploaded; Queue.Instance.ARE.Set(); }); Queue.Instance.ARE.WaitOne(TimeSpan.FromSeconds(20)); if (Queue.Instance.UploadSuccess) { if (Queue.Instance.CompileSuccess) { // Remove this from future queues kvp.Value.Remove(QT); // quickly check whether KVP.Value is empty if (kvp.Value.Count == 0) { // Send the container folder, and remove this from queue //inv.GiveFolder(Branch, GitBranchBase.Name, Recipient, false); //List<InventoryBase> folders = inv.FolderContents(Branch, BotSession.Instance.grid.Self.AgentID, true, false, InventorySortOrder.ByName, TimeSpan.FromSeconds(30).Milliseconds); if (Recipient != UUID.Zero) { foreach (KeyValuePair <string, UUID> kvpx in Finals.Folders) { inv.GiveFolder(kvpx.Value, kvpx.Key, Recipient, false); MH(Destinations.DEST_AGENT, Recipient, "Sending : " + kvpx.Key); } Queue.Instance.FinalQueue.Remove(Recipient); } X.ActualQueue.Remove(Recipient); } else { X.ActualQueue[Recipient] = kvp.Value; } if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item '" + QT.Name + "' finished processing"); } } } else { if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item: " + QT.Name + QT.FileExt + " failed!"); } } } else if (itemType == AssetType.Notecard) { inv.RequestUploadNotecardAsset(Encoding.UTF8.GetBytes(QT.Text), actualItem.UUID, delegate(bool success, string status, UUID itemID, UUID assetID) { if (success) { Queue.Instance.UploadSuccess = success; Queue.Instance.ARE.Set(); } }); if (Queue.Instance.UploadSuccess) { kvp.Value.Remove(QT); if (kvp.Value.Count == 0) { X.ActualQueue.Remove(Recipient); // inv.GiveFolder(Branch, GitBranchBase.Name, Recipient, false); if (Recipient != UUID.Zero) { foreach (KeyValuePair <string, UUID> kvpx in Finals.Folders) { inv.GiveFolder(kvpx.Value, kvpx.Key, Recipient, false); MH(Destinations.DEST_AGENT, Recipient, "Sending : " + kvpx.Key); } Queue.Instance.FinalQueue.Remove(Recipient); } } else { X.ActualQueue[Recipient] = kvp.Value; } if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item '" + QT.Name + "' finished processing"); } } else { if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item: " + QT.Name + QT.FileExt + " failed!"); } } } } else { // Item exists, verify hash data! if (itemType == AssetType.LSLText) { if (Queue.Instance.invItem.Description == QT.Hash) { // remove from queue kvp.Value.Remove(QT); if (kvp.Value.Count == 0) { if (Recipient != UUID.Zero) { foreach (KeyValuePair <string, UUID> kvpx in Finals.Folders) { inv.GiveFolder(kvpx.Value, kvpx.Key, Recipient, false); MH(Destinations.DEST_AGENT, Recipient, "Sending : " + kvpx.Key); } Queue.Instance.FinalQueue.Remove(Recipient); } X.ActualQueue.Remove(Recipient); //inv.GiveFolder(Branch, GitBranchBase.Name, Recipient, false); } else { X.ActualQueue[Recipient] = kvp.Value; } if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item '" + QT.Name + "' finished processing - no changes needed"); } } else { // update the script now inv.RequestUpdateScriptAgentInventory(EncodeScript(QT.Text), Queue.Instance.invItem.UUID, true, delegate(bool uploaded, string uploadstatus, bool compileSuccess, List <string> msgs, UUID itemID, UUID assetID) { Queue.Instance.compileMessages = msgs; Queue.Instance.CompileSuccess = compileSuccess; Queue.Instance.UploadSuccess = uploaded; Queue.Instance.ARE.Set(); }); Queue.Instance.ARE.WaitOne(TimeSpan.FromSeconds(15)); if (Queue.Instance.UploadSuccess) { if (Queue.Instance.CompileSuccess) { X.invItem.Description = QT.Hash; kvp.Value.Remove(QT); if (kvp.Value.Count == 0) { if (Recipient != UUID.Zero) { foreach (KeyValuePair <string, UUID> kvpx in Finals.Folders) { inv.GiveFolder(kvpx.Value, kvpx.Key, Recipient, false); MH(Destinations.DEST_AGENT, Recipient, "Sending : " + kvpx.Key); } Queue.Instance.FinalQueue.Remove(Recipient); } X.ActualQueue.Remove(Recipient); //inv.GiveFolder(Branch, GitBranchBase.Name, Recipient, false); } else { X.ActualQueue[Recipient] = kvp.Value; } if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item '" + QT.Name + "' finished processing"); } } } else { if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item: " + QT.Name + QT.FileExt + " failed!"); } } } } else if (itemType == AssetType.Notecard) { if (Queue.Instance.invItem.Description == QT.Hash) { kvp.Value.Remove(QT); if (kvp.Value.Count == 0) { if (Recipient != UUID.Zero) { foreach (KeyValuePair <string, UUID> kvpx in Finals.Folders) { inv.GiveFolder(kvpx.Value, kvpx.Key, Recipient, false); MH(Destinations.DEST_AGENT, Recipient, "Sending : " + kvpx.Key); } Queue.Instance.FinalQueue.Remove(Recipient); } X.ActualQueue.Remove(Recipient); //inv.GiveFolder(Branch, GitBranchBase.Name, Recipient, false); } else { X.ActualQueue[Recipient] = kvp.Value; } if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item '" + QT.Name + "' finished processing - no changes needed"); } } else { inv.RequestUploadNotecardAsset(EncodeScript(QT.Text), Queue.Instance.invItem.UUID, delegate(bool success, string status, UUID itemID, UUID assetID) { Queue.Instance.UploadSuccess = success; Queue.Instance.ARE.Set(); }); Queue.Instance.ARE.WaitOne(TimeSpan.FromSeconds(15)); if (Queue.Instance.UploadSuccess) { // Notecard updated kvp.Value.Remove(QT); if (kvp.Value.Count == 0) { if (Recipient != UUID.Zero) { foreach (KeyValuePair <string, UUID> kvpx in Finals.Folders) { inv.GiveFolder(kvpx.Value, kvpx.Key, Recipient, false); MH(Destinations.DEST_AGENT, Recipient, "Sending : " + kvpx.Key); } Queue.Instance.FinalQueue.Remove(Recipient); } X.ActualQueue.Remove(Recipient); //inv.GiveFolder(Branch, GitBranchBase.Name, Recipient, false); } else { X.ActualQueue[Recipient] = kvp.Value; } if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item '" + QT.Name + "' finished processing"); } } else { if (Recipient != UUID.Zero) { MH(Destinations.DEST_AGENT, Recipient, "Item: " + QT.Name + QT.FileExt + " failed!"); } } } } } X.ARE = new AutoResetEvent(false); X.compileMessages = new List <string>(); X.CompileSuccess = false; X.invItem = null; X.UploadSuccess = false; }