Example #1
0
        /// <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);
        }
Example #2
0
        /// <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");
        }
Example #3
0
        /// <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);
        }
Example #4
0
 /// <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); }
 }
Example #5
0
        /// <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"];
        }
Example #6
0
        /// <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);
        }
Example #7
0
        /// <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);
            }
        }
Example #8
0
 /// <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));
 }
Example #9
0
        /// <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);
        }
Example #10
0
        /// <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])));
        }
Example #11
0
        /// <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);
        }
Example #12
0
        /// <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); }
        }
Example #13
0
        /// <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);
        }
Example #14
0
        /// <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);
            }
        }
Example #15
0
        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);
        }
Example #16
0
        /// <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?");
            }
        }
Example #17
0
        /// <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);
            }
        }
Example #18
0
        /// <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.
            }
        }
Example #19
0
        /// <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); }
        }
Example #20
0
 /// <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");
 }
Example #21
0
        /// <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);
            }
        }
Example #22
0
        /// <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?");
            }
        }
Example #23
0
        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));
        }
Example #24
0
 /// <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));
 }