import "dota_shared_enums.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum DOTA_2013PassportSelectionIndices {
	PP13_SEL_ALLSTAR_PLAYER_0 = 0;
	PP13_SEL_ALLSTAR_PLAYER_1 = 1;
	PP13_SEL_ALLSTAR_PLAYER_2 = 2;
	PP13_SEL_ALLSTAR_PLAYER_3 = 3;
	PP13_SEL_ALLSTAR_PLAYER_4 = 4;
	PP13_SEL_ALLSTAR_PLAYER_5 = 5;
	PP13_SEL_ALLSTAR_PLAYER_6 = 6;
	PP13_SEL_ALLSTAR_PLAYER_7 = 7;
	PP13_SEL_ALLSTAR_PLAYER_8 = 8;
	PP13_SEL_ALLSTAR_PLAYER_9 = 9;
	PP13_SEL_QUALPRED_WEST_0 = 10;
	PP13_SEL_QUALPRED_WEST_1 = 11;
	PP13_SEL_QUALPRED_WEST_2 = 12;
	PP13_SEL_QUALPRED_WEST_3 = 13;
	PP13_SEL_QUALPRED_WEST_4 = 14;
	PP13_SEL_QUALPRED_WEST_5 = 15;
	PP13_SEL_QUALPRED_WEST_6 = 16;
	PP13_SEL_QUALPRED_WEST_7 = 17;
	PP13_SEL_QUALPRED_WEST_8 = 18;
	PP13_SEL_QUALPRED_WEST_9 = 19;
	PP13_SEL_QUALPRED_WEST_10 = 20;
	PP13_SEL_QUALPRED_WEST_11 = 21;
	PP13_SEL_QUALPRED_WEST_12 = 22;
	PP13_SEL_QUALPRED_WEST_13 = 23;
	PP13_SEL_QUALPRED_WEST_14 = 24;
	PP13_SEL_QUALPRED_EAST_0 = 25;
	PP13_SEL_QUALPRED_EAST_1 = 26;
	PP13_SEL_QUALPRED_EAST_2 = 27;
	PP13_SEL_QUALPRED_EAST_3 = 28;
	PP13_SEL_QUALPRED_EAST_4 = 29;
	PP13_SEL_QUALPRED_EAST_5 = 30;
	PP13_SEL_QUALPRED_EAST_6 = 31;
	PP13_SEL_QUALPRED_EAST_7 = 32;
	PP13_SEL_QUALPRED_EAST_8 = 33;
	PP13_SEL_QUALPRED_EAST_9 = 34;
	PP13_SEL_QUALPRED_EAST_10 = 35;
	PP13_SEL_QUALPRED_EAST_11 = 36;
	PP13_SEL_QUALPRED_EAST_12 = 37;
	PP13_SEL_QUALPRED_EAST_13 = 38;
	PP13_SEL_QUALPRED_EAST_14 = 39;
	PP13_SEL_TEAMCUP_TEAM = 40;
	PP13_SEL_TEAMCUP_PLAYER = 41;
	PP13_SEL_TEAMCUP_TEAM_LOCK = 42;
	PP13_SEL_TEAMCUP_PLAYER_LOCK = 43;
	PP13_SEL_EVENTPRED_0 = 44;
	PP13_SEL_EVENTPRED_1 = 45;
	PP13_SEL_EVENTPRED_2 = 46;
	PP13_SEL_EVENTPRED_3 = 47;
	PP13_SEL_EVENTPRED_4 = 48;
	PP13_SEL_EVENTPRED_5 = 49;
	PP13_SEL_EVENTPRED_6 = 50;
	PP13_SEL_EVENTPRED_7 = 51;
	PP13_SEL_EVENTPRED_8 = 52;
	PP13_SEL_EVENTPRED_9 = 53;
	PP13_SEL_EVENTPRED_10 = 54;
	PP13_SEL_EVENTPRED_11 = 55;
	PP13_SEL_EVENTPRED_12 = 56;
	PP13_SEL_EVENTPRED_13 = 57;
	PP13_SEL_EVENTPRED_14 = 58;
	PP13_SEL_EVENTPRED_15 = 59;
	PP13_SEL_EVENTPRED_16 = 60;
	PP13_SEL_EVENTPRED_17 = 61;
	PP13_SEL_EVENTPRED_18 = 62;
	PP13_SEL_EVENTPRED_19 = 63;
	PP13_SEL_EVENTPRED_20 = 64;
	PP13_SEL_EVENTPRED_21 = 65;
	PP13_SEL_EVENTPRED_22 = 66;
	PP13_SEL_EVENTPRED_23 = 67;
	PP13_SEL_EVENTPRED_24 = 68;
	PP13_SEL_EVENTPRED_25 = 69;
	PP13_SEL_EVENTPRED_26 = 70;
	PP13_SEL_EVENTPRED_27 = 71;
	PP13_SEL_EVENTPRED_28 = 72;
	PP13_SEL_EVENTPRED_29 = 73;
	PP13_SEL_EVENTPRED_30 = 74;
	PP13_SEL_EVENTPRED_31 = 75;
	PP13_SEL_EVENTPRED_32 = 76;
	PP13_SEL_EVENTPRED_33 = 77;
	PP13_SEL_EVENTPRED_34 = 78;
	PP13_SEL_EVENTPRED_35 = 79;
	PP13_SEL_EVENTPRED_36 = 80;
	PP13_SEL_EVENTPRED_37 = 81;
	PP13_SEL_EVENTPRED_38 = 82;
	PP13_SEL_EVENTPRED_39 = 83;
	PP13_SEL_EVENTPRED_40 = 84;
	PP13_SEL_EVENTPRED_41 = 85;
	PP13_SEL_EVENTPRED_42 = 86;
	PP13_SEL_EVENTPRED_43 = 87;
	PP13_SEL_SOLO_0 = 88;
	PP13_SEL_SOLO_1 = 89;
	PP13_SEL_SOLO_2 = 90;
	PP13_SEL_SOLO_3 = 91;
	PP13_SEL_SOLO_4 = 92;
	PP13_SEL_SOLO_5 = 93;
	PP13_SEL_SOLO_6 = 94;
	PP13_SEL_SOLO_7 = 95;
}

message CMsgDOTAPlayerInfo {
	message Results {
		optional uint32 league_id = 1;
		optional uint32 placement = 2;
		optional uint32 earnings = 3;
	}

	message AuditEntry {
		optional uint32 start_timestamp = 1;
		optional uint32 end_timestamp = 2;
		optional uint32 team_id = 3;
		optional string team_name = 4;
		optional string team_tag = 5;
		optional string team_url_logo = 6;
	}

	optional uint32 account_id = 1;
	optional string name = 2;
	optional string country_code = 3;
	optional .Fantasy_Roles fantasy_role = 4 [default = FANTASY_ROLE_UNDEFINED];
	optional uint32 team_id = 5;
	optional string team_name = 6;
	optional string team_tag = 7;
	optional string sponsor = 8;
	optional bool is_locked = 9;
	optional bool is_pro = 10;
	optional string real_name = 11;
	optional uint32 birthdate = 12;
	optional uint32 total_earnings = 13;
	repeated .CMsgDOTAPlayerInfo.Results results = 14;
	optional string team_url_logo = 15;
	repeated .CMsgDOTAPlayerInfo.AuditEntry audit_entries = 16;
}

message CMsgDOTAPlayerInfoList {
	repeated .CMsgDOTAPlayerInfo player_infos = 1;
}

message CMsgDOTADPCProfileInfo {
	message PredictionInfo {
		optional uint32 percent = 1;
		optional int32 shard_winnings = 2;
	}

	message FantasyInfo {
		optional uint32 top_90_finishes = 1;
		optional uint32 top_75_finishes = 2;
		optional uint32 top_50_finishes = 3;
		optional uint32 shard_winnings = 4;
	}

	optional .CMsgDOTAPlayerInfo player_info = 1;
	optional .CMsgDOTADPCProfileInfo.PredictionInfo prediction_info = 2;
	optional .CMsgDOTADPCProfileInfo.FantasyInfo fantasy_info = 3;
	repeated uint32 disabled_notifications = 4;
}

message CMsgDOTALeaderboards {
	message RegionLeaderboard {
		optional uint32 division = 1;
		repeated uint32 account_ids = 2;
	}

	repeated .CMsgDOTALeaderboards.RegionLeaderboard leaderboards = 2;
}

message CMsgDOTACreateFantasyLeagueRequest {
	optional string league_name = 1;
	optional uint64 league_logo = 2;
	optional .Fantasy_Selection_Mode selection_mode = 3 [default = FANTASY_SELECTION_INVALID];
	optional uint32 team_count = 4;
}

message CMsgDOTACreateFantasyLeagueResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_TOO_MANY_LEAGUES = 2;
		ERROR_INVALID_TEAM_COUNT = 3;
		ERROR_CREATION_DISABLED = 4;
	}

	optional .CMsgDOTACreateFantasyLeagueResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgFantasyLeagueScoring {
	optional float level = 1;
	optional float kills = 2;
	optional float deaths = 3;
	optional float assists = 4;
	optional float last_hits = 5;
	optional float denies = 6;
	optional float gpm = 7;
	optional float xppm = 8;
	optional float stuns = 9;
	optional float healing = 10;
	optional float tower_kills = 11;
	optional float roshan_kills = 12;
	optional float multiplier_premium = 13;
	optional float multiplier_professional = 14;
}

message CMsgDOTAFantasyLeagueInfo {
	message OwnerInfo {
		optional uint32 owner_account_id = 1;
		optional bool left_league = 2;
		repeated uint32 player_account_id = 3;
	}

	optional uint32 fantasy_league_id = 1;
	optional uint32 commissioner_account_id = 2;
	optional string fantasy_league_name = 3;
	optional .Fantasy_Selection_Mode selection_mode = 4 [default = FANTASY_SELECTION_INVALID];
	optional uint32 team_count = 5;
	optional uint64 logo = 6;
	optional .CMsgFantasyLeagueScoring scoring = 7;
	optional uint32 draft_time = 12;
	optional uint32 draft_pick_time = 13;
	optional uint32 season_start = 15;
	optional uint32 season_length = 16;
	optional uint32 veto_votes = 17;
	optional uint32 acquisitions = 18;
	optional uint32 slot_1 = 19;
	optional uint32 slot_2 = 20;
	optional uint32 slot_3 = 21;
	optional uint32 slot_4 = 22;
	optional uint32 slot_5 = 23;
	optional uint32 bench_slots = 24;
	repeated .CMsgDOTAFantasyLeagueInfo.OwnerInfo owner_info = 25;
	repeated uint32 players = 26;
	optional uint32 time_zone = 27;
	optional uint32 season = 28;
	optional string password = 29;
}

message CMsgDOTAFantasyLeagueEditInfoRequest {
	optional uint32 fantasy_league_id = 1;
	optional .CMsgDOTAFantasyLeagueInfo edit_info = 2;
}

message CMsgDOTAFantasyLeagueEditInfoResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
	}

	optional .CMsgDOTAFantasyLeagueEditInfoResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyLeagueFindRequest {
	optional uint32 fantasy_league_id = 1;
	optional string password = 2;
}

message CMsgDOTAFantasyLeagueFindResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_LEAGUE_NOT_FOUND = 1;
		ERROR_BAD_PASSWORD = 2;
		ERROR_UNSPECIFIED = 3;
		ERROR_FULL = 4;
		ERROR_ALREADY_MEMBER = 5;
		ERROR_LEAGUE_LOCKED = 6;
	}

	optional .CMsgDOTAFantasyLeagueFindResponse.EResult result = 1 [default = SUCCESS];
	optional string fantasy_league_name = 2;
	optional string commissioner_name = 3;
}

message CMsgDOTAFantasyLeagueInfoRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyLeagueInfoResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_BAD_LEAGUE_ID = 2;
	}

	optional .CMsgDOTAFantasyLeagueInfoResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyLeagueMatchupsRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyLeagueMatchupsResponse {
	message Matchup {
		optional uint32 owner_account_id_1 = 1;
		optional uint32 owner_account_id_2 = 2;
		optional float score_1 = 3;
		optional float score_2 = 4;
	}

	message WeeklyMatchups {
		repeated .CMsgDOTAFantasyLeagueMatchupsResponse.Matchup matchup = 1;
		optional uint32 start_time = 2;
		optional uint32 end_time = 3;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_BAD_LEAGUE_ID = 2;
		ERROR_NO_PERMISSION = 3;
	}

	optional .CMsgDOTAFantasyLeagueMatchupsResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_league_id = 2;
	repeated .CMsgDOTAFantasyLeagueMatchupsResponse.WeeklyMatchups weekly_matchups = 3;
}

message CMsgDOTAEditFantasyTeamRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional string team_name = 3;
	optional uint64 team_logo = 4;
}

message CMsgDOTAEditFantasyTeamResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_INVALID_TEAM_INFO = 2;
		ERROR_NAME_ALREADY_TAKEN = 3;
		ERROR_NO_PERMISSION = 4;
	}

	optional .CMsgDOTAEditFantasyTeamResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyTeamInfoRequestByFantasyLeagueID {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyTeamInfoRequestByOwnerAccountID {
	optional uint32 owner_account_id = 1;
}

message CMsgDOTAFantasyTeamInfoResponse {
	repeated .CMsgDOTAFantasyTeamInfo results = 1;
}

message CMsgDOTAFantasyTeamInfo {
	optional uint32 fantasy_league_id = 1;
	optional uint32 owner_account_id = 2;
	optional uint32 fantasy_team_index = 3;
	optional string team_name = 4;
	optional uint64 team_logo = 5;
	optional uint32 wins = 6;
	optional uint32 losses = 7;
	repeated uint32 current_roster = 8;
}

message CMsgDOTAFantasyTeamScoreRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 owner_account_id = 2;
	optional uint32 fantasy_team_index = 3;
	optional uint64 filter_match_id = 4;
	optional uint32 filter_start_time = 5;
	optional uint32 filter_end_time = 6;
	optional bool include_bench = 7;
}

message CMsgDOTAFantasyTeamScoreResponse {
	message CMsgPlayerScore {
		optional uint32 account_id = 1;
		optional float score = 2;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_OWNER_NOT_IN_LEAGUE = 3;
	}

	optional .CMsgDOTAFantasyTeamScoreResponse.EResult result = 1 [default = SUCCESS];
	optional float fantasy_team_score = 2;
	repeated .CMsgDOTAFantasyTeamScoreResponse.CMsgPlayerScore fantasy_player_score = 3;
}

message CMsgDOTAFantasyTeamStandingsRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 count = 2;
	optional uint32 filter_start_time = 3;
	optional uint32 filter_end_time = 4;
	optional uint64 filter_match_id = 5;
	optional bool filter_last_match = 6;
	optional bool filter_in_hall = 7;
}

message CMsgDOTAFantasyTeamStandingsResponse {
	message CMsgTeamScore {
		optional uint32 fantasy_league_id = 1;
		optional uint32 owner_account_id = 2;
		optional uint32 fantasy_team_index = 3;
		optional uint64 fantasy_team_logo = 4;
		optional string owner_name = 5;
		optional string fantasy_team_name = 6;
		optional float score = 7;
		optional float score_against = 8;
		optional uint32 wins = 9;
		optional uint32 losses = 10;
		optional int32 streak = 11;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
	}

	optional .CMsgDOTAFantasyTeamStandingsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyTeamStandingsResponse.CMsgTeamScore team_scores = 3;
}

message CMsgDOTAFantasyPlayerScoreRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 player_account_id = 2;
	optional uint32 filter_start_time = 3;
	optional uint32 filter_end_time = 4;
	optional uint64 filter_match_id = 5;
	optional bool filter_last_match = 6;
}

message CMsgDOTAFantasyPlayerScoreResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
	}

	optional .CMsgDOTAFantasyPlayerScoreResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_league_id = 2;
	optional uint32 player_account_id = 3;
	optional string player_name = 4;
	optional float score = 5;
}

message CMsgDOTAFantasyPlayerStandingsRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 count = 2;
	optional uint32 role = 3;
	optional uint32 filter_start_time = 4;
	optional uint32 filter_end_time = 5;
	optional uint64 filter_match_id = 6;
	optional bool filter_last_match = 7;
}

message CMsgDOTAFantasyPlayerStandingsResponse {
	message CMsgPlayerScore {
		optional uint32 player_account_id = 1;
		optional string player_name = 2;
		optional float score = 3;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
	}

	optional .CMsgDOTAFantasyPlayerStandingsResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_league_id = 2;
	optional uint32 role = 3;
	repeated .CMsgDOTAFantasyPlayerStandingsResponse.CMsgPlayerScore player_scores = 4;
}

message CMsgDOTAFantasyLeagueCreateRequest {
	optional uint32 season_id = 1;
	optional string fantasy_league_name = 2;
	optional string password = 3;
	optional string team_name = 4;
	optional uint64 logo = 5;
	optional uint64 ticket_item_id = 6;
}

message CMsgDOTAFantasyLeagueCreateResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_NO_PERMISSION = 1;
		ERROR_BAD_SEASON_ID = 2;
		ERROR_BAD_LEAGUE_NAME = 3;
		ERROR_BAD_TEAM_NAME = 4;
		ERROR_UNSPECIFIED = 5;
		ERROR_FAILED_LOGO_UPLOAD = 6;
		ERROR_NO_TICKET = 7;
	}

	optional .CMsgDOTAFantasyLeagueCreateResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_league_id = 2;
}

message CMsgDOTAFantasyTeamCreateRequest {
	optional uint32 fantasy_league_id = 1;
	optional string password = 2;
	optional string team_name = 3;
	optional uint64 logo = 4;
	optional uint64 ticket_item_id = 5;
}

message CMsgDOTAFantasyTeamCreateResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_NO_PERMISSION = 1;
		ERROR_FAILED_LOGO_UPLOAD = 2;
		ERROR_BAD_FANTASY_LEAGUE_ID = 3;
		ERROR_BAD_NAME = 4;
		ERROR_FULL = 5;
		ERROR_ALREADY_MEMBER = 6;
		ERROR_BAD_PASSWORD = 7;
		ERROR_UNSPECIFIED = 8;
		ERROR_NO_TICKET = 9;
		ERROR_LEAGUE_LOCKED = 10;
	}

	optional .CMsgDOTAFantasyTeamCreateResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_team_index = 2;
}

message CMsgDOTAFantasyLeagueEditInvitesRequest {
	message InviteChange {
		optional uint32 account_id = 1;
		optional bool invited = 2;
	}

	optional uint32 fantasy_league_id = 1;
	optional string password = 2;
	repeated .CMsgDOTAFantasyLeagueEditInvitesRequest.InviteChange invite_change = 3;
}

message CMsgDOTAFantasyLeagueEditInvitesResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
	}

	optional .CMsgDOTAFantasyLeagueEditInvitesResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyLeagueDraftStatusRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyLeagueDraftStatus {
	optional uint32 fantasy_league_id = 1;
	repeated uint32 draft_order = 2;
	optional uint32 current_pick = 3;
	optional uint32 time_remaining = 4;
	optional bool pending_resume = 5;
	optional bool completed = 6;
	repeated uint32 available_players = 7;
}

message CMsgDOTAFantasyLeagueDraftPlayerRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional uint32 player_account_id = 3;
}

message CMsgDOTAFantasyLeagueDraftPlayerResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_INVALID_FANTASY_LEAGUE = 2;
		ERROR_FANTASY_LEAGUE_NOT_DRAFTING = 3;
		ERROR_OWNER_NOT_IN_LEAGUE = 4;
		ERROR_NOT_OWNERS_TURN = 5;
		ERROR_PLAYER_INVALID = 6;
		ERROR_PLAYER_UNAVAILABLE = 7;
		ERROR_PLAYER_NO_VALID_SLOTS = 8;
	}

	optional .CMsgDOTAFantasyLeagueDraftPlayerResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyTeamRosterSwapRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional uint32 timestamp = 3;
	optional uint32 slot_1 = 4;
	optional uint32 slot_2 = 5;
}

message CMsgDOTAFantasyTeamRosterSwapResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_OWNER_NOT_IN_LEAGUE = 2;
		ERROR_SLOTS_INVALID = 3;
		ERROR_SLOT_LOCKED = 4;
	}

	optional .CMsgDOTAFantasyTeamRosterSwapResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyTeamRosterAddDropRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional uint32 add_account_id = 5;
	optional uint32 drop_account_id = 6;
}

message CMsgDOTAFantasyTeamRosterAddDropResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_OWNER_NOT_IN_LEAGUE = 2;
		ERROR_PLAYER_NOT_AVAILABLE = 3;
		ERROR_PLAYER_NOT_ON_TEAM = 4;
		ERROR_TRADE_ALREADY_PENDING = 5;
	}

	optional .CMsgDOTAFantasyTeamRosterAddDropResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyTeamTradesRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyTeamTradesResponse {
	message Trade {
		optional uint32 timestamp = 1;
		optional uint32 owner_account_id_1 = 2;
		optional uint32 owner_account_id_2 = 3;
		optional uint32 player_account_id_1 = 4;
		optional uint32 player_account_id_2 = 5;
		optional uint32 status = 6;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
	}

	optional .CMsgDOTAFantasyTeamTradesResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyTeamTradesResponse.Trade trades = 2;
}

message CMsgDOTAFantasyTeamTradeCancelRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index_1 = 3;
	optional uint32 owner_account_id_2 = 4;
	optional uint32 team_index_2 = 5;
}

message CMsgDOTAFantasyTeamTradeCancelResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_NO_TRADE = 3;
	}

	optional .CMsgDOTAFantasyTeamTradeCancelResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyTeamRosterRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional uint32 owner_account_id = 3;
	optional uint32 timestamp = 4;
}

message CMsgDOTAFantasyTeamRosterResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_OWNER_NOT_IN_LEAGUE = 3;
	}

	optional .CMsgDOTAFantasyTeamRosterResponse.EResult result = 1 [default = SUCCESS];
	repeated uint32 player_account_ids = 2;
	repeated bool player_locked = 3;
}

message CMsgDOTAFantasyPlayerHisoricalStatsRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyPlayerHisoricalStatsResponse {
	message PlayerScoreAccumulator {
		optional uint32 matches = 1;
		optional float levels = 2;
		optional float kills = 3;
		optional float deaths = 4;
		optional float assists = 5;
		optional float last_hits = 6;
		optional float denies = 7;
		optional float gpm = 8;
		optional float xppm = 9;
		optional float stuns = 10;
		optional float healing = 11;
		optional float tower_kills = 12;
		optional float roshan_kills = 13;
		optional float score = 14;
	}

	message PlayerStats {
		optional uint32 account_id = 1;
		optional uint32 weeks = 2;
		optional .CMsgDOTAFantasyPlayerHisoricalStatsResponse.PlayerScoreAccumulator stats_premium = 4;
		optional .CMsgDOTAFantasyPlayerHisoricalStatsResponse.PlayerScoreAccumulator stats_professional = 5;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
	}

	optional .CMsgDOTAFantasyPlayerHisoricalStatsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyPlayerHisoricalStatsResponse.PlayerStats stats = 2;
}

message CMsgDOTAFantasyMessageAdd {
	optional uint32 fantasy_league_id = 1;
	optional string message = 2;
}

message CMsgDOTAFantasyMessagesRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 start_message = 2;
	optional uint32 end_message = 3;
}

message CMsgDOTAFantasyMessagesResponse {
	message Message {
		optional uint32 message_id = 1;
		optional string message = 2;
		optional uint32 author_account_id = 3;
		optional uint32 time = 4;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
	}

	optional .CMsgDOTAFantasyMessagesResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyMessagesResponse.Message messages = 2;
	optional uint32 num_total_messages = 3;
}

message CMsgDOTAFantasyRemoveOwner {
	optional uint32 fantasy_league_id = 1;
	optional uint32 owner_account_id = 2;
	optional uint32 team_index = 3;
}

message CMsgDOTAFantasyRemoveOwnerResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_LEAGUE_LOCKED = 3;
		ERROR_NOT_A_MEMBER = 4;
	}

	optional .CMsgDOTAFantasyRemoveOwnerResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyScheduledMatchesRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyScheduledMatchesResponse {
	message ScheduledMatchDays {
		optional uint32 timestamp = 1;
		repeated uint32 team_ids = 2;
		repeated uint32 league_ids = 3;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
	}

	optional .CMsgDOTAFantasyScheduledMatchesResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyScheduledMatchesResponse.ScheduledMatchDays scheduled_match_days = 2;
}

message CMsgDOTAFantasyLeaveLeagueRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 fantasy_team_index = 2;
}

message CMsgDOTAFantasyLeaveLeagueResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NOT_MEMBER = 2;
		ERROR_LEAGUE_NOT_FOUND = 3;
		ERROR_DRAFT_ACTIVE = 4;
	}

	optional .CMsgDOTAFantasyLeaveLeagueResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyPlayerScoreDetailsRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 player_account_id = 2;
	optional uint32 start_time = 3;
	optional uint32 end_time = 4;
}

message CMsgDOTAFantasyPlayerScoreDetailsResponse {
	message PlayerMatchData {
		optional uint64 match_id = 1;
		optional uint32 series_id = 2;
		optional uint32 series_num = 3;
		optional uint32 series_type = 4;
		optional uint32 league_tier = 5;
		optional uint32 league_id = 6;
		optional uint32 opposing_team_id = 7;
		optional uint64 opposing_team_logo = 8;
		optional string opposing_team_name = 9;
		optional uint32 owned_by = 11;
		optional bool benched = 12;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NOT_MEMBER = 2;
	}

	optional .CMsgDOTAFantasyPlayerScoreDetailsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyPlayerScoreDetailsResponse.PlayerMatchData data = 2;
}

message CMsgDOTAPassportVoteTeamGuess {
	optional uint32 league_id = 1;
	optional uint32 winner_id = 2;
	optional uint32 runnerup_id = 3;
}

message CMsgDOTAPassportVoteGenericSelection {
	optional .DOTA_2013PassportSelectionIndices selection_index = 1 [default = PP13_SEL_ALLSTAR_PLAYER_0];
	optional uint32 selection = 2;
}

message CMsgDOTAPassportStampedPlayer {
	optional uint64 steam_id = 1;
	optional uint32 stamp_level = 2;
}

message CMsgDOTAPassportPlayerCardChallenge {
	optional uint32 challenge_id = 1;
}

message CMsgDOTAPassportVote {
	repeated .CMsgDOTAPassportVoteTeamGuess team_votes = 1;
	repeated .CMsgDOTAPassportVoteGenericSelection generic_selections = 2;
	repeated .CMsgDOTAPassportStampedPlayer stamped_players = 3;
	repeated .CMsgDOTAPassportPlayerCardChallenge player_card_challenges = 4;
}

message CMsgClientToGCGetPlayerCardRosterRequest {
	optional uint32 league_id = 1;
	optional uint32 timestamp = 2;
}

message CMsgClientToGCGetPlayerCardRosterResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_INVALID_LEAGUE_ID = 2;
		ERROR_INVALID_TIMESTAMP = 3;
	}

	optional .CMsgClientToGCGetPlayerCardRosterResponse.Result result = 1 [default = SUCCESS];
	repeated uint64 player_card_item_id = 2;
	optional float score = 3;
	optional bool finalized = 4;
	optional float percentile = 5;
}

message CMsgClientToGCSetPlayerCardRosterRequest {
	optional uint32 league_id = 1;
	optional uint32 timestamp = 2;
	optional uint32 slot = 3;
	optional uint64 player_card_item_id = 4;
	optional uint32 event_id = 5;
}

message CMsgClientToGCSetPlayerCardRosterResponse {
	enum Result {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_INVALID_LEAGUE_ID = 2;
		ERROR_INVALID_TIMESTAMP = 3;
		ERROR_PLAYER_CARD_NOT_OWNED = 4;
		ERROR_INVALID_SLOT = 5;
		ERROR_FAILED_CARD_INFO = 6;
		ERROR_ACCOUNT_DUPLICATE = 7;
		ERROR_LOCKED_TIMESTAMP = 8;
	}

	optional .CMsgClientToGCSetPlayerCardRosterResponse.Result result = 1 [default = SUCCESS];
}

message CMsgDOTAFantasyDPCLeagueStatus {
	message LeagueInfo {
		optional uint32 league_id = 1;
		optional string league_name = 2;
		optional uint32 start_timestamp = 3;
		optional uint32 end_timestamp = 4;
		repeated uint32 day_timestamps = 5;
		optional .CMsgDOTAFantasyDPCLeagueStatus.ERosterStatus status = 8 [default = UNSET];
	}

	enum ERosterStatus {
		UNSET = 0;
		PARTIAL = 1;
		FULL = 2;
		CONCLUDED = 3;
	}

	repeated .CMsgDOTAFantasyDPCLeagueStatus.LeagueInfo league_infos = 1;
}
