import "steammessages_base.proto";
import "steammessages_unified_base.steamclient.proto";

option cc_generic_services = true;

enum EGameSearchAction {
	k_EGameSearchAction_None = 0;
	k_EGameSearchAction_Accept = 1;
	k_EGameSearchAction_Decline = 2;
	k_EGameSearchAction_Cancel = 3;
}

enum EGameSearchResult {
	k_EGameSearchResult_Invalid = 0;
	k_EGameSearchResult_SearchInProgress = 1;
	k_EGameSearchResult_SearchFailedNoHosts = 2;
	k_EGameSearchResult_SearchGameFound = 3;
	k_EGameSearchResult_SearchCompleteAccepted = 4;
	k_EGameSearchResult_SearchCompleteDeclined = 5;
	k_EGameSearchResult_SearchCanceled = 6;
}

message GameSearchParam {
	optional string key_name = 1;
	repeated string value = 2;
}

message CQueuedMatchmaking_SearchForGame_Request {
	optional uint32 appid = 1;
	optional .EGameSearchAction action = 2 [default = k_EGameSearchAction_None];
	repeated .GameSearchParam params = 3;
	optional uint32 player_min = 4;
	optional uint32 player_max = 5;
	optional fixed64 steamidlobby = 6;
	optional uint64 searchid = 7;
}

message CQueuedMatchmaking_SearchForGame_Response {
	optional .EGameSearchResult gamesearchresult = 1 [default = k_EGameSearchResult_Invalid];
	optional uint64 searchid = 2;
	optional uint32 seconds_time_estimate = 3;
	optional uint32 poll_frequency = 4;
	optional uint32 count_searching = 5;
	optional uint32 players_in_match = 6;
	optional uint32 players_accepted = 7;
	optional string connect_string = 9;
	optional fixed64 steamidhost = 10;
	optional uint32 rtime_match_made = 11;
	optional uint32 rtime_now = 12;
	optional fixed64 steamid_canceled_search = 13;
}

message CQueuedMatchmakingGameHost_SearchForPlayers_Request {
	optional uint32 appid = 1;
	optional .EGameSearchAction action = 2 [default = k_EGameSearchAction_None];
	repeated .GameSearchParam params = 3;
	optional uint32 player_min = 4;
	optional uint32 player_max = 5;
	optional uint32 player_max_team_size = 6;
	optional string connection_string = 7;
	optional uint64 searchid = 8;
}

message PlayerFound {
	optional fixed64 steamid = 1;
	optional .EGameSearchAction action = 2 [default = k_EGameSearchAction_None];
	repeated .GameSearchParam params = 3;
	optional uint32 team_number = 4;
}

message CQueuedMatchmakingGameHost_SearchForPlayers_Response {
	optional .EGameSearchResult gamesearchresult = 1 [default = k_EGameSearchResult_Invalid];
	optional uint64 searchid = 2;
	optional uint32 poll_frequency = 3;
	optional uint64 matchid = 4;
	repeated .PlayerFound players = 5;
	optional uint32 rtime_match_made = 6;
	optional uint32 rtime_now = 7;
}

message PlayerResult {
	optional fixed64 steamid = 1;
	optional uint32 value = 2;
}

message CQueuedMatchmakingGameHost_SubmitPlayerResult_Request {
	optional uint32 appid = 1;
	optional uint64 matchid = 2;
	repeated .PlayerResult player_results = 3;
}

message CQueuedMatchmakingGameHost_SubmitPlayerResult_Response {
}

message CQueuedMatchmakingGameHost_EndGame_Request {
	optional uint32 appid = 1;
	optional uint64 matchid = 2;
}

message CQueuedMatchmakingGameHost_EndGame_Response {
}

service QueuedMatchmaking {
	rpc SearchForGame (.CQueuedMatchmaking_SearchForGame_Request) returns (.CQueuedMatchmaking_SearchForGame_Response);
}

service QueuedMatchmakingGameHost {
	rpc SearchForPlayers (.CQueuedMatchmakingGameHost_SearchForPlayers_Request) returns (.CQueuedMatchmakingGameHost_SearchForPlayers_Response);
	rpc SubmitPlayerResult (.CQueuedMatchmakingGameHost_SubmitPlayerResult_Request) returns (.CQueuedMatchmakingGameHost_SubmitPlayerResult_Response);
	rpc EndGame (.CQueuedMatchmakingGameHost_EndGame_Request) returns (.CQueuedMatchmakingGameHost_EndGame_Response);
}
