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 uint64 match_id = 12;
	optional uint32 series_id = 13;
	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 team_id_radiant = 30;
	optional uint32 team_id_dire = 31;
	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;
	optional bool live = 2;
}

message CMsgSpectateFriendGameResponse {
	enum EWatchLiveResult {
		SUCCESS = 0;
		ERROR_GENERIC = 1;
		ERROR_NO_PLUS = 2;
		ERROR_NOT_FRIENDS = 3;
		ERROR_LOBBY_NOT_FOUND = 4;
		ERROR_SPECTATOR_IN_A_LOBBY = 5;
		ERROR_LOBBY_IS_LAN = 6;
		ERROR_WRONG_LOBBY_TYPE = 7;
		ERROR_WRONG_LOBBY_STATE = 8;
		ERROR_PLAYER_NOT_PLAYER = 9;
		ERROR_TOO_MANY_SPECTATORS = 10;
		ERROR_SPECTATOR_SWITCHED_TEAMS = 11;
		ERROR_FRIENDS_ON_BOTH_SIDES = 12;
		ERROR_SPECTATOR_IN_THIS_LOBBY = 13;
	}

	optional fixed64 server_steamid = 4;
	optional .CMsgSpectateFriendGameResponse.EWatchLiveResult watch_live_result = 5 [default = SUCCESS];
}

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 uint32 series_game = 7;
	optional uint32 upcoming_broadcast_timestamp = 9;
	optional bool allow_live_video = 10;
	optional uint32 node_type = 11;
	optional string node_name = 12;
}

message CMsgDOTASeries {
	message TeamInfo {
		optional uint32 team_id = 1;
		optional string team_name = 2;
		optional string team_logo_url = 3;
		optional uint32 wager_count = 4;
	}

	message LiveGame {
		optional fixed64 server_steam_id = 1;
		optional .CMsgDOTASeries.TeamInfo team_radiant = 2;
		optional .CMsgDOTASeries.TeamInfo team_dire = 3;
		optional uint32 team_radiant_score = 4;
		optional uint32 team_dire_score = 5;
	}

	optional uint32 series_id = 1;
	optional uint32 series_type = 2;
	optional .CMsgDOTASeries.TeamInfo team_1 = 3;
	optional .CMsgDOTASeries.TeamInfo team_2 = 4;
	repeated .CMsgDOTAMatchMinimal match_minimal = 5;
	optional .CMsgDOTASeries.LiveGame live_game = 6;
}
