/// <summary> /// Fetch a list of Abuse Report categories from the simulator /// </summary> /// <param name="lang">language to return categories in</param> /// <returns>Returns Dictionary<string, string> of Abuse Report categories from the server</returns> public Dictionary <string, string> FetchAbuseReportCategories(string lang) { Dictionary <string, string> reportCategories = null; Uri abuseCategoriesCap = Client.Network.CurrentSim.Caps.CapabilityURI("AbuseCategories"); if (abuseCategoriesCap != null) { if (lang != null) { // s***e C# nonsense UriBuilder builder = new UriBuilder(abuseCategoriesCap); builder.Query = $"lc={lang}"; abuseCategoriesCap = builder.Uri; } var request = new CapsClient(abuseCategoriesCap); request.OnComplete += delegate(CapsClient client, OSD result, Exception error) { if (error != null) { Logger.Log($"Could not fetch abuse categories from cap. ({error.Message}", Helpers.LogLevel.Info); return; } if (result != null && result is OSDMap respMap && respMap.ContainsKey("categories")) { reportCategories = new Dictionary <string, string>(); var categories = respMap["categories"] as OSDArray; foreach (OSDMap row in categories) { reportCategories.Add( row["description_localized"].AsString(), row["category"].AsString()); } } }; request.GetRequestAsync(Client.Settings.CAPS_TIMEOUT); } else { Logger.Log("AbuseCategories capability does not exist. Could not fetch categories list.", Helpers.LogLevel.Info); } return(reportCategories); }