diff --git a/docs/protocols.markdown b/docs/protocols.markdown index 90aff0a..5544661 100644 --- a/docs/protocols.markdown +++ b/docs/protocols.markdown @@ -123,11 +123,11 @@ acknowledged by the client. Server to client: -* chr(0): keepalive message identifier +* `chr(0)`: keepalive message identifier Client to server: -* P\r\n +* `P\r\n` ### Sending audio signal ### @@ -138,31 +138,77 @@ server acknowledges, client can start transmitting audio data. Client to server: -* TX0\r\n +* `TX0\r\n` Server to client: -* chr(1)+chr(hh)+chr(ll): transmission acknowledged (hh*256+ll is the +* `chr(1)chr(hh)chr(ll)`: transmission acknowledged (hh*256+ll is the client index in client list) Client to server: -* TX1\r\n followed by 325 bytes: data following the first line +* `TX1\r\n` followed by 325 bytes: data following the first line contains 10 GSM 6.10 frames (representing 20mS of audio signal each one) encoded with WAV#49 variant. Client to server: -* RX0\r\n: clients stops transmitting audio. +* `RX0\r\n`: client stops transmitting audio. ### Receiving audio signal ### Server to client: -* chr(2)+chr(hh)+chr(ll) followed by 325 bytes: data following the first +* `chr(2)chr(hh)chr(ll)` followed by 325 bytes: data following the first 3 bytes contains 10 GSM 6.10 frames (representing 20mS of audio signal each one) encoded with WAV#49 variant. hh*256+ll represents the index in the client list of the client sending audio. +### Sending text messages ### + +Client to server: + +* `TM:clientIdMessage body\r\n`: Sends "Message body" +to client having id "clientId". If clientId is an empty string, +message is sent to all clients on the same network, including the +message sender. + + +### Receiving text messages ### + +Server to client: + +* `chr(4)` followed by 3-lines message: incoming message first line +contains the sender ID, second line the message body, third line the +message type: "A" for network messages or "P" for messages directed to a +single client. + + +### Receiving client list ### + +Server to client: + +* `chr(3)` followed by a multiline message: each line contains a client +description in an XML-like format containing the following fields: + + * **S**: Client status: 0=Available, 1=Not available, 2=Absent + * **M**: Client mute status: 0=Not muted, 1=Muted + * **NN**: Same as in authetication procedure + * **CT**: Same as in authetication procedure + * **BC**: Same as in authetication procedure + * **ON**: Same as in authetication procedure + * **ID**: Client ID (assigned to the client by the system manager +through the server during the authentication phase) + * **DS**: Same as in authetication procedure + + +### Receiving network list ### + +Server to client: + +* `chr(5)` followed by a multiline message: each line contains the name +of a network. + + diff --git a/frn/manager/remote.py b/frn/manager/remote.py index 8d6d5b5..9e8ca84 100644 --- a/frn/manager/remote.py +++ b/frn/manager/remote.py @@ -40,10 +40,11 @@ class RemoteManager(object): implements(IManager) - def __init__(self, reactor, server='frn.no-ip.info', port=10025): + def __init__(self, reactor, server='frn.no-ip.info', port=10025, maskParrot=True): self.reactor = reactor self.server = server self.port = port + self.maskParrot = maskParrot self.factory = None def doConnect(self): @@ -59,10 +60,18 @@ class RemoteManager(object): return self.factory.client.sendServerLogout(user) def clientLogin(self, user): - return self.factory.client.sendClientLogin(user) + if self.maskParrot and user.BC == 'Parrot': + u = user.copy(BC='PC Only') + else: + u = user.copy() + return self.factory.client.sendClientLogin(u) def clientLogout(self, user): - return self.factory.client.sendClientLogout(user) + if self.maskParrot and user.BC == 'Parrot': + u = user.copy(BC='PC Only') + else: + u = user.copy() + return self.factory.client.sendClientLogout(u) def getClientList(self): return self.factory.client.getClientList()