Wumpy-rest
Richly and accurately typed wrapper around the Discord REST API.
Usage
The best way to use wumpy-rest
is to import APIClient
:
import anyio
from wumpy.rest import APIClient
TOKEN = 'ABC123.XYZ789'
async def main():
async with APIClient(TOKEN) as api:
print(await api.fetch_my_user())
anyio.run(main)
APIClient
is a class that implements all routes of the Discord API. This is
made up of multiple route classes. You can create your own class with the
routes you use:
from wumpy.rest import (
ApplicationCommandRequester, InteractionRequester,
HTTPXRequester
)
class MyAPIClient(ApplicationCommandRequester, InteractionRequester, HTTPXRequester):
__slots__ = ()
Files
Some endpoints support uploading files, for these a file-like object is
expected that's been opened in binary-mode (for example 'rb'
).
For the message/interaction endpoints, remember to include a matching
attachment
object with 'id'
set to the index of the file.
Ratelimiter
You can pass a custom ratelimiter to the requester if you want to customize
that behaviour. For more, read the documentation.
Here's an example of a ratelimiter that does no ratelimiting and does not
handle any kind of 429
-responses.
from contextlib import asynccontextmanager
from typing import (
Any, AsyncContextManager, AsyncGenerator, Awaitable, Callable, Coroutine,
Mapping
)
import anyio
from wumpy.rest import APIClient
class NoOpRatelimiter:
"""Ratelimiter implementation that does nothing; a no-op implementation."""
async def __aenter__(self):
return self
async def __aexit__(
self,
exc_type: Optional[Type[BaseException]],
exc_val: Optional[BaseException],
exc_tb: Optional[TracebackType]
) -> object:
pass
@asynccontextmanager
async def __call__(self, route: Route) -> AsyncGenerator[
Callable[[Mapping[str, str]], Coroutine[Any, Any, object]],
None
]:
yield self.update
async def update(self, headers: Mapping[str, str]) -> object:
pass
async def main():
async with APIClient(TOKEN, ratelimiter=NoOpRatelimiter()) as api:
print(await api.fetch_my_user())
anyio.run(main)