/// <summary> /// Writes a Google+ App Activity to Google logging that the user has voted on a PhotoHunt /// photo. /// </summary> /// <param name="user">The user who has voted.</param> /// <param name="voteTarget">The photo the user has voted on.</param> public void WriteGooglePlusVoteAppActivity(User user, Photo voteTarget) { // Write an app activity for the vote. // Set the auth state in a the superclass for the authorization call. _authState = CreateState(user.googleAccessToken, user.googleRefreshToken, user.googleExpiresAt.AddSeconds(user.googleExpiresIn * -1), user.googleExpiresAt); AuthorizationServerDescription description = GoogleAuthenticationServer.Description; var provider = new WebServerClient(description); provider.ClientIdentifier = CLIENT_ID; provider.ClientSecret = CLIENT_SECRET; var authenticator = new OAuth2Authenticator <WebServerClient>( provider, GetAuthorization) { NoCaching = true }; ps = new PlusService(new BaseClientService.Initializer() { Authenticator = authenticator }); Moment body = new Moment(); ItemScope target = new ItemScope(); ItemScope result = new ItemScope(); // The target (an image) will be parsed from this URL containing microdata. target.Url = BASE_URL + "photo.aspx?photoId=" + voteTarget.id; // Just use a static review result. result.Type = SCHEMA_REVIEW_TYPE; result.Name = "A vote for this PhotoHunt photo."; result.Url = target.Url; result.Text = "This photo embodies " + voteTarget.themeDisplayName; body.Target = target; body.Result = result; body.Type = REVIEW_ACTIVITY_TYPE; MomentsResource.InsertRequest insert = new MomentsResource.InsertRequest( ps, body, "me", MomentsResource.Collection.Vault); try { insert.Fetch(); } catch (GoogleApiRequestException gare) { Debug.WriteLine("Error while writing app activity: " + gare.InnerException.Message + "\nThis could happen if the Google+ proxy can't access your server."); } }
public void AddLocationScope(ItemKey item, ItemScope scope, LocationScope locationScope) { SlotKey key = new SlotKey(item, scope); ItemLocation loc = Location(key); loc.LocScope = locationScope; if (!Locations.ContainsKey(locationScope)) { Locations[locationScope] = new List <SlotKey>(); } Locations[locationScope].Add(key); }
public void AddLocation(ItemKey item, ItemScope scope, LocationKey key) { if (!Data.ContainsKey(item)) { Data[item] = new ItemLocations(); } if (!Data[item].Locations.ContainsKey(scope)) { Data[item].Locations[scope] = new ItemLocation(scope); } Data[item].Locations[scope].Keys.Add(key); }
protected void AddActivity(string activityType) { Moment moment = new Moment(); ItemScope itemScope = new ItemScope(); UseSavedAuthorization(); itemScope.Url = momentUrl; moment.Type = activityType; moment.Target = itemScope; // Preparing and making the request. service.Moments.Insert(moment, "me", MomentsResource.Collection.Vault).Fetch(); }
public void AddLocationlessItem(ItemKey item) { ItemScope scope = new ItemScope(ItemScope.ScopeType.SPECIAL, -1); LocationScope locScope = new LocationScope(ItemScope.ScopeType.SPECIAL, -1, new SortedSet <int>(), new SortedSet <int>(), false); if (!Data.ContainsKey(item)) { Data[item] = new ItemLocations(); Data[item].Unique = true; } if (!Data[item].Locations.ContainsKey(scope)) { Data[item].Locations[scope] = new ItemLocation(scope); } AddLocationScope(item, scope, locScope); }
/// <summary> /// Write an app activity to Google using the Google+ API logging that the user /// has uploaded a Photo. /// </summary> /// <param name="user">The PhotoHunt user who uploaded the Photo.</param> /// <param name="dbPhoto">The Photo that was just uploaded.</param> public void WriteGooglePlusPhotoAppActivity(User user, Photo dbPhoto) { _authState = CreateState(user.googleAccessToken, user.googleRefreshToken, user.googleExpiresAt.AddSeconds(user.googleExpiresIn * -1), user.googleExpiresAt); AuthorizationServerDescription description = GoogleAuthenticationServer.Description; var provider = new WebServerClient(description); provider.ClientIdentifier = CLIENT_ID; provider.ClientSecret = CLIENT_SECRET; var authenticator = new OAuth2Authenticator <WebServerClient>( provider, GetAuthorization) { NoCaching = true }; ps = new PlusService(new BaseClientService.Initializer() { Authenticator = authenticator }); Moment body = new Moment(); ItemScope target = new ItemScope(); target.Url = BASE_URL + "photo.aspx?photoId=" + dbPhoto.id; body.Target = target; body.Type = ADD_ACTIVITY_TYPE; MomentsResource.InsertRequest insert = new MomentsResource.InsertRequest(ps, body, "me", MomentsResource.Collection.Vault); try { insert.Fetch(); } catch (GoogleApiRequestException gare) { Debug.WriteLine("Error while writing app activity: " + gare.InnerException.Message + "\nThis could happen if the Google+ proxy can't access your server."); } }
public SlotKey(ItemKey Item, ItemScope Scope) { this.Item = Item; this.Scope = Scope; }
public ItemLocation(ItemScope Scope) { this.Keys = new List <LocationKey>(); this.Scope = Scope; }
public Moment WriteDemoMoment() { Moment body = new Moment(); ItemScope target = new ItemScope(); target.Id = "replacewithuniqueforaddtarget"; target.Image = "http://www.google.com/s2/static/images/GoogleyEyes.png"; target.Type = ""; target.Description = "The description for the activity"; target.Name = "An example of add activity"; body.Target = target; body.Type = "http://schemas.google.com/AddActivity"; MomentsResource.InsertRequest insert = new MomentsResource.InsertRequest( plusService, body, "me", MomentsResource.Collection.Vault); Moment m = insert.Fetch(); return m; }
static void Main(string[] args) { //Scopes for use with Google+ API // activating Google+ API in console // Documentation: https://developers.google.com/+/api/oauth string[] scopes = new string[] { PlusService.Scope.PlusLogin, PlusService.Scope.UserinfoEmail, PlusService.Scope.UserinfoProfile ,"profile" }; string _client_id = "1046123799103-d0vpdthl4ms0soutcrpe036ckqn7rfpn.apps.googleusercontent.com"; string _client_secret = "NDmluNfTgUk6wgmy7cFo64RV"; // https://accounts.google.com/o/oauth2/auth?access_type=offline&response_type=code&client_id=1046123799103-d0vpdthl4ms0soutcrpe036ckqn7rfpn.apps.googleusercontent.com&redirect_uri=http://localhost:15918/authorize/&scope=https://www.googleapis.com/auth/plus.login%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&data-requestvisibleactions=http://schema.org/AddAction PlusService service = null; UserCredential credential = null; try { // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData% credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = _client_id, ClientSecret = _client_secret }, scopes, Environment.UserName, CancellationToken.None, new FileDataStore("Daimto.GooglePlusm.Auth.Store")).Result; } catch (Exception ex) { //If the user hits cancel you wont get access. if (ex.InnerException.Message.IndexOf("access_denied") != -1) { Console.WriteLine("User declined access"); Console.ReadLine(); return; } else { Console.WriteLine("Unknown Authentication Error:" + ex.Message); Console.ReadLine(); return; } } // Now we create a Google service. All of our requests will be run though this. service = new PlusService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Google Plus Sample", }); Moment body = new Moment(); body.Type = "http://schema.org/AddAction"; ItemScope itemScope = new ItemScope(); itemScope.Id = "target-id-1" ; itemScope.Type = "http://schema.org/AddAction"; itemScope.Name = "The Google+ Platform"; itemScope.Description = "A page that describes just how awesome Google+ is!"; itemScope.Image = "https://developers.google.com/+/plugins/snippet/examples/thing.png"; body.Object = itemScope; try { var l = service.Moments.Insert(body, "me", MomentsResource.InsertRequest.CollectionEnum.Vault); l.Execute(); } catch (Exception ex) { int i = 1; } // Getting a list of ALL a users public activities. IList<Activity> _Activities = DaimtoGooglePlusHelper.GetAllActivities(service, "me"); foreach (Activity item in _Activities) { Console.WriteLine(item.Actor.DisplayName + " Plus 1s: " + item.Object.Plusoners.TotalItems + " comments: " + item.Object.Replies.TotalItems); } //Just getting an activity that has some comments for the example below. Activity withComment = _Activities.Where(x => x.Object.Replies.TotalItems > 0).FirstOrDefault(); // Getting a list of all the comments for an activity IList<Comment> _comments = DaimtoGooglePlusHelper.GetAllComments(service, withComment.Id); foreach (Comment item in _comments) { Console.WriteLine("Comment " + item.Actor.DisplayName + " Plus 1s: " + item.Plusoners.TotalItems); } //Listing of all the people the user has circled. IList<Person> people = DaimtoGooglePlusHelper.GetAllPeople(service, "me"); Console.ReadLine(); }
private static void Run() { UserCredential credential; var initializer = new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = secrets, Scopes = new[] { PlusService.Scope.PlusLogin } }; var flow = new AAGoogleAuthorizationCodeFlow(initializer); credential = new AuthorizationCodeInstalledApp(flow, new LocalServerCodeReceiver()).AuthorizeAsync ("user", CancellationToken.None).Result; // Create the service. var service = new PlusService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Gus API", }); Moment body = new Moment(); ItemScope target = new ItemScope(); target.Url = "https://developers.google.com/+/web/snippet/examples/widget"; target.Image = "http://picpaste.com/pics/001.1437292069.jpg"; //target.Type = "http://schema.org/Thing"; target.Description = "The description for the action"; target.Name = "An example of add activity"; body.Target = target; body.Type = "http://schemas.google.com/AddActivity"; //PeopleResource.GetRequest personRequest = service.People.Get("me"); //Person _me = personRequest.Execute(); MomentsResource.InsertRequest insert = service.Moments.Insert(body, "me", MomentsResource.InsertRequest.CollectionEnum.Vault); //new MomentsResource.InsertRequest( // service, // body, // "me", // MomentsResource.InsertRequest.CollectionEnum.Vault); Moment wrote = insert.Execute(); MomentsResource.ListRequest ls = service.Moments.List("me", MomentsResource.ListRequest.CollectionEnum.Vault); MomentsFeed feeds = ls.Execute(); }
/// <summary> /// Writes a Google+ App Activity to Google logging that the user has voted on a PhotoHunt /// photo. /// </summary> /// <param name="user">The user who has voted.</param> /// <param name="voteTarget">The photo the user has voted on.</param> public void WriteGooglePlusVoteAppActivity(User user, Photo voteTarget) { // Write an app activity for the vote. // Set the auth state in a the superclass for the authorization call. _authState = CreateState(user.googleAccessToken, user.googleRefreshToken, user.googleExpiresAt.AddSeconds(user.googleExpiresIn * -1), user.googleExpiresAt); AuthorizationServerDescription description = GoogleAuthenticationServer.Description; var provider = new WebServerClient(description); provider.ClientIdentifier = CLIENT_ID; provider.ClientSecret = CLIENT_SECRET; var authenticator = new OAuth2Authenticator<WebServerClient>( provider, GetAuthorization) { NoCaching = true }; ps = new PlusService(new BaseClientService.Initializer() { Authenticator = authenticator }); Moment body = new Moment(); ItemScope target = new ItemScope(); ItemScope result = new ItemScope(); // The target (an image) will be parsed from this URL containing microdata. target.Url = BASE_URL + "photo.aspx?photoId=" + voteTarget.id; // Just use a static review result. result.Type = SCHEMA_REVIEW_TYPE; result.Name = "A vote for this PhotoHunt photo."; result.Url = target.Url; result.Text = "This photo embodies " + voteTarget.themeDisplayName; body.Target = target; body.Result = result; body.Type = REVIEW_ACTIVITY_TYPE; MomentsResource.InsertRequest insert = new MomentsResource.InsertRequest( ps, body, "me", MomentsResource.Collection.Vault); try { insert.Fetch(); } catch (GoogleApiRequestException gare) { Debug.WriteLine("Error while writing app activity: " + gare.InnerException.Message + "\nThis could happen if the Google+ proxy can't access your server."); } }
public LocationData FindItems(GameData game) { ItemLocs allLocs = FindItemLocs(game); SortedDictionary <int, List <EntityId> > usedItemLots = allLocs.usedItemLots; SortedDictionary <int, List <EntityId> > usedBaseShops = allLocs.usedBaseShops; PARAM shops = game.Param("ShopLineupParam"); PARAM itemLots = game.Param("ItemLotParam"); PARAM materials = game.Param("EquipMtrlSetParam"); PARAM npcs = game.Param("NpcParam"); // First we may have to create lots - easier to do this at the start than keep data in side channels all the way through int baseEvent = 52500960; foreach (KeyValuePair <int, int> toCreate in allLocs.baseLotsToCreate) { PARAM.Row baseRow = itemLots[toCreate.Value]; int newLot = toCreate.Key; PARAM.Row row = itemLots[newLot]; if (row == null) { row = game.AddRow("ItemLotParam", newLot); foreach (PARAM.Cell newCell in row.Cells) { newCell.Value = baseRow[newCell.Def.InternalName].Value; } } // TODO: Re-enable this with flag id validation row["getItemFlagId"].Value = baseEvent; baseEvent++; } LocationData data = new LocationData(); data.NewEntityLots = allLocs.newEntityLots; LocationKey prevLocation = null; foreach (KeyValuePair <int, List <EntityId> > entry in usedItemLots) { int itemLot = entry.Key; if (prevLocation != null) { // TODO: If event flag is tracked in script, allow 1 maxslot prevLocation.MaxSlots = Math.Max(Math.Min(itemLot - prevLocation.ID - 1, 8), 1); if (prevLocation.MaxSlots < 1) { Console.WriteLine($"XX Overlapping slots at {itemLot}"); } prevLocation = null; } List <EntityId> entities = entry.Value; string locs = string.Join(", ", entities.Select(e => game.EntityName(e, true) + (e.MapName == "" ? "" : " " + e.MapName))); if (itemLots[itemLot] == null) { string text = game.LotName(itemLot); // These are fine - no-ops to game if (logUnused) { Console.WriteLine($"MISSING connected item lot!! {itemLot}: {text} @ {locs}"); } continue; } LocationKey baseLocation = null; while (itemLots[itemLot] != null) { bool isBase = itemLot == entry.Key; string text = game.LotName(itemLot); PARAM.Row row = itemLots[itemLot]; int clearCount = (sbyte)row["ClearCount"].Value; int eventFlag = (int)row["getItemFlagId"].Value; int totalPoints = 0; for (int i = 1; i <= 8; i++) { totalPoints += (short)row[$"LotItemBasePoint0{i}"].Value; } List <string> itemLotOutput = new List <string>(); for (int i = 1; i <= 8; i++) { int id = (int)row[$"ItemLotId{i}"].Value; if (id != 0) { uint type = (uint)row[$"LotItemCategory0{i}"].Value; int points = (short)row[$"LotItemBasePoint0{i}"].Value; int quantity = (ushort)row[$"NewLotItemNum{i}"].Value; if (type == 0xFFFFFFFF) { continue; } ItemKey item = new ItemKey(LocationData.LotTypes[type], id); string itemText = $"{itemLot}[{locs}]"; List <string> lotInfo = new List <string>(); if (quantity > 1) { lotInfo.Add($"{quantity}x"); } if (points != totalPoints) { lotInfo.Add($"{100.0 * points / totalPoints:0.##}%"); } PARAM.Row itemRow = game.Item(item); if (itemRow != null && item.Type == ItemType.GOOD && (byte)itemRow["goodsType"].Value == 7) { // Items which are not shown in inventory menu for various reasons, but having them still does something. lotInfo.Add($"(hidden)"); } itemLotOutput.Add($"{game.Name(item)} " + string.Join(" ", lotInfo)); if (lotInfo.Count() > 0) { itemText += $" {string.Join(", ", lotInfo)}"; } if (quantity <= 0) { Console.WriteLine($"XX There is 0! of {itemText}"); } ItemScope scope; if (eventFlag != -1) { if (equivalentEvents.ContainsKey(eventFlag)) { eventFlag = equivalentEvents[eventFlag]; } scope = new ItemScope(ScopeType.EVENT, eventFlag); // Note this doesn't necessarily have to be slot 1. But it should be only one slot... if (points != totalPoints) { Console.WriteLine($"Has event flag? But random? {itemText}"); } } else { // One time drops that directly award, that aren't covered by event flags. Mostly crystal lizards. if (entities.Count() == 1 && entityItemLots.ContainsKey(entities[0].EventEntityID) && entityItemLots[entities[0].EventEntityID] == entry.Key) { scope = new ItemScope(ScopeType.ENTITY, entities[0].EventEntityID); } // Non-respawning enemies with drops which can be missed. These are reused between different entities, so can drop multiple times. else if (entities.All(e => nonRespawningEntities.Contains(e.EventEntityID))) { scope = new ItemScope(ScopeType.ENTITY, entities.Select(e => e.EventEntityID).Min()); } else { int model = entities.Select(e => e.GetModelID()).Min(); // Infinite guaranteed or scripted drops are not randomized unless specifically added to entityItemLots if (model == -1 || points == totalPoints) { if (logUnused) { Console.WriteLine($"XX Item {game.Name(item)} {itemLot} has no associated event, but is guaranteed or global: {itemText}"); } continue; } scope = new ItemScope(ScopeType.MODEL, model); } } LocationKey location = new LocationKey(LocationType.LOT, itemLot, itemText, entities, quantity, baseLocation); data.AddLocation(item, scope, location); if (baseLocation == null) { baseLocation = location; } } } // Write out the info. Some deduplication of sources to make prettier output. string lotOutput = string.Join(", ", itemLotOutput); bool simple = false; string text2; if (simple) { SortedSet <string> locations = new SortedSet <string>(entities.Select(e => game.LocationNames[e.MapName])); SortedSet <string> models = new SortedSet <string>(entities.Select(e => e.EntityName.StartsWith("o") ? "Treasure" : game.EntityName(e))); text2 = $"{string.Join(", ", models)}: {string.Join(", ", locations)}"; if (models.All(x => x == "unknown")) { text2 = "Unused/Unknown"; } if (models.All(x => x == "Unused NPC")) { text2 = "Unused NPC"; } else if (models.Any(x => x == "Unused NPC")) { models.Remove("Unused NPC"); if (locations.Count > 1) { locations.Remove("Global"); } text2 = $"{string.Join(", ", models)}: {string.Join(", ", locations)}"; } } else { // e.NPCParamID > -1 ? $" #{e.NPCParamID}" : "" // SortedSet<string> models = new SortedSet<string>(entities.Select(e => e.EntityName.StartsWith("o") ? $"Treasure in {e.MapName}" : $"{game.ModelName(e, true)} in {e.MapName}")); SortedSet <string> models = new SortedSet <string>(entities.Select(e => game.EntityName(e, true) + (e.MapName == "" ? "" : $" in {e.MapName}"))); text2 = $"{string.Join(", ", models)}"; } // Console.WriteLine($"{itemLot} [{text2}] {lotOutput}"); if (itemLot == 2014) { break; // Unused, and item lot immediately after it is used. Won't be an issue once. ... ?? } // Try to navigate resource drops (affected by Bell Demon). if ((byte)row["LotItemNum1"].Value == 1) { int curOffset = itemLot % 100; int curBase = itemLot / 100 * 100; int offset; for (offset = curOffset + 10; offset <= 50; offset += 10) { PARAM.Row offRow = itemLots[curBase + offset]; if (offRow != null && (byte)offRow["LotItemNum1"].Value == 1) { break; } } if (offset <= 50) { itemLot = curBase + offset; } else { itemLot++; } } else { itemLot++; } } prevLocation = baseLocation; } if (prevLocation != null) { prevLocation.MaxSlots = 5; } SortedDictionary <int, List <string> > qwcs = new SortedDictionary <int, List <string> >(); Dictionary <int, LocationKey> baseShops = new Dictionary <int, LocationKey>(); foreach (PARAM.Row row in shops.Rows) { int shopID = (int)row.ID; int baseShop = GetShopType(shopID); string shopName = shopSplits[baseShop]; if (shopName == null) { if (!addUnused) { continue; } shopName = "Unknown shop"; } if (shopID >= 9000000) { continue; } int qwc = (int)row["qwcID"].Value; int type = (byte)row["equipType"].Value; int id = (int)row["EquipId"].Value; int quantity = (short)row["sellQuantity"].Value; int eventFlag = (int)row["EventFlag"].Value; int material = (int)row["mtrlId"].Value; int value = (int)row["value"].Value; float priceRate = (float)row["PriceRate"].Value; string quantityText = quantity == -1 ? "" : $" ({quantity})"; // (unlimited) string qwcText = qwc == -1 ? "" : $" {game.QwcName(qwc)}"; string costText = ""; ItemKey item = new ItemKey((ItemType)type, id); if (material != -1) { PARAM.Row matRow = materials[material]; int materialQuant = (sbyte)matRow["ItemNum01"].Value; int materialItem = (int)matRow["MaterialId01"].Value; costText = $" for {materialQuant} {game.Name(new ItemKey(ItemType.GOOD, materialItem))}"; } if (value != 0 || costText == "") { int actualCost = value; if (actualCost == -1) { actualCost = (int)game.Item(item)["shopId"].Value; } if (priceRate != 0) { actualCost = (int)(actualCost * priceRate); } costText = costText == "" ? $" for {actualCost} Sen" : $"{costText} and {actualCost} Sen"; } string shopText = $"{shopName}{qwcText}{quantityText}{costText} - event {eventFlag}"; string text = $"{shopID}[{shopText}]"; // Console.WriteLine($"{shopID} [{shopName}{qwcText}] {game.Name(item)}{quantityText}{costText}"); LocationKey location = new LocationKey( LocationType.SHOP, shopID, text, usedBaseShops.ContainsKey(baseShop) ? usedBaseShops[baseShop] : new List <EntityId>(), quantity, null); // try not to use base shops - baseShops.ContainsKey(baseShop) ? baseShops[baseShop] : null); if (shopID == baseShop) { baseShops[baseShop] = location; } ItemScope scope; AddMulti(qwcs, qwc, $"{game.Name(item)}: {text}"); if (eventFlag != -1) { if (equivalentEvents.ContainsKey(eventFlag)) { eventFlag = equivalentEvents[eventFlag]; } if (quantity <= 0) { Console.WriteLine("XX No quantity for event flag shop entry {text}"); } ScopeType scopeType = ScopeType.EVENT; if (restrictiveQwcs.Contains(qwc)) { // If item becomes unavailable at some point, it returns in infinite form scopeType = ScopeType.SHOP_INFINITE_EVENT; } scope = new ItemScope(scopeType, eventFlag); } else if (material != -1) { int materialItem = (int)materials[material]["MaterialId01"].Value; scope = new ItemScope(ScopeType.MATERIAL, materialItem); } else { scope = new ItemScope(ScopeType.SHOP_INFINITE, -1); } data.AddLocation(item, scope, location); } // Merge infinite and finite shops. Mostly done via heuristic (when event and infinite both exist), with exception of one event ItemScope infiniteKey = new ItemScope(ScopeType.SHOP_INFINITE, -1); foreach (ItemLocations locations in data.Data.Values) { foreach (ItemLocation restrict in locations.Locations.Values.Where(loc => loc.Scope.Type == ScopeType.SHOP_INFINITE_EVENT).ToList()) { if (locations.Locations.ContainsKey(infiniteKey)) { // Combine infinite shops into event ItemLocation infinite = locations.Locations[infiniteKey]; restrict.Keys.AddRange(infinite.Keys); locations.Locations.Remove(infiniteKey); } else { Console.WriteLine($"XX: No 1:1 match between event shops and infinite shops for {restrict}"); // No infinite shops, turn this into a regular event shop. (Doesn't happen in base DS3) ItemLocation eventLoc = new ItemLocation(new ItemScope(ScopeType.EVENT, restrict.Scope.ID)); eventLoc.Keys.AddRange(restrict.Keys); locations.Locations[eventLoc.Scope] = eventLoc; locations.Locations.Remove(restrict.Scope); } } } // Now can find all location scopes List <ScopeType> uniqueTypes = new List <ScopeType> { ScopeType.EVENT, ScopeType.ENTITY, ScopeType.MATERIAL }; foreach (KeyValuePair <ItemKey, ItemLocations> entry in data.Data) { int unique = 0; foreach (KeyValuePair <ItemScope, ItemLocation> entry2 in entry.Value.Locations) { ItemScope scope = entry2.Key; ItemLocation loc = entry2.Value; int id = uniqueTypes.Contains(scope.Type) ? scope.ID : -1; unique = unique == -1 ? -1 : (id == -1 ? -1 : unique + 1); SortedSet <int> shopIds = new SortedSet <int>(loc.Keys.Where(k => k.Type == LocationType.SHOP).Select(k => GetShopType(k.ID))); SortedSet <int> shopQwcs = new SortedSet <int>(loc.Keys.Where(k => k.Type == LocationType.SHOP).Select(k => (int)shops[k.ID]["qwcID"].Value) .Select(qwc => equivalentEvents.ContainsKey(qwc) ? equivalentEvents[qwc] : qwc) .Where(qwc => qwc != -1 && !restrictiveQwcs.Contains(qwc))); SortedSet <int> allShop = new SortedSet <int>(shopIds.Union(shopQwcs)); if (shopIds.Count() + shopQwcs.Count() != allShop.Count()) { Console.WriteLine($"XX Overlapping qwc/shop ids for location {loc}"); } SortedSet <int> modelBase = scope.Type == ScopeType.MODEL ? new SortedSet <int>(loc.Keys.Select(k => k.BaseID)) : new SortedSet <int>(); bool onlyShops = loc.Keys.All(k => k.Type == LocationType.SHOP) && allShop.Count() > 0; LocationScope locationScope = new LocationScope(scope.Type, id, allShop, modelBase, onlyShops); data.AddLocationScope(entry.Key, scope, locationScope); loc.LocScope = locationScope; } entry.Value.Unique = unique > 0; } if (logUnused) { Console.WriteLine("---------------------------------------------------------------------------"); foreach (KeyValuePair <ItemKey, string> entry in game.Names()) { ItemKey item = entry.Key; if (item.Type == 0) { item = new ItemKey(item.Type, item.ID - (item.ID % 10000)); } if (!data.Data.ContainsKey(item)) { // Mostly pulls up old DS1 items, crow items, and gestures. Console.WriteLine($"Unused item {item.Type}-{entry.Key.ID}: {entry.Value}"); } } } return(data); }
static void Main(string[] args) { //Scopes for use with Google+ API // activating Google+ API in console // Documentation: https://developers.google.com/+/api/oauth string[] scopes = new string[] { PlusService.Scope.PlusLogin, PlusService.Scope.UserinfoEmail, PlusService.Scope.UserinfoProfile, "profile" }; string _client_id = "1046123799103-d0vpdthl4ms0soutcrpe036ckqn7rfpn.apps.googleusercontent.com"; string _client_secret = "NDmluNfTgUk6wgmy7cFo64RV"; // https://accounts.google.com/o/oauth2/auth?access_type=offline&response_type=code&client_id=1046123799103-d0vpdthl4ms0soutcrpe036ckqn7rfpn.apps.googleusercontent.com&redirect_uri=http://localhost:15918/authorize/&scope=https://www.googleapis.com/auth/plus.login%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&data-requestvisibleactions=http://schema.org/AddAction PlusService service = null; UserCredential credential = null; try { // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData% credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = _client_id, ClientSecret = _client_secret }, scopes, Environment.UserName, CancellationToken.None, new FileDataStore("Daimto.GooglePlusm.Auth.Store")).Result; } catch (Exception ex) { //If the user hits cancel you wont get access. if (ex.InnerException.Message.IndexOf("access_denied") != -1) { Console.WriteLine("User declined access"); Console.ReadLine(); return; } else { Console.WriteLine("Unknown Authentication Error:" + ex.Message); Console.ReadLine(); return; } } // Now we create a Google service. All of our requests will be run though this. service = new PlusService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Google Plus Sample", }); Moment body = new Moment(); body.Type = "http://schema.org/AddAction"; ItemScope itemScope = new ItemScope(); itemScope.Id = "target-id-1"; itemScope.Type = "http://schema.org/AddAction"; itemScope.Name = "The Google+ Platform"; itemScope.Description = "A page that describes just how awesome Google+ is!"; itemScope.Image = "https://developers.google.com/+/plugins/snippet/examples/thing.png"; body.Object = itemScope; try { var l = service.Moments.Insert(body, "me", MomentsResource.InsertRequest.CollectionEnum.Vault); l.Execute(); } catch (Exception ex) { int i = 1; } // Getting a list of ALL a users public activities. IList <Activity> _Activities = DaimtoGooglePlusHelper.GetAllActivities(service, "me"); foreach (Activity item in _Activities) { Console.WriteLine(item.Actor.DisplayName + " Plus 1s: " + item.Object.Plusoners.TotalItems + " comments: " + item.Object.Replies.TotalItems); } //Just getting an activity that has some comments for the example below. Activity withComment = _Activities.Where(x => x.Object.Replies.TotalItems > 0).FirstOrDefault(); // Getting a list of all the comments for an activity IList <Comment> _comments = DaimtoGooglePlusHelper.GetAllComments(service, withComment.Id); foreach (Comment item in _comments) { Console.WriteLine("Comment " + item.Actor.DisplayName + " Plus 1s: " + item.Plusoners.TotalItems); } //Listing of all the people the user has circled. IList <Person> people = DaimtoGooglePlusHelper.GetAllPeople(service, "me"); Console.ReadLine(); }
/// <summary> /// Write an app activity to Google using the Google+ API logging that the user /// has uploaded a Photo. /// </summary> /// <param name="user">The PhotoHunt user who uploaded the Photo.</param> /// <param name="dbPhoto">The Photo that was just uploaded.</param> public void WriteGooglePlusPhotoAppActivity(User user, Photo dbPhoto) { _authState = CreateState(user.googleAccessToken, user.googleRefreshToken, user.googleExpiresAt.AddSeconds(user.googleExpiresIn * -1), user.googleExpiresAt); AuthorizationServerDescription description = GoogleAuthenticationServer.Description; var provider = new WebServerClient(description); provider.ClientIdentifier = CLIENT_ID; provider.ClientSecret = CLIENT_SECRET; var authenticator = new OAuth2Authenticator<WebServerClient>( provider, GetAuthorization) { NoCaching = true }; ps = new PlusService(new BaseClientService.Initializer() { Authenticator = authenticator }); Moment body = new Moment(); ItemScope target = new ItemScope(); target.Url = BASE_URL + "photo.aspx?photoId=" + dbPhoto.id; body.Target = target; body.Type = ADD_ACTIVITY_TYPE; MomentsResource.InsertRequest insert = new MomentsResource.InsertRequest(ps, body, "me", MomentsResource.Collection.Vault); try { insert.Fetch(); } catch (GoogleApiRequestException gare) { Debug.WriteLine("Error while writing app activity: " + gare.InnerException.Message + "\nThis could happen if the Google+ proxy can't access your server."); } }
public LocationData FindItems(GameData game) { SortedDictionary <int, List <EntityId> > usedItemLots = FindItemLots(game); PARAM shops = game.Param("ShopLineupParam"); PARAM itemLots = game.Param("ItemLotParam"); PARAM materials = game.Param("EquipMtrlSetParam"); LocationData data = new LocationData(); // Run through all item lots in the game in order, extract all the data. LocationKey prevLocation = null; foreach (KeyValuePair <int, List <EntityId> > entry in usedItemLots) { int itemLot = entry.Key; if (prevLocation != null) { if (!crowLots.Contains(prevLocation.ID)) { prevLocation.MaxSlots = itemLot - prevLocation.ID - 1; if (prevLocation.MaxSlots < 1) { Warn($"Overlapping slots at {itemLot}"); } } prevLocation = null; } List <EntityId> entities = entry.Value; string locs = String.Join(", ", entities.Select(e => game.EntityName(e) + $" {e}")); if (itemLots[itemLot] == null) { string text = game.LotName(itemLot); // These are fine - no-ops to game // Console.WriteLine($"MISSING connected item lot!! {itemLot}: {text} @ {locs}"); continue; } LocationKey baseLocation = null; while (itemLots[itemLot] != null) { bool isBase = itemLot == entry.Key; string text = game.LotName(itemLot); PARAM.Row row = itemLots[itemLot]; int eventFlag = (int)row["getItemFlagId"].Value; int totalPoints = 0; for (int i = 1; i <= 8; i++) { totalPoints += (short)row[$"LotItemBasePoint0{i}"].Value; } for (int i = 1; i <= 8; i++) { int id = (int)row[$"ItemLotId{i}"].Value; if (id != 0) { uint type = (uint)row[$"LotItemCategory0{i}"].Value; int points = (short)row[$"LotItemBasePoint0{i}"].Value; int quantity = (byte)row[$"LotItemNum{i}"].Value; ItemKey item = new ItemKey(LocationData.LotTypes[type], id); string itemText = $"{itemLot}[{locs}]"; // Check out script about CC, btw List <string> info = new List <string>(); if (quantity > 1) { info.Add($"{quantity}"); } if (points != totalPoints) { info.Add($"{100.0 * points / totalPoints}%"); } if (info.Count() > 0) { itemText += $" ({string.Join(",", info)})"; } if (quantity <= 0 && logUnused) { Console.WriteLine($"There is 0! of {itemText}"); } ItemScope scope; if (eventFlag != -1) { if (equivalentEvents.ContainsKey(eventFlag)) { eventFlag = equivalentEvents[eventFlag]; } scope = new ItemScope(ScopeType.EVENT, eventFlag); } else { // One time drops that directly award, that aren't covered by event flags. Mostly crystal lizards. if (entities.Count() == 1 && entityItemLots.ContainsKey(entities[0].EventEntityID) && entityItemLots[entities[0].EventEntityID] == entry.Key) { scope = new ItemScope(ScopeType.ENTITY, entities[0].EventEntityID); } // Non-respawning enemies with drops which can be missed. These are reused between different entities, so can drop multiple times. else if (entities.All(e => nonRespawningEntities.Contains(e.EventEntityID))) { scope = new ItemScope(ScopeType.ENTITY, entities.Select(e => e.EventEntityID).Min()); } else { int model = entities.Select(e => e.GetModelID()).Min(); if (model == -1) { if (logUnused) { // Ideally this should not be randomized, but can't check here Console.WriteLine($"Infinite item {itemLot} with no event flags, entity flags, or models: {itemText}"); } continue; } scope = new ItemScope(ScopeType.MODEL, model); } } LocationKey location = new LocationKey(LocationType.LOT, itemLot, itemText, entities, quantity, baseLocation); data.AddLocation(item, scope, location); if (baseLocation == null) { baseLocation = location; } } } itemLot++; if (crowLots.Contains(itemLot - 1)) { break; } } prevLocation = baseLocation; } foreach (PARAM.Row row in shops.Rows) { int shopID = (int)row.ID; string shopName = shopSplits[GetShopType(shopID)]; if (shopName == null) { continue; } int qwc = (int)row["qwcID"].Value; int type = (byte)row["equipType"].Value; int id = (int)row["EquipId"].Value; int quantity = (short)row["sellQuantity"].Value; int eventFlag = (int)row["EventFlag"].Value; int material = (int)row["mtrlId"].Value; string quantityText = quantity == -1 ? "" : $" ({quantity})"; string qwcText = qwc == -1 ? "" : $" {game.QwcName(qwc)}"; ItemKey item = new ItemKey((ItemType)type, id); string text = $"{shopName}{qwcText}{quantityText}"; text = $"{shopID}[{text}]"; LocationKey location = new LocationKey(LocationType.SHOP, shopID, text, new List <EntityId>(), quantity, null); ItemScope scope; if (eventFlag != -1) { if (equivalentEvents.ContainsKey(eventFlag)) { eventFlag = equivalentEvents[eventFlag]; } if (quantity <= 0) { Warn($"No quantity for event flag shop entry {text}"); } ScopeType scopeType = ScopeType.EVENT; if (restrictiveQwcs.Contains(qwc)) { // In DS3, if item becomes unavailable at some point, that is because it returns in infinite form scopeType = ScopeType.SHOP_INFINITE_EVENT; } scope = new ItemScope(scopeType, eventFlag); } else if (material != -1) { int materialItem = (int)materials[material]["MaterialId01"].Value; scope = new ItemScope(ScopeType.MATERIAL, materialItem); } else { scope = new ItemScope(ScopeType.SHOP_INFINITE, -1); } data.AddLocation(item, scope, location); } // Merge infinite and finite shops. Mostly done via heuristic (when event and infinite both exist) ItemScope infiniteKey = new ItemScope(ScopeType.SHOP_INFINITE, -1); foreach (ItemLocations locations in data.Data.Values) { foreach (ItemLocation restrict in locations.Locations.Values.Where(loc => loc.Scope.Type == ScopeType.SHOP_INFINITE_EVENT).ToList()) { if (locations.Locations.ContainsKey(infiniteKey)) { // Combine infinite shops into event ItemLocation infinite = locations.Locations[infiniteKey]; restrict.Keys.AddRange(infinite.Keys); locations.Locations.Remove(infiniteKey); } else { Warn($"No 1:1 match between event shops and infinite shops for {restrict}"); // No infinite shops, turn this into a regular event shop. (Doesn't happen in base DS3) ItemLocation eventLoc = new ItemLocation(new ItemScope(ScopeType.EVENT, restrict.Scope.ID)); eventLoc.Keys.AddRange(restrict.Keys); locations.Locations[eventLoc.Scope] = eventLoc; locations.Locations.Remove(restrict.Scope); } } } // Now calculate all location scopes - distinct item sources. // This is the main key for the annotations file, so scopes can be marked as missable or not, assigned logical areas, etc. // It is also used as the target for randomizing an item, because if several locations are equivalent, all should contain the same item. List <ScopeType> uniqueTypes = new List <ScopeType> { ScopeType.EVENT, ScopeType.ENTITY, ScopeType.MATERIAL }; foreach (KeyValuePair <ItemKey, ItemLocations> entry in data.Data) { ItemKey item = entry.Key; int unique = 0; foreach (KeyValuePair <ItemScope, ItemLocation> entry2 in entry.Value.Locations) { ItemScope scope = entry2.Key; ItemLocation loc = entry2.Value; int id = uniqueTypes.Contains(scope.Type) ? scope.ID : -1; unique = unique == -1 ? -1 : (id == -1 ? -1 : unique + 1); SortedSet <int> shopIds = new SortedSet <int>(loc.Keys.Where(k => k.Type == LocationType.SHOP).Select(k => GetShopType(k.ID))); SortedSet <int> shopQwcs = new SortedSet <int>(loc.Keys.Where(k => k.Type == LocationType.SHOP).Select(k => ((int)shops[k.ID]["qwcID"].Value, (int)shops[k.ID]["EventFlag"].Value)) .Where(e => e.Item1 != -1 && (!restrictiveQwcs.Contains(e.Item1) || e.Item2 == -1)) .Select(e => e.Item1)); SortedSet <int> allShop = new SortedSet <int>(shopIds.Union(shopQwcs)); if (shopIds.Count() + shopQwcs.Count() != allShop.Count()) { Warn($"Overlapping qwc/shop ids for location {loc}"); } SortedSet <int> modelBase = scope.Type == ScopeType.MODEL ? new SortedSet <int>(loc.Keys.Select(k => k.BaseID)) : new SortedSet <int>(); bool onlyShops = loc.Keys.All(k => k.Type == LocationType.SHOP) && allShop.Count() > 0; LocationScope locationScope = new LocationScope(scope.Type, id, allShop, modelBase, onlyShops); data.AddLocationScope(item, scope, locationScope); } entry.Value.Unique = unique > 0 && item.Type != ItemType.ARMOR; } if (logUnused) { foreach (KeyValuePair <ItemKey, string> entry in game.Names()) { ItemKey item = entry.Key; if (item.Type == 0) { item = new ItemKey(item.Type, item.ID - (item.ID % 10000)); } if (!data.Data.ContainsKey(item)) { // Mostly pulls up old DS1 items and gestures. Console.WriteLine($"Unused item {item.Type}-{entry.Key.ID}: {entry.Value}"); } } } return(data); }
private void POstGooglePlus(UserCredential credential) { PlusService service = new PlusService(new BaseClientService.Initializer() { HttpClientInitializer = credential, }); Moment body = new Moment(); body.Type = "http://schema.org/AddAction"; ItemScope itemScope = new ItemScope(); itemScope.Id = "target-id-1"; itemScope.Type = "http://schema.org/AddAction"; itemScope.Name = "The Google+ Platform"; itemScope.Description = "A page that describes just how awesome Google+ is!"; itemScope.Image = "https://developers.google.com/+/plugins/snippet/examples/thing.png"; body.object__ = itemScope; var l = service.Moments.Insert(body, "me", MomentsResource.InsertRequest.CollectionEnum.Vault); l.Execute(); PeopleResource.GetRequest personRequest = service.People.Get("me"); Person _me = personRequest.Execute(); }