codetheweb / anylist

📋 a wrapper for AnyList's API (unoffical, reverse engineered)
81 stars 20 forks source link

Issue with Creating Recipes - Uncertain if code work #37

Open igormages opened 7 months ago

igormages commented 7 months ago

I am writing to report an issue I am facing when trying to create recipes. I am currently in the process of determining whether the code has ever worked or if this issue has been persistent. Here is a more detailed description of the situation:

Symptoms: When attempting to create a new recipe, nothing happens. I do not receive any specific error message, making troubleshooting more challenging. I tried with the example code as well.

Steps Taken So Far: I managed to create items, not recipes

If you require further information, please do not hesitate to contact me.

Thank you in advance for your help.

igormages commented 7 months ago

It definitely don't works. I got a empty response from the request. I made some changes and I get this response : recipe-data-timestamp ��R;U�A recipe-data-timestamp ��R;U�A But the recipe isn't created... I don't know why ?

igormages commented 7 months ago

@codetheweb @kevdliu @ajorpheus @brianespinoza have you the same issue ?

brianespinoza commented 7 months ago

hi @igormages , I noticed the same issue. It's possible Anylist's proto definitions may have changed. That's at least my leading suspicion given #40 .

I haven't used this package since implementing recipe support months ago so it's expected Anylist may have updated their API since.

Rudedog9d commented 6 months ago

I'm experiencing the same problem. I tried updating the protobuf schema by extracting it from the web interface. I was able to generate a schema that appears valid, but the same result occurs - a silent fail with no change in the webui.

Here's the code I used to generate the schema, after pausing the debugger in the UI at a place with access to the $type object

Console Code ```js window.generateProtoSchema = (u) => { let rule = "optional"; if(u.required) rule="required"; if(u.repeated) rule="repeated"; return { rule, type: u.resolvedType ? u.resolvedType.name : u.type.name, name: u.name, id: u.id } } window.findSchemas = (u) => { if(u._fields) { let s = { name: u.name, fields: u._fields.map(window.generateProtoSchema) } if(u.clazz) { let enumList = [] for(let eKey in u.clazz){ if(eKey.startsWith('encode') || eKey.startsWith('decode')) continue; let e = {name: eKey, values: []} let i = 0 for(let key in u.clazz[eKey]) { e['values'].push({name: key, id: i}) i++; } if(e.values.length > 0) enumList.push(e) } s.enums = enumList } schema.push(s) } if(u.children) u.children.forEach(c => findSchemas(c)) } schema=[];findSchemas(this.$type.parent);schema ```

definitions.json

edit: note that the attached definitions file contains all available definitions in the UI, not just the definitions that existed previously - so the diff between the two is giant.

Rudedog9d commented 6 months ago

Any suggestions for how to debug this further?

igormages commented 6 months ago

I also tried, and the same I got an empty return. No error, but nothing is created. For my part, I don't understand this type of data sending, which prevents me from debugging or coding a solution.

Do you have any idea of the name of this type of data exchange? What is the data exchanged via anylist API?

Rudedog9d commented 6 months ago

@igormages I believe it is ProtoBuf

codetheweb commented 6 months ago

It may be a bit easier to dump the full schema by searching in the bundled code for PROTO_BUILDER and copying out the schema:

Schema ```js { "package": "pcov.proto", messages: [ { name: "User", fields: [ { rule: "required", type: "string", name: "id", id: 1 }, { rule: "optional", type: "string", name: "email", id: 3 }, { rule: "optional", type: "int64", name: "created", id: 7 }, { rule: "optional", type: "string", name: "firstName", id: 15 }, { rule: "optional", type: "string", name: "lastName", id: 16 }, { rule: "optional", type: "bool", name: "isPremiumUser", id: 37 }, { rule: "repeated", type: "string", name: "pushTokens", id: 24 }, { rule: "repeated", type: "string", name: "fcmTokens", id: 42 }, { rule: "optional", type: "bool", name: "hasMigratedUserFavorites", id: 36 }, { rule: "optional", type: "string", name: "recipeDataId", id: 35 }, { rule: "optional", type: "string", name: "listDataId", id: 38 }, { rule: "optional", type: "string", name: "facebookUserId", id: 39 }, { rule: "optional", type: "string", name: "icalendarId", id: 43 }, { rule: "optional", type: "int32", name: "freeRecipeImportsRemainingCount", id: 40 }, { rule: "optional", type: "string", name: "otpSecret", id: 41 }, { rule: "repeated", type: "string", name: "orderedStarterListIds", id: 33 }, { rule: "optional", type: "double", name: "orderedStarterListIdsTimestamp", id: 34 }, { rule: "optional", type: "bool", name: "notify", id: 6 }, { rule: "optional", type: "double", name: "savedRecipesTimestamp", id: 25 }, { rule: "optional", type: "double", name: "listSettingsTimestamp", id: 28 }, { rule: "optional", type: "double", name: "listSettingsRequireRefreshTimestamp", id: 29 }, { rule: "optional", type: "double", name: "starterListSettingsTimestamp", id: 30 }, { rule: "optional", type: "double", name: "starterListSettingsRequireRefreshTimestamp", id: 31 }, { rule: "optional", type: "double", name: "orderedShoppingListIdsTimestamp", id: 32 }, { rule: "repeated", type: "string", name: "shoppingListIds", id: 23 }, { rule: "optional", type: "double", name: "categorizedItemsTimestamp", id: 26 }, { rule: "optional", type: "double", name: "categorizedItemsRequireRefreshTimestamp", id: 27 }, { rule: "repeated", type: "string", name: "DEPRECATEDStarred", id: 2 }, { rule: "repeated", type: "string", name: "DEPRECATEDSavedSearches", id: 4 }, { rule: "optional", type: "bytes", name: "DEPRECATEDList", id: 5 }, { rule: "optional", type: "bool", name: "DEPRECATEDWelcomed", id: 8 }, { rule: "repeated", type: "string", name: "DEPRECATEDNotifyProducts", id: 9 }, { rule: "repeated", type: "string", name: "DEPRECATEDNotifyTagNames", id: 10 }, { rule: "optional", type: "bytes", name: "DEPRECATEDLocation", id: 11 }, { rule: "repeated", type: "string", name: "DEPRECATEDPreferredChainIds", id: 12 }, { rule: "repeated", type: "string", name: "DEPRECATEDFavoriteTags", id: 13 }, { rule: "repeated", type: "string", name: "DEPRECATEDHiddenTags", id: 14 }, { rule: "optional", type: "string", name: "DEPRECATEDReferrer", id: 17 }, { rule: "optional", type: "string", name: "DEPRECATEDInviteCode", id: 18 }, { rule: "optional", type: "string", name: "DEPRECATEDHttpReferrer", id: 19 }, { rule: "optional", type: "int64", name: "DEPRECATEDWeeklyDealsEmailCount", id: 20 }, { rule: "repeated", type: "string", name: "DEPRECATEDPreferredStoreIds", id: 21 }, { rule: "optional", type: "double", name: "DEPRECATEDFavoriteProductsTimestamp", id: 22 } ] }, { name: "Tag", fields: [ { rule: "required", type: "string", name: "name", id: 1 }, { rule: "optional", type: "string", name: "displayName", id: 7 }, { rule: "optional", type: "string", name: "imageName", id: 8 }, { rule: "repeated", type: "string", name: "impliedTagNames", id: 6 }, { rule: "repeated", type: "string", name: "searchTerms", id: 3 }, { rule: "repeated", type: "string", name: "productIds", id: 2 }, { rule: "optional", type: "bytes", name: "priceStats", id: 4 }, { rule: "optional", type: "TagType", name: "tagType", id: 5 } ], enums: [ { name: "TagType", values: [ { name: "TAG_TYPE_GENERIC", id: 0 }, { name: "TAG_TYPE_PRODUCT", id: 1 }, { name: "TAG_TYPE_CATEGORY", id: 2 }, { name: "TAG_TYPE_ATTRIBUTE", id: 3 } ] } ] }, { name: "PBDeletedUserInfo", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "double", name: "deletionTimestamp", id: 3 }, { rule: "optional", type: "string", name: "userEmail", id: 4 }, { rule: "optional", type: "string", name: "adminEmail", id: 5 }, { rule: "optional", type: "string", name: "adminNote", id: 6 }, { rule: "optional", type: "string", name: "supportTicketUrl", id: 7 }, { rule: "optional", type: "string", name: "ipAddress", id: 8 } ] }, { name: "PBIcon", fields: [ { rule: "optional", type: "string", name: "iconName", id: 1 }, { rule: "optional", type: "string", name: "tintHexColor", id: 2 } ] }, { name: "PBUserListData", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "repeated", type: "string", name: "userIds", id: 3 }, { rule: "optional", type: "double", name: "userIdsTimestamp", id: 4 }, { rule: "repeated", type: "string", name: "listIds", id: 5 }, { rule: "optional", type: "double", name: "listIdsTimestamp", id: 6 }, { rule: "optional", type: "string", name: "rootFolderId", id: 7 }, { rule: "optional", type: "double", name: "rootFolderIdTimestamp", id: 8 }, { rule: "optional", type: "double", name: "categorizedItemsTimestamp", id: 9 }, { rule: "optional", type: "double", name: "categorizedItemsRequireRefreshTimestamp", id: 10 }, { rule: "optional", type: "bool", name: "hasMigratedListOrdering", id: 11 } ] }, { name: "ShoppingList", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "string", name: "name", id: 3 }, { rule: "repeated", type: "ListItem", name: "items", id: 4 }, { rule: "optional", type: "string", name: "creator", id: 5 }, { rule: "repeated", type: "string", name: "UNUSEDATTRIBUTE", id: 6 }, { rule: "repeated", type: "PBEmailUserIDPair", name: "sharedUsers", id: 7 }, { rule: "optional", type: "string", name: "password", id: 8 }, { rule: "repeated", type: "PBNotificationLocation", name: "notificationLocations", id: 9 }, { rule: "optional", type: "uint64", name: "logicalClockTime", id: 10 }, { rule: "optional", type: "string", name: "builtInAlexaListType", id: 11 }, { rule: "optional", type: "bool", name: "allowsMultipleListCategoryGroups", id: 16 }, { rule: "optional", type: "int32", name: "listItemSortOrder", id: 17 }, { rule: "optional", type: "int32", name: "newListItemPosition", id: 18 } ], enums: [ { name: "ListItemSortOrder", values: [ { name: "Manual", id: 0 }, { name: "Alphabetical", id: 1 } ] }, { name: "NewListItemPosition", values: [ { name: "Bottom", id: 0 }, { name: "Top", id: 1 } ] } ] }, { name: "PBItemQuantity", fields: [ { rule: "optional", type: "string", name: "amount", id: 1 }, { rule: "optional", type: "string", name: "unit", id: 2 }, { rule: "optional", type: "string", name: "rawQuantity", id: 3 } ] }, { name: "PBItemPackageSize", fields: [ { rule: "optional", type: "string", name: "size", id: 1 }, { rule: "optional", type: "string", name: "unit", id: 2 }, { rule: "optional", type: "string", name: "packageType", id: 3 }, { rule: "optional", type: "string", name: "rawPackageSize", id: 4 } ] }, { name: "PBItemQuantityAndPackageSize", fields: [ { rule: "optional", type: "PBItemQuantity", name: "quantityPb", id: 1 }, { rule: "optional", type: "PBItemPackageSize", name: "packageSizePb", id: 2 } ] }, { name: "PBItemIngredient", fields: [ { rule: "optional", type: "PBIngredient", name: "ingredient", id: 1 }, { rule: "optional", type: "PBItemQuantity", name: "quantityPb", id: 6 }, { rule: "optional", type: "PBItemPackageSize", name: "packageSizePb", id: 7 }, { rule: "optional", type: "string", name: "recipeId", id: 2 }, { rule: "optional", type: "string", name: "eventId", id: 3 }, { rule: "optional", type: "string", name: "recipeName", id: 4 }, { rule: "optional", type: "string", name: "eventDate", id: 5 } ] }, { name: "ListItem", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "serverModTime", id: 2 }, { rule: "optional", type: "string", name: "listId", id: 3 }, { rule: "optional", type: "string", name: "name", id: 4 }, { rule: "optional", type: "string", name: "details", id: 5 }, { rule: "optional", type: "bool", name: "checked", id: 6 }, { rule: "optional", type: "string", name: "recipeId", id: 7 }, { rule: "optional", type: "string", name: "rawIngredient", id: 8 }, { rule: "optional", type: "string", name: "priceMatchupTag", id: 9 }, { rule: "optional", type: "string", name: "priceId", id: 10 }, { rule: "optional", type: "string", name: "category", id: 11 }, { rule: "optional", type: "string", name: "userId", id: 12 }, { rule: "optional", type: "string", name: "categoryMatchId", id: 13 }, { rule: "repeated", type: "string", name: "photoIds", id: 14 }, { rule: "optional", type: "string", name: "eventId", id: 15 }, { rule: "repeated", type: "string", name: "storeIds", id: 16 }, { rule: "repeated", type: "PBItemPrice", name: "prices", id: 19 }, { rule: "repeated", type: "PBListItemCategoryAssignment", name: "categoryAssignments", id: 20 }, { rule: "optional", type: "PBItemQuantity", name: "quantityPb", id: 21 }, { rule: "optional", type: "PBItemQuantity", name: "priceQuantityPb", id: 22 }, { rule: "optional", type: "bool", name: "priceQuantityShouldOverrideItemQuantity", id: 23 }, { rule: "optional", type: "PBItemPackageSize", name: "packageSizePb", id: 24 }, { rule: "optional", type: "PBItemPackageSize", name: "pricePackageSizePb", id: 25 }, { rule: "optional", type: "bool", name: "pricePackageSizeShouldOverrideItemPackageSize", id: 26 }, { rule: "repeated", type: "PBItemIngredient", name: "ingredients", id: 27 }, { rule: "optional", type: "bool", name: "itemQuantityShouldOverrideIngredientQuantity", id: 28 }, { rule: "optional", type: "bool", name: "itemPackageSizeShouldOverrideIngredientPackageSize", id: 29 }, { rule: "optional", type: "int32", name: "manualSortIndex", id: 17 }, { rule: "optional", type: "string", name: "deprecatedQuantity", id: 18 } ] }, { name: "PBItemPrice", fields: [ { rule: "optional", type: "double", name: "amount", id: 2 }, { rule: "optional", type: "string", name: "details", id: 3 }, { rule: "optional", type: "string", name: "storeId", id: 4 }, { rule: "optional", type: "string", name: "date", id: 5 } ] }, { name: "PBListFolderItem", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "int32", name: "itemType", id: 2 } ], enums: [ { name: "ItemType", values: [ { name: "ListType", id: 0 }, { name: "FolderType", id: 1 } ] } ] }, { name: "PBListFolderSettings", fields: [ { rule: "optional", type: "int32", name: "listsSortOrder", id: 1 }, { rule: "optional", type: "int32", name: "folderSortPosition", id: 2 }, { rule: "optional", type: "string", name: "folderHexColor", id: 3 }, { rule: "optional", type: "PBIcon", name: "icon", id: 4 } ], enums: [ { name: "SortOrder", values: [ { name: "ManualSortOrder", id: 0 }, { name: "AlphabeticalSortOrder", id: 1 } ] }, { name: "FolderSortPosition", values: [ { name: "FolderSortPositionAfterLists", id: 0 }, { name: "FolderSortPositionBeforeLists", id: 1 }, { name: "FolderSortPositionWithLists", id: 2 } ] } ] }, { name: "PBListFolder", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "string", name: "name", id: 3 }, { rule: "repeated", type: "PBListFolderItem", name: "items", id: 4 }, { rule: "optional", type: "PBListFolderSettings", name: "folderSettings", id: 5 } ] }, { name: "PBShoppingListArchive", fields: [ { rule: "optional", type: "ShoppingList", name: "shoppingList", id: 1 }, { rule: "optional", type: "PBListSettings", name: "listSettings", id: 2 }, { rule: "repeated", type: "PBListCategoryGroup", name: "listCategoryGroups", id: 3 }, { rule: "repeated", type: "PBStore", name: "stores", id: 4 }, { rule: "repeated", type: "PBStoreFilter", name: "storeFilters", id: 5 }, { rule: "repeated", type: "PBListCategorizationRule", name: "categorizationRules", id: 6 }, { rule: "optional", type: "StarterList", name: "favoriteItems", id: 7 }, { rule: "optional", type: "StarterList", name: "recentItems", id: 8 } ] }, { name: "PBListFolderItemArchive", fields: [ { rule: "optional", type: "PBShoppingListArchive", name: "listArchive", id: 1 }, { rule: "optional", type: "PBListFolderArchive", name: "folderArchive", id: 2 } ] }, { name: "PBListFolderArchive", fields: [ { rule: "optional", type: "string", name: "name", id: 1 }, { rule: "optional", type: "PBListFolderSettings", name: "folderSettings", id: 2 }, { rule: "repeated", type: "PBListFolderItemArchive", name: "items", id: 3 } ] }, { name: "PBListFoldersResponse", fields: [ { rule: "optional", type: "string", name: "listDataId", id: 1 }, { rule: "optional", type: "string", name: "rootFolderId", id: 2 }, { rule: "optional", type: "bool", name: "includesAllFolders", id: 3 }, { rule: "repeated", type: "PBListFolder", name: "listFolders", id: 4 }, { rule: "repeated", type: "string", name: "deletedFolderIds", id: 5 }, { rule: "optional", type: "bool", name: "hasMigratedListOrdering", id: 6 } ] }, { name: "PBListFolderTimestamps", fields: [ { rule: "optional", type: "string", name: "rootFolderId", id: 1 }, { rule: "repeated", type: "PBTimestamp", name: "folderTimestamps", id: 2 } ] }, { name: "PBListCategoryGroupResponse", fields: [ { rule: "optional", type: "PBListCategoryGroup", name: "categoryGroup", id: 1 }, { rule: "repeated", type: "string", name: "deletedCategoryIds", id: 2 } ] }, { name: "ShoppingListsResponse", fields: [ { rule: "repeated", type: "ShoppingList", name: "newLists", id: 1 }, { rule: "repeated", type: "ShoppingList", name: "modifiedLists", id: 2 }, { rule: "repeated", type: "string", name: "unmodifiedIds", id: 3 }, { rule: "repeated", type: "string", name: "unknownIds", id: 4 }, { rule: "repeated", type: "string", name: "orderedIds", id: 5 }, { rule: "repeated", type: "PBListResponse", name: "listResponses", id: 6 } ] }, { name: "PBListResponse", fields: [ { rule: "optional", type: "string", name: "listId", id: 1 }, { rule: "optional", type: "bool", name: "isFullSync", id: 2 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 3 }, { rule: "repeated", type: "PBListCategoryGroupResponse", name: "categoryGroupResponses", id: 7 }, { rule: "repeated", type: "string", name: "deletedCategoryGroupIds", id: 8 }, { rule: "repeated", type: "PBListCategorizationRule", name: "categorizationRules", id: 13 }, { rule: "repeated", type: "string", name: "deletedCategorizationRuleIds", id: 14 }, { rule: "repeated", type: "PBStore", name: "stores", id: 9 }, { rule: "repeated", type: "string", name: "deletedStoreIds", id: 10 }, { rule: "repeated", type: "PBStoreFilter", name: "storeFilters", id: 11 }, { rule: "repeated", type: "string", name: "deletedStoreFilterIds", id: 12 } ] }, { name: "StarterList", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "string", name: "name", id: 3 }, { rule: "repeated", type: "ListItem", name: "items", id: 4 }, { rule: "optional", type: "string", name: "userId", id: 5 }, { rule: "optional", type: "string", name: "listId", id: 6 }, { rule: "optional", type: "int32", name: "starterListType", id: 7 } ], enums: [ { name: "Type", values: [ { name: "UserType", id: 0 }, { name: "RecentItemsType", id: 1 }, { name: "FavoriteItemsType", id: 2 } ] } ] }, { name: "StarterListResponse", fields: [ { rule: "optional", type: "StarterList", name: "starterList", id: 1 } ] }, { name: "StarterListBatchResponse", fields: [ { rule: "repeated", type: "StarterListResponse", name: "listResponses", id: 1 }, { rule: "optional", type: "bool", name: "includesAllLists", id: 2 }, { rule: "repeated", type: "string", name: "unknownListIds", id: 3 } ] }, { name: "StarterListsResponseV2", fields: [ { rule: "optional", type: "StarterListBatchResponse", name: "userListsResponse", id: 1 }, { rule: "optional", type: "StarterListBatchResponse", name: "recentItemListsResponse", id: 2 }, { rule: "optional", type: "StarterListBatchResponse", name: "favoriteItemListsResponse", id: 3 }, { rule: "optional", type: "bool", name: "hasMigratedUserFavorites", id: 4 } ] }, { name: "StarterListsResponse", fields: [ { rule: "repeated", type: "StarterList", name: "newLists", id: 1 }, { rule: "repeated", type: "StarterList", name: "modifiedLists", id: 2 }, { rule: "repeated", type: "string", name: "unmodifiedIds", id: 3 }, { rule: "repeated", type: "string", name: "unknownIds", id: 4 }, { rule: "repeated", type: "string", name: "orderedIds", id: 5 } ] }, { name: "PBStore", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "listId", id: 3 }, { rule: "optional", type: "string", name: "name", id: 4 }, { rule: "optional", type: "int32", name: "sortIndex", id: 5 } ] }, { name: "PBStoreFilter", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "listId", id: 3 }, { rule: "optional", type: "string", name: "name", id: 4 }, { rule: "repeated", type: "string", name: "storeIds", id: 5 }, { rule: "optional", type: "bool", name: "includesUnassignedItems", id: 6 }, { rule: "optional", type: "int32", name: "sortIndex", id: 7 }, { rule: "optional", type: "string", name: "listCategoryGroupId", id: 8 }, { rule: "optional", type: "bool", name: "showsAllItems", id: 9 } ] }, { name: "PBListCategory", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "categoryGroupId", id: 3 }, { rule: "optional", type: "string", name: "listId", id: 4 }, { rule: "optional", type: "string", name: "name", id: 5 }, { rule: "optional", type: "string", name: "icon", id: 6 }, { rule: "optional", type: "string", name: "systemCategory", id: 7 }, { rule: "optional", type: "int32", name: "sortIndex", id: 9 } ] }, { name: "PBListCategoryGroup", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "listId", id: 3 }, { rule: "optional", type: "string", name: "name", id: 4 }, { rule: "repeated", type: "PBListCategory", name: "categories", id: 5 }, { rule: "optional", type: "string", name: "defaultCategoryId", id: 8 }, { rule: "optional", type: "uint64", name: "categoriesLogicalTimestamp", id: 6 }, { rule: "optional", type: "uint64", name: "deletedCategoriesLogicalTimestamp", id: 7 } ] }, { name: "PBListCategorizationRule", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "listId", id: 3 }, { rule: "optional", type: "string", name: "categoryGroupId", id: 4 }, { rule: "optional", type: "string", name: "itemName", id: 5 }, { rule: "optional", type: "string", name: "categoryId", id: 6 } ] }, { name: "PBListCategorizationRuleList", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "listId", id: 3 }, { rule: "repeated", type: "PBListCategorizationRule", name: "categorizationRules", id: 4 }, { rule: "optional", type: "uint64", name: "categorizationRulesLogicalTimestamp", id: 5 }, { rule: "optional", type: "uint64", name: "deletedCategorizationRulesLogicalTimestamp", id: 6 } ] }, { name: "PBListItemCategoryAssignment", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "categoryGroupId", id: 2 }, { rule: "optional", type: "string", name: "categoryId", id: 3 } ] }, { name: "PBRecipe", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "string", name: "name", id: 3 }, { rule: "optional", type: "string", name: "icon", id: 4 }, { rule: "optional", type: "string", name: "note", id: 5 }, { rule: "optional", type: "string", name: "sourceName", id: 6 }, { rule: "optional", type: "string", name: "sourceUrl", id: 7 }, { rule: "repeated", type: "PBIngredient", name: "ingredients", id: 8 }, { rule: "repeated", type: "string", name: "preparationSteps", id: 9 }, { rule: "repeated", type: "string", name: "photoIds", id: 11 }, { rule: "optional", type: "string", name: "adCampaignId", id: 12 }, { rule: "repeated", type: "string", name: "photoUrls", id: 13 }, { rule: "optional", type: "double", name: "scaleFactor", id: 14 }, { rule: "optional", type: "int32", name: "rating", id: 15 }, { rule: "optional", type: "double", name: "creationTimestamp", id: 16 }, { rule: "optional", type: "string", name: "nutritionalInfo", id: 17 }, { rule: "optional", type: "int32", name: "cookTime", id: 18 }, { rule: "optional", type: "int32", name: "prepTime", id: 19 }, { rule: "optional", type: "string", name: "servings", id: 20 }, { rule: "optional", type: "string", name: "paprikaIdentifier", id: 21 }, { rule: "optional", type: "string", name: "recipeDataId", id: 23 } ] }, { name: "PBRecipeCookingState", fields: [ { rule: "optional", type: "string", name: "recipeId", id: 2 }, { rule: "optional", type: "string", name: "eventId", id: 3 }, { rule: "optional", type: "double", name: "lastOpenedTimestamp", id: 4 }, { rule: "optional", type: "int32", name: "selectedTabId", id: 5 }, { rule: "repeated", type: "string", name: "checkedIngredientIds", id: 6 }, { rule: "optional", type: "int32", name: "selectedStepNumber", id: 7 } ] }, { name: "PBXRecipe", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "name", id: 2 }, { rule: "optional", type: "string", name: "icon", id: 3 }, { rule: "optional", type: "string", name: "note", id: 4 }, { rule: "optional", type: "string", name: "sourceName", id: 5 }, { rule: "optional", type: "string", name: "sourceUrl", id: 6 }, { rule: "repeated", type: "PBXIngredient", name: "ingredients", id: 7 }, { rule: "repeated", type: "string", name: "preparationSteps", id: 8 }, { rule: "optional", type: "bytes", name: "photoBytes", id: 9 }, { rule: "optional", type: "double", name: "scaleFactor", id: 10 }, { rule: "optional", type: "int32", name: "rating", id: 11 }, { rule: "optional", type: "double", name: "creationTimestamp", id: 12 }, { rule: "optional", type: "string", name: "nutritionalInfo", id: 13 }, { rule: "optional", type: "int32", name: "cookTime", id: 14 }, { rule: "optional", type: "int32", name: "prepTime", id: 15 }, { rule: "optional", type: "string", name: "servings", id: 16 } ] }, { name: "PBXRecipeArchive", fields: [ { rule: "repeated", type: "PBXRecipe", name: "recipes", id: 1 } ] }, { name: "PBIngredient", fields: [ { rule: "optional", type: "string", name: "identifier", id: 6 }, { rule: "optional", type: "string", name: "rawIngredient", id: 1 }, { rule: "optional", type: "string", name: "name", id: 2 }, { rule: "optional", type: "string", name: "quantity", id: 3 }, { rule: "optional", type: "string", name: "note", id: 4 }, { rule: "optional", type: "bool", name: "isHeading", id: 7 } ] }, { name: "PBXIngredient", fields: [ { rule: "optional", type: "string", name: "rawIngredient", id: 1 }, { rule: "optional", type: "string", name: "name", id: 2 }, { rule: "optional", type: "string", name: "quantity", id: 3 }, { rule: "optional", type: "string", name: "note", id: 4 }, { rule: "optional", type: "bool", name: "isHeading", id: 5 } ] }, { name: "PBRecipeCollectionSettings", fields: [ { rule: "optional", type: "double", name: "timestamp", id: 5 }, { rule: "optional", type: "int32", name: "recipesSortOrder", id: 1 }, { rule: "optional", type: "bool", name: "useReversedSortDirection", id: 4 }, { rule: "optional", type: "int32", name: "collectionsSortOrder", id: 6 }, { rule: "optional", type: "bool", name: "useReversedCollectionsSortDirection", id: 7 }, { rule: "optional", type: "PBSmartFilter", name: "smartFilter", id: 3 }, { rule: "optional", type: "PBIcon", name: "icon", id: 8 }, { rule: "optional", type: "bool", name: "showOnlyRecipesWithNoCollection", id: 2 } ], enums: [ { name: "SortOrder", values: [ { name: "ManualSortOrder", id: 0 }, { name: "AlphabeticalSortOrder", id: 1 }, { name: "RatingSortOrder", id: 2 }, { name: "DateCreatedSortOrder", id: 3 }, { name: "PrepTimeSortOrder", id: 4 }, { name: "CookTimeSortOrder", id: 5 }, { name: "RecipeCountSortOrder", id: 6 } ] } ] }, { name: "PBRecipeCollection", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "string", name: "name", id: 3 }, { rule: "repeated", type: "string", name: "recipeIds", id: 4 }, { rule: "optional", type: "PBRecipeCollectionSettings", name: "collectionSettings", id: 5 } ] }, { name: "PBUserRecipeData", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "double", name: "recipeCollectionsTimestamp", id: 5 }, { rule: "optional", type: "double", name: "recipeCollectionIdsTimestamp", id: 6 }, { rule: "optional", type: "string", name: "allRecipesId", id: 7 }, { rule: "repeated", type: "string", name: "recipeCollectionIds", id: 8 }, { rule: "repeated", type: "string", name: "userIds", id: 9 }, { rule: "optional", type: "double", name: "userIdsTimestamp", id: 10 }, { rule: "optional", type: "bool", name: "hasImportedPunchforkRecipes", id: 11 }, { rule: "optional", type: "string", name: "mealPlanningCalendarId", id: 12 }, { rule: "map", type: "PBRecipeCollectionSettings", keytype: "string", name: "settingsMapForSystemCollections", id: 14 }, { rule: "optional", type: "double", name: "settingsMapForSystemCollectionsTimestamp", id: 15 }, { rule: "optional", type: "int32", name: "maxRecipeCount", id: 13 }, { rule: "optional", type: "double", name: "allRecipesTimestamp", id: 4 }, { rule: "optional", type: "double", name: "recipesTimestamp", id: 3 } ] }, { name: "PBRecipeLinkRequest", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "requestingUserId", id: 2 }, { rule: "optional", type: "string", name: "requestingEmail", id: 3 }, { rule: "optional", type: "string", name: "requestingName", id: 4 }, { rule: "optional", type: "string", name: "confirmingUserId", id: 5 }, { rule: "optional", type: "string", name: "confirmingEmail", id: 6 }, { rule: "optional", type: "string", name: "confirmingName", id: 7 } ] }, { name: "PBRecipeLinkRequestResponse", fields: [ { rule: "optional", type: "int32", name: "statusCode", id: 1 }, { rule: "optional", type: "PBRecipeDataResponse", name: "recipeDataResponse", id: 2 }, { rule: "optional", type: "string", name: "errorTitle", id: 3 }, { rule: "optional", type: "string", name: "errorMessage", id: 4 } ] }, { name: "PBRecipeDataResponse", fields: [ { rule: "optional", type: "double", name: "timestamp", id: 1 }, { rule: "optional", type: "PBRecipeCollection", name: "allRecipesCollection", id: 2 }, { rule: "repeated", type: "PBRecipe", name: "recipes", id: 3 }, { rule: "repeated", type: "string", name: "recipeCollectionIds", id: 4 }, { rule: "repeated", type: "PBRecipeCollection", name: "recipeCollections", id: 5 }, { rule: "repeated", type: "PBRecipeLinkRequest", name: "pendingRecipeLinkRequests", id: 6 }, { rule: "repeated", type: "PBRecipeLinkRequest", name: "recipeLinkRequestsToConfirm", id: 7 }, { rule: "repeated", type: "PBEmailUserIDPair", name: "linkedUsers", id: 8 }, { rule: "optional", type: "string", name: "recipeDataId", id: 9 }, { rule: "optional", type: "bool", name: "hasImportedPunchforkRecipes", id: 10 }, { rule: "optional", type: "bool", name: "includesRecipeCollectionIds", id: 11 }, { rule: "optional", type: "int32", name: "maxRecipeCount", id: 12 }, { rule: "map", type: "PBRecipeCollectionSettings", keytype: "string", name: "settingsMapForSystemCollections", id: 13 } ] }, { name: "PBRecipeOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "string", name: "recipeDataId", id: 2 }, { rule: "optional", type: "PBRecipe", name: "recipe", id: 3 }, { rule: "optional", type: "PBRecipeCollection", name: "recipeCollection", id: 4 }, { rule: "optional", type: "PBRecipeLinkRequest", name: "recipeLinkRequest", id: 5 }, { rule: "repeated", type: "string", name: "recipeCollectionIds", id: 6 }, { rule: "repeated", type: "PBRecipe", name: "recipes", id: 7 }, { rule: "optional", type: "bool", name: "isNewRecipeFromWebImport", id: 8 }, { rule: "repeated", type: "string", name: "recipeIds", id: 9 }, { rule: "repeated", type: "string", name: "recipeEventIds", id: 10 }, { rule: "optional", type: "int32", name: "maxRecipeCount", id: 11 } ] }, { name: "PBRecipeOperationList", fields: [ { rule: "repeated", type: "PBRecipeOperation", name: "operations", id: 1 } ] }, { name: "PBRecipeList", fields: [ { rule: "repeated", type: "PBRecipe", name: "recipes", id: 1 } ] }, { name: "PBRecipeDataArchive", fields: [ { rule: "repeated", type: "PBRecipe", name: "recipes", id: 1 }, { rule: "repeated", type: "PBRecipeCollection", name: "recipeCollections", id: 2 } ] }, { name: "PBRecipeWebImportResponse", fields: [ { rule: "optional", type: "int32", name: "statusCode", id: 1 }, { rule: "optional", type: "PBRecipe", name: "recipe", id: 2 }, { rule: "optional", type: "bool", name: "isPremiumUser", id: 3 }, { rule: "optional", type: "string", name: "siteSpecificHelpText", id: 4 }, { rule: "optional", type: "int32", name: "freeRecipeImportsRemainingCount", id: 5 } ] }, { name: "PBCalendar", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalClockTime", id: 2 } ] }, { name: "PBCalendarEvent", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "calendarId", id: 3 }, { rule: "optional", type: "string", name: "date", id: 4 }, { rule: "optional", type: "string", name: "title", id: 5 }, { rule: "optional", type: "string", name: "details", id: 6 }, { rule: "optional", type: "string", name: "recipeId", id: 7 }, { rule: "optional", type: "string", name: "labelId", id: 8 }, { rule: "optional", type: "int32", name: "orderAddedSortIndex", id: 9 }, { rule: "optional", type: "int32", name: "labelSortIndex", id: 11 }, { rule: "optional", type: "double", name: "recipeScaleFactor", id: 10 } ] }, { name: "PBCalendarLabel", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "calendarId", id: 3 }, { rule: "optional", type: "string", name: "hexColor", id: 4 }, { rule: "optional", type: "string", name: "name", id: 5 }, { rule: "optional", type: "int32", name: "sortIndex", id: 6 } ] }, { name: "PBCalendarResponse", fields: [ { rule: "required", type: "string", name: "calendarId", id: 1 }, { rule: "optional", type: "bool", name: "isFullSync", id: 2 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 3 }, { rule: "repeated", type: "PBCalendarEvent", name: "events", id: 4 }, { rule: "repeated", type: "string", name: "deletedEventIds", id: 5 }, { rule: "repeated", type: "PBCalendarLabel", name: "labels", id: 6 }, { rule: "repeated", type: "string", name: "deletedLabelIds", id: 7 } ] }, { name: "PBCalendarOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "string", name: "calendarId", id: 2 }, { rule: "optional", type: "PBCalendarEvent", name: "updatedEvent", id: 3 }, { rule: "optional", type: "PBCalendarEvent", name: "originalEvent", id: 4 }, { rule: "optional", type: "PBCalendarLabel", name: "updatedLabel", id: 5 }, { rule: "optional", type: "PBCalendarLabel", name: "originalLabel", id: 6 }, { rule: "repeated", type: "string", name: "sortedLabelIds", id: 7 }, { rule: "repeated", type: "string", name: "eventIds", id: 8 }, { rule: "repeated", type: "PBCalendarEvent", name: "updatedEvents", id: 9 }, { rule: "repeated", type: "PBCalendarEvent", name: "originalEvents", id: 10 } ] }, { name: "PBCalendarOperationList", fields: [ { rule: "repeated", type: "PBCalendarOperation", name: "operations", id: 1 } ] }, { name: "PBMealPlanSetICalendarEnabledRequest", fields: [ { rule: "optional", type: "bool", name: "shouldEnableIcalendarGeneration", id: 1 } ] }, { name: "PBMealPlanSetICalendarEnabledRequestResponse", fields: [ { rule: "optional", type: "int32", name: "statusCode", id: 1 }, { rule: "optional", type: "PBAccountInfoResponse", name: "accountInfo", id: 2 }, { rule: "optional", type: "string", name: "errorTitle", id: 3 }, { rule: "optional", type: "string", name: "errorMessage", id: 4 } ] }, { name: "PBSmartCondition", fields: [ { rule: "optional", type: "string", name: "fieldID", id: 1 }, { rule: "optional", type: "string", name: "operatorID", id: 2 }, { rule: "optional", type: "string", name: "value", id: 3 } ] }, { name: "PBSmartFilter", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "name", id: 3 }, { rule: "optional", type: "bool", name: "requiresMatchingAllConditions", id: 4 }, { rule: "repeated", type: "PBSmartCondition", name: "conditions", id: 5 } ] }, { name: "PBOperationMetadata", fields: [ { rule: "optional", type: "string", name: "operationId", id: 1 }, { rule: "optional", type: "string", name: "handlerId", id: 2 }, { rule: "optional", type: "string", name: "userId", id: 3 }, { rule: "optional", type: "int32", name: "operationClass", id: 4 } ], enums: [ { name: "OperationClass", values: [ { name: "UndefinedOperation", id: 0 }, { name: "StoreOperation", id: 1 }, { name: "StoreFilterOperation", id: 2 }, { name: "ListCategoryOperation", id: 3 }, { name: "ListCategoryGroupOperation", id: 4 }, { name: "ListCategorizationRuleOperation", id: 5 } ] } ] }, { name: "PBFavoriteProductOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "string", name: "productId", id: 2 } ] }, { name: "PBFavoriteProductOperationList", fields: [ { rule: "repeated", type: "PBFavoriteProductOperation", name: "operations", id: 1 } ] }, { name: "PBSavedRecipeOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "string", name: "recipeId", id: 2 } ] }, { name: "PBSavedRecipeOperationList", fields: [ { rule: "repeated", type: "PBSavedRecipeOperation", name: "operations", id: 1 } ] }, { name: "PBOrderedShoppingListIDsOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "repeated", type: "string", name: "orderedListIds", id: 2 } ] }, { name: "PBOrderedShoppingListIDsOperationList", fields: [ { rule: "repeated", type: "PBOrderedShoppingListIDsOperation", name: "operations", id: 1 } ] }, { name: "PBOrderedStarterListIDsOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "repeated", type: "string", name: "orderedListIds", id: 2 } ] }, { name: "PBOrderedStarterListIDsOperationList", fields: [ { rule: "repeated", type: "PBOrderedStarterListIDsOperation", name: "operations", id: 1 } ] }, { name: "PBListOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "string", name: "listId", id: 2 }, { rule: "optional", type: "string", name: "listItemId", id: 3 }, { rule: "optional", type: "string", name: "updatedValue", id: 4 }, { rule: "optional", type: "string", name: "originalValue", id: 5 }, { rule: "optional", type: "ListItem", name: "listItem", id: 6 }, { rule: "optional", type: "ShoppingList", name: "list", id: 7 }, { rule: "optional", type: "string", name: "listFolderId", id: 8 }, { rule: "optional", type: "PBNotificationLocation", name: "notificationLocation", id: 9 }, { rule: "optional", type: "PBStore", name: "updatedStore", id: 10 }, { rule: "optional", type: "PBStore", name: "originalStore", id: 11 }, { rule: "repeated", type: "string", name: "sortedStoreIds", id: 12 }, { rule: "optional", type: "PBStoreFilter", name: "updatedStoreFilter", id: 13 }, { rule: "optional", type: "PBStoreFilter", name: "originalStoreFilter", id: 14 }, { rule: "repeated", type: "string", name: "sortedStoreFilterIds", id: 15 }, { rule: "optional", type: "PBItemPrice", name: "itemPrice", id: 16 }, { rule: "optional", type: "PBListCategory", name: "updatedCategory", id: 17 }, { rule: "optional", type: "PBListCategory", name: "originalCategory", id: 18 }, { rule: "optional", type: "PBListCategoryGroup", name: "updatedCategoryGroup", id: 19 }, { rule: "optional", type: "PBListCategoryGroup", name: "originalCategoryGroup", id: 20 }, { rule: "optional", type: "PBListCategorizationRule", name: "updatedCategorizationRule", id: 21 }, { rule: "optional", type: "PBListCategorizationRule", name: "originalCategorizationRule", id: 22 }, { rule: "repeated", type: "PBListCategorizationRule", name: "updatedCategorizationRules", id: 23 } ] }, { name: "PBListOperationList", fields: [ { rule: "repeated", type: "PBListOperation", name: "operations", id: 1 } ] }, { name: "PBShareListOperationResponse", fields: [ { rule: "optional", type: "PBEmailUserIDPair", name: "sharedUser", id: 1 }, { rule: "optional", type: "double", name: "originalListTimestamp", id: 2 }, { rule: "optional", type: "double", name: "updatedListTimestamp", id: 3 }, { rule: "optional", type: "int32", name: "statusCode", id: 4 }, { rule: "optional", type: "string", name: "errorTitle", id: 5 }, { rule: "optional", type: "string", name: "errorMessage", id: 6 } ] }, { name: "PBListFolderOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "string", name: "listDataId", id: 2 }, { rule: "optional", type: "PBListFolder", name: "listFolder", id: 3 }, { rule: "repeated", type: "PBListFolderItem", name: "folderItems", id: 4 }, { rule: "optional", type: "string", name: "originalParentFolderId", id: 5 }, { rule: "optional", type: "string", name: "updatedParentFolderId", id: 6 } ] }, { name: "PBListFolderOperationList", fields: [ { rule: "repeated", type: "PBListFolderOperation", name: "operations", id: 1 } ] }, { name: "PBStarterListOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "string", name: "listId", id: 2 }, { rule: "optional", type: "string", name: "listItemId", id: 3 }, { rule: "optional", type: "string", name: "updatedValue", id: 4 }, { rule: "optional", type: "string", name: "originalValue", id: 5 }, { rule: "optional", type: "ListItem", name: "listItem", id: 6 }, { rule: "optional", type: "StarterList", name: "list", id: 7 }, { rule: "optional", type: "PBItemPrice", name: "itemPrice", id: 8 } ] }, { name: "PBStarterListOperationList", fields: [ { rule: "repeated", type: "PBStarterListOperation", name: "operations", id: 1 } ] }, { name: "PBCategorizeItemOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "ListItem", name: "listItem", id: 2 } ] }, { name: "PBCategorizeItemOperationList", fields: [ { rule: "repeated", type: "PBCategorizeItemOperation", name: "operations", id: 1 } ] }, { name: "PBCategorizedItemsList", fields: [ { rule: "optional", type: "PBTimestamp", name: "timestamp", id: 1 }, { rule: "repeated", type: "ListItem", name: "categorizedItems", id: 2 } ] }, { name: "PBCategoryOrdering", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "name", id: 2 }, { rule: "repeated", type: "string", name: "categories", id: 3 } ] }, { name: "PBListSettings", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "userId", id: 2 }, { rule: "optional", type: "string", name: "listId", id: 3 }, { rule: "optional", type: "double", name: "timestamp", id: 4 }, { rule: "optional", type: "bool", name: "shouldHideCategories", id: 5 }, { rule: "optional", type: "string", name: "selectedCategoryOrdering", id: 6 }, { rule: "repeated", type: "PBCategoryOrdering", name: "categoryOrderings", id: 7 }, { rule: "optional", type: "bool", name: "genericGroceryAutocompleteEnabled", id: 8 }, { rule: "optional", type: "string", name: "listItemSortOrder", id: 9 }, { rule: "optional", type: "string", name: "categoryGroupingId", id: 10 }, { rule: "optional", type: "bool", name: "shouldRememberItemCategories", id: 11 }, { rule: "optional", type: "bool", name: "favoritesAutocompleteEnabled", id: 12 }, { rule: "optional", type: "bool", name: "recentItemsAutocompleteEnabled", id: 13 }, { rule: "optional", type: "bool", name: "shouldHideCompletedItems", id: 14 }, { rule: "optional", type: "int32", name: "listColorType", id: 15 }, { rule: "optional", type: "string", name: "listThemeId", id: 16 }, { rule: "optional", type: "PBListTheme", name: "customTheme", id: 17 }, { rule: "optional", type: "PBListTheme", name: "customDarkTheme", id: 31 }, { rule: "optional", type: "PBIcon", name: "icon", id: 32 }, { rule: "optional", type: "string", name: "badgeMode", id: 18 }, { rule: "optional", type: "bool", name: "locationNotificationsEnabled", id: 19 }, { rule: "optional", type: "string", name: "storeFilterId", id: 20 }, { rule: "optional", type: "bool", name: "shouldHideStoreNames", id: 21 }, { rule: "optional", type: "bool", name: "shouldHideRunningTotals", id: 22 }, { rule: "optional", type: "bool", name: "shouldHidePrices", id: 23 }, { rule: "optional", type: "int32", name: "leftRunningTotalType", id: 24 }, { rule: "optional", type: "int32", name: "rightRunningTotalType", id: 25 }, { rule: "optional", type: "string", name: "linkedAlexaListId", id: 26 }, { rule: "optional", type: "string", name: "listCategoryGroupId", id: 27 }, { rule: "optional", type: "string", name: "migrationListCategoryGroupIdForNewList", id: 28 }, { rule: "optional", type: "bool", name: "shouldShowSharedListCategoryOrderHintBanner", id: 29 }, { rule: "optional", type: "string", name: "linkedGoogleAssistantListId", id: 30 }, { rule: "optional", type: "bool", name: "hasShownAccountNamePrompt", id: 33 } ] }, { name: "PBListSettingsList", fields: [ { rule: "optional", type: "PBTimestamp", name: "timestamp", id: 1 }, { rule: "repeated", type: "PBListSettings", name: "settings", id: 2 } ] }, { name: "PBListSettingsOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "PBListSettings", name: "updatedSettings", id: 2 } ] }, { name: "PBListSettingsOperationList", fields: [ { rule: "repeated", type: "PBListSettingsOperation", name: "operations", id: 1 } ] }, { name: "PBListTheme", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "string", name: "userId", id: 3 }, { rule: "optional", type: "string", name: "name", id: 4 }, { rule: "optional", type: "string", name: "fontName", id: 5 }, { rule: "optional", type: "string", name: "bannerHexColor", id: 6 }, { rule: "optional", type: "string", name: "backgroundHexColor", id: 7 }, { rule: "optional", type: "string", name: "backgroundTexture", id: 8 }, { rule: "optional", type: "string", name: "itemNameHexColor", id: 9 }, { rule: "optional", type: "string", name: "itemDetailsHexColor", id: 10 }, { rule: "optional", type: "string", name: "controlHexColor", id: 11 }, { rule: "optional", type: "string", name: "separatorHexColor", id: 12 }, { rule: "optional", type: "string", name: "navigationBarHexColor", id: 13 }, { rule: "optional", type: "string", name: "cellHexColor", id: 14 }, { rule: "optional", type: "string", name: "cellTexture", id: 15 }, { rule: "optional", type: "string", name: "tableHexColor", id: 16 }, { rule: "optional", type: "string", name: "tableTexture", id: 17 }, { rule: "optional", type: "string", name: "backgroundImage", id: 18 }, { rule: "optional", type: "string", name: "selectionHexColor", id: 19 } ] }, { name: "PBListThemeList", fields: [ { rule: "optional", type: "PBTimestamp", name: "timestamp", id: 1 }, { rule: "repeated", type: "PBListTheme", name: "themes", id: 2 } ] }, { name: "PBMobileAppSettings", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "string", name: "defaultListId", id: 3 }, { rule: "optional", type: "string", name: "crossOffGesture", id: 4 }, { rule: "optional", type: "string", name: "listsSortOrder", id: 5 }, { rule: "optional", type: "string", name: "starterListsSortOrder", id: 6 }, { rule: "optional", type: "bool", name: "remindersAppImportEnabled", id: 7 }, { rule: "optional", type: "string", name: "appBadgeMode", id: 8 }, { rule: "optional", type: "bool", name: "shouldAutoImportReminders", id: 9 }, { rule: "optional", type: "bool", name: "shouldPreventScreenAutolock", id: 10 }, { rule: "optional", type: "bool", name: "promptToLoadPhotosOverCellularData", id: 11 }, { rule: "optional", type: "string", name: "listIdForRecipeIngredients", id: 12 }, { rule: "optional", type: "string", name: "webSelectedListId", id: 43 }, { rule: "optional", type: "string", name: "webSelectedRecipeId", id: 13 }, { rule: "optional", type: "string", name: "webSelectedRecipeCollectionId", id: 14 }, { rule: "optional", type: "string", name: "webSelectedTabId", id: 15 }, { rule: "optional", type: "string", name: "webSelectedListFolderPath", id: 16 }, { rule: "optional", type: "int32", name: "webSelectedMealPlanTab", id: 17 }, { rule: "optional", type: "bool", name: "webHasHiddenStoresAndFiltersHelp", id: 18 }, { rule: "optional", type: "bool", name: "webHasHiddenItemPricesHelp", id: 22 }, { rule: "optional", type: "string", name: "webDecimalSeparator", id: 23 }, { rule: "optional", type: "string", name: "webCurrencyCode", id: 24 }, { rule: "optional", type: "string", name: "webCurrencySymbol", id: 25 }, { rule: "optional", type: "int32", name: "webSelectedRecipeCollectionType", id: 40 }, { rule: "repeated", type: "PBHintBannerDisplayStats", name: "hintBannerDisplayStats", id: 19 }, { rule: "optional", type: "PBRecipeCollectionSettings", name: "webSelectedRecipeCollectionSettingsOverride", id: 20 }, { rule: "optional", type: "bool", name: "shouldUseMetricUnits", id: 21 }, { rule: "repeated", type: "PBAlexaList", name: "unlinkedAlexaLists", id: 26 }, { rule: "optional", type: "bool", name: "alexaSkillHasListReadPermission", id: 27 }, { rule: "optional", type: "bool", name: "alexaSkillHasListWritePermission", id: 28 }, { rule: "optional", type: "bool", name: "isAccountLinkedToAlexaSkill", id: 29 }, { rule: "optional", type: "string", name: "alexaApiEndpoint", id: 30 }, { rule: "optional", type: "bool", name: "alexaSkillOnlySupportsBuiltInLists", id: 31 }, { rule: "optional", type: "bool", name: "hasMigratedUserCategoriesToListCategories", id: 32 }, { rule: "optional", type: "bool", name: "isAccountLinkedToGoogleAssistant", id: 34 }, { rule: "optional", type: "bool", name: "clientHasShownGoogleAssistantOnboarding", id: 36 }, { rule: "repeated", type: "PBRecipeCookingState", name: "recipeCookingStates", id: 37 }, { rule: "optional", type: "bool", name: "shouldNotLinkNewListsWithAlexaByDefault", id: 38 }, { rule: "optional", type: "bool", name: "shouldNotLinkNewListsWithGoogleAssistantByDefault", id: 39 }, { rule: "optional", type: "bool", name: "didSuppressAccountNamePrompt", id: 41 }, { rule: "optional", type: "bool", name: "isOnlineShoppingDisabled", id: 42 }, { rule: "repeated", type: "PBGoogleAssistantList", name: "unlinkedGoogleAssistantLists", id: 33 }, { rule: "optional", type: "bool", name: "isActiveGoogleAssistantProvider", id: 35 } ] }, { name: "PBAppNotice", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "string", name: "title", id: 3 }, { rule: "optional", type: "string", name: "notificationTitle", id: 4 }, { rule: "optional", type: "string", name: "notificationSubtitle", id: 5 }, { rule: "optional", type: "string", name: "bodyHtml", id: 6 }, { rule: "optional", type: "string", name: "bodyCss", id: 7 }, { rule: "optional", type: "string", name: "userId", id: 8 }, { rule: "optional", type: "string", name: "context", id: 9 }, { rule: "optional", type: "bool", name: "isDraft", id: 10 }, { rule: "optional", type: "double", name: "maxUserCreationTime", id: 11 } ] }, { name: "PBAppNoticesUserData", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "repeated", type: "string", name: "readNoticeIds", id: 3 }, { rule: "repeated", type: "string", name: "dismissedGlobalNoticeIds", id: 4 } ] }, { name: "PBAppNoticeOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "repeated", type: "string", name: "noticeIds", id: 2 } ] }, { name: "PBAppNoticeOperationList", fields: [ { rule: "repeated", type: "PBAppNoticeOperation", name: "operations", id: 1 } ] }, { name: "PBAppNoticeList", fields: [ { rule: "repeated", type: "PBAppNotice", name: "notices", id: 1 } ] }, { name: "PBHintBannerDisplayStats", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "repeated", type: "double", name: "displayTimestamps", id: 2 } ] }, { name: "PBMobileAppSettingsOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "PBMobileAppSettings", name: "updatedSettings", id: 2 } ] }, { name: "PBMobileAppSettingsOperationList", fields: [ { rule: "repeated", type: "PBMobileAppSettingsOperation", name: "operations", id: 1 } ] }, { name: "PBUserCategory", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "userId", id: 2 }, { rule: "optional", type: "string", name: "name", id: 3 }, { rule: "optional", type: "string", name: "icon", id: 4 }, { rule: "optional", type: "string", name: "systemCategory", id: 5 }, { rule: "optional", type: "string", name: "categoryMatchId", id: 6 }, { rule: "optional", type: "bool", name: "fromSharedList", id: 7 }, { rule: "optional", type: "double", name: "timestamp", id: 8 } ] }, { name: "PBCategoryGrouping", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "userId", id: 2 }, { rule: "optional", type: "string", name: "name", id: 3 }, { rule: "optional", type: "double", name: "timestamp", id: 4 }, { rule: "optional", type: "string", name: "sharingId", id: 5 }, { rule: "repeated", type: "string", name: "categoryIds", id: 6 }, { rule: "optional", type: "bool", name: "shouldHideFromBrowseListCategoryGroupsScreen", id: 7 } ] }, { name: "PBUserCategoryData", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 }, { rule: "optional", type: "double", name: "requiresRefreshTimestamp", id: 3 }, { rule: "repeated", type: "PBUserCategory", name: "categories", id: 4 }, { rule: "repeated", type: "PBCategoryGrouping", name: "groupings", id: 5 }, { rule: "optional", type: "bool", name: "hasMigratedCategoryOrderings", id: 6 } ] }, { name: "PBUserCategoryOperation", fields: [ { rule: "optional", type: "PBOperationMetadata", name: "metadata", id: 1 }, { rule: "optional", type: "PBUserCategory", name: "category", id: 2 }, { rule: "optional", type: "PBCategoryGrouping", name: "grouping", id: 3 } ] }, { name: "PBUserCategoryOperationList", fields: [ { rule: "repeated", type: "PBUserCategoryOperation", name: "operations", id: 1 } ] }, { name: "PBTimestamp", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "timestamp", id: 2 } ] }, { name: "PBTimestampList", fields: [ { rule: "repeated", type: "PBTimestamp", name: "timestamps", id: 1 } ] }, { name: "PBLogicalTimestamp", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 }, { rule: "optional", type: "string", name: "description", id: 3 } ] }, { name: "PBLogicalTimestampList", fields: [ { rule: "repeated", type: "PBLogicalTimestamp", name: "timestamps", id: 1 } ] }, { name: "PBEditOperationResponse", fields: [ { rule: "repeated", type: "PBTimestamp", name: "originalTimestamps", id: 1 }, { rule: "repeated", type: "PBTimestamp", name: "newTimestamps", id: 2 }, { rule: "repeated", type: "string", name: "processedOperations", id: 3 }, { rule: "repeated", type: "PBLogicalTimestamp", name: "originalLogicalTimestamps", id: 4 }, { rule: "repeated", type: "PBLogicalTimestamp", name: "currentLogicalTimestamps", id: 5 }, { rule: "repeated", type: "string", name: "fullRefreshTimestampIds", id: 6 } ] }, { name: "PBUserSubscriptionInfo", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "bool", name: "subscriptionIsActive", id: 16 }, { rule: "optional", type: "int32", name: "subscriptionManagementSystem", id: 14 }, { rule: "optional", type: "string", name: "expirationTimestampMsStr", id: 2 }, { rule: "optional", type: "int64", name: "expirationTimestampMs", id: 15 }, { rule: "optional", type: "int32", name: "subscriptionType", id: 3 }, { rule: "optional", type: "PBEmailUserIDPair", name: "masterUser", id: 4 }, { rule: "repeated", type: "PBEmailUserIDPair", name: "subusers", id: 5 }, { rule: "repeated", type: "PBIAPReceipt", name: "nonrenewIapReceipts", id: 6 }, { rule: "repeated", type: "PBIAPReceipt", name: "autorenewIapReceipts", id: 7 }, { rule: "repeated", type: "PBStripeCharge", name: "nonrenewStripeCharges", id: 9 }, { rule: "repeated", type: "PBGooglePlayPurchase", name: "googlePlayPurchases", id: 12 }, { rule: "optional", type: "string", name: "googlePlayPurchaseToken", id: 13 }, { rule: "repeated", type: "string", name: "googlePlayOrderIds", id: 17 }, { rule: "optional", type: "int32", name: "subuserLimit", id: 8, options: { "default": 5 } }, { rule: "repeated", type: "string", name: "sentEmailIdentifiers", id: 10 }, { rule: "optional", type: "bool", name: "userConfirmedNotRenewing", id: 11 }, { rule: "optional", type: "bool", name: "subscriptionIsCanceled", id: 20 }, { rule: "optional", type: "bool", name: "subscriptionIsPendingDowngrade", id: 26 }, { rule: "optional", type: "bool", name: "subscriptionIsInStripeAutorenewMigrationPeriod", id: 27 }, { rule: "optional", type: "string", name: "stripeCustomerId", id: 18 }, { rule: "optional", type: "string", name: "stripeSubscriptionId", id: 21 }, { rule: "repeated", type: "PBStripeSubscriptionInvoice", name: "stripeSubscriptionInvoices", id: 19 }, { rule: "optional", type: "string", name: "stripePaymentMethodLast4", id: 22 }, { rule: "optional", type: "int32", name: "stripePaymentMethodExpirationMonth", id: 23 }, { rule: "optional", type: "int32", name: "stripePaymentMethodExpirationYear", id: 24 }, { rule: "optional", type: "string", name: "stripePaymentMethodBrand", id: 25 } ] }, { name: "PBIAPReceipt", fields: [ { rule: "optional", type: "string", name: "transactionId", id: 1 }, { rule: "optional", type: "bytes", name: "receiptData", id: 2 }, { rule: "optional", type: "string", name: "parsedReceipt", id: 3 } ] }, { name: "PBStripeCharge", fields: [ { rule: "optional", type: "string", name: "chargeId", id: 1 }, { rule: "optional", type: "string", name: "charge", id: 2 } ] }, { name: "PBGooglePlayPurchase", fields: [ { rule: "optional", type: "string", name: "orderId", id: 1 }, { rule: "optional", type: "string", name: "purchaseToken", id: 3 }, { rule: "optional", type: "string", name: "purchaseInfo", id: 2 } ] }, { name: "PBStripeSubscriptionInvoice", fields: [ { rule: "optional", type: "string", name: "subscriptionId", id: 1 }, { rule: "optional", type: "string", name: "invoiceId", id: 2 }, { rule: "optional", type: "string", name: "subscription", id: 3 } ] }, { name: "PBUserEmailInfo", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "unsubscribeId", id: 2 }, { rule: "repeated", type: "string", name: "sentMessageIdentifiers", id: 4 }, { rule: "optional", type: "bool", name: "shouldSendNewsletters", id: 3 }, { rule: "optional", type: "bool", name: "shouldSendOnboardingTips", id: 5 }, { rule: "optional", type: "bool", name: "shouldSendSubscriptionLifecycleMessages", id: 6 } ] }, { name: "PBEmailSuppressionInfo", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "emailAddress", id: 2 }, { rule: "optional", type: "bool", name: "shouldSuppressAllMessages", id: 3 }, { rule: "repeated", type: "PBEmailEvent", name: "emailEvents", id: 4 } ] }, { name: "PBEmailEvent", fields: [ { rule: "optional", type: "string", name: "eventType", id: 1 }, { rule: "optional", type: "string", name: "eventData", id: 2 }, { rule: "optional", type: "string", name: "description", id: 3 } ] }, { name: "PBAccountInfoResponse", fields: [ { rule: "optional", type: "int32", name: "statusCode", id: 1 }, { rule: "optional", type: "string", name: "firstName", id: 2 }, { rule: "optional", type: "string", name: "lastName", id: 3 }, { rule: "optional", type: "string", name: "email", id: 4 }, { rule: "optional", type: "bool", name: "isPremiumUser", id: 5 }, { rule: "optional", type: "int32", name: "subscriptionType", id: 6 }, { rule: "optional", type: "int32", name: "subscriptionManagementSystem", id: 10 }, { rule: "optional", type: "string", name: "expirationTimestampMsStr", id: 7 }, { rule: "optional", type: "int64", name: "expirationTimestampMs", id: 11 }, { rule: "optional", type: "PBEmailUserIDPair", name: "masterUser", id: 8 }, { rule: "repeated", type: "PBEmailUserIDPair", name: "subusers", id: 9 }, { rule: "optional", type: "bool", name: "subscriptionIsCanceled", id: 13 }, { rule: "optional", type: "bool", name: "subscriptionIsPendingDowngrade", id: 14 }, { rule: "optional", type: "string", name: "icalendarId", id: 12 } ] }, { name: "PBAppNoticesResponse", fields: [ { rule: "repeated", type: "PBAppNotice", name: "newGlobalNotices", id: 1 }, { rule: "repeated", type: "PBAppNotice", name: "updatedGlobalNotices", id: 2 }, { rule: "repeated", type: "string", name: "removedGlobalNoticeIds", id: 3 }, { rule: "repeated", type: "PBAppNotice", name: "newUserNotices", id: 4 }, { rule: "repeated", type: "PBAppNotice", name: "updatedUserNotices", id: 5 }, { rule: "repeated", type: "string", name: "removedUserNoticeIds", id: 6 }, { rule: "optional", type: "PBAppNoticesUserData", name: "userData", id: 7 } ] }, { name: "PBAccountChangePasswordResponse", fields: [ { rule: "optional", type: "int32", name: "statusCode", id: 1 }, { rule: "optional", type: "string", name: "errorTitle", id: 2 }, { rule: "optional", type: "string", name: "errorMessage", id: 3 }, { rule: "optional", type: "string", name: "refreshToken", id: 4 }, { rule: "optional", type: "string", name: "accessToken", id: 5 } ] }, { name: "PBRedemptionCodeInfo", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "redemptionCode", id: 2 }, { rule: "optional", type: "string", name: "purchasingUserId", id: 3 }, { rule: "optional", type: "string", name: "redeemingUserId", id: 4 }, { rule: "optional", type: "double", name: "redemptionTimestamp", id: 5 }, { rule: "optional", type: "int32", name: "subscriptionType", id: 6 }, { rule: "optional", type: "double", name: "creationTimestamp", id: 7 }, { rule: "optional", type: "bool", name: "wasPurchased", id: 8 } ] }, { name: "PBRedemptionCodeResponse", fields: [ { rule: "optional", type: "int32", name: "statusCode", id: 1 }, { rule: "optional", type: "PBAccountInfoResponse", name: "accountInfo", id: 2 }, { rule: "optional", type: "string", name: "errorTitle", id: 3 }, { rule: "optional", type: "string", name: "errorMessage", id: 4 } ] }, { name: "PBAuthTokenInfo", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "bool", name: "isBlacklisted", id: 2 }, { rule: "optional", type: "string", name: "userId", id: 3 }, { rule: "optional", type: "int64", name: "creationTimestamp", id: 4 }, { rule: "optional", type: "int64", name: "expirationTimestamp", id: 5 }, { rule: "optional", type: "int64", name: "blacklistedTimestamp", id: 6 }, { rule: "optional", type: "int64", name: "lastUsedForRefreshTimestamp", id: 7 }, { rule: "optional", type: "string", name: "replacementTokenId", id: 8 }, { rule: "optional", type: "string", name: "replacementTokenStr", id: 9 }, { rule: "optional", type: "int64", name: "replacementTokenGenerationTimestamp", id: 10 }, { rule: "optional", type: "string", name: "clientPlatform", id: 11 } ] }, { name: "PBIdentifierList", fields: [ { rule: "optional", type: "double", name: "timestamp", id: 1 }, { rule: "repeated", type: "string", name: "identifiers", id: 2 } ] }, { name: "PBEmailUserIDPair", fields: [ { rule: "optional", type: "string", name: "email", id: 1 }, { rule: "optional", type: "string", name: "userId", id: 2 }, { rule: "optional", type: "string", name: "fullName", id: 3 } ] }, { name: "PBNotificationLocation", fields: [ { rule: "required", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "double", name: "latitude", id: 2 }, { rule: "optional", type: "double", name: "longitude", id: 3 }, { rule: "optional", type: "string", name: "name", id: 4 }, { rule: "optional", type: "string", name: "address", id: 5 } ] }, { name: "PBUserDataClientTimestamps", fields: [ { rule: "optional", type: "PBTimestampList", name: "shoppingListTimestamps", id: 1 }, { rule: "optional", type: "PBListFolderTimestamps", name: "listFolderTimestamps", id: 2 }, { rule: "optional", type: "PBTimestamp", name: "userRecipeDataTimestamp", id: 3 }, { rule: "optional", type: "PBLogicalTimestamp", name: "mealPlanningCalendarTimestamp", id: 4 }, { rule: "optional", type: "PBTimestamp", name: "categorizedItemsTimestamp", id: 5 }, { rule: "optional", type: "PBTimestamp", name: "userCategoriesTimestamp", id: 6 }, { rule: "optional", type: "PBTimestampList", name: "starterListTimestamps", id: 7 }, { rule: "optional", type: "PBTimestampList", name: "recentItemTimestamps", id: 8 }, { rule: "optional", type: "PBTimestampList", name: "favoriteItemTimestamps", id: 9 }, { rule: "optional", type: "PBTimestamp", name: "orderedStarterListIdsTimestamp", id: 10 }, { rule: "optional", type: "PBTimestamp", name: "listSettingsTimestamp", id: 11 }, { rule: "optional", type: "PBTimestamp", name: "starterListSettingsTimestamp", id: 12 }, { rule: "optional", type: "PBTimestamp", name: "mobileAppSettingsTimestamp", id: 13 }, { rule: "optional", type: "PBLogicalTimestampList", name: "shoppingListLogicalTimestamps", id: 14 } ] }, { name: "PBUserDataResponse", fields: [ { rule: "optional", type: "ShoppingListsResponse", name: "shoppingListsResponse", id: 1 }, { rule: "optional", type: "PBListFoldersResponse", name: "listFoldersResponse", id: 2 }, { rule: "optional", type: "PBRecipeDataResponse", name: "recipeDataResponse", id: 3 }, { rule: "optional", type: "PBCalendarResponse", name: "mealPlanningCalendarResponse", id: 4 }, { rule: "optional", type: "PBCategorizedItemsList", name: "categorizedItemsResponse", id: 5 }, { rule: "optional", type: "PBUserCategoryData", name: "userCategoriesResponse", id: 6 }, { rule: "optional", type: "StarterListsResponseV2", name: "starterListsResponse", id: 7 }, { rule: "optional", type: "PBIdentifierList", name: "orderedStarterListIdsResponse", id: 8 }, { rule: "optional", type: "PBListSettingsList", name: "listSettingsResponse", id: 9 }, { rule: "optional", type: "PBListSettingsList", name: "starterListSettingsResponse", id: 10 }, { rule: "optional", type: "PBMobileAppSettings", name: "mobileAppSettingsResponse", id: 11 } ] }, { name: "PBValue", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "repeated", type: "string", name: "stringValue", id: 2 }, { rule: "optional", type: "bool", name: "boolValue", id: 3 }, { rule: "optional", type: "int32", name: "intValue", id: 4 }, { rule: "optional", type: "double", name: "doubleValue", id: 5 }, { rule: "optional", type: "bytes", name: "dataValue", id: 6 }, { rule: "optional", type: "bytes", name: "encodedPb", id: 7 }, { rule: "optional", type: "string", name: "pbClassName", id: 8 }, { rule: "optional", type: "uint64", name: "logicalTimestampValue", id: 9 }, { rule: "map", type: "PBRecipeCollectionSettings", keytype: "string", name: "recipeCollectionSettingsMap", id: 10 } ] }, { name: "PBValueList", fields: [ { rule: "repeated", type: "PBValue", name: "values", id: 1 } ] }, { name: "PBDeletedObjectID", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 2 } ] }, { name: "PBDeletedObjectIDList", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "containerId", id: 2 }, { rule: "optional", type: "string", name: "logicalClockId", id: 3 }, { rule: "optional", type: "uint64", name: "creationLogicalTimestamp", id: 4 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 5 }, { rule: "repeated", type: "PBDeletedObjectID", name: "deletedObjectIds", id: 6 } ] }, { name: "PBEmailUserIDPairList", fields: [ { rule: "repeated", type: "PBEmailUserIDPair", name: "emailUserIdPair", id: 1 } ] }, { name: "PBRecipeLinkRequestList", fields: [ { rule: "repeated", type: "PBRecipeLinkRequest", name: "recipeLinkRequest", id: 1 } ] }, { name: "PBSyncOperation", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "operationQueueId", id: 2 }, { rule: "optional", type: "string", name: "operationClassName", id: 3 }, { rule: "optional", type: "bytes", name: "encodedOperation", id: 4 } ] }, { name: "PBWatchSyncResponse", fields: [ { rule: "optional", type: "string", name: "watchId", id: 23 }, { rule: "optional", type: "string", name: "userId", id: 1 }, { rule: "optional", type: "bool", name: "isPremiumUser", id: 2 }, { rule: "optional", type: "string", name: "rootFolderId", id: 3 }, { rule: "optional", type: "uint64", name: "logicalTimestamp", id: 4 }, { rule: "optional", type: "bool", name: "isFullSync", id: 22 }, { rule: "repeated", type: "ShoppingList", name: "shoppingLists", id: 5 }, { rule: "repeated", type: "string", name: "deletedShoppingListIds", id: 6 }, { rule: "repeated", type: "ListItem", name: "listItems", id: 7 }, { rule: "repeated", type: "string", name: "deletedListItemIds", id: 8 }, { rule: "repeated", type: "PBStore", name: "stores", id: 9 }, { rule: "repeated", type: "string", name: "deletedStoresIds", id: 10 }, { rule: "repeated", type: "PBStoreFilter", name: "storeFilters", id: 11 }, { rule: "repeated", type: "string", name: "deletedStoreFilterIds", id: 12 }, { rule: "repeated", type: "PBListSettings", name: "listSettings", id: 13 }, { rule: "repeated", type: "string", name: "deletedListSettingIds", id: 14 }, { rule: "repeated", type: "PBCategoryGrouping", name: "categoryGroups", id: 15 }, { rule: "repeated", type: "string", name: "deletedCategoryGroupIds", id: 16 }, { rule: "repeated", type: "PBUserCategory", name: "categories", id: 17 }, { rule: "repeated", type: "string", name: "deletedCategoryIds", id: 18 }, { rule: "repeated", type: "PBListCategory", name: "listCategories", id: 24 }, { rule: "repeated", type: "string", name: "deletedListCategoryIds", id: 25 }, { rule: "repeated", type: "PBListCategoryGroup", name: "listCategoryGroups", id: 26 }, { rule: "repeated", type: "string", name: "deletedListCategoryGroupIds", id: 27 }, { rule: "repeated", type: "PBListCategorizationRule", name: "listCategorizationRules", id: 28 }, { rule: "repeated", type: "string", name: "deletedListCategorizationRuleIds", id: 29 }, { rule: "repeated", type: "PBListFolder", name: "listFolders", id: 19 }, { rule: "repeated", type: "string", name: "deletedListFolderIds", id: 20 }, { rule: "repeated", type: "string", name: "processedOperationIds", id: 21 } ] }, { name: "PBWatchSyncMultipartResponsePart", fields: [ { rule: "optional", type: "string", name: "fullResponseHash", id: 1 }, { rule: "optional", type: "int32", name: "partIndex", id: 2 }, { rule: "optional", type: "int32", name: "partsCount", id: 3 }, { rule: "optional", type: "bytes", name: "responsePart", id: 4 } ] }, { name: "PBWatchSyncMultipartResponse", fields: [ { rule: "repeated", type: "PBWatchSyncMultipartResponsePart", name: "reponsePart", id: 1 }, { rule: "optional", type: "string", name: "fullResponseHash", id: 2 }, { rule: "optional", type: "uint64", name: "responseLogicalTimestamp", id: 3 } ] }, { name: "PBAlexaUser", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "alexaUserId", id: 2 }, { rule: "optional", type: "string", name: "anylistUserId", id: 3 }, { rule: "optional", type: "bool", name: "hasListReadPermission", id: 4 }, { rule: "optional", type: "bool", name: "hasListWritePermission", id: 5 }, { rule: "optional", type: "bool", name: "isSkillEnabled", id: 6 }, { rule: "optional", type: "string", name: "accountLinkedTimestamp", id: 7 }, { rule: "optional", type: "string", name: "skillEnabledTimestamp", id: 8 }, { rule: "optional", type: "string", name: "skillPermissionTimestamp", id: 10 }, { rule: "optional", type: "string", name: "alexaApiEndpoint", id: 11 } ] }, { name: "PBAlexaList", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "alexaListId", id: 2 }, { rule: "optional", type: "string", name: "anylistListId", id: 3 }, { rule: "optional", type: "string", name: "alexaUserId", id: 4 }, { rule: "optional", type: "string", name: "name", id: 5 }, { rule: "repeated", type: "PBAlexaListItem", name: "items", id: 6 }, { rule: "optional", type: "string", name: "state", id: 7 }, { rule: "optional", type: "int32", name: "version", id: 8 } ] }, { name: "PBAlexaListItem", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "alexaItemId", id: 2 }, { rule: "optional", type: "string", name: "anylistItemId", id: 3 }, { rule: "optional", type: "string", name: "alexaListId", id: 4 }, { rule: "optional", type: "string", name: "alexaUserId", id: 5 }, { rule: "optional", type: "int32", name: "version", id: 6 }, { rule: "optional", type: "string", name: "itemValue", id: 7 }, { rule: "optional", type: "string", name: "status", id: 8 } ] }, { name: "PBAlexaListOperation", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "operationType", id: 2 }, { rule: "optional", type: "string", name: "alexaUserId", id: 3 }, { rule: "repeated", type: "PBAlexaListItem", name: "operationItems", id: 4 }, { rule: "repeated", type: "PBAlexaList", name: "operationLists", id: 5 } ] }, { name: "PBAlexaTask", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "alexaUserId", id: 2 }, { rule: "optional", type: "string", name: "eventJson", id: 3 }, { rule: "optional", type: "PBAlexaListOperation", name: "listOperation", id: 4 } ] }, { name: "PBGoogleAssistantUser", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "anylistUserId", id: 2 }, { rule: "optional", type: "string", name: "listActionsApiRefreshToken", id: 3 }, { rule: "optional", type: "bool", name: "isGoogleAssistantAccountLinked", id: 4 }, { rule: "optional", type: "string", name: "anylistRefreshToken", id: 6 }, { rule: "optional", type: "string", name: "anylistAccessToken", id: 7 }, { rule: "optional", type: "bool", name: "isActiveGoogleAssistantProvider", id: 5 } ] }, { name: "PBGoogleAssistantList", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "googleAssistantCreateToken", id: 2 }, { rule: "optional", type: "string", name: "anylistListId", id: 3 }, { rule: "optional", type: "string", name: "anylistUserId", id: 4 }, { rule: "optional", type: "string", name: "title", id: 5 }, { rule: "repeated", type: "PBGoogleAssistantListItem", name: "items", id: 6 }, { rule: "optional", type: "bool", name: "isArchived", id: 7 }, { rule: "optional", type: "string", name: "createTime", id: 8 }, { rule: "optional", type: "string", name: "updateTime", id: 9 } ] }, { name: "PBGoogleAssistantListItem", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "googleAssistantCreateToken", id: 2 }, { rule: "optional", type: "string", name: "anylistItemId", id: 3 }, { rule: "optional", type: "string", name: "googleAssistantListId", id: 4 }, { rule: "optional", type: "string", name: "anylistUserId", id: 5 }, { rule: "optional", type: "string", name: "content", id: 6 }, { rule: "optional", type: "bool", name: "isChecked", id: 7 }, { rule: "optional", type: "string", name: "createTime", id: 8 }, { rule: "optional", type: "string", name: "updateTime", id: 9 } ] }, { name: "PBGoogleAssistantListOperation", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "operationType", id: 2 }, { rule: "optional", type: "string", name: "anylistUserId", id: 3 }, { rule: "repeated", type: "PBGoogleAssistantListItem", name: "operationItems", id: 4 }, { rule: "repeated", type: "PBGoogleAssistantList", name: "operationLists", id: 5 }, { rule: "optional", type: "string", name: "googleAssistantListId", id: 6 } ] }, { name: "PBGoogleAssistantTask", fields: [ { rule: "optional", type: "string", name: "identifier", id: 1 }, { rule: "optional", type: "string", name: "anylistUserId", id: 2 }, { rule: "optional", type: "PBGoogleAssistantListOperation", name: "listOperation", id: 3 } ] } ] } ```
igormages commented 6 months ago

I just tried for several days... and I can't find the solution. I don't have the knowledge to understand the Anylist API and adapt the code...