/// <summary> /// Is the user friends with another user specified? /// </summary> /// <param name="user">The user to check our friendship with.</param> /// <returns>Is this user friends with the specified user?</returns> public async Task <bool> IsFriendsWith(User user) { //return (await HttpHelper.GetStringFromURL(string.Format("https://assetgame.roblox.com/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerId={0}&userId={1}", ID, user.ID))).Contains("true"); string stringifiedJSON = await HttpHelper.GetStringFromURL(string.Format("https://friends.roblox.com/v1/users/{0}/friends", user.ID)); JObject jObject = JObject.Parse(stringifiedJSON); JToken dataToken; if (jObject.TryGetValue("data", out dataToken)) { JArray arr = (JArray)dataToken; foreach (JObject userObject in arr) { JToken idTok; if (userObject.TryGetValue("id", out idTok)) { int friendId = idTok.Value <int>(); if (user.ID == friendId) { return(true); } } } } return(false); }
/// <summary> /// Checks if the user owns the asset provided. /// </summary> /// <param name="asset">The asset to check.</param> /// <returns>Does the user own the asset?</returns> public async Task <bool> OwnsAsset(Asset asset) { // https://api.roblox.com/ownership/hasasset?userId={0}&assetId={1} string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/ownership/hasasset?userId={0}&assetId={1}", ID, asset.ID)); return(data.ToLower() == "true"); }
/// <summary> /// Gets a friend list page asynchronusly. /// </summary> /// <param name="page">The page to get in a non-zero based index. 1=first page, 2=second page,...</param> /// <returns></returns> public async Task <Page> Get(int page) { if (page <= 0) { throw new ArgumentException("Argument should be above 0.", "page"); } if (_Pages.ContainsKey(page)) { return(_Pages[page]); } string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/users/{0}/friends?page={1}", User.ID, page)); JArray arr = JArray.Parse(data); Page pg = new Page(); foreach (JObject obj in arr) { pg.Add(new Entry((string)obj["Username"], (int)obj["Id"], (bool)obj["IsOnline"])); } _Pages.Add(page, pg); return(pg); }
/// <summary> /// Is the user friends with another user specified? /// </summary> /// <param name="user">The user to check our friendship with.</param> /// <returns>Is this user friends with the specified user?</returns> public async Task <bool> IsFriendsWith(User user) { try { return((await HttpHelper.GetStringFromURL(string.Format("https://assetgame.roblox.com/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerId={0}&userId={1}", ID, user.ID))).Contains("true")); } catch { return(false); } }
/// <summary> /// Updates the Username. /// </summary> /// <returns></returns> public async Task Update() { string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/users/{0}", ID)); JObject obj = JObject.Parse(data); Username = (string)obj["Username"]; }
/// <summary> /// Can this user manage the asset provided? /// </summary> /// <param name="asset">The asset to test.</param> /// <returns>Can this user manage the asset?</returns> public async Task <bool> CanManageAsset(Asset asset) { string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/users/{0}/canmanage/{1}", ID, asset.ID)); JObject obj = JObject.Parse(data); return(obj.Value <bool?>("CanManage") ?? false); }
/// <summary> /// Gets a group object using the groupId. /// </summary> /// <param name="groupId">Group to get</param> /// <returns>The group object</returns> public static async Task <Group> FromID(int groupId) { try { Group group = new Group(); group.ID = groupId; string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/groups/{0}", groupId)); JObject obj = JObject.Parse(data); group.Name = (string)obj["Name"]; JObject jOwner = (JObject)obj["Owner"]; if (jOwner != null) { User owner = new User((int)jOwner["Id"]); owner.Username = (string)jOwner["Name"]; group.Owner = owner; } group.EmblemUrl = (string)obj["EmblemUrl"]; group.Description = (string)obj["Description"]; /* * JArray roles = obj.Value<JArray>("Roles"); * * group.Roles = new GroupRole[roles.Count]; * * for (int i = 0; i < group.Roles.Length; i++) * { * JObject o = (JObject)roles[i]; * group.Roles[i] = new GroupRole((string)o["Name"], (int)o["Rank"]); * } */ string dataa = await HttpHelper.GetStringFromURL(string.Format("https://www.roblox.com/api/groups/{0}/RoleSets/", group.ID)); JArray roles = JArray.Parse(dataa); group.Roles = new GroupRole[roles.Count]; for (int i = 0; i < roles.Count; i++) { JObject o = (JObject)roles[i]; group.Roles[i] = new GroupRole((string)o["Name"], (int)o["Rank"], (int)o["Id"]); } return(group); } catch (WebException) { return(null); } }
/// <summary> /// Gets an outfit object from an outfit ID. /// </summary> /// <param name="outfitID">The outfit to get.</param> /// <returns>The outfit object from ID.</returns> public static async Task <Outfit> FromID(int outfitID) { return(await new Outfit().Parse( JObject.Parse( await HttpHelper.GetStringFromURL( string.Format( "https://avatar.roblox.com/v1/outfits/{0}/details", outfitID) ) ), true)); }
/// <summary> /// Searches using keywords and category. /// </summary> /// <param name="keywords">Keywords for search</param> /// <param name="category">What category.</param> /// <returns>The results of the search as a async task.</returns> public static async Task <List <SearchResult> > Search(string keywords, ESearchCategory category) { string url = string.Format("https://search.roblox.com/catalog/json?Category={0}&Keywords={1}", (int)category, System.Uri.EscapeDataString(keywords)); string data = await HttpHelper.GetStringFromURL(url); List <SearchResult> results = JsonConvert.DeserializeObject <List <SearchResult> >(data); Console.WriteLine(results.Count); return(results); }
/// <summary> /// Gets the asset thumbnail url for a certain size. /// </summary> /// <param name="size">The size to get the thumbnail for.</param> /// <returns>The thumbnail to the image with the size.</returns> public async Task <string> GetAssetImageURL(EThumbnailSize size) { string sizeStr = ""; switch (size) { case EThumbnailSize.Rectangle160x100: sizeStr = "160x100"; break; case EThumbnailSize.Rectangle420x230: sizeStr = "420x230"; break; case EThumbnailSize.Rectangle60x62: sizeStr = "60x62"; break; case EThumbnailSize.Square100x100: sizeStr = "100x100"; break; case EThumbnailSize.Square110x110: sizeStr = "110x110"; break; case EThumbnailSize.Square250x250: sizeStr = "250x250"; break; case EThumbnailSize.Square352x352: sizeStr = "352x352"; break; case EThumbnailSize.Square420x420: sizeStr = "420x420"; break; case EThumbnailSize.Square48x48: sizeStr = "48x48"; break; case EThumbnailSize.Square75x75: sizeStr = "75x75"; break; default: throw new ArgumentException("Size must not be Unknown.", "size"); } return(await HttpHelper.GetStringFromURL(string.Format("https://www.roblox.com/Thumbs/RawAsset.ashx?assetId={0}&imageFormat=png&width={1}&height={2}", ID, sizeStr.Split('x')[0], sizeStr.Split('x')[1]))); }
/// <summary> /// Searches using keywords and category. Will take a long time to search and then convert Search Results into Asset objects. /// </summary> /// <param name="keywords">Keywords for search</param> /// <param name="category">What category.</param> /// <returns>The results of the search as a async task.</returns> public static async Task <Asset[]> SearchAssets(string keywords, ESearchCategory category) { string url = string.Format("https://search.roblox.com/catalog/json?Category={0}&Keywords={1}", (int)category, System.Uri.EscapeDataString(keywords)); string data = await HttpHelper.GetStringFromURL(url); List <SearchResult> results = JsonConvert.DeserializeObject <List <SearchResult> >(data); Asset[] assets = new Asset[results.Count]; for (int i = 0; i < results.Count; i++) { assets[i] = await Asset.FromID(results[i].AssetId); } return(assets); }
/// <summary> /// Gets what platform this item is for only. /// </summary> /// <returns>What platform this item is for only.</returns> public async Task <EItemExclusivity> GetExclusivity() { try { string url = string.Format("https://www.roblox.com/catalog/{0}/{1}", ID, Name); string data = await HttpHelper.GetStringFromURL(url); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(data); HtmlNode node = doc.DocumentNode .Descendants("div") .Where(d => d.Attributes.Contains("class") && d.Attributes["class"].Value.Contains("item-note") && d.Attributes["class"].Value.Contains("has-price-label") ).FirstOrDefault(); if (node == null) { return(EItemExclusivity.None); } if (node.InnerText.Contains("Google Play")) { return(EItemExclusivity.GooglePlay); } if (node.InnerText.Contains("Xbox One")) { return(EItemExclusivity.XboxOne); } if (node.InnerText.Contains("Amazon")) { return(EItemExclusivity.AmazonAppstore); } if (node.InnerText.ToLower().Contains("ios")) { return(EItemExclusivity.AppleIOS); } return(EItemExclusivity.None); } catch { return(EItemExclusivity.None); } }
/// <summary> /// Gets the user's blurb/status using the profile page. /// /// Will most likely break due to ROBLOX possibly changing the html format. /// </summary> /// <returns>The status/blurb of this user.</returns> public async Task <string> GetStatus() { HtmlDocument document = new HtmlDocument(); document.LoadHtml(await HttpHelper.GetStringFromURL(string.Format("https://www.roblox.com/users/{0}/profile", ID))); HtmlNodeCollection nodes = document .DocumentNode .SelectNodes(string.Format("//div[@data-profileuserid='{0}']", ID)); if (nodes == null || nodes.FirstOrDefault() == null) { throw new Exception("User page did not have the correct element. Did the website change?"); } if (string.IsNullOrEmpty(nodes.FirstOrDefault().Attributes["data-statustext"].Value)) { return(null); } return(nodes.FirstOrDefault().Attributes["data-statustext"].Value); }
/// <summary> /// Gets a user object from a user id. /// </summary> /// <param name="userId">The user id for the user</param> /// <returns>The user object</returns> public static async Task <User> FromID(int userId) { try { string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/users/{0}", userId)); JObject obj = JObject.Parse(data); User user = new User(); user.ID = userId; await user.Update(); return(user); } catch (WebException) { return(null); } }
public async Task <Clan> GetClan() { string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/clans/get-by-user?userId={0}", ID)); JObject obj = JObject.Parse(data); if (obj.Value <int>("Id") == 0) // User is not in a clan. { return(null); } Clan clan = new Clan(); clan.ID = obj.Value <int>("Id"); clan.Name = obj.Value <string>("Name"); clan.EmblemAsset = await Asset.FromID(obj.Value <int>("EmblemAssetId")); return(clan); }
/// <summary> /// Checks if a user is in the group. If an http exeption occurs then it will return false. /// </summary> /// <param name="user">The user to check.</param> /// <returns>A boolean dictating if the user is in this group.</returns> public async Task <bool> IsUserInGroup(User user) { string stringifiedJSON = await HttpHelper.GetStringFromURL(string.Format("https://groups.roblox.com/v1/users/{0}/groups/roles", user.ID)); JObject obj = JObject.Parse(stringifiedJSON); JToken dataToken; if (obj.TryGetValue("data", out dataToken)) { JArray arr = (JArray)dataToken; foreach (JObject groupMembershipObject in arr) { JToken groupObject; if (groupMembershipObject.TryGetValue("group", out groupObject)) { JToken idToken; if (((JObject)groupObject).TryGetValue("id", out idToken)) { if (idToken.Value <int>() == ID) { return(true); } } else { throw new Exception("Token \"group.id\" could not be found in groupMembershipObject."); } } else { throw new Exception("Token \"group\" could not be found in groupMembershipObject."); } } return(false); } else { throw new Exception("Could not find \"data\" in json response. Did the response model change?"); } }
/// <summary> /// Gets a Clan object from a group/clan ID. /// </summary> /// <param name="clanId">The clan ID to get.</param> /// <returns>The clan object.</returns> public static async Task <Clan> FromID(int clanId) { try { string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/clans/get-by-id?clanId={0}", clanId)); JObject obj = JObject.Parse(data); Clan clan = new Clan(); clan.ID = clanId; clan.Name = obj.Value <string>("Name"); clan.EmblemAsset = await Asset.FromID(obj.Value <int>("EmblemAssetId")); return(clan); } catch (WebException ex) { HttpWebResponse resp = (HttpWebResponse)ex.Response; return(null); } }
/// <summary> /// Gets the role of a certain user in the group. If the user isn't in the group or the rank the user has doesn't exist within the group object, it returns null. /// </summary> /// <param name="user">The user to get the role from.</param> /// <returns>The role of the user.</returns> public async Task <GroupRole> GetRoleOfUser(User user) { string data = await HttpHelper.GetStringFromURL(string.Format("https://assetgame.roblox.com/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid={0}&groupid={1}", user.ID, ID)); data = data.Substring(22).Replace("</Value>", ""); if (data == "0") { return(null); } else { foreach (GroupRole role in Roles) { if (role.Rank == int.Parse(data)) { return(role); } } return(null); // No role of rank x exists, return null. } }
/// <summary> /// If this asset is a package, get the assets within the package. /// </summary> /// <returns>Assets within this package.</returns> public async Task <Asset[]> GetAssetsInPackage() { try { string data = await HttpHelper.GetStringFromURL(string.Format("http://assetgame.roblox.com/Game/GetAssetIdsForPackageId?packageId={0}", ID)); if (data.StartsWith("{\"")) { return(null); } JArray obj = JArray.Parse(data); List <Asset> assets = new List <Asset>(); foreach (JToken tok in obj) { assets.Add(await FromID(tok.Value <int>())); } return(assets.ToArray()); } catch { return(null); } }
/// <summary> /// Does the user id provided have the asset? /// </summary> /// <param name="userId">The user to check.</param> /// <returns>Does the user id provided have the asset?</returns> public async Task <bool> DoesUserHave(int userId) { return(await HttpHelper.GetStringFromURL(string.Format("http://api.roblox.com/Ownership/HasAsset?userId={0}&assetId={1}", userId, ID)) == "true"); }
/// <summary> /// Gets an <see cref="Asset"/> with information filled in. /// </summary> /// <param name="assetId">The asset id to pull from</param> /// <returns>Asset filled with information</returns> public static async Task <Asset> FromID(int assetId) { try { string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/marketplace/productinfo?assetId={0}", assetId)); JObject obj = JObject.Parse(data); Asset asset = new Asset(); asset.ID = (int)obj["AssetId"]; asset.ProductId = (int?)obj["ProductId"] ?? -1; asset.Name = (string)obj["Name"]; asset.Description = (string)obj["Description"]; asset.AssetType = (EAssetType)(int)obj["AssetTypeId"]; // eww. string creatorType = (string)obj["Creator"]["CreatorType"]; if (creatorType == "Group") { Group group = await Group.FromID((int)obj["Creator"]["CreatorTargetId"]); asset.CreatorType = ECreatorType.Group; } else { User user = new User(); user.ID = (int)obj["Creator"]["CreatorTargetId"]; user.Username = (string)obj["Creator"]["Name"]; asset.CreatorType = ECreatorType.User; } asset.IconImageAssetId = (int?)obj["IconImageAssetId"] ?? 0; asset.Created = DateTime.Parse((string)obj["Created"]); asset.Updated = DateTime.Parse((string)obj["Updated"]); asset.PriceInRobux = (int?)obj["PriceInRobux"] ?? 0; // We don't use PriceInTickets since Tickets are gone from roblox. asset.Sales = (int?)obj["Sales"] ?? 0; asset.IsNew = (bool?)obj["IsNew"] ?? false; asset.IsForSale = (bool?)obj["IsForSale"] ?? false; asset.IsPublicDomain = (bool?)obj["IsPublicDomain"] ?? false; asset.IsLimited = (bool?)obj["IsLimited"] ?? false; asset.IsLimitedUnique = (bool?)obj["IsLimitedUnique"] ?? false; if (obj.Value <int?>("Remaining") != null) { asset.Remaining = (int)obj["Remaining"]; } else { asset.Remaining = -1; // Infinite amount of this item. } asset.MinimumMembershipLevel = (EMembershipLevel)(int)obj["MinimumMembershipLevel"]; asset.Is13OrOver = ((int?)obj["ContentRatingTypeId"] == 1); return(asset); } catch (WebException) { return(null); } }
/// <summary> /// Gets the role of a certain user in the group. If the user isn't in the group or the rank the user has doesn't exist within the group object, it returns null. /// </summary> /// <param name="user">The user to get the role from.</param> /// <returns>The role of the user.</returns> public async Task <GroupRole> GetRoleOfUser(User user) { string stringifiedJSON = await HttpHelper.GetStringFromURL(string.Format("https://groups.roblox.com/v1/users/{0}/groups/roles", user.ID)); JObject obj = JObject.Parse(stringifiedJSON); JToken dataToken; if (obj.TryGetValue("data", out dataToken)) { JArray arr = (JArray)dataToken; foreach (JObject groupMembershipObject in arr) { JToken groupObject; if (groupMembershipObject.TryGetValue("group", out groupObject)) { JToken idToken; if (((JObject)groupObject).TryGetValue("id", out idToken)) { if (idToken.Value <int>() == ID) { JToken roleToken; if (groupMembershipObject.TryGetValue("role", out roleToken)) { JObject roleObj = (JObject)roleToken; int roleId = 0; string roleName = ""; int roleRank = 0; JToken tok; if (roleObj.TryGetValue("id", out tok)) { roleId = tok.Value <int>(); } else { throw new Exception("Token \"id\" could not be found in roleObj."); } if (roleObj.TryGetValue("rank", out tok)) { roleRank = tok.Value <int>(); } else { throw new Exception("Token \"rank\" could not be found in roleObj."); } if (roleObj.TryGetValue("name", out tok)) { roleName = tok.Value <string>(); } else { throw new Exception("Token \"name\" could not be found in roleObj."); } return(new GroupRole(roleName, roleRank, roleId)); } else { throw new Exception("Token \"role\" could not be found in groupMembershipObject."); } } } else { throw new Exception("Token \"group.id\" could not be found in groupMembershipObject."); } } else { throw new Exception("Token \"group\" could not be found in groupMembershipObject."); } } return(null); } else { throw new Exception("Could not find \"data\" in json response. Did the response model change?"); } }
private async Task <GroupResult_t> GetEnemyPage(int page) { string data = await HttpHelper.GetStringFromURL(string.Format("https://api.roblox.com/groups/{0}/enemies?page={1}", ID, page)); return(JsonConvert.DeserializeObject <GroupResult_t>(data)); }
/// <summary> /// Gets the asset data from https://assetgame.roblox.com/Asset/?id= /// </summary> /// <returns>The asset downloaded as a string</returns> public async Task <string> DownloadAsString() { return(await HttpHelper.GetStringFromURL("https://assetgame.roblox.com/Asset/?id=" + ID)); }