import "dota_shared_enums.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

message CMsgClientToGCPrivateChatInvite {
	optional string private_chat_channel_name = 1;
	optional uint32 invited_account_id = 2;
}

message CMsgClientToGCPrivateChatKick {
	optional string private_chat_channel_name = 1;
	optional uint32 kick_account_id = 2;
}

message CMsgClientToGCPrivateChatPromote {
	optional string private_chat_channel_name = 1;
	optional uint32 promote_account_id = 2;
}

message CMsgClientToGCPrivateChatDemote {
	optional string private_chat_channel_name = 1;
	optional uint32 demote_account_id = 2;
}

message CMsgGCToClientPrivateChatResponse {
	enum Result {
		SUCCESS = 0;
		FAILURE_CREATION_LOCK = 1;
		FAILURE_SQL_TRANSACTION = 2;
		FAILURE_SDO_LOAD = 3;
		FAILURE_NO_PERMISSION = 4;
		FAILURE_ALREADY_MEMBER = 5;
		FAILURE_NOT_A_MEMBER = 7;
		FAILURE_NO_REMAINING_ADMINS = 8;
		FAILURE_NO_ROOM = 9;
		FAILURE_CREATION_RATE_LIMITED = 10;
		FAILURE_UNKNOWN_CHANNEL_NAME = 11;
		FAILURE_UNKNOWN_USER = 12;
		FAILURE_UNKNOWN_ERROR = 13;
		FAILURE_CANNOT_KICK_ADMIN = 14;
		FAILURE_ALREADY_ADMIN = 15;
	}

	optional string private_chat_channel_name = 1;
	optional .CMsgGCToClientPrivateChatResponse.Result result = 2 [default = SUCCESS];
	optional string username = 3;
}

message CMsgClientToGCPrivateChatInfoRequest {
	optional string private_chat_channel_name = 1;
}

message CMsgGCToClientPrivateChatInfoResponse {
	message Member {
		optional uint32 account_id = 1;
		optional string name = 2;
		optional uint32 status = 3;
	}

	optional string private_chat_channel_name = 1;
	repeated .CMsgGCToClientPrivateChatInfoResponse.Member members = 2;
	optional uint32 creator = 3;
	optional uint32 creation_date = 4;
}

message CMsgDOTAJoinChatChannel {
	optional string channel_name = 2;
	optional .DOTAChatChannelType_t channel_type = 4 [default = DOTAChannelType_Regional];
}

message CMsgDOTALeaveChatChannel {
	optional uint64 channel_id = 1;
}

message CMsgGCChatReportPublicSpam {
	optional uint64 channel_id = 1;
	optional uint32 channel_user_id = 2;
}

message CMsgDOTAClientIgnoredUser {
	optional uint32 ignored_account_id = 1;
}

message CMsgDOTAChatMessage {
	message DiceRoll {
		optional int32 roll_min = 1;
		optional int32 roll_max = 2;
		optional int32 result = 3;
	}

	message TriviaAnswered {
		optional uint32 question_id = 1;
		optional uint32 answer_index = 2;
		optional uint32 party_questions_correct = 3;
		optional uint32 party_questions_viewed = 4;
		optional uint32 party_trivia_points = 5;
	}

	optional uint32 account_id = 1;
	optional uint64 channel_id = 2;
	optional string persona_name = 3;
	optional string text = 4;
	optional uint32 timestamp = 5;
	optional uint32 suggest_invite_account_id = 6;
	optional string suggest_invite_name = 7;
	optional uint32 fantasy_draft_owner_account_id = 8;
	optional uint32 fantasy_draft_player_account_id = 9;
	optional uint32 event_id = 10;
	optional bool suggest_invite_to_lobby = 11;
	optional uint32 event_points = 12;
	optional bool coin_flip = 13;
	optional int32 player_id = 14 [default = -1];
	optional uint32 share_profile_account_id = 15;
	optional uint32 channel_user_id = 16;
	optional .CMsgDOTAChatMessage.DiceRoll dice_roll = 17;
	optional uint64 share_party_id = 18;
	optional uint64 share_lobby_id = 19;
	optional uint64 share_lobby_custom_game_id = 20;
	optional string share_lobby_passkey = 21;
	optional uint32 private_chat_channel_id = 22;
	optional uint32 status = 23;
	optional bool legacy_battle_cup_victory = 24;
	optional uint32 battle_cup_streak = 29;
	optional uint32 badge_level = 25;
	optional uint32 suggest_pick_hero_id = 26;
	optional string suggest_pick_hero_role = 27;
	optional uint32 suggest_ban_hero_id = 30;
	optional .CMsgDOTAChatMessage.TriviaAnswered trivia_answer = 32;
	optional uint32 requested_ability_id = 33;
	optional uint32 chat_flags = 34;
	optional bool started_finding_match = 35;
}

message CMsgDOTAChatMember {
	optional fixed64 steam_id = 1;
	optional string persona_name = 2;
	optional uint32 channel_user_id = 3;
	optional uint32 status = 4;
}

message CMsgDOTAJoinChatChannelResponse {
	enum Result {
		JOIN_SUCCESS = 0;
		INVALID_CHANNEL_TYPE = 1;
		ACCOUNT_NOT_FOUND = 2;
		ACH_FAILED = 3;
		USER_IN_TOO_MANY_CHANNELS = 4;
		RATE_LIMIT_EXCEEDED = 5;
		CHANNEL_FULL = 6;
		CHANNEL_FULL_OVERFLOWED = 7;
		FAILED_TO_ADD_USER = 8;
		CHANNEL_TYPE_DISABLED = 9;
		PRIVATE_CHAT_CREATE_FAILED = 10;
		PRIVATE_CHAT_NO_PERMISSION = 11;
		PRIVATE_CHAT_CREATE_LOCK_FAILED = 12;
		PRIVATE_CHAT_KICKED = 13;
		USER_NOT_ALLOWED = 14;
	}

	optional uint32 response = 1;
	optional string channel_name = 2;
	optional fixed64 channel_id = 3;
	optional uint32 max_members = 4;
	repeated .CMsgDOTAChatMember members = 5;
	optional .DOTAChatChannelType_t channel_type = 6 [default = DOTAChannelType_Regional];
	optional .CMsgDOTAJoinChatChannelResponse.Result result = 7 [default = JOIN_SUCCESS];
	optional bool gc_initiated_join = 8;
	optional uint32 channel_user_id = 9;
	optional string welcome_message = 10;
}

message CMsgDOTAChatChannelFullUpdate {
	optional fixed64 channel_id = 1;
	repeated .CMsgDOTAChatMember members = 2;
}

message CMsgDOTAOtherJoinedChatChannel {
	optional fixed64 channel_id = 1;
	optional string persona_name = 2;
	optional fixed64 steam_id = 3;
	optional uint32 channel_user_id = 4;
	optional uint32 status = 5;
}

message CMsgDOTAOtherLeftChatChannel {
	optional fixed64 channel_id = 1;
	optional fixed64 steam_id = 2;
	optional uint32 channel_user_id = 3;
}

message CMsgDOTAChatChannelMemberUpdate {
	message JoinedMember {
		optional fixed64 steam_id = 1;
		optional string persona_name = 2;
		optional uint32 channel_user_id = 3;
		optional uint32 status = 4;
	}

	optional fixed64 channel_id = 1;
	repeated fixed64 left_steam_ids = 2;
	repeated .CMsgDOTAChatChannelMemberUpdate.JoinedMember joined_members = 3;
}

message CMsgDOTARequestChatChannelList {
}

message CMsgDOTARequestChatChannelListResponse {
	message ChatChannel {
		optional string channel_name = 1;
		optional uint32 num_members = 2;
		optional .DOTAChatChannelType_t channel_type = 3 [default = DOTAChannelType_Regional];
	}

	repeated .CMsgDOTARequestChatChannelListResponse.ChatChannel channels = 1;
}

message CMsgDOTAChatGetUserList {
	optional fixed64 channel_id = 1;
}

message CMsgDOTAChatGetUserListResponse {
	message Member {
		optional fixed64 steam_id = 1;
		optional string persona_name = 2;
		optional uint32 channel_user_id = 3;
		optional uint32 status = 4;
	}

	optional fixed64 channel_id = 1;
	repeated .CMsgDOTAChatGetUserListResponse.Member members = 2;
}

message CMsgDOTAChatGetMemberCount {
	optional string channel_name = 1;
	optional .DOTAChatChannelType_t channel_type = 2 [default = DOTAChannelType_Regional];
}

message CMsgDOTAChatGetMemberCountResponse {
	optional string channel_name = 1;
	optional .DOTAChatChannelType_t channel_type = 2 [default = DOTAChannelType_Regional];
	optional uint32 member_count = 3;
}

message CMsgDOTAChatRegionsEnabled {
	message Region {
		optional float min_latitude = 1;
		optional float max_latitude = 2;
		optional float min_longitude = 3;
		optional float max_longitude = 4;
	}

	optional bool enable_all_regions = 1;
	repeated .CMsgDOTAChatRegionsEnabled.Region enabled_regions = 2;
}
