diff --git a/.travis.yml b/.travis.yml index fd889d67..949d076a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ language: node_js node_js: - - "8.9.1" - - "9.2.0" + - "10.1.0" + - "8.11.1" diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bfad038..7f928dbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# Changelog 6.1.0 +## General + * Removed some trailing util.log commands + * Protobuf updates + * Attempt to fix mocha not exiting + * Added profile request fuction that allows fetching profile page + # Changelog 6.0.0 ## General Fixed some chat channel bugs diff --git a/README.md b/README.md index ed5994f0..5a0efe7c 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ Dota 2 module * [.requestChatChannels()](#module_Dota2.Dota2Client+requestChatChannels) * [.requestPlayerMatchHistory(account_id, [options], [callback])](#module_Dota2.Dota2Client+requestPlayerMatchHistory) * [.requestProfileCard(account_id, [callback])](#module_Dota2.Dota2Client+requestProfileCard) + * [.requestProfile(account_id, [callback])](#module_Dota2.Dota2Client+requestProfile) * [.requestHallOfFame(week, [callback])](#module_Dota2.Dota2Client+requestHallOfFame) * [.requestPlayerInfo(account_ids)](#module_Dota2.Dota2Client+requestPlayerInfo) * [.requestTrophyList(account_id, [callback])](#module_Dota2.Dota2Client+requestTrophyList) @@ -149,6 +150,7 @@ Dota 2 module * ["chatChannelsData" (channels)](#module_Dota2.Dota2Client+event_chatChannelsData) * ["playerMatchHistoryData" (requestId, matchHistoryResponse)](#module_Dota2.Dota2Client+event_playerMatchHistoryData) * ["profileCardData" (account_id, profileCardResponse)](#module_Dota2.Dota2Client+event_profileCardData) + * ["profileData" (profileResponse)](#module_Dota2.Dota2Client+event_profileData) * ["hallOfFameData" (week, featured_players, featured_farmer, hallOfFameResponse)](#module_Dota2.Dota2Client+event_hallOfFameData) * ["playerInfoData" (playerInfoData)](#module_Dota2.Dota2Client+event_playerInfoData) * ["trophyListData" (trophyListResponse)](#module_Dota2.Dota2Client+event_trophyListData) @@ -218,6 +220,7 @@ Dota 2 module * [.requestChatChannels()](#module_Dota2.Dota2Client+requestChatChannels) * [.requestPlayerMatchHistory(account_id, [options], [callback])](#module_Dota2.Dota2Client+requestPlayerMatchHistory) * [.requestProfileCard(account_id, [callback])](#module_Dota2.Dota2Client+requestProfileCard) + * [.requestProfile(account_id, [callback])](#module_Dota2.Dota2Client+requestProfile) * [.requestHallOfFame(week, [callback])](#module_Dota2.Dota2Client+requestHallOfFame) * [.requestPlayerInfo(account_ids)](#module_Dota2.Dota2Client+requestPlayerInfo) * [.requestTrophyList(account_id, [callback])](#module_Dota2.Dota2Client+requestTrophyList) @@ -287,6 +290,7 @@ Dota 2 module * ["chatChannelsData" (channels)](#module_Dota2.Dota2Client+event_chatChannelsData) * ["playerMatchHistoryData" (requestId, matchHistoryResponse)](#module_Dota2.Dota2Client+event_playerMatchHistoryData) * ["profileCardData" (account_id, profileCardResponse)](#module_Dota2.Dota2Client+event_profileCardData) + * ["profileData" (profileResponse)](#module_Dota2.Dota2Client+event_profileData) * ["hallOfFameData" (week, featured_players, featured_farmer, hallOfFameResponse)](#module_Dota2.Dota2Client+event_hallOfFameData) * ["playerInfoData" (playerInfoData)](#module_Dota2.Dota2Client+event_playerInfoData) * ["trophyListData" (trophyListResponse)](#module_Dota2.Dota2Client+event_trophyListData) @@ -364,29 +368,29 @@ The lobby the bot is currently in. Falsy if the bot isn't in a lobby. | --- | --- | --- | --- | | game_name | string | | Name of the lobby | | pass_key | string | | Lobby password | -| server_region | [ServerRegion](#module_Dota2.ServerRegion) | module:Dota2.ServerRegion.UNSPECIFIED | Server region where the lobby will be created | -| game_mode | DOTA_GameMode | DOTA_GameMode.DOTA_GAMEMODE_AP | Game mode | -| game_version | DOTAGameVersion | DOTAGameVersion.GAME_VERSION_STABLE | Version of the game | -| cm_pick | DOTA_CM_PICK | DOTA_CM_PICK.DOTA_CM_RANDOM | Who gets first pick | -| allow_cheats | boolean | false | Whether or not to allow cheats | -| fill_with_bots | boolean | false | Whether or not to fill empty slots with bots | -| bot_difficulty_radiant | BotDifficulty | module:Dota2.BotDifficulty.PASSIVE | The bot difficulty for radiant bots, if fill_with_bots is true. | -| bot_difficulty_dire | BotDifficulty | module:Dota2.BotDifficulty.PASSIVE | The bot difficulty for dire bots, if fill_with_bots is true. | -| bot_radiant | number | | Presumably the ID of the custom AI to be applied to radiant bots. | -| bot_dire | number | | Presumably the ID of the custom AI to be applied to dire bots. | -| allow_spectating | boolean | true | Whether or not to allow spectating | -| series_type | SeriesType | NONE | Whether or not the game is part of a series (Bo3, Bo5). | -| radiant_series_wins | number | 0 | # of games won so far, e.g. for a Bo3 or Bo5. | -| dire_series_wins | number | 0 | # of games won so far, e.g. for a Bo3 or Bo5. | -| previous_match_override | number | | In a series, the match ID of the previous game. If not supplied, the GC will try to find it automatically based on the teams and the players. | -| allchat | boolean | false | Whether or not it's allowed to all-chat | -| dota_tv_delay | LobbyDotaTVDelay | LobbyDotaTV_120 | How much time the game should be delayed for DotaTV. | -| leagueid | number | | The league this lobby is being created for. The bot should be a league admin for this to work. | -| custom_game_mode | string | | Name of the custom game | -| custom_map_name | string | | Which map the custom game should be played on | -| custom_difficulty | number | | Difficulty of the custom game | -| custom_game_id | [Long](#external_Long) | | 64bit ID of the custom game mode | -| pause_setting | LobbyDotaPauseSetting | 0 | Pause setting: 0 - unlimited, 1 - limited, 2 - disabled | +| [server_region] | [ServerRegion](#module_Dota2.ServerRegion) | module:Dota2.ServerRegion.UNSPECIFIED | Server region where the lobby will be created | +| [game_mode] | DOTA_GameMode | DOTA_GameMode.DOTA_GAMEMODE_AP | Game mode | +| [game_version] | DOTAGameVersion | DOTAGameVersion.GAME_VERSION_STABLE | Version of the game | +| [cm_pick] | DOTA_CM_PICK | DOTA_CM_PICK.DOTA_CM_RANDOM | Who gets first pick | +| [allow_cheats] | boolean | false | Whether or not to allow cheats | +| [fill_with_bots] | boolean | false | Whether or not to fill empty slots with bots | +| [bot_difficulty_radiant] | BotDifficulty | module:Dota2.BotDifficulty.PASSIVE | The bot difficulty for radiant bots, if fill_with_bots is true. | +| [bot_difficulty_dire] | BotDifficulty | module:Dota2.BotDifficulty.PASSIVE | The bot difficulty for dire bots, if fill_with_bots is true. | +| [bot_radiant] | number | | Presumably the ID of the custom AI to be applied to radiant bots. | +| [bot_dire] | number | | Presumably the ID of the custom AI to be applied to dire bots. | +| [allow_spectating] | boolean | true | Whether or not to allow spectating | +| [series_type] | SeriesType | NONE | Whether or not the game is part of a series (Bo3, Bo5). | +| [radiant_series_wins] | number | 0 | # of games won so far, e.g. for a Bo3 or Bo5. | +| [dire_series_wins] | number | 0 | # of games won so far, e.g. for a Bo3 or Bo5. | +| [previous_match_override] | number | | In a series, the match ID of the previous game. If not supplied, the GC will try to find it automatically based on the teams and the players. | +| [allchat] | boolean | false | Whether or not it's allowed to all-chat | +| [dota_tv_delay] | LobbyDotaTVDelay | LobbyDotaTV_120 | How much time the game should be delayed for DotaTV. | +| [leagueid] | number | | The league this lobby is being created for. The bot should be a league admin for this to work. | +| [custom_game_mode] | string | | Name of the custom game | +| [custom_map_name] | string | | Which map the custom game should be played on | +| [custom_difficulty] | number | | Difficulty of the custom game | +| [custom_game_id] | [Long](#external_Long) | | 64bit ID of the custom game mode | +| [pause_setting] | LobbyDotaPauseSetting | 0 | Pause setting: 0 - unlimited, 1 - limited, 2 - disabled | @@ -549,6 +553,22 @@ Requires the GC to be [ready](#module_Dota2.Dota2Client+event_ready). | account_id | number | Dota 2 account ID of the player whose profile card the bot should fetch | | [callback] | [requestCallback](#module_Dota2..requestCallback) | Called with `err, CMsgDOTAProfileCard` | + + +#### dota2Client.requestProfile(account_id, [callback]) +Sends a message to the Game Coordinator requesting `account_id`'s profile page. +This method is heavily rate limited. When abused, the GC just stops responding. +Even the regular client runs into this limit when you check too many profiles. +Provide a callback or listen for [profileData](#module_Dota2.Dota2Client+event_profileData) event for Game Coordinator's response. +Requires the GC to be [ready](#module_Dota2.Dota2Client+event_ready). + +**Kind**: instance method of [Dota2Client](#module_Dota2.Dota2Client) + +| Param | Type | Description | +| --- | --- | --- | +| account_id | number | Dota 2 account ID of the player whose profile page the bot should fetch | +| [callback] | [requestCallback](#module_Dota2..requestCallback) | Called with `err, CMsgDOTAProfileResponse` | + #### dota2Client.requestHallOfFame(week, [callback]) @@ -640,7 +660,6 @@ All requests are staggered in 200ms intervals and time out after 2s. Requires the GC to be [ready](#module_Dota2.Dota2Client+event_ready). **Kind**: instance method of [Dota2Client](#module_Dota2.Dota2Client) -**Async**: Returns a list of promises that resolve to [FantasyPlayer](#module_Dota2.Dota2Client+requestPlayerCardsByPlayer.FantasyPlayer) objects ##### requestPlayerCardsByPlayer.FantasyPlayer : Object @@ -1429,6 +1448,17 @@ Emitted in response to a [request for a player's profile card](#module_Dota2.Dot | account_id | number | Dota2 account ID of the player whose profile card was fetched. | | profileCardResponse | CMsgDOTAProfileCard | The raw response data containing the user's profile card. | + + +#### "profileData" (profileResponse) +Emitted in response to a [request for a player's profile page](#module_Dota2.Dota2Client+requestProfile) + +**Kind**: event emitted by [Dota2Client](#module_Dota2.Dota2Client) + +| Param | Type | Description | +| --- | --- | --- | +| profileResponse | CMsgProfileResponse | The raw response data containing the user's profile page. | + #### "hallOfFameData" (week, featured_players, featured_farmer, hallOfFameResponse) diff --git a/examples/example2.js b/examples/example2.js index a7dd24db..c689bd8f 100644 --- a/examples/example2.js +++ b/examples/example2.js @@ -44,16 +44,15 @@ var onSteamLogOn = function onSteamLogOn(logonResp) { // COMMUNITY var accId = 103637655; - // var playerInfo = 0; + var playerInfo = 1; var playerInfo2 = 0; // var playerInfo3 = 0; - // if(playerInfo == 1){ // not working - maybe disabled by Valve - // Dota2.requestProfile(accId, true); - // Dota2.on("profileData", function (accId, data) { - // util.log(JSON.stringify(data)); - // }); - // } + if(playerInfo == 1) { + Dota2.requestProfile(accId, function (err, data) { + util.log(JSON.stringify(data)); + }); + } if(playerInfo2 == 1){ Dota2.requestProfileCard(accId, function (accId, data) { diff --git a/handlers/chat.js b/handlers/chat.js index 97dd69b0..a922f91f 100644 --- a/handlers/chat.js +++ b/handlers/chat.js @@ -311,11 +311,11 @@ var onUserLeftChannel = function onOtherLeftChannel(message) { this.emit("chatLeave", channel.channel_name, userWhoLeft.steam_id, userWhoLeft); this.emit("chatLeft", channel.channel_name); if (this.debug) - util.log("Left channel " + channel.channel_name); + this.Logger.debug("Left channel " + channel.channel_name); } else { this._leaveChatChannelById(userWhoLeft.channel_id); if (this.debug) - util.log("I left unknown channel " + userWhoLeft.channel_id); + this.Logger.debug("I left unknown channel " + userWhoLeft.channel_id); } } else { if (channel) { @@ -323,11 +323,11 @@ var onUserLeftChannel = function onOtherLeftChannel(message) { // Delete member from cached chatChannel channel.members = channel.members.filter(item => item.steam_id.notEquals(userWhoLeft.steam_id)); if (this.debug) - util.log(userWhoLeft.steam_id + " left channel " + channel.channel_name); + this.Logger.debug(userWhoLeft.steam_id + " left channel " + channel.channel_name); } else { this._leaveChatChannelById(userWhoLeft.channel_id); if (this.debug) - util.log(userWhoLeft.steam_id + " left unknown channel " + userWhoLeft.channel_id); + this.Logger.debug(userWhoLeft.steam_id + " left unknown channel " + userWhoLeft.channel_id); } } }; diff --git a/handlers/community.js b/handlers/community.js index 34a790f3..fdcdbd29 100644 --- a/handlers/community.js +++ b/handlers/community.js @@ -68,6 +68,32 @@ Dota2.Dota2Client.prototype.requestProfileCard = function(account_id, callback) onProfileCardResponse, callback); }; +/** + * Sends a message to the Game Coordinator requesting `account_id`'s profile page. + * This method is heavily rate limited. When abused, the GC just stops responding. + * Even the regular client runs into this limit when you check too many profiles. + * Provide a callback or listen for {@link module:Dota2.Dota2Client#event:profileData|profileData} event for Game Coordinator's response. + * Requires the GC to be {@link module:Dota2.Dota2Client#event:ready|ready}. + * @alias module:Dota2.Dota2Client#requestProfile + * @param {number} account_id - Dota 2 account ID of the player whose profile page the bot should fetch + * @param {module:Dota2~requestCallback} [callback] - Called with `err, CMsgDOTAProfileResponse` + */ +Dota2.Dota2Client.prototype.requestProfile = function(account_id, callback) { + callback = callback || null; + var _self = this; + + /* Sends a message to the Game Coordinator requesting `accountId`'s profile. Listen for `profileData` event for Game Coordinator's response. */ + this.Logger.debug("Sending profile request"); + + var payload = { + "account_id": account_id + }; + this.sendToGC( Dota2.schema.lookupEnum("EDOTAGCMsg").values.k_EMsgProfileRequest, + Dota2.schema.lookupType("CMsgProfileRequest").encode(payload).finish(), + onProfileResponse, callback); +}; + + /** * Sends a message to the Game Coordinator requesting the Hall of Fame data for `week`. * Provide a callback or listen for the {@link module:Dota2.Dota2Client#event:hallOfFameData|hallOfFameData} event for the Game Coordinator's response. @@ -180,6 +206,11 @@ Dota2.Dota2Client.prototype.requestPlayerStats = function(account_id, callback) * @param {CMsgDOTAProfileCard} profileCardResponse - The raw response data containing the user's profile card. */ /** + * Emitted in response to a {@link module:Dota2.Dota2Client#requestProfile|request for a player's profile page} + * @event module:Dota2.Dota2Client#profileData + * @param {CMsgProfileResponse} profileResponse - The raw response data containing the user's profile page. + */ + /** * Emitted in response to a {@link module:Dota2.Dota2Client#requestHallOfFame|request for a player's profile card} * @event module:Dota2.Dota2Client#hallOfFameData * @param {number} week - Weeks since unix epoch for which the hall of fame data was fetched @@ -284,6 +315,16 @@ var onProfileCardResponse = function onProfileCardResponse(message, callback) { }; handlers[Dota2.schema.lookupEnum("EDOTAGCMsg").values.k_EMsgClientToGCGetProfileCardResponse] = onProfileCardResponse; +var onProfileResponse = function onProfileResponse(message, callback) { + callback = callback || null; + var profileResponse = Dota2.schema.lookupType("CMsgProfileResponse").decode(message); + + this.Logger.debug("Received profile page"); + this.emit("profileData", profileResponse); + if (callback) callback(null, profileResponse); +}; +handlers[Dota2.schema.lookupEnum("EDOTAGCMsg").values.k_EMsgProfileResponse] = onProfileResponse; + var onHallOfFameResponse = function onHallOfFameResponse(message, callback) { callback = callback || null; var hallOfFameResponse = Dota2.schema.lookupType("CMsgDOTAHallOfFameResponse").decode(message); diff --git a/handlers/fantasy.js b/handlers/fantasy.js index aa2b9b98..1b45381a 100644 --- a/handlers/fantasy.js +++ b/handlers/fantasy.js @@ -45,7 +45,7 @@ Dota2.Dota2Client.prototype.requestPlayerCardsByPlayer = function() { // Sort cards per player var players = playercards.reduce((players, card)=>{ var id_attr = card.attribute.filter(attr => attr.def_index == 424)[0]; - var account_id = Buffer.from(id_attr.value_bytes, 'base64').readUInt32LE(); + var account_id = Buffer.from(id_attr.value_bytes, 'base64').readUInt32LE(0); // Add player if we haven't seen him yet if (!players[account_id]) players[account_id] = {'account_id': account_id, 'cards': []}; // Add this card diff --git a/handlers/helper.js b/handlers/helper.js index f80f6abb..bc0120a3 100644 --- a/handlers/helper.js +++ b/handlers/helper.js @@ -160,13 +160,13 @@ Dota2._parseOptions = function(options, possibleOptions) { type = possibleOptions[option]; if (type == null) { if (this.debug) { - util.log("Option " + option + " is not possible."); + this.Logger.debug("Option " + option + " is not possible."); } continue; } if (typeof value !== type) { if (this.debug) { - util.log("Option " + option + " must be a " + type + "."); + this.Logger.debug("Option " + option + " must be a " + type + "."); } continue; } diff --git a/handlers/leagues.js b/handlers/leagues.js index a5f60eb8..0395a353 100644 --- a/handlers/leagues.js +++ b/handlers/leagues.js @@ -73,7 +73,7 @@ var onLiveLeagueGameUpdate = function onLiveLeagueGameUpdate(message, callback) callback = callback || null; var response = Dota2.schema.lookupType("CMsgDOTALiveLeagueGameUpdate").decode(message); - if (this.debugMore) util.log("Live league games: " + response.live_league_games + "."); + if (this.debugMore) this.Logger.debug("Live league games: " + response.live_league_games + "."); this.emit("liveLeagueGamesUpdate", response.live_league_games); if (callback) callback(null, response.live_league_games); }; diff --git a/handlers/lobbies.js b/handlers/lobbies.js index 29c95455..a1c3e4c6 100644 --- a/handlers/lobbies.js +++ b/handlers/lobbies.js @@ -677,8 +677,8 @@ var onInviteCreated = function onInviteCreated(message) { var inviteCreated = Dota2.schema.lookupType("CMsgInvitationCreated").decode(message); var is_online = !inviteCreated.user_offline; - if (this.debug && is_online) util.log("Created invitation to online user " + inviteCreated.steam_id); - if (this.debug && !is_online) util.log("Created invitation to offline user " + inviteCreated.steam_id); + if (this.debug && is_online) this.Logger.debug("Created invitation to online user " + inviteCreated.steam_id); + if (this.debug && !is_online) this.Logger.debug("Created invitation to offline user " + inviteCreated.steam_id); this.emit("inviteCreated", inviteCreated.steam_id, inviteCreated.group_id, is_online); } handlers[Dota2.schema.lookupEnum("EGCBaseMsg").values.k_EMsgGCInvitationCreated] = onInviteCreated; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..e6af215c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,801 @@ +{ + "name": "dota2", + "version": "6.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/inquire": "1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@types/long": { + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", + "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" + }, + "@types/node": { + "version": "8.10.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.13.tgz", + "integrity": "sha512-AorNXRHoPVxIUIVmr6uJXRnvlPOSNKAJF5jZ1JOj1/IxYMocZzvQooNeLU02Db6kpy1IVIySTOvuIxmUF1HrOg==" + }, + "adm-zip": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", + "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=" + }, + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "requires": { + "long": "3.2.0" + }, + "dependencies": { + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + } + } + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + }, + "colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "0.10.38" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deferred": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/deferred/-/deferred-0.7.9.tgz", + "integrity": "sha1-+2KuCqDboFypH+0gHC9QE2ejYKI=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "event-emitter": "0.3.5", + "next-tick": "1.0.0", + "timers-ext": "0.1.2" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "es5-ext": { + "version": "0.10.38", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", + "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-symbol": "3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38" + } + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.1.tgz", + "integrity": "sha512-kKKs/H1KrMMQIEsWNxGmb4/BGsmj0dkeyotEvbrAuQ01FcWRLssUNXCEUZk6SZtyJBi6EE7SL0zDDtItw1rGhw==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "moment": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.10.13", + "long": "4.0.0" + } + }, + "should": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.1.tgz", + "integrity": "sha512-l+/NwEMO+DcstsHEwPHRHzC9j4UOE3VQwJGcMWSsD/vqpqHbnQ+1iSHy64Ihmmjx1uiRPD9pFadTSc3MJtXAgw==", + "dev": true, + "requires": { + "should-equal": "2.0.0", + "should-format": "3.0.3", + "should-type": "1.4.0", + "should-type-adaptors": "1.1.0", + "should-util": "1.0.0" + } + }, + "should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "requires": { + "should-type": "1.4.0" + } + }, + "should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", + "dev": true, + "requires": { + "should-type": "1.4.0", + "should-type-adaptors": "1.1.0" + } + }, + "should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", + "dev": true + }, + "should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "requires": { + "should-type": "1.4.0", + "should-util": "1.0.0" + } + }, + "should-util": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", + "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "steam": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/steam/-/steam-1.4.0.tgz", + "integrity": "sha1-vAPCvzZd298E2yd1NBPS3bg1sbE=", + "requires": { + "adm-zip": "0.4.7", + "buffer-crc32": "0.2.13", + "bytebuffer": "5.0.1", + "steam-crypto": "0.0.1", + "steam-resources": "git+https://github.com/seishun/node-steam-resources.git#1403939a12ba467a4b82c8ccbc279bbcdad43588" + }, + "dependencies": { + "steam-resources": { + "version": "git+https://github.com/seishun/node-steam-resources.git#1403939a12ba467a4b82c8ccbc279bbcdad43588", + "requires": { + "bytebuffer": "5.0.0", + "protobufjs": "4.1.2" + }, + "dependencies": { + "bytebuffer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.0.tgz", + "integrity": "sha1-TpLJKvedXsPWpllVQSfj+NA9IOc=", + "requires": { + "long": "3.0.1" + }, + "dependencies": { + "long": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/long/-/long-3.0.1.tgz", + "integrity": "sha1-uZKB/nmPpk6jt6dMj+ExUbMxCwU=" + } + } + }, + "protobufjs": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-4.1.2.tgz", + "integrity": "sha1-Cmsb0nz39YcLI9cxPdvnCBWHb8Q=", + "requires": { + "ascli": "1.0.0", + "bytebuffer": "4.1.0", + "glob": "5.0.15", + "yargs": "3.29.0" + }, + "dependencies": { + "ascli": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.0.tgz", + "integrity": "sha1-A6gEDoYzgkQwBQlwhgKmWRa1OjE=", + "requires": { + "colour": "0.7.1", + "optjs": "3.2.2" + } + }, + "bytebuffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-4.1.0.tgz", + "integrity": "sha1-TFgmngUqseSx9/82T9+zzogpBqo=", + "requires": { + "bufferview": "1.0.1", + "long": "2.4.0" + }, + "dependencies": { + "bufferview": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bufferview/-/bufferview-1.0.1.tgz", + "integrity": "sha1-ev10pF+Tf6QiodM4wIu/3HbNcl0=" + }, + "long": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", + "integrity": "sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8=" + } + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "1.0.4", + "inherits": "2.0.3", + "minimatch": "3.0.0", + "once": "1.3.2", + "path-is-absolute": "1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "requires": { + "once": "1.3.2", + "wrappy": "1.0.1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" + } + } + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "requires": { + "brace-expansion": "1.1.1" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "integrity": "sha1-2l+3iu9MRMnkrPUlBk+zII66sEU=", + "requires": { + "balanced-match": "0.2.1", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", + "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "once": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "integrity": "sha1-2P7sqTsDnsHc3ud0HJK9rF4oCBs=", + "requires": { + "wrappy": "1.0.1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" + } + } + }, + "yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", + "requires": { + "camelcase": "1.2.1", + "cliui": "3.0.3", + "decamelize": "1.1.1", + "os-locale": "1.4.0", + "window-size": "0.1.2", + "y18n": "3.2.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.0.3.tgz", + "integrity": "sha1-R23l40QskhsWW8+FVq7pww5+FE4=", + "requires": { + "string-width": "1.0.1", + "strip-ansi": "3.0.0", + "wrap-ansi": "1.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", + "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=", + "requires": { + "code-point-at": "1.0.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.0" + }, + "dependencies": { + "code-point-at": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", + "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", + "requires": { + "number-is-nan": "1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "requires": { + "ansi-regex": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "wrap-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-1.0.0.tgz", + "integrity": "sha1-9XO7nuI89DiR8zYvXzWaHfo4/DQ=", + "requires": { + "string-width": "1.0.1" + } + } + } + }, + "decamelize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.1.1.tgz", + "integrity": "sha1-iHFHmmwEh/VlPUipkvHQOBym8DE=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "1.0.0" + }, + "dependencies": { + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + }, + "dependencies": { + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + } + } + } + } + }, + "window-size": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.2.tgz", + "integrity": "sha1-ENU/D47oZ+OoUfC+DjEAhyMp2zo=" + }, + "y18n": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.0.tgz", + "integrity": "sha1-O+xkyTtzDZJKYUjHZXV5MkM+NMg=" + } + } + } + } + } + } + } + } + }, + "steam-crypto": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/steam-crypto/-/steam-crypto-0.0.1.tgz", + "integrity": "sha1-BHexgqKx/dlBiT28wi4Ok7FKu38=" + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "timers-ext": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.2.tgz", + "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=", + "requires": { + "es5-ext": "0.10.38", + "next-tick": "1.0.0" + } + }, + "winston": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.2.tgz", + "integrity": "sha512-4S/Ad4ZfSNl8OccCLxnJmNISWcm2joa6Q0YGDxlxMzH0fgSwWsjMt+SmlNwCqdpaPg3ev1HKkMBsIiXeSUwpbA==", + "requires": { + "async": "1.0.0", + "colors": "1.0.3", + "cycle": "1.0.3", + "eyes": "0.1.8", + "isstream": "0.1.2", + "stack-trace": "0.0.10" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index d634baf0..47b8a866 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,22 @@ { "name": "dota2", - "version": "6.0.1", + "version": "6.1.0", "dependencies": { "deferred": "^0.7.9", - "long": "^3.2.0", + "long": "^4.0.0", "merge": "^1.2.0", - "moment": "^2.19.4", - "protobufjs": "^6.8.3", + "moment": "^2.22.1", + "protobufjs": "^6.8.6", "steam": "^1.4.0", - "winston": "^2.3.1" + "winston": "^2.4.2" }, "devDependencies": { - "mocha": "^4.0.0", - "should": "^13.1.3" + "mocha": "^5.1.1", + "should": "^13.2.1" }, "scripts": { "update": "bash update_proto.sh", - "test": "mocha" + "test": "mocha --exit" }, "readmeFilename": "README.md", "description": "A node-steam plugin for Dota 2.", diff --git a/proto/base_gcmessages.proto b/proto/base_gcmessages.proto index aded4cf6..423212e8 100644 --- a/proto/base_gcmessages.proto +++ b/proto/base_gcmessages.proto @@ -21,6 +21,8 @@ enum EGCBaseMsg { k_EMsgGCLobbyInviteResponse = 4513; k_EMsgGCToClientPollFileRequest = 4514; k_EMsgGCToClientPollFileResponse = 4515; + k_EMsgGCToGCPerformManualOp = 4516; + k_EMsgGCToGCPerformManualOpCompleted = 4517; } enum EGCBaseProtoObjectTypes { @@ -224,7 +226,6 @@ message CSOEconItem { optional uint32 origin = 9 [default = 0]; repeated .CSOEconItemAttribute attribute = 12; optional .CSOEconItem interior_item = 13; - optional bool in_use = 14 [default = false]; optional uint32 style = 15 [default = 0]; optional uint64 original_id = 16 [default = 0]; repeated .CSOEconItemEquipped equipped_state = 18; @@ -241,23 +242,6 @@ message CSOEconClaimCode { optional string code = 4; } -message CMsgStoreGetUserData { - optional fixed32 price_sheet_version = 1; -} - -message CMsgStoreGetUserDataResponse { - optional int32 result = 1; - optional int32 currency = 2; - optional string country = 3; - optional fixed32 price_sheet_version = 4; - optional uint64 experiment_data = 5 [default = 0]; - optional int32 featured_item_idx = 6; - optional bool show_hat_descriptions = 7 [default = true]; - optional bytes price_sheet = 8; - optional int32 default_item_sort = 9 [default = 0]; - repeated uint32 popular_items = 10; -} - message CMsgUpdateItemSchema { optional bytes items_game = 1; optional fixed32 item_schema_version = 2; @@ -390,10 +374,6 @@ message CMsgGCBannedWordListResponse { repeated .CMsgGCBannedWord word_list = 2; } -message CMsgGCToGCBannedWordListBroadcast { - optional .CMsgGCBannedWordListResponse broadcast = 1; -} - message CMsgGCToGCBannedWordListUpdated { optional uint32 group_id = 1; } @@ -558,3 +538,13 @@ message CMsgGCToClientPollFileResponse { optional uint32 file_size = 2; } +message CMsgGCToGCPerformManualOp { + optional uint64 op_id = 1; + optional uint32 group_code = 2; +} + +message CMsgGCToGCPerformManualOpCompleted { + optional bool success = 1; + optional uint32 source_gc = 2; +} + diff --git a/proto/dota_gcmessages_client.proto b/proto/dota_gcmessages_client.proto index bd4e52c8..997e76b9 100644 --- a/proto/dota_gcmessages_client.proto +++ b/proto/dota_gcmessages_client.proto @@ -3,6 +3,7 @@ import "dota_shared_enums.proto"; import "dota_gcmessages_common.proto"; import "gcsdk_gcmessages.proto"; import "dota_gcmessages_common_match_management.proto"; +import "base_gcmessages.proto"; option optimize_for = SPEED; option cc_generic_services = false; @@ -85,11 +86,18 @@ enum EDOTATriviaAnswerResult { k_EDOTATriviaAnswerResult_TriviaDisabled = 5; } -message CMsgClientSuspended { - optional uint32 time_end = 1; +enum EPurchaseHeroRelicResult { + k_EPurchaseHeroRelicResult_Success = 0; + k_EPurchaseHeroRelicResult_FailedToSend = 1; + k_EPurchaseHeroRelicResult_NotEnoughPoints = 2; + k_EPurchaseHeroRelicResult_InternalServerError = 3; + k_EPurchaseHeroRelicResult_PurchaseNotAllowed = 4; + k_EPurchaseHeroRelicResult_InvalidRelic = 5; + k_EPurchaseHeroRelicResult_AlreadyOwned = 6; } -message CMsgRequestInternationalTicket { +message CMsgClientSuspended { + optional uint32 time_end = 1; } message CMsgBalancedShuffleLobby { @@ -208,6 +216,7 @@ message CMsgDOTAPopup { GENERIC_INFO = 69; GENERIC_ERROR = 70; RANK_TIER_UPDATED = 75; + CUSTOM_GAME_COOLDOWN_RESTRICTED = 76; } optional .CMsgDOTAPopup.PopupID id = 1 [default = NONE]; @@ -307,82 +316,21 @@ message CMsgGCToServerMatchDetailsResponse { repeated .CMsgDOTAMatch matches = 1; } -message CMsgDOTAProfileRequest { - optional uint32 account_id = 1; - optional bool request_name = 2; -} - -message CMsgDOTAProfileResponse { - message PlayedHero { - optional uint32 hero_id = 1; - optional uint32 wins = 2; - } - - message ShowcaseHero { - optional uint32 hero_id = 1; - repeated bytes object_data = 2; - } - - message LeaguePass { - optional uint32 league_id = 1; - optional uint32 item_def = 2; - } - - message EventTicket { - optional uint32 event_id = 1; - } - - message FeaturedItem { - optional uint64 item_id = 1; - optional bytes object_data = 2; - optional uint32 slot_index = 3; - } - - optional uint32 result = 1; - optional .CSODOTAGameAccountClient game_account_client = 2; - repeated .CMsgDOTAMatch latest_matches = 3; - repeated .CMsgDOTAProfileResponse.PlayedHero heroes = 4; - optional string player_name = 5; - optional string team_name = 6; - optional string team_tag = 7; - optional uint64 team_logo = 8; - optional .CMsgDOTAProfileResponse.ShowcaseHero showcase_hero = 9; - repeated .CMsgDOTAProfileResponse.LeaguePass league_passes = 10; - repeated .CMsgDOTAProfileResponse.EventTicket event_tickets = 11; - optional uint32 team_id = 12; - optional bool has_passport = 13; - repeated .CMsgDOTAProfileResponse.FeaturedItem featured_items = 14; - optional uint32 abandon_percent = 15; -} - message CMsgDOTAProfileTickets { message LeaguePass { optional uint32 league_id = 1; optional uint32 item_def = 2; } - message EventTicket { - optional uint32 event_id = 1; - } - optional uint32 result = 1; optional uint32 account_id = 2; repeated .CMsgDOTAProfileTickets.LeaguePass league_passes = 3; - repeated .CMsgDOTAProfileTickets.EventTicket event_tickets = 4; } message CMsgClientToGCGetProfileTickets { optional uint32 account_id = 1; } -message CMsgGCSteamProfileRequest { - optional uint32 account_id = 1; -} - -message CMsgGCSteamProfileRequestResponse { - optional uint32 result = 1; -} - message CMsgDOTAClearNotifySuccessfulReport { } @@ -419,6 +367,7 @@ message CMsgDOTAWelcome { repeated .CMsgDOTAWelcome.CExtraMsg extra_messages = 26; optional uint64 minimum_recent_item_id = 27; optional .EEvent active_event = 28 [default = EVENT_ID_NONE]; + optional uint32 additional_user_message = 29; } message CSODOTAGameHeroFavorites { @@ -434,14 +383,6 @@ message CMsgDOTAHeroFavoritesRemove { optional uint32 hero_id = 1; } -message CMsgSetShowcaseHero { - optional uint32 showcase_hero_id = 1; -} - -message CMsgSetFeaturedItems { - repeated uint64 featured_item_id = 1; -} - message CMsgDOTAFeaturedItems { optional uint32 account_id = 1; repeated uint64 featured_item_id = 2; @@ -724,19 +665,31 @@ message CMsgGCGetHeroStandingsResponse { optional uint32 losses_with_ally = 17; optional uint32 wins_against_enemy = 18; optional uint32 losses_against_enemy = 19; + optional uint32 networth_peak = 20; + optional uint32 lasthit_peak = 21; + optional uint32 deny_peak = 22; + optional uint32 damage_peak = 23; + optional uint32 longest_game_peak = 24; + optional uint32 healing_peak = 25; + optional float avg_lasthits = 26; + optional float avg_denies = 27; } repeated .CMsgGCGetHeroStandingsResponse.Hero standings = 1; } message CMsgGCGetHeroTimedStats { - optional uint32 account_id = 1; optional uint32 hero_id = 2; } message CMsgGCGetHeroTimedStatsResponse { + message RankChunkedStats { + optional uint32 rank_chunk = 1; + repeated .CMatchPlayerTimedStats timed_stats = 2; + } + optional uint32 hero_id = 1; - repeated .CMatchPlayerTimedStats timed_stats = 2; + repeated .CMsgGCGetHeroTimedStatsResponse.RankChunkedStats rank_chunked_stats = 2; } message CMsgGCItemEditorReservationsRequest { @@ -855,6 +808,7 @@ message CMsgDOTAClaimEventActionResponse { SDOLoadFailure = 9; EventNotOwned = 10; Timeout = 11; + RequiresPlusSubscription = 12; } optional .CMsgDOTAClaimEventActionResponse.ResultCode result = 1 [default = Success]; @@ -955,7 +909,7 @@ message CMsgDOTAGetPlayerMatchHistoryResponse { optional bool abandon = 10; optional uint32 duration = 11; optional uint32 engine = 12; - optional bool active_prime_subscription = 13; + optional bool active_plus_subscription = 13; optional bool seasonal_rank = 14; optional uint32 tourney_id = 15; optional uint32 tourney_round = 16; @@ -1177,14 +1131,6 @@ message CMsgGCToClientHeroStatueCreateResult { optional uint64 resulting_item = 1; } -message CMsgClientToGCRecordCompendiumStats { - optional uint32 league_id = 1; - optional uint32 view_duration_s = 2; - optional uint32 videos_viewed = 3; - optional uint32 page_turns = 4; - optional uint32 links_followed = 5; -} - message CMsgGCToClientEventStatusChanged { optional .EEvent active_event = 2 [default = EVENT_ID_NONE]; } @@ -1213,6 +1159,10 @@ message CMsgGCToClientPlayerStatsResponse { optional float support_score = 17; optional float push_score = 18; optional float versatility_score = 19; + optional float mean_networth = 20; + optional float mean_damage = 21; + optional float mean_heals = 22; + optional uint32 rapiers_purchased = 23; } message CMsgClientToGCCustomGamePlayerCountRequest { @@ -1420,7 +1370,7 @@ message CMsgClientToGCGetQuestProgressResponse { optional uint32 time_completed = 2; optional uint32 attempts = 3; optional uint32 hero_id = 4; - optional uint32 challenge_type = 5; + optional uint32 template_id = 5; optional uint32 quest_rank = 6; } @@ -1480,6 +1430,8 @@ message CMsgGCToClientWageringResponse { optional uint32 coins_max = 7; optional uint32 rank_wagers_remaining = 8; optional uint32 rank_wagers_max = 9; + optional uint32 prediction_tokens_remaining = 10; + optional uint32 prediction_tokens_max = 11; } message CMsgGCToClientWageringUpdate { @@ -1640,6 +1592,7 @@ message CMsgArcanaVotes { optional bool is_current_round_calibrating = 5; optional uint32 closest_active_match_id = 6; optional uint32 event_id = 7; + optional uint32 voting_start_time = 8; } message CMsgClientToGCRequestArcanaVotesRemaining { @@ -1658,95 +1611,21 @@ message CMsgClientToGCRequestArcanaVotesRemainingResponse { repeated .CMsgClientToGCRequestArcanaVotesRemainingResponse.MatchVote matches_previously_voted_for = 4; } -message CMsgClientToGCRequestEventPointLog { +message CMsgClientToGCRequestEventPointLogV2 { optional uint32 event_id = 1; } -message CMsgClientToGCRequestEventPointLogResponse { - message QuestChallengeEvent { - optional uint32 quest_id = 1; - optional uint32 challenge_id = 2; - optional uint32 rank = 3; - } - - message WagerWonEvent { - optional uint64 match_id = 1; - } - - message TipGivenEvent { - optional uint32 recipient_account_id = 1; - optional string recipient_name = 2; - } - - message TipReceivedEvent { - optional uint32 giver_account_id = 1; - optional string giver_name = 2; - } - - message RecycledItemEvent { - optional uint32 recipe_item_def_index = 1; - } - - message ActionRewardEvent { - optional uint32 action_id = 1; - optional uint32 action_score = 2; - } - - message MysteryItemReceivedEvent { - optional bool community_goal_item = 1; - } - - message CorrectPredictionEvent { - optional uint32 prediction_id = 1; - } - - message InGamePredictionCorrectEvent { - optional uint64 match_id = 1; - } - - message WeekendTourneyPayoutEvent { - optional uint64 team_gid = 1; - } - - message FantasyRewardEvent { - optional uint32 percentile = 1; - } - - message BracketRewardEvent { - optional uint32 correct_answers = 1; - } - - message WeeklyGameEvent { - optional uint32 points_won = 1; - } - - message ExploitCorrectionEvent { - optional uint32 points_corrected = 1; - } - - message EventPointTransaction { - optional uint32 time = 1; - optional int32 event_points = 2; - optional bool compendium_activated_event = 3; - optional bool point_item_used_event = 4; - optional .CMsgClientToGCRequestEventPointLogResponse.WagerWonEvent wager_won_event = 5; - optional .CMsgClientToGCRequestEventPointLogResponse.MysteryItemReceivedEvent mystery_item_received_event = 6; - optional .CMsgClientToGCRequestEventPointLogResponse.QuestChallengeEvent quest_challenge_event = 7; - optional .CMsgClientToGCRequestEventPointLogResponse.TipGivenEvent tip_given_event = 8; - optional .CMsgClientToGCRequestEventPointLogResponse.TipReceivedEvent tip_received_event = 9; - optional .CMsgClientToGCRequestEventPointLogResponse.RecycledItemEvent recycled_item_event = 10; - optional .CMsgClientToGCRequestEventPointLogResponse.ActionRewardEvent action_reward_event = 11; - optional .CMsgClientToGCRequestEventPointLogResponse.InGamePredictionCorrectEvent in_game_prediction_event = 12; - optional .CMsgClientToGCRequestEventPointLogResponse.CorrectPredictionEvent prediction_event = 13; - optional .CMsgClientToGCRequestEventPointLogResponse.FantasyRewardEvent fantasy_reward_event = 15; - optional .CMsgClientToGCRequestEventPointLogResponse.BracketRewardEvent bracket_reward_event = 16; - optional .CMsgClientToGCRequestEventPointLogResponse.WeeklyGameEvent weekly_game_event = 19; - optional .CMsgClientToGCRequestEventPointLogResponse.ExploitCorrectionEvent exploit_correction_event = 20; +message CMsgClientToGCRequestEventPointLogResponseV2 { + message LogEntry { + optional uint32 timestamp = 1; + optional uint32 audit_action = 2; + optional int32 event_points = 3; + optional uint64 audit_data = 4; } optional bool result = 1; - repeated .CMsgClientToGCRequestEventPointLogResponse.EventPointTransaction transactions = 2; - optional uint32 event_id = 3; + optional .EEvent event_id = 2 [default = EVENT_ID_NONE]; + repeated .CMsgClientToGCRequestEventPointLogResponseV2.LogEntry log_entries = 3; } message CMsgClientToGCPublishUserStat { @@ -1793,7 +1672,7 @@ message CMsgGCToClientQuestProgressUpdated { optional uint32 time_completed = 2; optional uint32 attempts = 3; optional uint32 hero_id = 4; - optional uint32 challenge_type = 5; + optional uint32 template_id = 5; optional uint32 quest_rank = 6; optional uint32 max_quest_rank = 7; } @@ -1802,10 +1681,6 @@ message CMsgGCToClientQuestProgressUpdated { repeated .CMsgGCToClientQuestProgressUpdated.Challenge completed_challenges = 2; } -message CMsgGCToClientUpdateClientClippy { - repeated uint32 hero_ids = 1; -} - message CMsgDOTARedeemItem { optional uint64 currency_id = 1; optional uint32 purchase_def = 2; @@ -2133,6 +2008,66 @@ message CMsgGCToClientBattlePassRollup_Winter2017 { optional .CMsgGCToClientBattlePassRollup_Winter2017.FantasyChallenge fantasy_challenge = 9; } +message CMsgGCToClientBattlePassRollup_TI7 { + message Questlines { + optional string name = 1; + optional uint32 onestar = 2; + optional uint32 twostar = 3; + optional uint32 threestar = 4; + optional uint32 total = 5; + } + + message Wagering { + optional uint32 total_wagered = 1; + optional uint32 total_won = 2; + optional uint32 average_won = 3; + optional uint32 success_rate = 4; + optional uint32 total_tips = 5; + } + + message Achievements { + optional uint32 completed = 1; + optional uint32 total = 2; + optional uint32 points = 3; + } + + message BattleCup { + optional uint32 wins = 1; + optional uint32 score = 2; + } + + message Predictions { + optional uint32 correct = 1; + optional uint32 total = 2; + optional uint32 points = 3; + } + + message Bracket { + optional uint32 correct = 1; + optional uint32 points = 2; + } + + message PlayerCard { + optional uint32 account_id = 1; + optional uint32 quality = 2; + } + + message FantasyChallenge { + optional float total_score = 1; + optional float percentile = 2; + } + + optional uint32 battle_pass_level = 1; + repeated .CMsgGCToClientBattlePassRollup_TI7.Questlines questlines = 2; + optional .CMsgGCToClientBattlePassRollup_TI7.Wagering wagering = 3; + optional .CMsgGCToClientBattlePassRollup_TI7.Achievements achievements = 4; + optional .CMsgGCToClientBattlePassRollup_TI7.BattleCup battle_cup = 5; + optional .CMsgGCToClientBattlePassRollup_TI7.Predictions predictions = 6; + optional .CMsgGCToClientBattlePassRollup_TI7.Bracket bracket = 7; + repeated .CMsgGCToClientBattlePassRollup_TI7.PlayerCard player_cards = 8; + optional .CMsgGCToClientBattlePassRollup_TI7.FantasyChallenge fantasy_challenge = 9; +} + message CMsgGCToClientBattlePassRollupRequest { optional uint32 event_id = 1; optional uint32 account_id = 2; @@ -2142,6 +2077,7 @@ message CMsgGCToClientBattlePassRollupResponse { optional .CMsgGCToClientBattlePassRollup_International2016 event_ti6 = 1; optional .CMsgGCToClientBattlePassRollup_Fall2016 event_fall2016 = 2; optional .CMsgGCToClientBattlePassRollup_Winter2017 event_winter2017 = 3; + optional .CMsgGCToClientBattlePassRollup_TI7 event_ti7 = 4; } message CMsgGCToClientBattlePassRollupListRequest { @@ -2149,7 +2085,12 @@ message CMsgGCToClientBattlePassRollupListRequest { } message CMsgGCToClientBattlePassRollupListResponse { - repeated uint32 event_id = 1; + message EventInfo { + optional uint32 event_id = 1; + optional uint32 level = 2; + } + + repeated .CMsgGCToClientBattlePassRollupListResponse.EventInfo event_info = 1; } message CMsgClientToGCTransferSeasonalMMRRequest { @@ -2283,6 +2224,12 @@ message CMsgGCToClientTipNotification { optional uint32 event_id = 5; } +message CMsgGCToClientCommendNotification { + optional uint32 commender_account_id = 1; + optional string commender_name = 2; + optional uint32 flags = 3; +} + message CMsgGCToClientAllStarVotesRequest { optional uint32 event_id = 1; } @@ -2370,6 +2317,13 @@ message CMsgDOTADestroyLobbyResponse { optional .CMsgDOTADestroyLobbyResponse.Result result = 1 [default = SUCCESS]; } +message CMsgDOTAGetRecentPlayTimeFriendsRequest { +} + +message CMsgDOTAGetRecentPlayTimeFriendsResponse { + repeated fixed32 account_ids = 1; +} + message CMsgPurchaseItemWithEventPoints { optional uint32 item_def = 1; optional uint32 quantity = 2; @@ -2388,6 +2342,8 @@ message CMsgPurchaseItemWithEventPointsResponse { NOT_ENOUGH_POINTS = 6; SQL_ERROR = 7; FAILED_TO_SEND = 8; + SERVER_ERROR = 9; + NOT_ALLOWED = 10; } optional .CMsgPurchaseItemWithEventPointsResponse.Result result = 1 [default = SUCCESS]; @@ -2408,3 +2364,335 @@ message CMsgGCRequestItemRecommendationsResponse { repeated uint32 recommended_item_ids = 1; } +message CMsgGCRequestSkillUpRecommendations { + optional uint32 mmr = 1; + optional uint32 hero_id = 2; + repeated uint32 allied_hero_ids = 3; + repeated uint32 enemy_hero_ids = 4; + repeated uint32 ability_ids = 5; +} + +message CMsgGCRequestSkillUpRecommendationsResponse { + message AbilitySelection { + optional uint32 ability_id = 1; + optional float weight = 2; + } + + repeated .CMsgGCRequestSkillUpRecommendationsResponse.AbilitySelection abilities = 1; +} + +message CMsgClientToGCRecycleHeroRelic { + repeated uint64 item_ids = 1; +} + +message CMsgClientToGCRecycleHeroRelicResponse { + enum Result { + SUCCESS = 1; + ERROR_INTERNAL = 2; + ERROR_FAILED_TO_FIND_HERO_RELIC = 3; + ERROR_ITEM_NOT_HERO_RELIC = 4; + ERROR_FAILED_EVENT_NOT_OWNED = 5; + } + + optional .CMsgClientToGCRecycleHeroRelicResponse.Result result = 1 [default = SUCCESS]; + optional uint32 dust_amount = 2; +} + +message CMsgPurchaseHeroRelic { + optional uint32 hero_id = 1; + optional uint32 kill_eater_type = 2; +} + +message CMsgPurchaseHeroRelicResponse { + optional .EPurchaseHeroRelicResult result = 1 [default = k_EPurchaseHeroRelicResult_Success]; +} + +message CMsgPurchaseHeroRandomRelic { + optional uint32 hero_id = 1; +} + +message CMsgPurchaseHeroRandomRelicResponse { + optional .EPurchaseHeroRelicResult result = 1 [default = k_EPurchaseHeroRelicResult_Success]; + optional uint32 kill_eater_type = 2; +} + +message CMsgClientToGCRequestPlusWeeklyChallengeResult { + optional .EEvent event_id = 1 [default = EVENT_ID_NONE]; + optional uint32 week = 2; +} + +message CMsgClientToGCRequestPlusWeeklyChallengeResultResponse { +} + +message CMsgProfileRequest { + optional uint32 account_id = 1; +} + +message CMsgProfileResponse { + message FeaturedHero { + optional uint32 hero_id = 1; + repeated .CSOEconItem equipped_econ_items = 2; + optional bool manually_set = 3; + } + + message MatchInfo { + optional uint64 match_id = 1; + optional uint32 match_timestamp = 2; + optional sint32 performance_rating = 3; + optional uint32 hero_id = 4; + optional bool won_match = 5; + } + + optional .CSOEconItem background_item = 1; + repeated .CMsgProfileResponse.FeaturedHero featured_heroes = 2; + repeated .CMsgProfileResponse.MatchInfo recent_matches = 3; + repeated .CMsgSuccessfulHero successful_heroes = 4; + optional .CMsgRecentMatchInfo recent_match_details = 5; +} + +message CMsgProfileUpdate { + optional uint64 background_item_id = 1; + repeated uint32 featured_hero_ids = 2; +} + +message CMsgProfileUpdateResponse { + enum Result { + SUCCESS = 0; + FAILURE = 1; + } + + optional .CMsgProfileUpdateResponse.Result result = 1 [default = SUCCESS]; +} + +message CMsgTalentWinRates { + optional uint32 last_run = 1; + optional uint32 ability_id = 2; + optional uint32 game_count = 3; + optional uint32 win_count = 4; +} + +message CMsgGlobalHeroAverages { + optional uint32 last_run = 1; + optional uint32 avg_gold_per_min = 3; + optional uint32 avg_xp_per_min = 4; + optional uint32 avg_kills = 5; + optional uint32 avg_deaths = 6; + optional uint32 avg_assists = 7; + optional uint32 avg_last_hits = 8; + optional uint32 avg_denies = 9; + optional uint32 avg_net_worth = 10; +} + +message CMsgHeroGlobalDataRequest { + optional uint32 hero_id = 1; +} + +message CMsgHeroGlobalDataResponse { + message GraphData { + optional uint32 day = 1; + optional float win_percent = 2; + optional float pick_percent = 3; + optional float ban_percent = 4; + } + + message HeroDataPerRankChunk { + optional uint32 rank_chunk = 1; + repeated .CMsgTalentWinRates talent_win_rates = 2; + optional .CMsgGlobalHeroAverages hero_averages = 3; + repeated .CMsgHeroGlobalDataResponse.GraphData graph_data = 4; + } + + optional uint32 hero_id = 1; + repeated .CMsgHeroGlobalDataResponse.HeroDataPerRankChunk hero_data_per_chunk = 2; +} + +message CMsgPrivateMetadataKeyRequest { + optional uint64 match_id = 1; +} + +message CMsgPrivateMetadataKeyResponse { + optional uint32 private_key = 1; +} + +message CMsgActivatePlusFreeTrialRequest { +} + +message CMsgActivatePlusFreeTrialResponse { + enum Result { + SUCCESS = 0; + ERROR_GENERIC = 1; + ERROR_ALREADY_IN_FREE_TRIAL = 2; + ERROR_ALREADY_USED_FREE_TRIAL = 3; + ERROR_OFFER_NOT_VALID = 4; + } + + optional .CMsgActivatePlusFreeTrialResponse.Result result = 1 [default = SUCCESS]; +} + +message CMsgGCToClientCavernCrawlMapPathCompleted { + optional uint32 event_id = 1; + optional uint32 path_id_completed = 2; + optional uint32 hero_id_completed = 3; + optional bool received_ultra_rare_reward = 4; +} + +message CMsgClientToGCCavernCrawlClaimRoom { + optional uint32 event_id = 1; + optional uint32 room_id = 2; +} + +message CMsgClientToGCCavernCrawlClaimRoomResponse { + enum Result { + SUCCESS = 0; + ERROR_UNKNOWN = 1; + RECEIVED_ULTRA_RARE_REWARD = 2; + } + + optional .CMsgClientToGCCavernCrawlClaimRoomResponse.Result result = 1 [default = SUCCESS]; +} + +message CMsgClientToGCCavernCrawlUseItemOnRoom { + optional uint32 event_id = 1; + optional uint32 room_id = 2; + optional uint32 item_type = 3; +} + +message CMsgClientToGCCavernCrawlUseItemOnRoomResponse { + enum Result { + SUCCESS = 0; + ERROR_UNKNOWN = 1; + RECEIVED_ULTRA_RARE_REWARD = 2; + } + + optional .CMsgClientToGCCavernCrawlUseItemOnRoomResponse.Result result = 1 [default = SUCCESS]; +} + +message CMsgClientToGCCavernCrawlUseItemOnPath { + optional uint32 event_id = 1; + optional uint32 path_id = 2; + optional uint32 item_type = 3; +} + +message CMsgClientToGCCavernCrawlUseItemOnPathResponse { + enum Result { + SUCCESS = 0; + ERROR_UNKNOWN = 1; + RECEIVED_ULTRA_RARE_REWARD = 2; + } + + optional .CMsgClientToGCCavernCrawlUseItemOnPathResponse.Result result = 1 [default = SUCCESS]; +} + +message CMsgClientToGCCavernCrawlRequestMapState { + optional uint32 event_id = 1; +} + +message CMsgClientToGCCavernCrawlRequestMapStateResponse { + message SwappedChallenge { + optional uint32 path_id_1 = 1; + optional uint32 path_id_2 = 2; + } + + message InventoryItem { + optional uint32 item_type = 1; + optional uint32 count = 2; + } + + enum Result { + SUCCESS = 0; + ERROR_UNKNOWN = 1; + EVENT_NOT_OWNED = 2; + } + + optional .CMsgClientToGCCavernCrawlRequestMapStateResponse.Result result = 1 [default = SUCCESS]; + optional fixed64 claimed_rooms_1 = 2; + optional fixed64 claimed_rooms_2 = 3; + optional fixed64 revealed_rooms_1 = 4; + optional fixed64 revealed_rooms_2 = 5; + optional fixed64 completed_paths_1 = 6; + optional fixed64 completed_paths_2 = 7; + optional fixed64 completed_paths_3 = 8; + repeated .CMsgClientToGCCavernCrawlRequestMapStateResponse.SwappedChallenge swapped_challenge = 9; + repeated .CMsgClientToGCCavernCrawlRequestMapStateResponse.InventoryItem inventory_item = 10; + optional uint32 ultra_rare_reward_room_number = 11; +} + +message CMsgDOTAMutationList { + message Mutation { + optional uint32 id = 1; + optional string name = 2; + optional string description = 3; + } + + repeated .CMsgDOTAMutationList.Mutation mutations = 1; +} + +message CMsgEventTipsSummaryRequest { + optional .EEvent event_id = 1 [default = EVENT_ID_NONE]; + optional uint32 account_id = 2; +} + +message CMsgEventTipsSummaryResponse { + message Tipper { + optional uint32 tipper_account_id = 1; + optional uint32 tip_count = 2 [default = 1]; + } + + optional bool result = 1; + repeated .CMsgEventTipsSummaryResponse.Tipper tips_received = 2; +} + +message CMsgSocialFeedRequest { + optional uint32 account_id = 1; + optional bool self_only = 2; +} + +message CMsgSocialFeedResponse { + message FeedEvent { + optional uint64 feed_event_id = 1; + optional uint32 account_id = 2; + optional uint32 timestamp = 3; + optional uint32 comment_count = 4; + optional uint32 event_type = 5; + optional uint32 event_sub_type = 6; + optional uint64 param_big_int_1 = 7; + optional uint32 param_int_1 = 8; + optional uint32 param_int_2 = 9; + optional uint32 param_int_3 = 10; + optional string param_string = 11; + } + + enum Result { + SUCCESS = 0; + FAILED_TO_LOAD_FRIENDS = 1; + FAILED_TO_LOAD_FEED_DATA = 2; + FAILED_TO_LOAD_FEED_ENTRY = 3; + FAILED_TO_LOAD_COMMENTS = 4; + FAILED_TOO_MANY_REQUESTS = 5; + } + + optional .CMsgSocialFeedResponse.Result result = 1 [default = SUCCESS]; + repeated .CMsgSocialFeedResponse.FeedEvent feed_events = 2; +} + +message CMsgSocialFeedCommentsRequest { + optional uint64 feed_event_id = 1; +} + +message CMsgSocialFeedCommentsResponse { + message FeedComment { + optional uint32 commenter_account_id = 1; + optional uint32 timestamp = 2; + optional string comment_text = 3; + } + + enum Result { + SUCCESS = 0; + FAILED_TOO_MANY_REQUESTS = 1; + FAILED_TO_LOAD_COMMENTS = 2; + } + + optional .CMsgSocialFeedCommentsResponse.Result result = 1 [default = SUCCESS]; + repeated .CMsgSocialFeedCommentsResponse.FeedComment feed_comments = 3; +} + diff --git a/proto/dota_gcmessages_client_chat.proto b/proto/dota_gcmessages_client_chat.proto index 97278297..d6943958 100644 --- a/proto/dota_gcmessages_client_chat.proto +++ b/proto/dota_gcmessages_client_chat.proto @@ -126,10 +126,9 @@ message CMsgDOTAChatMessage { optional uint32 suggest_pick_hero_id = 26; optional string suggest_pick_hero_role = 27; optional uint32 suggest_ban_hero_id = 30; - optional bool terse = 28; - optional bool ignore_muted = 31; optional .CMsgDOTAChatMessage.TriviaAnswered trivia_answer = 32; optional uint32 requested_ability_id = 33; + optional uint32 chat_flags = 34; } message CMsgDOTAChatMember { diff --git a/proto/dota_gcmessages_client_match_management.proto b/proto/dota_gcmessages_client_match_management.proto index 4a74ec8b..d846a5cd 100644 --- a/proto/dota_gcmessages_client_match_management.proto +++ b/proto/dota_gcmessages_client_match_management.proto @@ -52,6 +52,8 @@ message CMsgStartFindingMatch { optional bool solo_queue = 14; optional uint32 bot_script_index = 15; optional uint32 steam_clan_account_id = 16; + optional bool is_challenge_match = 17; + optional uint32 lane_selection_flags = 18; } message CMsgStartFindingMatchResult { @@ -130,6 +132,7 @@ message CMsgPracticeLobbySetDetails { optional uint64 bot_radiant = 44; optional uint64 bot_dire = 45; optional .DOTASelectionPriorityRules selection_priority_rules = 46 [default = k_DOTASelectionPriorityRules_Manual]; + optional bool custom_game_penalties = 47; } message CMsgPracticeLobbyCreate { @@ -194,7 +197,6 @@ message CMsgClearPracticeLobbyTeam { } message CMsgPracticeLobbyList { - optional bool tournament_games = 1; optional string pass_key = 2; optional uint32 region = 3; optional .DOTA_GameMode game_mode = 4 [default = DOTA_GAMEMODE_NONE]; @@ -207,8 +209,6 @@ message CMsgPracticeLobbyListResponseEntry { } optional uint64 id = 1 [(key_field) = true]; - optional uint32 tournament_id = 3; - optional uint32 tournament_game_id = 4; repeated .CMsgPracticeLobbyListResponseEntry.CLobbyMember members = 5; optional bool requires_pass_key = 6; optional uint32 leader_account_id = 7; @@ -227,7 +227,6 @@ message CMsgPracticeLobbyListResponseEntry { } message CMsgPracticeLobbyListResponse { - optional bool tournament_games = 1; repeated .CMsgPracticeLobbyListResponseEntry lobbies = 2; } @@ -450,3 +449,10 @@ message CMsgGCToClientSteamDatagramTicket { optional bytes serialized_ticket = 16; } +message CMsgGCToClientRequestLaneSelection { +} + +message CMsgGCToClientRequestLaneSelectionResponse { + optional uint32 lane_selection_flags = 1; +} + diff --git a/proto/dota_gcmessages_client_team.proto b/proto/dota_gcmessages_client_team.proto index 817d1dfd..1b740aa1 100644 --- a/proto/dota_gcmessages_client_team.proto +++ b/proto/dota_gcmessages_client_team.proto @@ -70,6 +70,9 @@ message CMsgDOTATeamInfo { optional uint32 time_joined = 2; optional bool admin = 3; optional bool sub = 4; + optional string persona = 5; + optional string pro_name = 6; + optional bool pro = 7; } repeated .CMsgDOTATeamInfo.Member members = 1; @@ -97,6 +100,10 @@ message CMsgDOTATeamInfo { repeated uint64 recent_match_ids = 23; } +message CMsgDOTATeamInfoRequest { + optional .CMsgDOTATeamInfo result = 1; +} + message CMsgDOTATeamsInfo { optional uint32 league_id = 1; repeated .CMsgDOTATeamInfo teams = 2; diff --git a/proto/dota_gcmessages_common.proto b/proto/dota_gcmessages_common.proto index cb208275..ac00ecf1 100644 --- a/proto/dota_gcmessages_common.proto +++ b/proto/dota_gcmessages_common.proto @@ -42,51 +42,6 @@ enum DOTA_TournamentEvents { TE_BLACK_HOLE = 11; } -enum DOTA_COMBATLOG_TYPES { - DOTA_COMBATLOG_INVALID = -1; - DOTA_COMBATLOG_DAMAGE = 0; - DOTA_COMBATLOG_HEAL = 1; - DOTA_COMBATLOG_MODIFIER_ADD = 2; - DOTA_COMBATLOG_MODIFIER_REMOVE = 3; - DOTA_COMBATLOG_DEATH = 4; - DOTA_COMBATLOG_ABILITY = 5; - DOTA_COMBATLOG_ITEM = 6; - DOTA_COMBATLOG_LOCATION = 7; - DOTA_COMBATLOG_GOLD = 8; - DOTA_COMBATLOG_GAME_STATE = 9; - DOTA_COMBATLOG_XP = 10; - DOTA_COMBATLOG_PURCHASE = 11; - DOTA_COMBATLOG_BUYBACK = 12; - DOTA_COMBATLOG_ABILITY_TRIGGER = 13; - DOTA_COMBATLOG_PLAYERSTATS = 14; - DOTA_COMBATLOG_MULTIKILL = 15; - DOTA_COMBATLOG_KILLSTREAK = 16; - DOTA_COMBATLOG_TEAM_BUILDING_KILL = 17; - DOTA_COMBATLOG_FIRST_BLOOD = 18; - DOTA_COMBATLOG_MODIFIER_REFRESH = 19; - DOTA_COMBATLOG_NEUTRAL_CAMP_STACK = 20; - DOTA_COMBATLOG_PICKUP_RUNE = 21; - DOTA_COMBATLOG_REVEALED_INVISIBLE = 22; - DOTA_COMBATLOG_HERO_SAVED = 23; - DOTA_COMBATLOG_MANA_RESTORED = 24; - DOTA_COMBATLOG_HERO_LEVELUP = 25; - DOTA_COMBATLOG_BOTTLE_HEAL_ALLY = 26; - DOTA_COMBATLOG_ENDGAME_STATS = 27; - DOTA_COMBATLOG_INTERRUPT_CHANNEL = 28; - DOTA_COMBATLOG_ALLIED_GOLD = 29; - DOTA_COMBATLOG_AEGIS_TAKEN = 30; - DOTA_COMBATLOG_MANA_DAMAGE = 31; - DOTA_COMBATLOG_PHYSICAL_DAMAGE_PREVENTED = 32; - DOTA_COMBATLOG_UNIT_SUMMONED = 33; - DOTA_COMBATLOG_ATTACK_EVADE = 34; - DOTA_COMBATLOG_TREE_CUT = 35; - DOTA_COMBATLOG_SUCCESSFUL_SCAN = 36; - DOTA_COMBATLOG_END_KILLSTREAK = 37; - DOTA_COMBATLOG_BLOODSTONE_CHARGE = 38; - DOTA_COMBATLOG_CRITICAL_DAMAGE = 39; - DOTA_COMBATLOG_SPELL_ABSORB = 40; -} - message CSODOTAGameAccountClient { optional uint32 account_id = 1 [(key_field) = true]; optional uint32 wins = 3; @@ -110,7 +65,6 @@ message CSODOTAGameAccountClient { optional uint32 forgiving = 31; optional uint32 account_disabled_until_date = 38; optional uint32 account_disabled_count = 39; - optional uint32 showcase_hero_id = 40; optional uint32 match_disabled_until_date = 41; optional uint32 match_disabled_count = 42; optional .PartnerAccountType partner_account_type = 44 [default = PARTNER_NONE]; @@ -156,12 +110,30 @@ message CSODOTAGameAccountClient { optional bool solo_seasonal_rank_transferred = 102; optional uint64 favorite_team_packed = 103; optional uint32 recent_report_time = 104; + optional uint32 custom_game_disabled_until_date = 105; + optional uint32 recent_win_time_1 = 106; + optional uint32 recent_win_time_2 = 107; + optional uint32 recent_win_time_3 = 108; } -message CSODOTAGameAccountPrime { +message CSODOTAGameAccountPlus { optional uint32 account_id = 1 [(key_field) = true]; optional uint32 original_start_date = 2; - optional uint32 prime_flags = 3; + optional uint32 plus_flags = 3; + optional uint32 plus_status = 4; + optional uint32 prepaid_time_start = 5; + optional uint32 prepaid_time_balance = 6; + optional fixed32 next_payment_date = 7; + optional fixed64 steam_agreement_id = 8; +} + +message CMsgLobbyPlayerPlusSubscriptionData { + message HeroBadge { + optional uint32 hero_id = 1; + optional uint32 hero_badge_xp = 2; + } + + repeated .CMsgLobbyPlayerPlusSubscriptionData.HeroBadge hero_badges = 1; } message CMsgLobbyEventPoints { @@ -170,6 +142,11 @@ message CMsgLobbyEventPoints { optional uint32 message_id_end = 2; } + message PeriodicResourceValues { + optional uint32 remaining = 1; + optional uint32 max = 2; + } + message AccountPoints { optional uint32 account_id = 1; optional uint32 normal_points = 2; @@ -180,12 +157,13 @@ message CMsgLobbyEventPoints { optional uint32 points_held = 7; optional uint32 premium_points_held = 8; optional uint32 favorite_team_foil_level = 9; - optional uint32 wager_tokens_remaining = 10; - optional uint32 wager_tokens_max = 11; optional uint64 active_effects_mask = 12; repeated .CMsgLobbyEventPoints.ChatWheelMessageRange unlocked_chat_wheel_message_ranges = 13; - optional uint32 rank_wager_tokens_remaining = 14; - optional uint32 rank_wager_tokens_max = 15; + optional .CMsgLobbyPlayerPlusSubscriptionData plus_subscription_data = 16; + optional .CMsgLobbyEventPoints.PeriodicResourceValues wager_tokens = 17; + optional .CMsgLobbyEventPoints.PeriodicResourceValues rank_wager_tokens = 18; + optional .CMsgLobbyEventPoints.PeriodicResourceValues tip_tokens = 19; + optional uint32 tip_amount = 20; } optional uint32 event_id = 1; @@ -195,7 +173,7 @@ message CMsgLobbyEventPoints { message CMsgLocalServerFakeLobbyData { optional uint32 account_id = 1; repeated .CMsgLobbyEventPoints event_points = 2; - optional bool is_prime_subscriber = 3; + optional bool is_plus_subscriber = 3; optional uint32 primary_event_id = 4; } @@ -359,78 +337,6 @@ message CAdditionalEquipSlot { optional uint32 def_index = 3; } -message CMsgDOTACombatLogEntry { - optional .DOTA_COMBATLOG_TYPES type = 1 [default = DOTA_COMBATLOG_INVALID]; - optional uint32 target_name = 2; - optional uint32 target_source_name = 3; - optional uint32 attacker_name = 4; - optional uint32 damage_source_name = 5; - optional uint32 inflictor_name = 6; - optional bool is_attacker_illusion = 7; - optional bool is_attacker_hero = 8; - optional bool is_target_illusion = 9; - optional bool is_target_hero = 10; - optional bool is_visible_radiant = 11; - optional bool is_visible_dire = 12; - optional uint32 value = 13; - optional int32 health = 14; - optional float timestamp = 15; - optional float stun_duration = 16; - optional float slow_duration = 17; - optional bool is_ability_toggle_on = 18; - optional bool is_ability_toggle_off = 19; - optional uint32 ability_level = 20; - optional float location_x = 21; - optional float location_y = 22; - optional uint32 gold_reason = 23; - optional float timestamp_raw = 24; - optional float modifier_duration = 25; - optional uint32 xp_reason = 26; - optional uint32 last_hits = 27; - optional uint32 attacker_team = 28; - optional uint32 target_team = 29; - optional uint32 obs_wards_placed = 30; - optional uint32 assist_player0 = 31; - optional uint32 assist_player1 = 32; - optional uint32 assist_player2 = 33; - optional uint32 assist_player3 = 34; - optional uint32 stack_count = 35; - optional bool hidden_modifier = 36; - optional bool is_target_building = 37; - optional uint32 neutral_camp_type = 38; - optional uint32 rune_type = 39; - repeated uint32 assist_players = 40; - optional bool is_heal_save = 41; - optional bool is_ultimate_ability = 42; - optional uint32 attacker_hero_level = 43; - optional uint32 target_hero_level = 44; - optional uint32 xpm = 45; - optional uint32 gpm = 46; - optional uint32 event_location = 47; - optional bool target_is_self = 48; - optional uint32 damage_type = 49; - optional bool invisibility_modifier = 50; - optional uint32 damage_category = 51; - optional uint32 networth = 52; - optional uint32 building_type = 53; - optional float modifier_elapsed_duration = 54; - optional bool silence_modifier = 55; - optional bool heal_from_lifesteal = 56; - optional bool modifier_purged = 57; - optional bool spell_evaded = 58; - optional bool motion_controller_modifier = 59; - optional bool long_range_kill = 60; - optional uint32 modifier_purge_ability = 61; - optional uint32 modifier_purge_npc = 62; - optional bool root_modifier = 63; - optional uint32 total_unit_death_count = 64; - optional bool aura_modifier = 65; - optional bool armor_debuff_modifier = 66; - optional bool no_physical_damage_modifier = 67; - optional uint32 modifier_ability = 68; - optional bool modifier_hidden = 69; -} - message CMsgDOTAProfileCard { message Slot { message Trophy { @@ -478,6 +384,7 @@ message CMsgDOTAProfileCard { k_eStat_Commends = 4; k_eStat_GamesPlayed = 5; k_eStat_FirstMatchDate = 6; + k_eStat_PreviousSeasonRank = 7; } optional uint32 account_id = 1; @@ -489,19 +396,16 @@ message CMsgDOTAProfileCard { optional .CMsgBattleCupVictory recent_battle_cup_victory = 7; optional uint32 rank_tier = 8; optional uint32 leaderboard_rank = 9; + optional bool is_plus_subscriber = 10; + optional uint32 plus_original_start_date = 11; + optional uint32 rank_tier_score = 12; + optional uint32 previous_rank_tier = 13; } message CSODOTAPlayerChallenge { - enum EFlags { - eFlag_InstantRerollUncompleted = 1; - eFlag_QuestChallenge = 2; - eFlag_MultiMatch = 3; - } - optional uint32 account_id = 1 [(key_field) = true]; optional uint32 event_id = 2 [(key_field) = true]; optional uint32 slot_id = 3 [(key_field) = true]; - optional uint32 challenge_type = 4; optional uint32 int_param_0 = 5; optional uint32 int_param_1 = 6; optional uint32 created_time = 7; @@ -515,11 +419,13 @@ message CSODOTAPlayerChallenge { optional uint32 max_quest_rank = 15; optional uint32 instance_id = 16; optional uint32 hero_id = 17; + optional uint32 template_id = 18; } message CMsgClientToGCRerollPlayerChallenge { optional uint32 event_id = 1; optional uint32 sequence_id = 3; + optional uint32 hero_id = 4; } message CMsgGCRerollPlayerChallengeResponse { @@ -552,7 +458,7 @@ message CMsgDOTARealtimeGameStats { } message ItemDetails { - optional uint32 id = 1; + optional uint32 item_ability_id = 1; optional string name = 2; optional int32 time = 3; optional bool sold = 4; @@ -999,7 +905,7 @@ message CMsgDOTAMatch { repeated .CMatchAdditionalUnitInventory additional_units_inventory = 48; repeated .CMatchPlayerPermanentBuff permanent_buffs = 57; optional .CMsgDOTAMatch.Player.CustomGameData custom_game_data = 50; - optional bool active_prime_subscription = 51; + optional bool active_plus_subscription = 51; optional uint32 net_worth = 52; optional uint32 bot_difficulty = 58; optional uint32 hero_pick_order = 63; @@ -1161,72 +1067,31 @@ message CMsgDOTABotDebugInfo { repeated uint32 rune_status = 13; } -message CMsgDOTALeagueTournament { - message NodeGroup { - optional string name = 1; - optional uint32 node_group_id = 2; - optional uint32 parent_node_group_id = 3; - optional uint32 advancing_node_group_id = 4; - optional uint32 advancing_team_count = 5; - optional uint32 team_count = 6; - optional .CMsgDOTALeagueTournament.ENodeGroupType node_group_type = 7 [default = INVALID_GROUP_TYPE]; - optional .CMsgDOTALeagueTournament.ENodeType default_node_type = 8 [default = INVALID_NODE_TYPE]; - optional uint32 round = 9; - optional uint32 max_rounds = 10; - optional bool is_tiebreaker = 11; - optional bool is_final_group = 12; - optional bool is_completed = 13; - repeated .CMsgDOTALeagueTournament.TeamStanding team_standings = 14; - repeated .CMsgDOTALeagueTournament.Node nodes = 15; - repeated .CMsgDOTALeagueTournament.NodeGroup node_groups = 16; - } - - message Node { - optional string name = 1; - optional uint32 node_id = 2; - optional uint32 node_group_id = 3; - optional uint32 winning_node_id = 4; - optional uint32 losing_node_id = 5; - optional .CMsgDOTALeagueTournament.ENodeType node_type = 6 [default = INVALID_NODE_TYPE]; - optional uint32 scheduled_time = 7; - optional uint32 team_id_1 = 10; - optional uint32 team_id_2 = 11; - optional uint32 series_id = 20; - repeated uint64 matches = 21; - optional uint32 team_1_wins = 22; - optional uint32 team_2_wins = 23; - optional bool is_completed = 24; - } - - message TeamStanding { - optional uint32 team_id = 1; - optional uint32 node_wins = 2; - optional uint32 node_losses = 3; - optional uint32 match_wins = 4; - optional uint32 match_losses = 5; - optional uint32 score = 6; - } +message CMsgSuccessfulHero { + optional uint32 hero_id = 1; + optional float win_percent = 2; + optional uint32 longest_streak = 3; +} - enum ENodeGroupType { - INVALID_GROUP_TYPE = 0; - ORGANIZATIONAL = 1; - ROUND_ROBIN = 2; - SWISS = 3; - BRACKET_SINGLE = 4; - BRACKET_DOUBLE_SEED_LOSER = 5; - BRACKET_DOUBLE_ALL_WINNER = 6; - BRACKET_SHOWMATCH = 7; - } +message CMsgRecentMatchInfo { + optional uint64 match_id = 1; + optional .DOTA_GameMode game_mode = 2 [default = DOTA_GAMEMODE_NONE]; + optional uint32 kills = 3; + optional uint32 deaths = 4; + optional uint32 assists = 5; + optional uint32 duration = 6; + optional uint32 player_slot = 7; + optional .EMatchOutcome match_outcome = 8 [default = k_EMatchOutcome_Unknown]; + optional uint32 timestamp = 9; +} - enum ENodeType { - INVALID_NODE_TYPE = 0; - BEST_OF_ONE = 1; - BEST_OF_THREE = 2; - BEST_OF_FIVE = 3; - BEST_OF_TWO = 4; +message CMsgMatchTips { + message SingleTip { + optional uint32 source_account_id = 1; + optional uint32 target_account_id = 2; } - optional uint32 league_id = 1; - repeated .CMsgDOTALeagueTournament.NodeGroup node_groups = 2; + optional .EEvent event_id = 1 [default = EVENT_ID_NONE]; + repeated .CMsgMatchTips.SingleTip tips = 2; } diff --git a/proto/dota_gcmessages_common_match_management.proto b/proto/dota_gcmessages_common_match_management.proto index d2b12368..30b0ba03 100644 --- a/proto/dota_gcmessages_common_match_management.proto +++ b/proto/dota_gcmessages_common_match_management.proto @@ -5,6 +5,13 @@ import "dota_shared_enums.proto"; option optimize_for = SPEED; option cc_generic_services = false; +enum ELaneSelectionFlags { + k_ELaneSelectionFlags_LANE_SELECTION_SAFELANE = 1; + k_ELaneSelectionFlags_LANE_SELECTION_OFFLANE = 2; + k_ELaneSelectionFlags_LANE_SELECTION_MIDLANE = 4; + k_ELaneSelectionFlags_LANE_SELECTION_OTHER = 8; +} + enum LobbyDotaTVDelay { LobbyDotaTV_10 = 0; LobbyDotaTV_120 = 1; @@ -17,15 +24,31 @@ enum LobbyDotaPauseSetting { LobbyDotaPauseSetting_Disabled = 2; } +enum EReadyCheckStatus { + k_EReadyCheckStatus_Unknown = 0; + k_EReadyCheckStatus_NotReady = 1; + k_EReadyCheckStatus_Ready = 2; +} + +enum EReadyCheckRequestResult { + k_EReadyCheckRequestResult_Success = 0; + k_EReadyCheckRequestResult_AlreadyInProgress = 1; + k_EReadyCheckRequestResult_NotInParty = 2; + k_EReadyCheckRequestResult_SendError = 3; + k_EReadyCheckRequestResult_UnknownError = 4; +} + message CSODOTAPartyMember { optional .PartnerAccountType partner_type = 1 [default = PARTNER_NONE]; optional bool is_coach = 2; repeated uint32 region_ping_codes = 4 [packed = true]; repeated uint32 region_ping_times = 5 [packed = true]; optional uint32 region_ping_failed_bitmask = 6; + optional bool is_plus_subscriber = 10; optional uint32 tourney_skill_level = 7; optional uint32 tourney_buyin = 8; optional uint32 tourney_prevent_until = 9; + optional uint32 lane_selection_flags = 11; } message CSODOTAParty { @@ -78,6 +101,10 @@ message CSODOTAParty { optional bool solo_queue = 59; optional uint32 bot_script_index = 60; optional uint32 steam_clan_account_id = 61; + optional .CMsgReadyCheckStatus ready_check = 62; + optional uint32 custom_game_disabled_until_date = 63; + optional uint32 custom_game_disabled_account_id = 64; + optional bool is_challenge_match = 65; } message CSODOTAPartyInvite { @@ -155,8 +182,10 @@ message CDOTALobbyMember { optional uint32 lobby_mvp_vote_account_id = 32; optional .MatchType search_match_type = 33 [default = MATCH_TYPE_CASUAL]; optional uint64 favorite_team_packed = 35; - optional bool is_prime_subscriber = 36; + optional bool is_plus_subscriber = 36; optional bool rank_tier_updated = 37; + optional uint32 lane_selection_flags = 38; + optional bool can_earn_rewards = 39; } message CLobbyTeamDetails { @@ -176,6 +205,8 @@ message CLobbyTeamDetails { optional uint32 rank = 15; optional sint32 rank_change = 16; optional bool is_home_team = 17; + optional bool is_challenge_match = 18; + optional uint64 challenge_match_token_account = 19; } message CLobbyTimedRewardDetails { @@ -213,7 +244,6 @@ message CSODOTALobby { INVALID = -1; CASUAL_MATCH = 0; PRACTICE = 1; - TOURNAMENT = 2; COOP_BOT_MATCH = 4; LEGACY_TEAM_MATCH = 5; LEGACY_SOLO_QUEUE_MATCH = 6; @@ -309,9 +339,36 @@ message CSODOTALobby { optional bool series_current_selection_priority_used_coin_toss = 102; optional .EEvent current_primary_event = 103 [default = EVENT_ID_NONE]; optional bool lowpri_deprecated = 104; + repeated uint32 emergency_disabled_hero_ids = 105; + optional fixed64 custom_game_private_key = 106; + optional bool custom_game_penalties = 107; + repeated uint32 mutations = 108; } message CMsgLobbyPlaytestDetails { optional string json = 1; } +message CMsgReadyCheckStatus { + message ReadyMember { + optional uint32 account_id = 1; + optional .EReadyCheckStatus ready_status = 2 [default = k_EReadyCheckStatus_Unknown]; + } + + optional uint32 start_timestamp = 1; + optional uint32 finish_timestamp = 2; + optional uint32 initiator_account_id = 3; + repeated .CMsgReadyCheckStatus.ReadyMember ready_members = 4; +} + +message CMsgPartyReadyCheckRequest { +} + +message CMsgPartyReadyCheckResponse { + optional .EReadyCheckRequestResult result = 1 [default = k_EReadyCheckRequestResult_Success]; +} + +message CMsgPartyReadyCheckAcknowledge { + optional .EReadyCheckStatus ready_status = 1 [default = k_EReadyCheckStatus_Unknown]; +} + diff --git a/proto/dota_gcmessages_msgid.proto b/proto/dota_gcmessages_msgid.proto index b2979fc0..d00d3e45 100644 --- a/proto/dota_gcmessages_msgid.proto +++ b/proto/dota_gcmessages_msgid.proto @@ -63,8 +63,6 @@ enum EDOTAGCMsg { k_EMsgGCMatchDetailsRequest = 7095; k_EMsgGCMatchDetailsResponse = 7096; k_EMsgGCCancelWatchGame = 7097; - k_EMsgGCProfileRequest = 7098; - k_EMsgGCProfileResponse = 7099; k_EMsgGCPopup = 7102; k_EMsgGCDOTAClearNotifySuccessfulReport = 7104; k_EMsgGCFriendPracticeLobbyListRequest = 7111; @@ -87,9 +85,7 @@ enum EDOTAGCMsg { k_EMsgGCSuggestTeamMatchmaking = 7132; k_EMsgGCPlayerHeroesFavoritesAdd = 7133; k_EMsgGCPlayerHeroesFavoritesRemove = 7134; - k_EMsgGCSetShowcaseHero = 7141; k_EMsgGCApplyTeamToPracticeLobby = 7142; - k_EMsgGCRequestInternatinalTicketEmail = 7143; k_EMsgGCTransferTeamAdmin = 7144; k_EMsgRequestLeagueInfo = 7147; k_EMsgResponseLeagueInfo = 7148; @@ -139,8 +135,6 @@ enum EDOTAGCMsg { k_EMsgGCSetMapLocationStateResponse = 7208; k_EMsgGCResetMapLocations = 7209; k_EMsgGCResetMapLocationsResponse = 7210; - k_EMsgGCSetFeaturedItems = 7212; - k_EMsgGCFeaturedItems = 7215; k_EMsgRefreshPartnerAccountLink = 7216; k_EMsgClientsRejoinChatChannels = 7217; k_EMsgGCToGCGetUserChatInfo = 7218; @@ -235,8 +229,6 @@ enum EDOTAGCMsg { k_EMsgGCNotifyAccountFlagsChange = 7326; k_EMsgGCSetProfilePrivacy = 7327; k_EMsgGCSetProfilePrivacyResponse = 7328; - k_EMsgGCSteamProfileRequest = 7329; - k_EMsgGCSteamProfileRequestResponse = 7330; k_EMsgGCFantasyLeagueCreateInfoRequest = 7331; k_EMsgGCFantasyLeagueCreateInfoResponse = 7332; k_EMsgGCFantasyLeagueInviteInfoRequest = 7333; @@ -354,8 +346,6 @@ enum EDOTAGCMsg { k_EMsgGCToGCGetAccountLevelResponse = 7459; k_EMsgGCToGCGetAccountPartner = 7460; k_EMsgGCToGCGetAccountPartnerResponse = 7461; - k_EMsgGCToGCGetAccountProfile = 7462; - k_EMsgGCToGCGetAccountProfileResponse = 7463; k_EMsgDOTAGetWeekendTourneySchedule = 7464; k_EMsgDOTAWeekendTourneySchedule = 7465; k_EMsgGCJoinableCustomGameModesRequest = 7466; @@ -441,7 +431,6 @@ enum EDOTAGCMsg { k_EMsgGCToGCReportKillSummaries = 7555; k_EMsgGCToGCUpdateAssassinMinigame = 7556; k_EMsgGCToGCFantasySetMatchLeague = 7557; - k_EMsgClientToGCRecordCompendiumStats = 7558; k_EMsgGCItemEditorRequestLeagueInfo = 7559; k_EMsgGCItemEditorLeagueInfoResponse = 7560; k_EMsgGCToGCUpdatePlayerPredictions = 7561; @@ -491,10 +480,14 @@ enum EDOTAGCMsg { k_EMsgGCToGCGetAccountMatchStatusResponse = 7610; k_EMsgGCToGCCheckOwnsEntireEmoticonRange = 7611; k_EMsgGCToGCCheckOwnsEntireEmoticonRangeResponse = 7612; - k_EMsgGCUpdateClippy = 7613; - k_EMsgGCUpdateClientClippy = 7614; - k_EMsgGCRequestItemRecommendations = 7615; - k_EMsgGCRequestItemRecommendationsResponse = 7616; + k_EMsgClientToGCRecycleHeroRelic = 7619; + k_EMsgClientToGCRecycleHeroRelicResponse = 7620; + k_EMsgGCToGCRevokeEventOwnership = 7621; + k_EMsgGCToGCUnlockEventPointSpending = 7622; + k_EMsgGCToClientRequestLaneSelection = 7623; + k_EMsgGCToClientRequestLaneSelectionResponse = 7624; + k_EMsgServerToGCCavernCrawlIsHeroActive = 7625; + k_EMsgServerToGCCavernCrawlIsHeroActiveResponse = 7626; k_EMsgGCDev_GrantWarKill = 8001; k_EMsgServerToGCLockCharmTrading = 8004; k_EMsgClientToGCPlayerStatsRequest = 8006; @@ -615,8 +608,6 @@ enum EDOTAGCMsg { k_EMsgGCToClientTeamInfo = 8135; k_EMsgGCToClientTeamsInfo = 8136; k_EMsgClientToGCMyTeamInfoRequest = 8137; - k_EMsgClientToGCRequestEventPointLog = 8138; - k_EMsgClientToGCRequestEventPointLogResponse = 8139; k_EMsgClientToGCPublishUserStat = 8140; k_EMsgGCToGCSignoutSpendWager = 8141; k_EMsgGCSubmitLobbyMVPVote = 8144; @@ -721,7 +712,57 @@ enum EDOTAGCMsg { k_EMsgPurchaseItemWithEventPoints = 8248; k_EMsgPurchaseItemWithEventPointsResponse = 8249; k_EMsgServerToGCMatchPlayerItemPurchaseHistory = 8250; + k_EMsgGCToGCGrantPlusHeroMatchResults = 8251; k_EMsgGCGetHeroTimedStats = 8252; k_EMsgGCGetHeroTimedStatsResponse = 8253; + k_EMsgLobbyPlayerPlusSubscriptionData = 8254; + k_EMsgServerToGCMatchStateHistory = 8255; + k_EMsgPurchaseHeroRelic = 8256; + k_EMsgPurchaseHeroRelicResponse = 8257; + k_EMsgPurchaseHeroRandomRelic = 8258; + k_EMsgPurchaseHeroRandomRelicResponse = 8259; + k_EMsgPartyReadyCheckRequest = 8262; + k_EMsgPartyReadyCheckResponse = 8263; + k_EMsgPartyReadyCheckAcknowledge = 8264; + k_EMsgGetRecentPlayTimeFriendsRequest = 8265; + k_EMsgGetRecentPlayTimeFriendsResponse = 8266; + k_EMsgGCToClientCommendNotification = 8267; + k_EMsgProfileRequest = 8268; + k_EMsgProfileResponse = 8269; + k_EMsgProfileUpdate = 8270; + k_EMsgProfileUpdateResponse = 8271; + k_EMsgSuccessfulHero = 8273; + k_EMsgHeroGlobalDataRequest = 8274; + k_EMsgHeroGlobalDataResponse = 8275; + k_EMsgClientToGCRequestPlusWeeklyChallengeResult = 8276; + k_EMsgClientToGCRequestPlusWeeklyChallengeResultResponse = 8277; + k_EMsgGCToGCGrantPlusPrepaidTime = 8278; + k_EMsgPrivateMetadataKeyRequest = 8279; + k_EMsgPrivateMetadataKeyResponse = 8280; + k_EMsgGCToGCReconcilePlusStatus = 8281; + k_EMsgGCToGCCheckPlusStatus = 8282; + k_EMsgGCToGCCheckPlusStatusResponse = 8283; + k_EMsgGCToGCReconcilePlusAutoGrantItems = 8284; + k_EMsgGCToGCReconcilePlusStatusUnreliable = 8285; + k_EMsgActivatePlusFreeTrialRequest = 8286; + k_EMsgActivatePlusFreeTrialResponse = 8287; + k_EMsgGCToClientCavernCrawlMapPathCompleted = 8288; + k_EMsgClientToGCCavernCrawlClaimRoom = 8289; + k_EMsgClientToGCCavernCrawlClaimRoomResponse = 8290; + k_EMsgClientToGCCavernCrawlUseItemOnRoom = 8291; + k_EMsgClientToGCCavernCrawlUseItemOnRoomResponse = 8292; + k_EMsgClientToGCCavernCrawlUseItemOnPath = 8293; + k_EMsgClientToGCCavernCrawlUseItemOnPathResponse = 8294; + k_EMsgClientToGCCavernCrawlRequestMapState = 8295; + k_EMsgClientToGCCavernCrawlRequestMapStateResponse = 8296; + k_EMsgSignOutTips = 8297; + k_EMsgClientToGCRequestEventPointLogV2 = 8298; + k_EMsgClientToGCRequestEventPointLogResponseV2 = 8299; + k_EMsgClientToGCRequestEventTipsSummary = 8300; + k_EMsgClientToGCRequestEventTipsSummaryResponse = 8301; + k_EMsgClientToGCRequestSocialFeed = 8303; + k_EMsgClientToGCRequestSocialFeedResponse = 8304; + k_EMsgClientToGCRequestSocialFeedComments = 8305; + k_EMsgClientToGCRequestSocialFeedCommentsResponse = 8306; } diff --git a/proto/dota_shared_enums.proto b/proto/dota_shared_enums.proto index 7b4e73ac..2edb4a88 100644 --- a/proto/dota_shared_enums.proto +++ b/proto/dota_shared_enums.proto @@ -26,6 +26,7 @@ enum DOTA_GameMode { DOTA_GAMEMODE_1V1MID = 21; DOTA_GAMEMODE_ALL_DRAFT = 22; DOTA_GAMEMODE_TURBO = 23; + DOTA_GAMEMODE_MUTATION = 24; } enum DOTA_GameState { @@ -72,10 +73,11 @@ enum EEvent { EVENT_ID_WINTER_MAJOR_2017 = 16; EVENT_ID_NEW_BLOOM_2017 = 17; EVENT_ID_INTERNATIONAL_2017 = 18; - EVENT_ID_BATTLE_PASS_REWORK = 19; + EVENT_ID_PLUS_SUBSCRIPTION = 19; EVENT_ID_SINGLES_DAY_2017 = 20; EVENT_ID_FROSTIVUS_2017 = 21; - EVENT_ID_COUNT = 22; + EVENT_ID_INTERNATIONAL_2018 = 22; + EVENT_ID_COUNT = 23; } enum DOTALeaverStatus_t { @@ -205,6 +207,7 @@ enum DOTAJoinLobbyResult { DOTA_JOIN_RESULT_LOBBY_FULL = 9; DOTA_JOIN_RESULT_CUSTOM_GAME_INCORRECT_VERSION = 10; DOTA_JOIN_RESULT_TIMEOUT = 11; + DOTA_JOIN_RESULT_CUSTOM_GAME_COOLDOWN = 12; } enum DOTASelectionPriorityRules { @@ -263,7 +266,8 @@ enum MatchType { MATCH_TYPE_EVENT = 7; MATCH_TYPE_SEASONAL_RANKED = 8; MATCH_TYPE_LOWPRI_DEPRECATED = 9; - MATCH_TYPE_LOWPRI_DEPRECATED2 = 10; + MATCH_TYPE_STEAM_GROUP = 10; + MATCH_TYPE_MUTATION = 11; } enum DOTABotDifficulty { @@ -354,6 +358,53 @@ enum EBadgeType { k_EBadgeType_TI7_AllEvent = 3; } +enum DOTA_COMBATLOG_TYPES { + DOTA_COMBATLOG_INVALID = -1; + DOTA_COMBATLOG_DAMAGE = 0; + DOTA_COMBATLOG_HEAL = 1; + DOTA_COMBATLOG_MODIFIER_ADD = 2; + DOTA_COMBATLOG_MODIFIER_REMOVE = 3; + DOTA_COMBATLOG_DEATH = 4; + DOTA_COMBATLOG_ABILITY = 5; + DOTA_COMBATLOG_ITEM = 6; + DOTA_COMBATLOG_LOCATION = 7; + DOTA_COMBATLOG_GOLD = 8; + DOTA_COMBATLOG_GAME_STATE = 9; + DOTA_COMBATLOG_XP = 10; + DOTA_COMBATLOG_PURCHASE = 11; + DOTA_COMBATLOG_BUYBACK = 12; + DOTA_COMBATLOG_ABILITY_TRIGGER = 13; + DOTA_COMBATLOG_PLAYERSTATS = 14; + DOTA_COMBATLOG_MULTIKILL = 15; + DOTA_COMBATLOG_KILLSTREAK = 16; + DOTA_COMBATLOG_TEAM_BUILDING_KILL = 17; + DOTA_COMBATLOG_FIRST_BLOOD = 18; + DOTA_COMBATLOG_MODIFIER_STACK_EVENT = 19; + DOTA_COMBATLOG_NEUTRAL_CAMP_STACK = 20; + DOTA_COMBATLOG_PICKUP_RUNE = 21; + DOTA_COMBATLOG_REVEALED_INVISIBLE = 22; + DOTA_COMBATLOG_HERO_SAVED = 23; + DOTA_COMBATLOG_MANA_RESTORED = 24; + DOTA_COMBATLOG_HERO_LEVELUP = 25; + DOTA_COMBATLOG_BOTTLE_HEAL_ALLY = 26; + DOTA_COMBATLOG_ENDGAME_STATS = 27; + DOTA_COMBATLOG_INTERRUPT_CHANNEL = 28; + DOTA_COMBATLOG_ALLIED_GOLD = 29; + DOTA_COMBATLOG_AEGIS_TAKEN = 30; + DOTA_COMBATLOG_MANA_DAMAGE = 31; + DOTA_COMBATLOG_PHYSICAL_DAMAGE_PREVENTED = 32; + DOTA_COMBATLOG_UNIT_SUMMONED = 33; + DOTA_COMBATLOG_ATTACK_EVADE = 34; + DOTA_COMBATLOG_TREE_CUT = 35; + DOTA_COMBATLOG_SUCCESSFUL_SCAN = 36; + DOTA_COMBATLOG_END_KILLSTREAK = 37; + DOTA_COMBATLOG_BLOODSTONE_CHARGE = 38; + DOTA_COMBATLOG_CRITICAL_DAMAGE = 39; + DOTA_COMBATLOG_SPELL_ABSORB = 40; + DOTA_COMBATLOG_UNIT_TELEPORTED = 41; + DOTA_COMBATLOG_KILL_EATER_EVENT = 42; +} + message CDOTAClientHardwareSpecs { optional uint32 logical_processors = 1; optional fixed64 cpu_cycles_per_second = 2; @@ -390,3 +441,78 @@ message CDOTASaveGame { repeated .CDOTASaveGame.SaveInstance save_instances = 4; } +message CMsgDOTACombatLogEntry { + optional .DOTA_COMBATLOG_TYPES type = 1 [default = DOTA_COMBATLOG_INVALID]; + optional uint32 target_name = 2; + optional uint32 target_source_name = 3; + optional uint32 attacker_name = 4; + optional uint32 damage_source_name = 5; + optional uint32 inflictor_name = 6; + optional bool is_attacker_illusion = 7; + optional bool is_attacker_hero = 8; + optional bool is_target_illusion = 9; + optional bool is_target_hero = 10; + optional bool is_visible_radiant = 11; + optional bool is_visible_dire = 12; + optional uint32 value = 13; + optional int32 health = 14; + optional float timestamp = 15; + optional float stun_duration = 16; + optional float slow_duration = 17; + optional bool is_ability_toggle_on = 18; + optional bool is_ability_toggle_off = 19; + optional uint32 ability_level = 20; + optional float location_x = 21; + optional float location_y = 22; + optional uint32 gold_reason = 23; + optional float timestamp_raw = 24; + optional float modifier_duration = 25; + optional uint32 xp_reason = 26; + optional uint32 last_hits = 27; + optional uint32 attacker_team = 28; + optional uint32 target_team = 29; + optional uint32 obs_wards_placed = 30; + optional uint32 assist_player0 = 31; + optional uint32 assist_player1 = 32; + optional uint32 assist_player2 = 33; + optional uint32 assist_player3 = 34; + optional uint32 stack_count = 35; + optional bool hidden_modifier = 36; + optional bool is_target_building = 37; + optional uint32 neutral_camp_type = 38; + optional uint32 rune_type = 39; + repeated uint32 assist_players = 40; + optional bool is_heal_save = 41; + optional bool is_ultimate_ability = 42; + optional uint32 attacker_hero_level = 43; + optional uint32 target_hero_level = 44; + optional uint32 xpm = 45; + optional uint32 gpm = 46; + optional uint32 event_location = 47; + optional bool target_is_self = 48; + optional uint32 damage_type = 49; + optional bool invisibility_modifier = 50; + optional uint32 damage_category = 51; + optional uint32 networth = 52; + optional uint32 building_type = 53; + optional float modifier_elapsed_duration = 54; + optional bool silence_modifier = 55; + optional bool heal_from_lifesteal = 56; + optional bool modifier_purged = 57; + optional bool spell_evaded = 58; + optional bool motion_controller_modifier = 59; + optional bool long_range_kill = 60; + optional uint32 modifier_purge_ability = 61; + optional uint32 modifier_purge_npc = 62; + optional bool root_modifier = 63; + optional uint32 total_unit_death_count = 64; + optional bool aura_modifier = 65; + optional bool armor_debuff_modifier = 66; + optional bool no_physical_damage_modifier = 67; + optional uint32 modifier_ability = 68; + optional bool modifier_hidden = 69; + optional bool inflictor_is_stolen_ability = 70; + optional uint32 kill_eater_event = 71; + optional uint32 unit_status_label = 72; +} + diff --git a/proto/econ_gcmessages.proto b/proto/econ_gcmessages.proto index dc45dac1..f2241c5f 100644 --- a/proto/econ_gcmessages.proto +++ b/proto/econ_gcmessages.proto @@ -98,17 +98,14 @@ enum EGCItemMsg { k_EMsgGCServerRentalsBase = 1700; k_EMsgGCDev_NewItemRequest = 2001; k_EMsgGCDev_NewItemRequestResponse = 2002; - k_EMsgGCStoreGetUserData = 2500; - k_EMsgGCStoreGetUserDataResponse = 2501; + k_EMsgGCDev_UnlockAllItemStylesRequest = 2003; + k_EMsgGCDev_UnlockAllItemStylesResponse = 2004; k_EMsgGCStorePurchaseFinalize = 2504; k_EMsgGCStorePurchaseFinalizeResponse = 2505; k_EMsgGCStorePurchaseCancel = 2506; k_EMsgGCStorePurchaseCancelResponse = 2507; k_EMsgGCStorePurchaseInit = 2510; k_EMsgGCStorePurchaseInitResponse = 2511; - k_EMsgGCBannedWordListRequest = 2512; - k_EMsgGCBannedWordListResponse = 2513; - k_EMsgGCToGCBannedWordListBroadcast = 2514; k_EMsgGCToGCBannedWordListUpdated = 2515; k_EMsgGCToGCDirtySDOCache = 2516; k_EMsgGCToGCDirtyMultipleSDOCache = 2517; @@ -180,9 +177,11 @@ enum EGCItemMsg { k_EMsgGCToGCInternalTestMsg = 2592; k_EMsgGCToGCClientServerVersionsUpdated = 2593; k_EMsgGCUseMultipleItemsRequest = 2594; - k_EMsgGCCheckAccountSubscription = 2595; - k_EMsgGCCheckAccountSubscriptionResponse = 2596; - k_EMsgGCToGCAccountSubscriptionChange = 2597; + k_EMsgGCGetAccountSubscriptionItem = 2595; + k_EMsgGCGetAccountSubscriptionItemResponse = 2596; + k_EMsgGCToGCBroadcastMessageFromSub = 2598; + k_EMsgGCToClientCurrencyPricePoints = 2599; + k_EMsgGCToGCAddSubscriptionTime = 2600; } enum EItemPurgatoryResponse_Finalize { @@ -396,6 +395,12 @@ message CMsgGCToGCCheckAccountTradeStatusResponse { optional uint32 error_code = 2; } +message CMsgGCToGCAddSubscriptionTime { + optional uint32 account_id = 1; + repeated uint32 matching_subscription_def_indexes = 2; + optional uint32 additional_seconds = 3; +} + message CMsgGCToGCGrantAccountRolledItems { message Item { message DynamicAttribute { @@ -511,26 +516,20 @@ message CMsgDevNewItemRequestResponse { optional bool success = 1; } -message CMsgGCCheckAccountSubscription { - optional uint32 account_id = 1; - optional uint32 def_index = 2; +message CMsgDevUnlockAllItemStyles { + optional uint64 item_id = 1; } -message CMsgGCCheckAccountSubscriptionResponse { - enum ESubscriptionState { - STATE_UNKNOWN = 0; - STATE_INACTIVE = 1; - STATE_ACTIVE = 2; - } - - optional .CMsgGCCheckAccountSubscriptionResponse.ESubscriptionState state = 1 [default = STATE_UNKNOWN]; - optional uint32 cache_until = 2; +message CMsgDevUnlockAllItemStylesResponse { + optional bool success = 1; } -message CMsgGCToGCAccountSubscriptionChange { +message CMsgGCGetAccountSubscriptionItem { optional uint32 account_id = 1; - optional uint32 item_definition_index = 2; - optional bool is_subscription_active = 3; +} + +message CMsgGCGetAccountSubscriptionItemResponse { + optional uint32 def_index = 1; } message CMsgGCAddGiftItem { @@ -968,3 +967,20 @@ message CMsgGCToGCClientServerVersionsUpdated { optional uint32 server_deployed_version = 4; } +message CMsgGCToGCBroadcastMessageFromSub { + optional uint32 msg_id = 1; + optional bytes serialized_msg = 2; + repeated uint32 account_id_list = 3 [packed = true]; + repeated fixed64 steam_id_list = 4 [packed = true]; +} + +message CMsgGCToClientCurrencyPricePoints { + message Currency { + optional uint32 currency_id = 1; + repeated uint64 currency_price = 2 [packed = true]; + } + + repeated uint64 price_key = 1 [packed = true]; + repeated .CMsgGCToClientCurrencyPricePoints.Currency currencies = 2; +} + diff --git a/proto/gcsdk_gcmessages.proto b/proto/gcsdk_gcmessages.proto index 03249250..0c39d4d4 100644 --- a/proto/gcsdk_gcmessages.proto +++ b/proto/gcsdk_gcmessages.proto @@ -346,3 +346,38 @@ message CMsgGCToClientPollConvarResponse { optional string convar_value = 2; } +message CGCMsgCompressedMsgToClient { + optional uint32 msg_id = 1; + optional bytes compressed_msg = 2; +} + +message CMsgGCToGCMasterBroadcastMessage { + optional uint32 users_per_second = 1; + optional bool send_to_users = 2; + optional bool send_to_servers = 3; + optional uint32 msg_id = 4; + optional bytes msg_data = 5; +} + +message CMsgGCToGCMasterSubscribeToCache { + optional uint32 soid_type = 1; + optional fixed64 soid_id = 2; + repeated uint32 account_ids = 3; + repeated fixed64 steam_ids = 4; +} + +message CMsgGCToGCMasterSubscribeToCacheResponse { +} + +message CMsgGCToGCMasterUnsubscribeFromCache { + optional uint32 soid_type = 1; + optional fixed64 soid_id = 2; + repeated uint32 account_ids = 3; + repeated fixed64 steam_ids = 4; +} + +message CMsgGCToGCMasterDestroyCache { + optional uint32 soid_type = 1; + optional fixed64 soid_id = 2; +} + diff --git a/proto/gcsystemmsgs.proto b/proto/gcsystemmsgs.proto index 8840092d..df132e52 100644 --- a/proto/gcsystemmsgs.proto +++ b/proto/gcsystemmsgs.proto @@ -93,6 +93,13 @@ enum EGCSystemMsg { k_EGCMsgAccountTwoFactorChange = 520; k_EGCMsgCheckClanMembership = 521; k_EGCMsgCheckClanMembershipResponse = 522; + k_EGCMsgCompressedMsgToClient = 523; + k_EGCMsgGetGamePersonalDataCategoriesRequest = 524; + k_EGCMsgGetGamePersonalDataCategoriesResponse = 525; + k_EGCMsgGetGamePersonalDataEntriesRequest = 526; + k_EGCMsgGetGamePersonalDataEntriesResponse = 527; + k_EGCMsgTerminateGamePersonalDataEntriesRequest = 528; + k_EGCMsgTerminateGamePersonalDataEntriesResponse = 529; } enum ESOMsg { @@ -136,5 +143,49 @@ enum EGCToGCMsg { k_EMsgGCToGCUniverseStartup = 163; k_EMsgGCToGCUniverseStartupResponse = 164; k_EMsgGCToGCForwardAccountDetails = 165; + k_EMsgGCToGCMasterBroadcastMessage = 166; + k_EMsgGCToGCMasterSubscribeToCache = 167; + k_EMsgGCToGCMasterSubscribeToCacheResponse = 168; + k_EMsgGCToGCMasterUnsubscribeFromCache = 169; + k_EMsgGCToGCMasterDestroyCache = 170; +} + +message CCommunity_GamePersonalDataCategoryInfo { + optional string type = 1; + optional string type_localization_token = 2; + optional string template_file = 3; + optional string category = 4; + optional string category_localization_token = 5; +} + +message CCommunity_GetGamePersonalDataCategories_Request { + optional uint32 appid = 1; +} + +message CCommunity_GetGamePersonalDataCategories_Response { + repeated .CCommunity_GamePersonalDataCategoryInfo categories = 1; + optional string app_assets_basename = 2; +} + +message CCommunity_GetGamePersonalDataEntries_Request { + optional uint32 appid = 1; + optional uint64 steamid = 2; + optional string type = 3; + optional string continue_token = 4; +} + +message CCommunity_GetGamePersonalDataEntries_Response { + optional uint32 gceresult = 1; + repeated string entries = 2; + optional string continue_token = 3; +} + +message CCommunity_TerminateGamePersonalDataEntries_Request { + optional uint32 appid = 1; + optional uint64 steamid = 2; +} + +message CCommunity_TerminateGamePersonalDataEntries_Response { + optional uint32 gceresult = 1; } diff --git a/proto/steammessages.proto b/proto/steammessages.proto index f94f0049..2e30f638 100644 --- a/proto/steammessages.proto +++ b/proto/steammessages.proto @@ -409,6 +409,7 @@ message CMsgGCGetAppFriendsList_Response { optional bool success = 1; repeated fixed64 steamids = 2; repeated fixed32 friendship_timestamps = 3; + repeated fixed32 last_playtimes = 4; } message CMsgGCMsgMasterSetDirectory {