package MumbleProto;

option optimize_for = SPEED;

message	Version {
	optional uint32 version = 1;
	optional string release = 2;
	optional string os = 3;
	optional string os_version = 4;
}

message UDPTunnel {
	required bytes packet = 1;
}

message Authenticate {
	optional string username = 1;
	optional string password = 2;
	repeated string tokens = 3;
	repeated int32 celt_versions = 4;
}

message Ping {
	optional uint64 timestamp = 1;
	optional uint32 good = 2;
	optional uint32 late = 3;
	optional uint32 lost = 4;
	optional uint32 resync = 5;
	optional uint32 udp_packets = 6;
	optional uint32 tcp_packets = 7;
	optional float udp_ping_avg = 8;
	optional float udp_ping_var = 9;
	optional float tcp_ping_avg = 10;
	optional float tcp_ping_var = 11;
}

message Reject {
	enum RejectType {
		None = 0;
		WrongVersion = 1;
		InvalidUsername = 2;
		WrongUserPW = 3;
		WrongServerPW = 4;
		UsernameInUse = 5;
		ServerFull = 6;
		NoCertificate = 7;
	}
	optional RejectType type = 1;
	optional string reason = 2;
}

message ServerConfig {
	optional uint32 max_bandwidth = 1;
	optional string welcome_text = 2;
	optional bool allow_html = 3;
	optional uint32 message_length = 4;
	optional uint32 image_message_length = 5;
}

message ServerSync {
	optional uint32 session = 1;
	optional uint32 max_bandwidth = 2;
	optional string welcome_text = 3;
	optional uint64 permissions = 4;
}

message ChannelRemove {
	required uint32 channel_id = 1;
}

message ChannelState {
	optional uint32 channel_id = 1;
	optional uint32 parent = 2;
	optional string name = 3;
	repeated uint32 links = 4;
	optional string description = 5;
	repeated uint32 links_add = 6;
	repeated uint32 links_remove = 7;
	optional bool temporary = 8 [default = false];
	optional int32 position = 9 [default = 0];
	optional bytes description_hash = 10;
}

message UserRemove {
	required uint32 session = 1;
	optional uint32 actor = 2;
	optional string reason = 3;
	optional bool ban = 4;
}

message UserState {
	optional uint32 session = 1;
	optional uint32 actor = 2;
	optional string name = 3;
	optional uint32 user_id = 4;
	optional uint32 channel_id = 5;
	optional bool mute = 6;
	optional bool deaf = 7;
	optional bool suppress = 8;
	optional bool self_mute = 9;
	optional bool self_deaf = 10;
	optional bytes texture = 11;
	optional bytes plugin_context = 12;
	optional string plugin_identity = 13;
	optional string comment = 14;
	optional string hash = 15;
	optional bytes comment_hash = 16;
	optional bytes texture_hash = 17;
	optional bool priority_speaker = 18;
	optional bool recording = 19;
}

message BanList {
	message BanEntry {
		required bytes address = 1;
		required uint32 mask = 2;
		optional string name = 3;
		optional string hash = 4;
		optional string reason = 5;
		optional string start = 6;
		optional uint32 duration = 7;
	}
	repeated BanEntry bans = 1;
	optional bool query = 2 [default = false];
}

message TextMessage {
	optional uint32 actor = 1;
	repeated uint32 session = 2;
	repeated uint32 channel_id = 3;
	repeated uint32 tree_id = 4;
	required string message = 5;
}

message PermissionDenied {
	enum DenyType {
		Text = 0;
		Permission = 1;
		SuperUser = 2;
		ChannelName = 3;
		TextTooLong = 4;
		H9K = 5;
		TemporaryChannel = 6;
		MissingCertificate = 7;
		UserName = 8;
		ChannelFull = 9;
	}
	optional uint32 permission = 1;
	optional uint32 channel_id = 2;
	optional uint32 session = 3;
	optional string reason = 4;
	optional DenyType type = 5;
	optional string name = 6;
}

message ACL {
	message ChanGroup {
		required string name = 1;
		optional bool inherited = 2 [default = true];
		optional bool inherit = 3 [default = true];
		optional bool inheritable = 4 [default = true];
		repeated uint32 add = 5;
		repeated uint32 remove = 6;
		repeated uint32 inherited_members = 7;
	}
	message ChanACL {
		optional bool apply_here = 1 [default = true];
		optional bool apply_subs = 2 [default = true];
		optional bool inherited = 3 [default = true];
		optional uint32 user_id = 4;
		optional string group = 5;
		optional uint32 grant = 6;
		optional uint32 deny = 7;
	}
	required uint32 channel_id = 1;
	optional bool inherit_acls = 2 [default = true];
	repeated ChanGroup groups = 3;
	repeated ChanACL acls = 4;
	optional bool query = 5 [default = false];
}

message QueryUsers {
	repeated uint32 ids = 1;
	repeated string names = 2;
}

message CryptSetup {
	optional bytes key = 1;
	optional bytes client_nonce = 2;
	optional bytes server_nonce = 3;
}

message ContextActionAdd {
	enum Context {
		Server = 0x01;
		Channel = 0x02;
		User = 0x04;
	}
	required string action = 1;
	required string text = 2;
	optional uint32 context = 3;
}

message ContextAction {
	optional uint32 session = 1;
	optional uint32 channel_id = 2;
	required string action = 3;
}

message UserList {
	message User {
		required uint32 user_id = 1;
		optional string name = 2;
	}
	repeated User users = 1;
}

message VoiceTarget {
	message Target {
		repeated uint32 session = 1;
		optional uint32 channel_id = 2;
		optional string group = 3;
		optional bool links = 4 [default = false];
		optional bool children = 5 [default = false];
	}
	optional uint32 id = 1;
	repeated Target targets = 2;
}

message PermissionQuery {
	optional uint32 channel_id = 1;
	optional uint32 permissions = 2;
	optional bool flush = 3 [default = false];
}

message CodecVersion {
	required int32 alpha = 1;
	required int32 beta = 2;
	required bool prefer_alpha = 3 [default = true];
}

message UserStats {
	message Stats {
		optional uint32 good = 1;
		optional uint32 late = 2;
		optional uint32 lost = 3;
		optional uint32 resync = 4;
	}

	optional uint32 session = 1;
	optional bool stats_only = 2 [default = false];
	repeated bytes certificates = 3;
	optional Stats from_client = 4;
	optional Stats from_server = 5;

	optional uint32 udp_packets = 6;
	optional uint32 tcp_packets = 7;
	optional float udp_ping_avg = 8;
	optional float udp_ping_var = 9;
	optional float tcp_ping_avg = 10;
	optional float tcp_ping_var = 11;

	optional Version version = 12;
	repeated int32 celt_versions = 13;
	optional bytes address = 14;
	optional uint32 bandwidth = 15;
	optional uint32 onlinesecs = 16;
	optional uint32 idlesecs = 17;
	optional bool strong_certificate = 18 [default = false];
}

message RequestBlob {
	repeated uint32 session_texture = 1;
	repeated uint32 session_comment = 2;
	repeated uint32 channel_description = 3;
}
