import "steammessages.proto";
import "gcsdk_gcmessages.proto";
import "dota_shared_enums.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum ELaneSelection {
	k_ELaneSelection_SAFELANE = 0;
	k_ELaneSelection_OFFLANE = 1;
	k_ELaneSelection_MIDLANE = 2;
	k_ELaneSelection_SUPPORT_SOFT = 3;
	k_ELaneSelection_SUPPORT_HARD = 4;
}

enum ELaneSelectionFlags {
	k_ELaneSelectionFlags_None = 0;
	k_ELaneSelectionFlags_SAFELANE = 1;
	k_ELaneSelectionFlags_OFFLANE = 2;
	k_ELaneSelectionFlags_MIDLANE = 4;
	k_ELaneSelectionFlags_CORE = 7;
	k_ELaneSelectionFlags_SUPPORT_SOFT = 8;
	k_ELaneSelectionFlags_SUPPORT_HARD = 16;
	k_ELaneSelectionFlags_SUPPORT = 24;
	k_ELaneSelectionFlags_ALL = 31;
}

enum EPartyMatchmakingFlags {
	k_EPartyMatchmakingFlags_None = 0;
	k_EPartyMatchmakingFlags_LargeRankSpread = 1;
}

enum EHighPriorityMMState {
	k_EHighPriorityMM_Unknown = 0;
	k_EHighPriorityMM_MissingMMData = 1;
	k_EHighPriorityMM_ResourceMissing = 2;
	k_EHighPriorityMM_ManuallyDisabled = 3;
	k_EHighPriorityMM_Min_Enabled = 64;
	k_EHighPriorityMM_AllRolesSelected = 65;
	k_EHighPriorityMM_UsingResource = 66;
	k_EHighPriorityMM_FiveStack = 67;
	k_EHighPriorityMM_HighDemand = 68;
}

enum LobbyDotaTVDelay {
	LobbyDotaTV_10 = 0;
	LobbyDotaTV_120 = 1;
	LobbyDotaTV_300 = 2;
}

enum LobbyDotaPauseSetting {
	LobbyDotaPauseSetting_Unlimited = 0;
	LobbyDotaPauseSetting_Limited = 1;
	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;
}

enum EMatchBehaviorScoreVariance {
	k_EMatchBehaviorScoreVariance_Invalid = 0;
	k_EMatchBehaviorScoreVariance_Low = 1;
	k_EMatchBehaviorScoreVariance_Medium = 2;
	k_EMatchBehaviorScoreVariance_High = 3;
}

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 bool mm_data_valid = 13;
	optional uint32 lane_selection_flags = 11;
	optional bool high_priority_disabled = 14;
	optional bool has_hp_resource = 15;
	optional bool joined_from_partyfinder = 12;
}

message CSODOTAParty {
	enum State {
		UI = 0;
		FINDING_MATCH = 1;
		IN_MATCH = 2;
	}

	optional uint64 party_id = 1 [(key_field) = true];
	optional fixed64 leader_id = 2;
	repeated fixed64 member_ids = 3;
	optional uint32 game_modes = 4;
	optional .CSODOTAParty.State state = 6 [default = UI];
	optional uint32 effective_started_matchmaking_time = 7;
	optional uint32 raw_started_matchmaking_time = 32;
	optional uint32 attempt_start_time = 33;
	optional uint32 attempt_num = 34;
	optional uint32 matchgroups = 11;
	optional uint32 low_priority_account_id = 19;
	optional .MatchType match_type = 21 [default = MATCH_TYPE_CASUAL];
	optional .DOTABotDifficulty bot_difficulty = 22 [default = BOT_DIFFICULTY_PASSIVE];
	optional uint32 team_id = 23;
	optional string team_name = 51;
	optional uint64 team_ui_logo = 52;
	optional uint64 team_base_logo = 53;
	optional uint32 match_disabled_until_date = 24;
	optional uint32 match_disabled_account_id = 25;
	optional uint32 matchmaking_max_range_minutes = 26;
	optional uint32 matchlanguages = 27;
	repeated .CSODOTAPartyMember members = 29;
	optional uint32 low_priority_games_remaining = 35;
	optional bool open_for_join_requests = 40;
	repeated .CSODOTAPartyInvite sent_invites = 41;
	repeated .CSODOTAPartyInvite recv_invites = 42;
	optional uint32 account_flags = 43;
	optional uint32 region_select_flags = 44;
	optional uint32 exclusive_tournament_id = 45;
	optional uint32 tourney_division_id = 47;
	optional uint32 tourney_schedule_time = 48;
	optional uint32 tourney_skill_level = 49;
	optional uint32 tourney_bracket_round = 50;
	optional uint32 tourney_queue_deadline_time = 54;
	optional .ETourneyQueueDeadlineState tourney_queue_deadline_state = 55 [default = k_ETourneyQueueDeadlineState_Normal];
	optional uint32 party_builder_slots_to_fill = 56;
	optional uint32 party_builder_match_groups = 57;
	optional uint32 party_builder_start_time = 58;
	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;
	optional bool party_search_beacon_active = 66;
	optional uint32 matchmaking_flags = 67;
	optional .EHighPriorityMMState high_priority_state = 68 [default = k_EHighPriorityMM_Unknown];
	optional bool lane_selections_enabled = 69;
}

message CSODOTAPartyInvite {
	message PartyMember {
		optional string name = 1;
		optional fixed64 steam_id = 2;
		optional bool is_coach = 4;
	}

	optional uint64 group_id = 1 [(key_field) = true];
	optional fixed64 sender_id = 2;
	optional string sender_name = 3;
	repeated .CSODOTAPartyInvite.PartyMember members = 4;
	optional uint32 team_id = 5;
	optional bool low_priority_status = 6;
	optional bool as_coach = 7;
	optional fixed64 invite_gid = 8;
}

message CSODOTALobbyInvite {
	message LobbyMember {
		optional string name = 1;
		optional fixed64 steam_id = 2;
	}

	optional uint64 group_id = 1 [(key_field) = true];
	optional fixed64 sender_id = 2;
	optional string sender_name = 3;
	repeated .CSODOTALobbyInvite.LobbyMember members = 4;
	optional uint64 custom_game_id = 5;
	optional fixed64 invite_gid = 6;
	optional fixed64 custom_game_crc = 7;
	optional fixed32 custom_game_timestamp = 8;
}

message CMsgLeaverState {
	optional uint32 lobby_state = 1;
	optional .DOTA_GameState game_state = 2 [default = DOTA_GAMERULES_STATE_INIT];
	optional bool leaver_detected = 3;
	optional bool first_blood_happened = 4;
	optional bool discard_match_results = 5;
	optional bool mass_disconnect = 6;
}

message CDOTALobbyMember {
	message CDOTALobbyMemberXPBonus {
		optional uint32 type = 1;
		optional float xp_bonus = 2;
		optional uint64 source_key = 3;
	}

	optional fixed64 id = 1 [(key_field) = true];
	optional uint32 hero_id = 2;
	optional .DOTA_GC_TEAM team = 3 [default = DOTA_GC_TEAM_GOOD_GUYS];
	optional string name = 6;
	optional uint32 slot = 7;
	optional uint64 party_id = 12;
	optional uint32 meta_level = 13;
	optional uint32 meta_xp = 14;
	optional uint32 meta_xp_awarded = 15;
	optional .DOTALeaverStatus_t leaver_status = 16 [default = DOTA_LEAVER_NONE];
	optional uint32 leaver_actions = 28;
	optional uint32 channel = 17 [default = 6];
	optional uint32 prize_def_index = 18;
	repeated uint32 disabled_hero_id = 20;
	optional .PartnerAccountType partner_account_type = 21 [default = PARTNER_NONE];
	repeated uint32 enabled_hero_id = 22;
	optional .DOTA_GC_TEAM coach_team = 23 [default = DOTA_GC_TEAM_NOTEAM];
	optional uint32 coach_rating = 42;
	optional uint32 pwrd_cyber_cafe_id = 24;
	optional string pwrd_cyber_cafe_name = 25;
	repeated uint32 disabled_random_hero_id = 26 [packed = true];
	repeated fixed32 disabled_random_hero_bits = 41;
	repeated .CDOTALobbyMember.CDOTALobbyMemberXPBonus xp_bonuses = 27;
	optional sint32 rank_change = 29;
	optional bool cameraman = 30;
	repeated uint32 custom_game_product_ids = 31;
	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_plus_subscriber = 36;
	optional bool rank_tier_updated = 37;
	optional uint32 lane_selection_flags = 38;
	optional bool can_earn_rewards = 39;
	optional .DOTA_GC_TEAM live_spectator_team = 40 [default = DOTA_GC_TEAM_NOTEAM];
	optional bool was_mvp_last_game = 43;
	repeated .CMsgPendingEventAward pending_awards = 44;
	repeated .CMsgPendingEventAward pending_awards_on_victory = 45;
	optional .EDOTAMMRBoostType rank_mmr_boost_type = 46 [default = k_EDOTAMMRBoostType_None];
	optional sint32 queue_point_adjustment = 47;
	optional int32 rank_tier = 48;
}

message CLobbyTeamDetails {
	optional string team_name = 1;
	optional string team_tag = 3;
	optional uint32 team_id = 4;
	optional uint64 team_logo = 5;
	optional uint64 team_base_logo = 6;
	optional uint64 team_banner_logo = 7;
	optional bool team_complete = 8;
	optional string team_logo_url = 20;
	optional string guild_name = 9;
	optional string guild_tag = 10;
	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 {
	optional uint32 item_def_index = 2;
	optional bool is_supply_crate = 3;
	optional bool is_timed_drop = 4;
	optional uint32 account_id = 5;
	optional uint32 origin = 6;
}

message CLobbyBroadcastChannelInfo {
	optional uint32 channel_id = 1;
	optional string country_code = 2;
	optional string description = 3;
	optional string language_code = 4;
}

message CSODOTALobby {
	message CExtraMsg {
		optional uint32 id = 1;
		optional bytes contents = 2;
	}

	enum State {
		UI = 0;
		READYUP = 4;
		SERVERSETUP = 1;
		RUN = 2;
		POSTGAME = 3;
		NOTREADY = 5;
		SERVERASSIGN = 6;
	}

	enum LobbyType {
		INVALID = -1;
		CASUAL_MATCH = 0;
		PRACTICE = 1;
		COOP_BOT_MATCH = 4;
		LEGACY_TEAM_MATCH = 5;
		LEGACY_SOLO_QUEUE_MATCH = 6;
		COMPETITIVE_MATCH = 7;
		CASUAL_1V1_MATCH = 8;
		WEEKEND_TOURNEY = 9;
		LOCAL_BOT_MATCH = 10;
		SPECTATOR = 11;
		EVENT_MATCH = 12;
	}

	optional uint64 lobby_id = 1 [(key_field) = true];
	repeated .CDOTALobbyMember members = 2;
	repeated .CDOTALobbyMember left_members = 7;
	optional fixed64 leader_id = 11;
	optional fixed64 server_id = 6 [default = 0];
	optional uint32 game_mode = 3;
	repeated fixed64 pending_invites = 10;
	optional .CSODOTALobby.State state = 4 [default = UI];
	optional string connect = 5;
	optional .CSODOTALobby.LobbyType lobby_type = 12 [default = INVALID];
	optional bool allow_cheats = 13;
	optional bool fill_with_bots = 14;
	optional bool intro_mode = 15;
	optional string game_name = 16;
	repeated .CLobbyTeamDetails team_details = 17;
	optional uint32 tutorial_lesson = 18;
	optional uint32 tournament_id = 19;
	optional uint32 tournament_game_id = 20;
	optional uint32 server_region = 21 [default = 0];
	optional .DOTA_GameState game_state = 22 [default = DOTA_GAMERULES_STATE_INIT];
	optional uint32 num_spectators = 23;
	optional uint32 matchgroup = 25;
	optional .DOTA_CM_PICK cm_pick = 28 [default = DOTA_CM_RANDOM];
	optional uint64 match_id = 30;
	optional bool allow_spectating = 31 [default = true];
	optional .DOTABotDifficulty bot_difficulty_radiant = 36 [default = BOT_DIFFICULTY_HARD];
	optional .DOTAGameVersion game_version = 37 [default = GAME_VERSION_CURRENT];
	repeated .CLobbyTimedRewardDetails timed_reward_details = 38;
	optional string pass_key = 39;
	optional uint32 leagueid = 42;
	optional uint32 penalty_level_radiant = 43 [default = 0];
	optional uint32 penalty_level_dire = 44 [default = 0];
	optional uint32 load_game_id = 45;
	optional uint32 series_type = 46;
	optional uint32 radiant_series_wins = 47;
	optional uint32 dire_series_wins = 48;
	optional uint32 loot_generated = 49;
	optional uint32 loot_awarded = 50;
	optional bool allchat = 51 [default = false];
	optional .LobbyDotaTVDelay dota_tv_delay = 53 [default = LobbyDotaTV_10];
	optional string custom_game_mode = 54;
	optional string custom_map_name = 55;
	optional uint32 custom_difficulty = 56;
	optional bool lan = 57;
	repeated .CLobbyBroadcastChannelInfo broadcast_channel_info = 58;
	optional uint32 first_leaver_accountid = 59;
	optional uint32 series_id = 60;
	optional bool low_priority = 61;
	repeated .CSODOTALobby.CExtraMsg extra_messages = 62;
	optional .CDOTASaveGame save_game = 63;
	optional bool first_blood_happened = 65;
	optional .EMatchOutcome match_outcome = 70 [default = k_EMatchOutcome_Unknown];
	optional bool mass_disconnect = 67;
	optional uint64 custom_game_id = 68;
	optional uint32 custom_min_players = 71;
	optional uint32 custom_max_players = 72;
	optional .PartnerAccountType partner_type = 73 [default = PARTNER_NONE];
	optional .DOTALobbyVisibility visibility = 75 [default = DOTALobbyVisibility_Public];
	optional fixed64 custom_game_crc = 76;
	optional bool custom_game_auto_created_lobby = 77;
	optional fixed32 custom_game_timestamp = 80;
	repeated uint64 previous_series_matches = 81;
	optional uint64 previous_match_override = 82;
	optional bool custom_game_uses_account_records = 83;
	optional uint32 game_start_time = 87;
	optional .LobbyDotaPauseSetting pause_setting = 88 [default = LobbyDotaPauseSetting_Unlimited];
	optional uint32 lobby_mvp_account_id = 89;
	optional uint32 weekend_tourney_division_id = 90;
	optional uint32 weekend_tourney_skill_level = 91;
	optional uint32 weekend_tourney_bracket_round = 92;
	optional .DOTABotDifficulty bot_difficulty_dire = 93 [default = BOT_DIFFICULTY_HARD];
	optional uint64 bot_radiant = 94;
	optional uint64 bot_dire = 95;
	repeated .EEvent event_progression_enabled = 96;
	optional .DOTASelectionPriorityRules selection_priority_rules = 97 [default = k_DOTASelectionPriorityRules_Manual];
	optional uint32 series_previous_selection_priority_team_id = 98;
	optional uint32 series_current_selection_priority_team_id = 99;
	optional .DOTASelectionPriorityChoice series_current_priority_team_choice = 100 [default = k_DOTASelectionPriorityChoice_Invalid];
	optional .DOTASelectionPriorityChoice series_current_non_priority_team_choice = 101 [default = k_DOTASelectionPriorityChoice_Invalid];
	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;
	optional string lan_host_ping_location = 109;
	optional uint32 league_node_id = 110;
	optional uint32 match_duration = 111;
	optional bool custom_game_browseable = 112;
	optional uint32 league_phase = 113;
	optional bool record_detailed_stats = 114;
	optional bool experimental_gameplay_enabled = 116;
}

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];
}

message CMsgLobbyEventGameDetails {
	optional bytes kv_data = 1;
}

message CMsgMatchMatchmakingStats {
	optional uint32 average_queue_time = 1;
	optional uint32 maximum_queue_time = 2;
	optional .EMatchBehaviorScoreVariance behavior_score_variance = 3 [default = k_EMatchBehaviorScoreVariance_Invalid];
}
