syntax = "proto3";
package local;

message ServerConnection {
    string name = 1;
    string connect_address = 2;
    string connect_port = 3;
    bool encrypted = 4;
    bool fixed = 5;
    repeated string clients = 6;
    uint32 connected = 7;
}

message ClientConnection {
    string name = 1;
    string listen_address = 2;
    string listen_port = 3;
    bool encrypted = 4;
    bool fixed = 5;
    string server = 6;
    uint32 connected = 7;
}

message ConnectionsList {
    repeated ServerConnection server_connections = 1;
    repeated ClientConnection client_connections = 2;
}

message InitRequest {
    string tracker_name = 1;
    string email = 2;
}

message InitResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        EMAIL_EXISTS = 10;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
    }
    Result response = 1;
}

message ConfirmRequest {
    string tracker_name = 1;
    string token = 2;
}

message ConfirmResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
    }
    Result response = 1;
    string token = 2;
}

message CreateDaemonRequest {
    string tracker_name = 1;
    string daemon_name = 2;
    bool randomize = 3;
}

message CreateDaemonResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        INVALID_NAME = 10;
        NAME_EXISTS = 11;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
    }
    Result response = 1;
    string daemon_name = 2;
    string token = 3;
}

message DeleteDaemonRequest {
    string tracker_name = 1;
    string daemon_name = 2;
}

message DeleteDaemonResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        NOT_FOUND = 10;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
    }
    Result response = 1;
}

message SetTokenRequest {
    enum Type {
        MASTER = 0;
        DAEMON = 1;
    }
    Type type = 1;
    string token = 2;
    string tracker_name = 3;
}

message SetTokenResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
    }
    Result response = 1;
}

message CreateRequest {
    enum Type {
        SERVER = 0;
        CLIENT = 1;
        NOT_CONNECTED = 2;
    }
    string tracker_name = 1;
    string daemon_name = 2;
    string path = 3;
    Type type = 4;
    bool encrypted = 5;
    bool fixed = 6;
    string connect_address = 7;
    string connect_port = 8;
    string listen_address = 9;
    string listen_port = 10;
}

message CreateResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        INVALID_PATH = 10;
        PATH_EXISTS = 11;
        INVALID_ADDRESS = 20;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
    string server_token = 2;
    string client_token = 3;
    ConnectionsList updates = 4;
}

message DeleteRequest {
    string tracker_name = 1;
    string path = 2;
}

message DeleteResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        INVALID_PATH = 10;
        PATH_NOT_FOUND = 11;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
}

message ImportRequest {
    string tracker_name = 1;
    string token = 2;
}

message ImportResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
    ConnectionsList updates = 2;
}

message AttachRequest {
    string tracker_name = 1;
    string path = 2;
    string address_override = 3;
    string port_override = 4;
}

message AttachResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        INVALID_PATH = 10;
        PATH_NOT_FOUND = 11;
        INVALID_ADDRESS = 20;
        ALREADY_ATTACHED = 30;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
    ConnectionsList updates = 2;
}

message RemoteAttachRequest {
    string tracker_name = 1;
    string path = 2;
    string daemon_name = 3;
    bool server = 4;
    string address_override = 5;
    string port_override = 6;
}

message RemoteAttachResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        INVALID_PATH = 10;
        PATH_NOT_FOUND = 11;
        INVALID_ADDRESS = 20;
        DAEMON_NOT_FOUND = 30;
        ALREADY_ATTACHED = 40;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
    }
    Result response = 1;
}

message DetachRequest {
    string tracker_name = 1;
    string path = 2;
}

message DetachResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        INVALID_PATH = 10;
        PATH_NOT_FOUND = 11;
        DAEMON_NOT_FOUND = 12;
        NOT_ATTACHED = 20;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
}

message RemoteDetachRequest {
    string tracker_name = 1;
    string path = 2;
    string daemon_name = 3;
}

message RemoteDetachResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        INVALID_PATH = 10;
        PATH_NOT_FOUND = 11;
        DAEMON_NOT_FOUND = 12;
        NOT_ATTACHED = 20;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
    }
    Result response = 1;
}

message TreeRequest {
    string tracker_name = 1;
    string daemon_name = 2;
    string path = 3;
}

message Tree {
    enum Type {
        SERVER = 0;
        CLIENT = 1;
        NOT_CONNECTED = 2;
    }
    repeated Tree tree = 1;
    bool connection = 2;
    Type type = 3;
    string name = 4;
    string path = 5;
    uint32 servers_number = 6;
    string connect_address = 7;
    string connect_port = 8;
    uint32 clients_number = 9;
    string listen_address = 10;
    string listen_port = 11;
    bool encrypted = 12;
    bool fixed = 13;
}

message TreeResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        INVALID_PATH = 10;
        PATH_NOT_FOUND = 11;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
    Tree tree = 2;
}

message ConnectionsListRequest {
    string tracker_name = 1;
}

message ConnectionsListResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
    ConnectionsList list = 2;
}

message SetConnectionsRequest {
    string tracker_name = 1;
    ConnectionsList list = 2;
}

message SetConnectionsResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
    }
    Result response = 1;
}

message GetConnectionsRequest {
    string tracker_name = 1;
}

message GetConnectionsResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
    ConnectionsList active_list = 2;
    ConnectionsList imported_list = 3;
}

message ImportConnectionsRequest {
    string tracker_name = 1;
    string token = 2;
    ConnectionsList list = 3;
}

message ImportConnectionsResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
    }
    Result response = 1;
}

message UpdateConnectionsRequest {
    string tracker_name = 1;
    ConnectionsList list = 2;
    string path = 3;
}

message UpdateConnectionsResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
}

message Daemon {
    string name = 1;
    bool online = 2;
    bool server = 3;
    bool client = 4;
    string version = 5;
    string hostname = 6;
    string external_address = 7;
    repeated string internal_addresses = 8;
}

message DaemonsListRequest {
    string tracker_name = 1;
    string path = 2;
}

message DaemonsListResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        INVALID_PATH = 10;
        PATH_NOT_FOUND = 11;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
        NOT_REGISTERED = 9020;
    }
    Result response = 1;
    repeated Daemon list = 2;
}

message RedeemMasterRequest {
    string tracker_name = 1;
    string email = 2;
}

message RedeemMasterResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
    }
    Result response = 1;
}

message RedeemDaemonRequest {
    string tracker_name = 1;
    string daemon_name = 2;
}

message RedeemDaemonResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
    }
    Result response = 1;
    string token = 2;
}

message RedeemPathRequest {
    enum Type {
        SERVER = 0;
        CLIENT = 1;
    }
    string tracker_name = 1;
    string path = 2;
    Type type = 3;
}

message RedeemPathResponse {
    enum Result {
        ACCEPTED = 0;
        REJECTED = 1;
        TIMEOUT = 9000;
        NO_TRACKER = 9010;
    }
    Result response = 1;
    string token = 2;
}

message ClientMessage {
    enum Type {
        INIT_REQUEST = 0;
        CONFIRM_REQUEST = 1;
        CREATE_DAEMON_REQUEST = 10;
        DELETE_DAEMON_REQUEST = 11;
        SET_TOKEN_REQUEST = 20;
        CREATE_REQUEST = 30;
        DELETE_REQUEST = 40;
        IMPORT_REQUEST = 50;
        ATTACH_REQUEST = 60;
        REMOTE_ATTACH_REQUEST = 61;
        DETACH_REQUEST = 70;
        REMOTE_DETACH_REQUEST = 71;
        TREE_REQUEST = 80;
        CONNECTIONS_LIST_REQUEST = 90;
        DAEMONS_LIST_REQUEST = 91;
        SET_CONNECTIONS_REQUEST = 100;
        GET_CONNECTIONS_REQUEST = 101;
        IMPORT_CONNECTIONS_REQUEST = 110;
        UPDATE_CONNECTIONS_REQUEST = 111;
        REDEEM_MASTER_REQUEST = 120;
        REDEEM_DAEMON_REQUEST = 121;
        REDEEM_PATH_REQUEST = 122;
    }
    Type type = 1;
    InitRequest init_request = 100;
    ConfirmRequest confirm_request = 110;
    CreateDaemonRequest create_daemon_request = 200;
    DeleteDaemonRequest delete_daemon_request = 210;
    SetTokenRequest set_token_request = 300;
    CreateRequest create_request = 400;
    DeleteRequest delete_request = 500;
    ImportRequest import_request = 600;
    AttachRequest attach_request = 700;
    RemoteAttachRequest remote_attach_request = 710;
    DetachRequest detach_request = 800;
    RemoteDetachRequest remote_detach_request = 810;
    TreeRequest tree_request = 900;
    ConnectionsListRequest connections_list_request = 1000;
    DaemonsListRequest daemons_list_request = 1010;
    SetConnectionsRequest set_connections_request = 1100;
    GetConnectionsRequest get_connections_request = 1110;
    ImportConnectionsRequest import_connections_request = 1200;
    UpdateConnectionsRequest update_connections_request = 1210;
    RedeemMasterRequest redeem_master_request = 1300;
    RedeemDaemonRequest redeem_daemon_request = 1310;
    RedeemPathRequest redeem_path_request = 1320;
}

message ServerMessage {
    enum Type {
        INIT_RESPONSE = 0;
        CONFIRM_RESPONSE = 1;
        CREATE_DAEMON_RESPONSE = 10;
        DELETE_DAEMON_RESPONSE = 11;
        SET_TOKEN_RESPONSE = 20;
        CREATE_RESPONSE = 30;
        DELETE_RESPONSE = 40;
        IMPORT_RESPONSE = 50;
        ATTACH_RESPONSE = 60;
        REMOTE_ATTACH_RESPONSE = 61;
        DETACH_RESPONSE = 70;
        REMOTE_DETACH_RESPONSE = 71;
        TREE_RESPONSE = 80;
        CONNECTIONS_LIST_RESPONSE = 90;
        DAEMONS_LIST_RESPONSE = 91;
        SET_CONNECTIONS_RESPONSE = 100;
        GET_CONNECTIONS_RESPONSE = 101;
        IMPORT_CONNECTIONS_RESPONSE = 110;
        UPDATE_CONNECTIONS_RESPONSE = 111;
        REDEEM_MASTER_RESPONSE = 120;
        REDEEM_DAEMON_RESPONSE = 121;
        REDEEM_PATH_RESPONSE = 122;
    }
    Type type = 1;
    InitResponse init_response = 100;
    ConfirmResponse confirm_response = 110;
    CreateDaemonResponse create_daemon_response = 200;
    DeleteDaemonResponse delete_daemon_response = 210;
    SetTokenResponse set_token_response = 300;
    CreateResponse create_response = 400;
    DeleteResponse delete_response = 500;
    ImportResponse import_response = 600;
    AttachResponse attach_response = 700;
    RemoteAttachResponse remote_attach_response = 710;
    DetachResponse detach_response = 800;
    RemoteDetachResponse remote_detach_response = 810;
    TreeResponse tree_response = 900;
    ConnectionsListResponse connections_list_response = 1000;
    DaemonsListResponse daemons_list_response = 1010;
    SetConnectionsResponse set_connections_response = 1100;
    GetConnectionsResponse get_connections_response = 1110;
    ImportConnectionsResponse import_connections_response = 1200;
    UpdateConnectionsResponse update_connections_response = 1210;
    RedeemMasterResponse redeem_master_response = 1300;
    RedeemDaemonResponse redeem_daemon_response = 1310;
    RedeemPathResponse redeem_path_response = 1320;
}
