93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
import json
|
|
from asyncio import sleep
|
|
from urllib.parse import quote
|
|
|
|
from matrix_client.api import MatrixHttpApi
|
|
from matrix_client.errors import MatrixError, MatrixRequestError
|
|
|
|
|
|
class AsyncHTTPAPI(MatrixHttpApi):
|
|
"""
|
|
Contains all raw matrix HTTP client-server API calls using asyncio and coroutines.
|
|
Examples
|
|
--------
|
|
.. code-block: python
|
|
async def main():
|
|
async with aiohttp.ClientSession() as session:
|
|
mapi = AsyncHTTPAPI("http://matrix.org", session)
|
|
resp = await mapi.get_room_id("#matrix:matrix.org")
|
|
print(resp)
|
|
loop = asyncio.get_event_loop()
|
|
loop.run_until_complete(main())
|
|
"""
|
|
|
|
def __init__(self, base_url, client_session, token=None, identity=None):
|
|
self.base_url = base_url
|
|
self.token = token
|
|
self.identity = identity
|
|
self.txn_id = 0
|
|
self.validate_cert = True
|
|
self.client_session = client_session
|
|
|
|
async def _send(self,
|
|
method,
|
|
path,
|
|
content=None,
|
|
query_params={},
|
|
headers={},
|
|
api_path="/_matrix/client/r0"):
|
|
if not content:
|
|
content = {}
|
|
|
|
method = method.upper()
|
|
if method not in ["GET", "PUT", "DELETE", "POST"]:
|
|
raise MatrixError("Unsupported HTTP method: %s" % method)
|
|
|
|
if "Content-Type" not in headers:
|
|
headers["Content-Type"] = "application/json"
|
|
|
|
if self.token:
|
|
query_params["access_token"] = self.token
|
|
endpoint = self.base_url + api_path + path
|
|
|
|
if headers["Content-Type"] == "application/json":
|
|
content = json.dumps(content)
|
|
|
|
while True:
|
|
request = self.client_session.request(
|
|
method,
|
|
endpoint,
|
|
params=query_params,
|
|
data=content,
|
|
headers=headers)
|
|
async with request as response:
|
|
if response.status < 200 or response.status >= 300:
|
|
raise MatrixRequestError(
|
|
code=response.status, content=await response.text())
|
|
|
|
if response.status == 429:
|
|
await sleep(response.json()['retry_after_ms'] / 1000)
|
|
else:
|
|
return await response.json()
|
|
|
|
async def get_display_name(self, user_id):
|
|
content = await self._send("GET", "/profile/%s/displayname" % user_id)
|
|
return content.get('displayname', None)
|
|
|
|
async def get_avatar_url(self, user_id):
|
|
content = await self._send("GET", "/profile/%s/avatar_url" % user_id)
|
|
return content.get('avatar_url', None)
|
|
|
|
async def get_room_id(self, room_alias):
|
|
"""Get room id from its alias
|
|
Args:
|
|
room_alias(str): The room alias name.
|
|
Returns:
|
|
Wanted room's id.
|
|
"""
|
|
content = await self._send(
|
|
"GET",
|
|
"/directory/room/{}".format(quote(room_alias)),
|
|
api_path="/_matrix/client/r0")
|
|
return content.get("room_id", None)
|