import "dota_shared_enums.proto";
import "dota_gcmessages_common.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

message CSourceTVGameSmall {
	message Player {
		optional uint32 account_id = 1;
		optional uint32 hero_id = 2;
	}

	optional uint32 activate_time = 1;
	optional uint32 deactivate_time = 2;
	optional uint64 server_steam_id = 3;
	optional uint64 lobby_id = 4;
	optional uint32 league_id = 5;
	optional uint32 lobby_type = 6;
	optional int32 game_time = 7;
	optional uint32 delay = 8;
	optional uint32 spectators = 9;
	optional uint32 game_mode = 10;
	optional uint32 average_mmr = 11;
	optional string team_name_radiant = 15;
	optional string team_name_dire = 16;
	optional fixed64 team_logo_radiant = 24;
	optional fixed64 team_logo_dire = 25;
	optional uint32 sort_score = 17;
	optional float last_update_time = 18;
	optional int32 radiant_lead = 19;
	optional uint32 radiant_score = 20;
	optional uint32 dire_score = 21;
	repeated .CSourceTVGameSmall.Player players = 22;
	optional fixed32 building_state = 23;
	optional uint32 weekend_tourney_tournament_id = 26;
	optional uint32 weekend_tourney_division = 27;
	optional uint32 weekend_tourney_skill_level = 28;
	optional uint32 weekend_tourney_bracket_round = 29;
}

message CMsgClientToGCFindTopSourceTVGames {
	optional string search_key = 1;
	optional uint32 league_id = 2;
	optional uint32 hero_id = 3;
	optional uint32 start_game = 4;
	optional uint32 game_list_index = 5;
	repeated uint64 lobby_ids = 6;
}

message CMsgGCToClientFindTopSourceTVGamesResponse {
	optional string search_key = 1;
	optional uint32 league_id = 2;
	optional uint32 hero_id = 3;
	optional uint32 start_game = 4;
	optional uint32 num_games = 5;
	optional uint32 game_list_index = 6;
	repeated .CSourceTVGameSmall game_list = 7;
	optional bool specific_games = 8;
	optional .CSourceTVGameSmall bot_game = 9;
}

message CMsgGCToClientTopWeekendTourneyGames {
	repeated .CSourceTVGameSmall live_games = 1;
}

message CMsgClientToGCTopMatchesRequest {
	optional uint32 hero_id = 1;
	optional uint32 player_account_id = 2;
	optional uint32 team_id = 3;
}

message CMsgClientToGCTopLeagueMatchesRequest {
}

message CMsgClientToGCTopFriendMatchesRequest {
}

message CMsgClientToGCMatchesMinimalRequest {
	repeated uint64 match_ids = 1;
}

message CMsgClientToGCMatchesMinimalResponse {
	repeated .CMsgDOTAMatchMinimal matches = 1;
	optional bool last_match = 2;
}

message CMsgGCToClientTopLeagueMatchesResponse {
	repeated .CMsgDOTAMatchMinimal matches = 2;
}

message CMsgGCToClientTopFriendMatchesResponse {
	repeated .CMsgDOTAMatchMinimal matches = 1;
}

message CMsgClientToGCFindTopMatches {
	optional uint32 start_game = 1;
	optional uint32 league_id = 2;
	optional uint32 hero_id = 3;
	optional uint32 friend_id = 4;
	optional bool friend_list = 5;
	optional bool league_list = 6;
}

message CMsgGCToClientFindTopLeagueMatchesResponse {
	optional uint32 start_game = 1;
	optional uint32 league_id = 2;
	optional uint32 hero_id = 3;
	repeated uint32 match_ids = 4;
	repeated .CMsgDOTAMatch matches = 5;
}

message CMsgSpectateFriendGame {
	optional fixed64 steam_id = 1;
}

message CMsgSpectateFriendGameResponse {
	optional fixed64 server_steamid = 4;
}

message CMsgDOTAMatchMinimal {
	message Player {
		optional uint32 account_id = 1;
		optional uint32 hero_id = 2;
		optional uint32 kills = 3;
		optional uint32 deaths = 4;
		optional uint32 assists = 5;
		repeated uint32 items = 6;
		optional uint32 player_slot = 7;
	}

	message Tourney {
		optional uint32 league_id = 1;
		optional uint32 series_type = 8;
		optional uint32 series_game = 9;
		optional uint32 weekend_tourney_tournament_id = 10;
		optional uint32 weekend_tourney_season_trophy_id = 11;
		optional uint32 weekend_tourney_division = 12;
		optional uint32 weekend_tourney_skill_level = 13;
		optional uint32 radiant_team_id = 2;
		optional string radiant_team_name = 3;
		optional fixed64 radiant_team_logo = 4;
		optional uint32 dire_team_id = 5;
		optional string dire_team_name = 6;
		optional fixed64 dire_team_logo = 7;
	}

	optional uint64 match_id = 1;
	optional fixed32 start_time = 2;
	optional uint32 duration = 3;
	optional .DOTA_GameMode game_mode = 4 [default = DOTA_GAMEMODE_NONE];
	repeated .CMsgDOTAMatchMinimal.Player players = 6;
	optional .CMsgDOTAMatchMinimal.Tourney tourney = 7;
	optional .EMatchOutcome match_outcome = 8 [default = k_EMatchOutcome_Unknown];
}

message CDOTAReplayDownloadInfo {
	message Highlight {
		optional uint32 timestamp = 1;
		optional string description = 2;
	}

	optional .CMsgDOTAMatchMinimal match = 1;
	optional string title = 2;
	optional string description = 3;
	optional uint32 size = 4;
	repeated string tags = 5;
	optional bool exists_on_disk = 6;
}

message CMsgWatchGame {
	optional fixed64 server_steamid = 1;
	optional uint32 client_version = 2;
	optional fixed64 watch_server_steamid = 3;
	optional uint64 lobby_id = 4;
	repeated uint32 regions = 5;
}

message CMsgCancelWatchGame {
}

message CMsgWatchGameResponse {
	enum WatchGameResult {
		PENDING = 0;
		READY = 1;
		GAMESERVERNOTFOUND = 2;
		UNAVAILABLE = 3;
		CANCELLED = 4;
		INCOMPATIBLEVERSION = 5;
		MISSINGLEAGUESUBSCRIPTION = 6;
		LOBBYNOTFOUND = 7;
	}

	optional .CMsgWatchGameResponse.WatchGameResult watch_game_result = 1 [default = PENDING];
	optional uint32 source_tv_public_addr = 2;
	optional uint32 source_tv_private_addr = 3;
	optional uint32 source_tv_port = 4;
	optional fixed64 game_server_steamid = 5;
	optional fixed64 watch_server_steamid = 6;
	optional fixed64 watch_tv_unique_secret_code = 7;
}

message CMsgPartyLeaderWatchGamePrompt {
	optional fixed64 game_server_steamid = 5;
}

message CDOTABroadcasterInfo {
	optional uint32 account_id = 1;
	optional fixed64 server_steam_id = 2;
	optional bool live = 3;
	optional string team_name_radiant = 4;
	optional string team_name_dire = 5;
	optional string stage_name = 6;
	optional uint32 series_game = 7;
	optional uint32 series_type = 8;
	optional uint32 upcoming_broadcast_timestamp = 9;
	optional bool allow_live_video = 10;
}

