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;
optional bool opus = 5 [default = false];

}

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;
        NestingLimit = 10;
}
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 ContextActionModify {

enum Context {
        Server = 0x01;
        Channel = 0x02;
        User = 0x04;
}
enum Operation {
        Add = 0;
        Remove = 1;
}
required string action = 1;
optional string text = 2;
optional uint32 context = 3;
optional Operation operation = 4;

}

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];
optional bool opus = 4 [default = false];

}

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];
optional bool opus = 19 [default = false];

}

message SuggestConfig {

optional uint32 version = 1;
optional bool positional = 2;
optional bool push_to_talk = 3;

}

message RequestBlob {

repeated uint32 session_texture = 1;
repeated uint32 session_comment = 2;
repeated uint32 channel_description = 3;

}