mirror of
https://github.com/MelisaDev/melisa.git
synced 2024-11-11 19:07:28 +03:00
add an http client, add support for get requests
This commit is contained in:
parent
89c1f8ccff
commit
8ff4983d83
2 changed files with 95 additions and 0 deletions
|
@ -1,6 +1,8 @@
|
||||||
from .models.app import Shard
|
from .models.app import Shard
|
||||||
from .utils.types import Coro
|
from .utils.types import Coro
|
||||||
|
|
||||||
|
from .core.http import HTTPClient
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
|
@ -8,6 +10,7 @@ from typing import Dict
|
||||||
class Client:
|
class Client:
|
||||||
def __init__(self, token, intents, **kwargs):
|
def __init__(self, token, intents, **kwargs):
|
||||||
self.shards: Dict[int, Shard] = {}
|
self.shards: Dict[int, Shard] = {}
|
||||||
|
self.http = HTTPClient(token)
|
||||||
self._events = {}
|
self._events = {}
|
||||||
|
|
||||||
self.guilds = []
|
self.guilds = []
|
||||||
|
|
92
melisa/core/http.py
Normal file
92
melisa/core/http.py
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
from typing import Dict, Optional, Union, Any
|
||||||
|
|
||||||
|
from aiohttp import ClientSession, ClientResponse
|
||||||
|
|
||||||
|
|
||||||
|
class HTTPClient:
|
||||||
|
def __init__(self, token: str, *, ttl: int = 5):
|
||||||
|
self.url: str = f"https://discord.com/api/v9"
|
||||||
|
self.max_ttl: int = ttl
|
||||||
|
|
||||||
|
headers: Dict[str, str] = {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Authorization": f"Bot {token}",
|
||||||
|
"User-Agent": f"Melisa Python Library"
|
||||||
|
}
|
||||||
|
|
||||||
|
self.__aiohttp_session: ClientSession = ClientSession(headers=headers)
|
||||||
|
|
||||||
|
async def close(self):
|
||||||
|
"""Close the aiohttp session"""
|
||||||
|
await self.__aiohttp_session.close()
|
||||||
|
|
||||||
|
async def __send(
|
||||||
|
self,
|
||||||
|
method: str,
|
||||||
|
endpoint: str,
|
||||||
|
*,
|
||||||
|
_ttl: int = None,
|
||||||
|
**kwargs
|
||||||
|
) -> Optional[Dict]:
|
||||||
|
"""Send an API request to the Discord API."""
|
||||||
|
|
||||||
|
ttl = _ttl or self.max_ttl
|
||||||
|
|
||||||
|
url = f"{self.url}/{endpoint}"
|
||||||
|
|
||||||
|
if ttl != 0:
|
||||||
|
async with self.__aiohttp_session.request(method, url, **kwargs) as response:
|
||||||
|
return await self.__handle_response(response, method, endpoint, __ttl=ttl, **kwargs)
|
||||||
|
|
||||||
|
async def __handle_response(
|
||||||
|
self,
|
||||||
|
res: ClientResponse,
|
||||||
|
method: str,
|
||||||
|
endpoint: str,
|
||||||
|
*,
|
||||||
|
_ttl: int = None,
|
||||||
|
**kwargs
|
||||||
|
) -> Optional[Dict]:
|
||||||
|
"""Handle responses from the Discord API."""
|
||||||
|
if res.ok:
|
||||||
|
return await res.json()
|
||||||
|
|
||||||
|
retry_in = 1 + (self.max_ttl - _ttl) * 2
|
||||||
|
|
||||||
|
await asyncio.sleep(retry_in)
|
||||||
|
|
||||||
|
return await self.__send(
|
||||||
|
method,
|
||||||
|
endpoint,
|
||||||
|
_ttl=_ttl - 1,
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
async def get(
|
||||||
|
self,
|
||||||
|
route: str,
|
||||||
|
params: Optional[Dict] = None
|
||||||
|
) -> Optional[Dict]:
|
||||||
|
"""|coro|
|
||||||
|
Sends a get request to a Discord REST endpoint.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
route : :class:`str`
|
||||||
|
The endpoint to send the request to.
|
||||||
|
params: Optional[:class:`Dict`]
|
||||||
|
The query parameters to add to the request.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
Optional[:class:`Dict`]
|
||||||
|
The response from Discord.
|
||||||
|
"""
|
||||||
|
return await self.__send(
|
||||||
|
"GET",
|
||||||
|
route,
|
||||||
|
params=params
|
||||||
|
)
|
Loading…
Reference in a new issue