Esempio n. 1
0
        static async Task MainAsync(string[] args)
        {
            var username    = args.Length > 0 ? args[0] : "";
            var testing     = DateTime.Now.AddDays(30).ToUnixTime();
            var oauthClient = new MiiverseOAuthClient();
            var token       = oauthClient.GetTokenAsync().GetAwaiter().GetResult();

            Console.WriteLine("client_id:\t{0}", token.ClientID);
            Console.WriteLine("response_type:\t{0}", token.ResponseType);
            Console.WriteLine("redirect_uri:\t{0}", token.RedirectUri);
            Console.WriteLine("state:\t{0}", token.State);
            Console.WriteLine("-----------");

            Console.WriteLine("Please input your NNID.");
            Console.Write("Username: "******"Password: "******"");
            Console.WriteLine("-----------");

            var ctx = oauthClient.Authorize(token, new NintendoNetworkAuthenticationToken(userName, password), "en-US", ViewRegion.Japan).GetAwaiter().GetResult();

            // TODO: Figure out a way to automate archiving game/user data.
            // Hardcoding this for testing...
            Console.WriteLine("-----------");
            //Console.WriteLine("Archiving: Splatoon (Drawing)");
            //Console.WriteLine("Archiving: Game Lists");
            Console.WriteLine("Parsing Test: Users List");
            Console.WriteLine("-----------");
            var gameList = ctx.GetCommunityGameListAsync(GameSearchList.All, GamePlatformSearch.Wiiu, 300).GetAwaiter().GetResult();

            var userIds = File.ReadAllLines("miiverse_users.txt").ToList();

            using (var db = new LiteDatabase("friends.db"))
            {
                var users         = db.GetCollection <UserFriend>("friends");
                var allUsers      = users.Find(Query.All()).ToList();
                var startingCount = 0;
                if (allUsers.Any() && !string.IsNullOrEmpty(username))
                {
                    startingCount = userIds.IndexOf(username);
                }
                for (var i = startingCount; i <= userIds.Count(); i++)
                {
                    var user = userIds[i];
                    Console.WriteLine($"Getting Friends for {user}");
                    var friendList = await GetFeed(ctx, user, UserProfileFeedType.Friends);

                    Console.WriteLine($"{user} Friends: {friendList.ResultScreenNames.Count()}");

                    var newFriendsList = friendList.ResultScreenNames.Where(n => !allUsers.Any(o => o.ProfileFeedType == UserProfileFeedType.Friends && o.ScreenName == user && o.AcquaintanceScreenName == n)).ToList();
                    foreach (var friend in newFriendsList)
                    {
                        users.Insert(new UserFriend(user, friend, UserProfileFeedType.Friends));
                    }

                    Console.WriteLine($"Getting Followers for {user}");
                    var followerList = await GetFeed(ctx, user, UserProfileFeedType.Followers);

                    var newFollowersList = followerList.ResultScreenNames.Where(n => !allUsers.Any(o => o.ProfileFeedType == UserProfileFeedType.Followers && o.ScreenName == user && o.AcquaintanceScreenName == n)).ToList();

                    Console.WriteLine($"{user} Followers: {followerList.ResultScreenNames.Count()}");
                    foreach (var friend in newFollowersList)
                    {
                        users.Insert(new UserFriend(user, friend, UserProfileFeedType.Followers));
                    }

                    Console.WriteLine($"Getting Following for {user}");
                    var FollowingList = await GetFeed(ctx, user, UserProfileFeedType.Following);

                    var newFollowingList = FollowingList.ResultScreenNames.Where(n => !allUsers.Any(o => o.ProfileFeedType == UserProfileFeedType.Following && o.ScreenName == user && o.AcquaintanceScreenName == n)).ToList();

                    Console.WriteLine($"{user} Following: {FollowingList.ResultScreenNames.Count()}");
                    foreach (var friend in newFollowingList)
                    {
                        users.Insert(new UserFriend(user, friend, UserProfileFeedType.Following));
                    }
                }
            }


            //using (var db = new LiteDatabase("users.db"))
            //{
            //    var users = db.GetCollection<User>("users");
            //    var allUsers = users.Find(Query.All());
            //    var startingCount = 0;
            //    if (allUsers.Any())
            //    {
            //        var userNames = allUsers.Select(n => n.ScreenName).ToList();
            //        startingCount = userNames.IndexOf(allUsers.Last().ScreenName) + 1;
            //    }

            //    for (var i = startingCount; i <= userIds.Count(); i++)
            //    {
            //        var userEntity = await ctx.GetUserProfileAsync(userIds[i]);
            //        Console.WriteLine("Name: {0}", userEntity.User.Name);
            //        Console.WriteLine("ScreenName: {0}", userEntity.User.ScreenName);
            //        Console.WriteLine("Following: {0}", userEntity.User.FollowingCount);
            //        Console.WriteLine("FollowerCount: {0}", userEntity.User.FollowerCount);
            //        Console.WriteLine("FriendsCount: {0}", userEntity.User.FriendsCount);
            //        Console.WriteLine("TotalPosts: {0}", userEntity.User.TotalPosts);
            //        Console.WriteLine("EmpathyCount: {0}", userEntity.User.EmpathyCount);
            //        Console.WriteLine("Bio: {0}", userEntity.User.Bio);
            //        Console.WriteLine("IconUri: {0}", userEntity.User.IconUri);
            //        Console.WriteLine("Country: {0}", userEntity.User.Country);
            //        Console.WriteLine("Birthday: {0}", userEntity.User.Birthday);
            //        Console.WriteLine("Birthday Hidden: {0}", userEntity.User.IsBirthdayHidden);
            //        Console.WriteLine("Sidebar Image: {0}", userEntity.User.SidebarCoverUrl);
            //        if (userEntity.User.GameSystem != null)
            //        {
            //            foreach (var gameSystem in userEntity.User.GameSystem)
            //            {
            //                Console.WriteLine("GameSystem: {0}", gameSystem);
            //            }
            //        }
            //        if (userEntity.User.FavoriteGameGenre != null)
            //        {
            //            foreach (var gameGenre in userEntity.User.FavoriteGameGenre)
            //            {
            //                Console.WriteLine("GameGenre: {0}", gameGenre);
            //            }
            //        }
            //        Console.WriteLine("GameSkill: {0}", userEntity.User.GameSkill);
            //        Console.WriteLine("-----------");

            //        userEntity.User.Id = i;
            //        users.Upsert(userEntity.User);
            //    }
            //}
            //var postTest = await ctx.GetPostAsync("AYIHAAAEAABEVRTp4iPDww");
            //var repliesTest = await ctx.GetPostResponse("AYIHAAAEAABEVRTp4iPDww", MiiverseArchive.Tools.Constants.WebApiType.Replies);
            //var gameTest = new Game("community-14866558073673172583", "Splatoon", "/titles/14866558073673172576/14866558073673172583", new Uri("https://d3esbfg30x759i.cloudfront.net/cnj/zlCfzTYBRmcD4DW6Q5"), "platform-tag-wiiu.png", "Wii U Games");
        }
Esempio n. 2
0
        static async Task MainAsync(string[] args)
        {
            //using (var db2 = new LiteDatabase("fulldb.db"))
            //{
            //    var posts2 = db2.GetCollection<Post>("posts");
            //    var allPosts = posts2.Find(Query.All()).Where(node => node.Text != null && node.Text.ToLower().Contains("trump")).ToList();
            //    //Parallel.For(0, allPosts.Count(), index =>
            //    //{
            //    //    var game = allPosts[index];
            //    //    Console.WriteLine($"{game.ID}");
            //    //    using (var webClient = new WebClient())
            //    //    {
            //    //        Directory.CreateDirectory($"{game.ImageUri.Segments[1]}");
            //    //        webClient.DownloadFile(game.ImageUri, $"{game.ImageUri.Segments[1]}" + Path.GetFileName(game.ImageUri.ToString()) + ".png");
            //    //    }
            //    //});
            //}

            var filename    = args.Length > 0 ? args[0] : "";
            var gameId      = args.Length > 2 ? args[2] : "";
            var webType     = args.Length > 1 ? (WebApiType)Convert.ToInt32(args[1]) : WebApiType.Diary;
            var oauthClient = new MiiverseOAuthClient();
            var token       = oauthClient.GetTokenAsync().GetAwaiter().GetResult();

            Console.WriteLine("client_id:\t{0}", token.ClientID);
            Console.WriteLine("response_type:\t{0}", token.ResponseType);
            Console.WriteLine("redirect_uri:\t{0}", token.RedirectUri);
            Console.WriteLine("state:\t{0}", token.State);
            Console.WriteLine("-----------");

            Console.WriteLine("Please input your NNID.");
            Console.Write("Username: "******"Password: "******"");
            Console.WriteLine("-----------");
            var viewRegion = ViewRegion.America;

            var ctx = oauthClient.Authorize(token, new NintendoNetworkAuthenticationToken(userName, password), "en-US", viewRegion).GetAwaiter().GetResult();

            // TODO: Figure out a way to automate archiving game/user data.
            // Hardcoding this for testing...
            Console.WriteLine("-----------");

            //var testGame = ctx.GetCommunityGameListAsync(GameSearchList.All, GamePlatformSearch.Wiiu, 300).GetAwaiter().GetResult();

            //using (var db = new LiteDatabase("gamelist.db"))
            //using (var db2 = new LiteDatabase("gamelistrelated.db"))
            //{
            //    var games = db.GetCollection<Game>("gamelist");
            //    var gamesRelated = db2.GetCollection<CommunityItem>("gamelistrelated");
            //    var allGames = games.Find(Query.All()).ToList();
            //    foreach (var game in allGames)
            //    {
            //        var testingbesting = game.TitleUrl.Split('/');
            //        var result = await ctx.GetRelatedCommunityGameListAsync(testingbesting[2]);
            //        if (result.Games == null) continue;
            //        foreach (var test in result.Games)
            //        {
            //            test.ViewRegion = game.ViewRegion;
            //            test.Type = game.Type;
            //            Console.WriteLine($"{test.Title}");
            //            gamesRelated.Insert(test);
            //        }
            //    }

            //    var allGamesRelated = gamesRelated.Find(Query.All()).ToList();
            //    File.WriteAllText("gamelistrelated.json", JsonConvert.SerializeObject(allGamesRelated, Formatting.Indented));
            //    File.WriteAllText("gamelistrelated-notmain.json", JsonConvert.SerializeObject(allGamesRelated.Where(node => node.CommunityBadge != "Main Community"), Formatting.Indented));
            //}

            //var gameList = JsonConvert.DeserializeObject<List<Game>>(File.ReadAllText($"{filename}.json"));
            //var communityItemList = JsonConvert.DeserializeObject<List<CommunityItem>>(File.ReadAllText($"{filename}.json"));

            //var startIndex = 0;

            //if (gameId != "")
            //{
            //    var game = gameList.FirstOrDefault(node => node.Id == gameId);
            //    if (game != null)
            //        startIndex = gameList.IndexOf(game);
            //}

            //var filenametest = "";

            //switch (webType)
            //{
            //    case WebApiType.Diary:
            //        filenametest = "diary";
            //        break;
            //    case WebApiType.Discussion:
            //        filenametest = "discussion";
            //        break;
            //    case WebApiType.Drawing:
            //        filenametest = "drawing";
            //        break;
            //    case WebApiType.InGame:
            //        filenametest = "ingame";
            //        break;
            //    case WebApiType.OldGame:
            //        filenametest = "oldgame";
            //        break;
            //    case WebApiType.Posts:
            //        filenametest = "posts";
            //        break;
            //    case WebApiType.Replies:
            //        filenametest = "replies";
            //        break;
            //    case WebApiType.Special:
            //        filenametest = "special";
            //        break;
            //}

            //for (var i = startIndex; i < gameList.Count; i++)
            //{
            //    var game = gameList[i];
            //    Console.WriteLine($"Game - {game.Title} - {game.Id} - {game.TitleUrl}");
            //    using (var db = new LiteDatabase($"{game.Id}-{filenametest}.db"))
            //    {
            //        var posts = db.GetCollection<Post>("posts");
            //        var allPosts = posts.Find(Query.All());

            //        double nextPost = 0;
            //        double nextPostMinutes = 0;
            //        DateTime time = DateTime.UtcNow;
            //        var nextPageUrl = "";
            //        if (allPosts.Any())
            //        {
            //            if (File.Exists($"{game.Id}-nextUrl.txt")) {
            //                nextPageUrl = File.ReadAllLines($"{game.Id}-nextUrl.txt").Last();
            //            }
            //        }

            //        var countInserted = 0;

            //        while (true)
            //        {
            //            var response = await ctx.GetWebApiResponse(game, webType, nextPageUrl);

            //            if (response.Posts == null || !response.Posts.Any())
            //            {
            //                // We're done! Time to wrap it up.
            //                Console.WriteLine(Environment.NewLine);
            //                break;
            //            }

            //            foreach (var post in response.Posts)
            //            {
            //                // Upsert either "inserts" a new post, or "Updates" an existing post
            //                // I use this so, in case the same post shows up again,
            //                // we can continue without the program throwing an error.
            //                post.GameCommunity = communityItemList[i];
            //                posts.Upsert(post);
            //            }


            //            Console.Write("\rNext Post Time: {0} Total Inserted: {1}", nextPost, posts.Count());

            //            if (response.NextPageUrl == nextPageUrl || response.NextPageUrl == "")
            //            {
            //                // We're done! Time to wrap it up.
            //                Console.WriteLine(Environment.NewLine);
            //                break;
            //            }

            //            File.AppendAllText($"{game.Id}-nextUrl.txt", response.NextPageUrl + Environment.NewLine);
            //            countInserted = posts.Count();
            //            nextPageUrl = response.NextPageUrl;
            //        }
            //    }
            //}

            //var userIds = File.ReadAllLines(filename).ToList();
            //using (var db = new LiteDatabase($"{filename}.db"))
            //{
            //    var users = db.GetCollection<UserFriend>("friends");
            //    var allUsers = users.Find(Query.All()).ToList();
            //    var startingCount = 0;
            //    if (allUsers.Any())
            //    {
            //        var lastUser = allUsers.Last().ScreenName;
            //        startingCount = userIds.IndexOf(lastUser);
            //    }
            //    for (var i = startingCount; i <= userIds.Count(); i++)
            //    {
            //        var user = userIds[i];
            //        Console.WriteLine($"Getting Friends for {user}");
            //        var friendList = await GetFeed(ctx, user, UserProfileFeedType.Friends);
            //        Console.WriteLine($"{user} Friends: {friendList.ResultScreenNames.Count()}");

            //        var newFriendsList = friendList.ResultScreenNames.Where(n => !allUsers.Any(o => o.ProfileFeedType == UserProfileFeedType.Friends && o.ScreenName == user && o.AcquaintanceScreenName == n)).ToList();
            //        foreach (var friend in newFriendsList)
            //        {
            //            users.Insert(new UserFriend(user, friend, UserProfileFeedType.Friends));
            //        }

            //        Console.WriteLine($"Getting Followers for {user}");
            //        var followerList = await GetFeed(ctx, user, UserProfileFeedType.Followers);
            //        var newFollowersList = followerList.ResultScreenNames.Where(n => !allUsers.Any(o => o.ProfileFeedType == UserProfileFeedType.Followers && o.ScreenName == user && o.AcquaintanceScreenName == n)).ToList();

            //        Console.WriteLine($"{user} Followers: {followerList.ResultScreenNames.Count()}");
            //        foreach (var friend in newFollowersList)
            //        {
            //            users.Insert(new UserFriend(user, friend, UserProfileFeedType.Followers));
            //        }

            //        Console.WriteLine($"Getting Following for {user}");
            //        var FollowingList = await GetFeed(ctx, user, UserProfileFeedType.Following);
            //        var newFollowingList = FollowingList.ResultScreenNames.Where(n => !allUsers.Any(o => o.ProfileFeedType == UserProfileFeedType.Following && o.ScreenName == user && o.AcquaintanceScreenName == n)).ToList();

            //        Console.WriteLine($"{user} Following: {FollowingList.ResultScreenNames.Count()}");
            //        foreach (var friend in newFollowingList)
            //        {
            //            users.Insert(new UserFriend(user, friend, UserProfileFeedType.Following));
            //        }

            //    }
            //}

            //return;

            // GET SPLATOON POSTS

            //using (var db = new LiteDatabase("gamelist.db"))
            //using (var db2 = new LiteDatabase("postlist.db"))
            //{
            //    var games = db.GetCollection<Game>("gamelist");
            //    var posts = db2.GetCollection<Post>("postList");
            //    var allGames = games.Find(Query.All()).ToList();
            //    var allPosts = posts.Find(Query.All()).ToList();

            //    double nextPost = 0;
            //    double nextPostMinutes = 0;

            //    DateTime time = DateTime.UtcNow;
            //    if (allPosts.Any())
            //    {
            //        var post = allPosts.OrderBy(n => n.PostedDate).First();
            //        var secondsSinceEpoch = post.PostedDate.ToUnixTime();
            //        nextPost = -(secondsSinceEpoch);
            //        time = post.PostedDate;
            //    }

            //    // Get Japanese version of Splatoon
            //    var splatoon = allGames.First(n => n.Title.Contains("Splatoon") && n.ViewRegion == ViewRegion.Japan);

            //    var countInserted = 0;
            //    while (true)
            //    {
            //        var splatoonGameDrawingResponse = await ctx.GetWebApiResponse(splatoon, MiiverseArchive.Tools.Constants.WebApiType.Drawing, nextPost);
            //        if (splatoonGameDrawingResponse.Posts == null)
            //        {
            //            // We're done! Time to wrap it up.
            //            return;
            //        }

            //        foreach (var post in splatoonGameDrawingResponse.Posts)
            //        {
            //            // Upsert either "inserts" a new post, or "Updates" an existing post
            //            // I use this so, in case the same post shows up again,
            //            // we can continue without the program throwing an error.
            //            posts.Upsert(post);
            //        }

            //        // We can't get exact times for posts, only relative times like "About an hour".
            //        // Because of that, we can't rely on using the last post to set where we start from.
            //        // Because we could end up just getting the same last hour of posts. So instead.
            //        // Keep substracting 15 minutes from the current time. That should result in getting newer posts.

            //        TimeSpan epoch;
            //        time = splatoonGameDrawingResponse.Posts.Last().PostedDate;
            //        if (countInserted != posts.Count())
            //        {
            //            epoch = time - new DateTime(1970, 1, 1);
            //        }
            //        else
            //        {
            //            nextPostMinutes = nextPostMinutes + 100;
            //            epoch = time.AddMinutes(-1 * nextPostMinutes) - new DateTime(1970, 1, 1);
            //        }
            //        double secondsSinceEpoch = epoch.TotalSeconds;
            //        nextPost = -(secondsSinceEpoch);
            //        Console.WriteLine("Next Post Time: {0} Total Inserted: {1}", nextPost, posts.Count());
            //        countInserted = posts.Count();
            //    }
            //}

            //using (var db = new LiteDatabase("gamelist.db"))
            //{
            //    var posts = db.GetCollection<Game>("gamelist");
            //    var allPosts = posts.Find(Query.All()).ToList();
            //    var allPostsTip = allPosts.Where(node => node.IconUri.ToString().Contains("/tip/")).Count();
            //    var postIndex = allPosts.IndexOf(allPosts.First(n => n.Title == "Excave III : Tower of Destiny"));

            //    // New, Parallel, l337 way!

            //    Parallel.For(2000, allPosts.Count(), index =>
            //    {
            //        var game = allPosts[index];
            //        Console.WriteLine($"{game.Title}");
            //        using (var webClient = new WebClient())
            //        {
            //            if (game.CommunityListIcon != null)
            //            {
            //                Directory.CreateDirectory($"{game.CommunityListIcon.Segments[1]}");
            //                webClient.DownloadFile(game.CommunityListIcon, $"{game.CommunityListIcon.Segments[1]}" + Path.GetFileName(game.CommunityListIcon.ToString()) + ".png");
            //            }

            //            Directory.CreateDirectory($"{game.IconUri.Segments[1]}");
            //            webClient.DownloadFile(game.IconUri, $"{game.IconUri.Segments[1]}" + Path.GetFileName(game.IconUri.ToString()) + ".png");
            //        }
            //    });

            //    ////Old, terrible way
            //    //foreach (var game in allPosts)
            //    //{
            //    //    Console.WriteLine($"{game.Title}");
            //    //    if (game.CommunityListIcon != null)
            //    //    {
            //    //        Directory.CreateDirectory($"{game.CommunityListIcon.Segments[1]}");
            //    //        webClient.DownloadFile(game.CommunityListIcon, $"{game.CommunityListIcon.Segments[1]}" + Path.GetFileName(game.CommunityListIcon.ToString()) + ".png");
            //    //    }

            //    //    Directory.CreateDirectory($"{game.IconUri.Segments[1]}");
            //    //    webClient.DownloadFile(game.IconUri, $"{game.IconUri.Segments[1]}" + Path.GetFileName(game.IconUri.ToString()) + ".png");
            //    //}
            //}

            // GET GAME LIST

            //using (var db = new LiteDatabase("gamelist-test.db"))
            //{
            //    var posts = db.GetCollection<Game>("gamelist");
            //    var allPosts = posts.Find(Query.All());
            //    var offset = 0;

            //    Console.WriteLine("Getting Nintendo3DS Game List");
            //    while (true)
            //    {
            //        var communityList = await ctx.GetCommunityGameListAsync(GameSearchList.All, GamePlatformSearch.Nintendo3ds, offset);
            //        if (communityList.Games == null)
            //        {
            //            // We're done! Time to wrap it up.
            //            break;
            //        }

            //        foreach (var game in communityList.Games)
            //        {
            //            var test = posts.FindById(game.Id);
            //            if (test == null)
            //            {
            //                game.ViewRegion = viewRegion;
            //                posts.Insert(game);
            //            }
            //            else
            //            {
            //                // Game exists in database, so say that it's a world release.
            //                game.ViewRegion = ViewRegion.World;
            //                posts.Upsert(game);
            //            }
            //        }
            //        Console.WriteLine($"{posts.Count()}");
            //        offset = offset + 30;
            //    }

            //    offset = 0;

            //    Console.WriteLine("Getting WiiU Game List");
            //    while (true)
            //    {
            //        var communityList = await ctx.GetCommunityGameListAsync(GameSearchList.All, GamePlatformSearch.Wiiu, offset);
            //        if (communityList.Games == null)
            //        {
            //            // We're done! Time to wrap it up.
            //            break;
            //        }

            //        foreach (var game in communityList.Games)
            //        {
            //            var test = posts.FindById(game.Id);
            //            if (test == null)
            //            {
            //                game.ViewRegion = viewRegion;
            //                posts.Insert(game);
            //            }
            //            else
            //            {
            //                // Game exists in database, so say that it's a world release.
            //                game.ViewRegion = ViewRegion.World;
            //                posts.Upsert(game);
            //            }
            //        }
            //        Console.WriteLine($"{posts.Count()}");
            //        offset = offset + 30;
            //    }
            //}
        }