Newer
Older
# Copyright (c) 2019 Nico Alt
# SPDX-License-Identifier: AGPL-3.0-only
# License-Filename: LICENSE.md
"""
Wrapper around Briar API's _/contacts/_ resource
"""
from briar_wrapper.constants import BASE_HTTP_URL
from briar_wrapper.model import Model
_API_ENDPOINT = "contacts/"
_CONNECTION_EVENTS = ("ContactConnectedEvent", "ContactDisconnectedEvent")
def add_pending(self, link, alias):
# pylint: disable=line-too-long
"""
Adds pending contact to Briar with `link` URL and `alias`
[Upstream documentation](https://code.briarproject.org/briar/briar/blob/master/briar-headless/README.md#adding-a-contact)
.. versionadded:: 0.0.3
"""
url = urljoin(BASE_HTTP_URL, self._API_ENDPOINT + "add/pending/")
_post(url, headers=self._headers, json={"link": link, "alias": alias})
def delete(self, contact_id):
# pylint: disable=line-too-long
"""
Deletes the contact with `contact_id`
[Upstream documentation](https://code.briarproject.org/briar/briar/blob/master/briar-headless/README.md#removing-a-contact)
.. versionadded:: 0.0.4
"""
url = urljoin(BASE_HTTP_URL, self._API_ENDPOINT + str(contact_id))
_delete(url, headers=self._headers)
# pylint: disable=line-too-long
"""
Returns sorted list containing all contacts
[Upstream documentation](https://code.briarproject.org/briar/briar/blob/master/briar-headless/README.md#listing-all-contacts)
.. versionadded:: 0.0.3
.. versionchanged:: 0.0.4
"""
url = urljoin(BASE_HTTP_URL, self._API_ENDPOINT)
# pylint: disable=line-too-long
"""
Returns _briar://_ link
[Upstream documentation](https://code.briarproject.org/briar/briar/blob/master/briar-headless/README.md#adding-a-contact)
.. versionadded:: 0.0.3
"""
url = urljoin(BASE_HTTP_URL, self._API_ENDPOINT + "add/link/")
request = _get(url, headers=self._headers).json()
return request['link']
def watch_connections(self, callback):
# pylint: disable=line-too-long
"""
Calls `callback` whenever a contact's connection status changes
[Upstream documentation](https://code.briarproject.org/briar/briar/blob/master/briar-headless/README.md#a-contact-connected-or-disconnected)
.. versionadded:: 0.0.4
"""
self._connections_callback = callback
signal_ids = list()
event_callback = self._handle_connections_callback
signal_id = self._api.socket_listener.connect(event,
event_callback)
signal_ids.append(signal_id)
return signal_ids
def _handle_connections_callback(self, message):
contact_id = message["data"]["contactId"]
if message["name"] == "ContactConnectedEvent":
self._connections_callback(contact_id, True)
elif message["name"] == "ContactDisconnectedEvent":
self._connections_callback(contact_id, False)
else:
raise Exception(f"Wrong event in callback: {message['name']}")