* Use built-in types for Type Annotations. Replaced `typing.List`, `typing.Dict` and `typing.Tuple` with `list`, `dict`, `tuple`.
* Latest TOTD is now cached with `totd:latest` key.
* Created a flag in `TOTD.get_totd()` for latest totd that is used by the `TOTD.latest_totd()` command.
* Fix date parsing by creating a single command for all date types on trackmania.io api.
* Create a unified variable to prevent repeated use of `suppress(ConnectionRefusedError, redis.exceptions.ConnectionError):` everywhere.
* Create `get_from_cache` and `set_in_cache` functions to make it easier for feature development.
* Campaign Class
* `classmethod get_campaign()` Get a campaign with the campaign id and club id.
* `classmethod current_season()` Gets the current ongoing official campaign.
* `leaderboards()` Gets the leaderboard of the campaign.
* `static official_campaigns()` Gets all the official campaigns.
* `static popular_campaigns()` Gets all the non-official campaigns ranked by current popularity.
* `club()` Gets the club the campaign belongs to.
* Club Class
* `classmethod get_club()` Gets a club with the given club id.
* `creator()` Gets the player object of the creator of the club.
* `get_activities()` Gets all the activities of the club.
* `get_members()` Gets all the members of the club.
* `static list_clubs()` Lists all the popular clubs.
* Room Class
* `classmethod get_room()` Gets the room using the room id and club id.
* `static popular_rooms()` Gets all the popular rooms.
* `club()` Gets the club the room belongs to.
* Add `trackmania.campaign.py`, `trackmania.club.py` and `trackmania.room.py` to documentation.
* Create base objects for all classes in the module.
* `.top_matchmaking()` now returns a list of `MatchmakingLeaderboard` class.
* Add `typing_extensions` to requirements. This will be removed once `Self` is added to python 3.11
* Random map function in class `TMXMap`.
* Add `map_name` parameter to `TMXMap`.
* Remove `login` from `Player` docstring.
* Updated `redis`.
* Updated `requirements-dev.txt`.
* `Player.search` now never returns a `NoneType` and instead returns an empty list.
* Update `PlayerMatchmaking.history()` command to reflect changes in the api.
* Rename `comments_count` to `comment_count` in `TMXMapMetadata` docstring.
* BUMP VERSION
**Full Changelog**: https://github.com/NottCurious/py-tmio/compare/v0.4.6...v0.5.0-rc1