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"); }
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; // } //} }