Skip to content

client

Contains the main client class for interacting with the Luduvo API.

Client

Represents a Luduvo Client.

Attributes:

Name Type Description
requests Requests

The requests object, which is used to send requests to Luduvo endpoints.

url_generator URLGenerator

The URL generator object, which is used to generate URLs to send requests to endpoints.

Source code in luduvo/client.py
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
class Client:
    """Represents a Luduvo Client.

    Attributes:
        requests: The requests object, which is used to send requests to Luduvo endpoints.
        url_generator: The URL generator object, which is used to generate URLs to send requests to endpoints.
    """

    def __init__(self, base_url="luduvo.com"):
        """
        Args:
            base_url (str, optional): The base URL for the Luduvo API.
        """
        logger.debug("Initializing Client(base_url=%s)", base_url)

        self._url_generator: URLGenerator = URLGenerator(base_url=base_url)
        self._requests: Requests = Requests()

        self.url_generator: URLGenerator = self._url_generator
        self.requests: Requests = self._requests

    def __repr__(self):
        return f"<{self.__class__.__name__}>"

    # --------------------------
    # API Endpoints
    # --------------------------

    async def get_user(self, user_id: int) -> User:
        """
        Gets a user with the specified user ID.

        Arguments:
            user_id: A Luduvo user ID.

        Returns:
            A user object.
        """
        logger.debug(f"Fetching user with ID: {user_id}")
        try:
            user_response = await self._requests.get(
                url=self.url_generator.get_url(f"users/{user_id}/profile", "api")
            )
        except NotFound as exception:
            logger.error(f"User not found: {user_id}")
            raise UserNotFound(
                message="Invalid user.", response=exception.response
            ) from None
        user_data = user_response.json()
        logger.debug(f"Successfully retrieved user data for ID: {user_id}")
        return User(client=self, data=user_data)

    async def get_user_by_username(
        self, username: str, expand: bool = True
    ) -> User | PartialUser:
        """
        Gets a user with the specified username.

        Arguments:
            username: A Luduvo username.
            expand: Whether to return a User (2 requests) rather than a PartialUser (1 request)

        Returns:
            A User or PartialUser depending on the expand argument.
        """
        logger.debug(f"Fetching user with username: {username}")
        try:
            user_response = await self._requests.get(
                url=self.url_generator.get_url(f"users?q={username}", "api")
            )
        except NotFound as exception:
            logger.error(f"User not found: {username}")
            raise UserNotFound(
                message="Invalid user.", response=exception.response
            ) from None
        user_data = user_response.json()
        if len(user_data) == 0:
            logger.error(f"User not found: {username}")
            raise UserNotFound(message="Invalid user.")
        user_info = user_data[0]
        if expand:
            logger.debug(f"Expanding user data for username: {username}")
            return await self.get_user(user_info["id"])
        return PartialUser(client=self, data=user_info)

__init__(base_url='luduvo.com')

Parameters:

Name Type Description Default
base_url str

The base URL for the Luduvo API.

'luduvo.com'
Source code in luduvo/client.py
21
22
23
24
25
26
27
28
29
30
31
32
def __init__(self, base_url="luduvo.com"):
    """
    Args:
        base_url (str, optional): The base URL for the Luduvo API.
    """
    logger.debug("Initializing Client(base_url=%s)", base_url)

    self._url_generator: URLGenerator = URLGenerator(base_url=base_url)
    self._requests: Requests = Requests()

    self.url_generator: URLGenerator = self._url_generator
    self.requests: Requests = self._requests

get_user(user_id) async

Gets a user with the specified user ID.

Parameters:

Name Type Description Default
user_id int

A Luduvo user ID.

required

Returns:

Type Description
User

A user object.

Source code in luduvo/client.py
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
async def get_user(self, user_id: int) -> User:
    """
    Gets a user with the specified user ID.

    Arguments:
        user_id: A Luduvo user ID.

    Returns:
        A user object.
    """
    logger.debug(f"Fetching user with ID: {user_id}")
    try:
        user_response = await self._requests.get(
            url=self.url_generator.get_url(f"users/{user_id}/profile", "api")
        )
    except NotFound as exception:
        logger.error(f"User not found: {user_id}")
        raise UserNotFound(
            message="Invalid user.", response=exception.response
        ) from None
    user_data = user_response.json()
    logger.debug(f"Successfully retrieved user data for ID: {user_id}")
    return User(client=self, data=user_data)

get_user_by_username(username, expand=True) async

Gets a user with the specified username.

Parameters:

Name Type Description Default
username str

A Luduvo username.

required
expand bool

Whether to return a User (2 requests) rather than a PartialUser (1 request)

True

Returns:

Type Description
User | PartialUser

A User or PartialUser depending on the expand argument.

Source code in luduvo/client.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
async def get_user_by_username(
    self, username: str, expand: bool = True
) -> User | PartialUser:
    """
    Gets a user with the specified username.

    Arguments:
        username: A Luduvo username.
        expand: Whether to return a User (2 requests) rather than a PartialUser (1 request)

    Returns:
        A User or PartialUser depending on the expand argument.
    """
    logger.debug(f"Fetching user with username: {username}")
    try:
        user_response = await self._requests.get(
            url=self.url_generator.get_url(f"users?q={username}", "api")
        )
    except NotFound as exception:
        logger.error(f"User not found: {username}")
        raise UserNotFound(
            message="Invalid user.", response=exception.response
        ) from None
    user_data = user_response.json()
    if len(user_data) == 0:
        logger.error(f"User not found: {username}")
        raise UserNotFound(message="Invalid user.")
    user_info = user_data[0]
    if expand:
        logger.debug(f"Expanding user data for username: {username}")
        return await self.get_user(user_info["id"])
    return PartialUser(client=self, data=user_info)