Skip to content

nekitdev/gd.py

Repository files navigation

Image

gd.py

License Version Downloads Discord

Documentation Check Test Coverage

An API wrapper for Geometry Dash written in Python.

Installing

Python 3.8 or above is required.

pip

Installing the library with pip is quite simple:

$ pip install gd.py

Alternatively, the library can be installed from source:

$ git clone https://github.com/nekitdev/gd.py.git
$ cd gd.py
$ python -m pip install .

poetry

You can add gd.py as a dependency with the following command:

$ poetry add gd.py

Or by directly specifying it in the configuration like so:

[tool.poetry.dependencies]
"gd.py" = "^2.0.0-dev.0"

Alternatively, you can add it directly from the source:

[tool.poetry.dependencies."gd.py"]
git = "https://github.com/nekitdev/gd.py.git"

Examples

Interactive

Song

Fetching

# file.py

from entrypoint import entrypoint

import gd

SONG_ID = 1081309

SONG_INFO = "`{song.name}` by `{song.artist.name}` (ID: `{song.id}`, size: `{song.size} MB`)"
song_info = SONG_INFO.format


async def async_main() -> None:
    song = await client.get_song(SONG_ID)

    print(song_info(song=song))


@entrypoint(__name__)
def main() -> None:
    client.run(async_main())
$ python file.py
`PANDA EYES - BROKEN` by `PandaEyesOfficial` (ID: `1081309`, size: `9.71 MB`)

Login

gd.py is now using hashed passwords for safety reasons.

gd.hash_password is provided for convenience.

Moreover, client.login returns an awaitable asynchronous context manager, which can be utilized to factor out the blocks that require logging in.

In the snippet below we define the credentials and hash the password.

import gd

client = gd.Client()

name = "name"
password = "********"

hashed_password = gd.hash_password(password)

Regular login:

await client.login(name, hashed_password)

...  # the client is now logged in

Advanced version:

async with client.login(name, hashed_password):
    ...  # the client is logged in here

...  # but not outside of the `async with` block!

Listening

from entrypoint import entrypoint

import gd

client = gd.Client()

DAILY_INFO = "new daily! `{daily.name}` by `{daily.creator.name}` (ID: `{daily.id}`)"
daily_info = DAILY_INFO.format


@client.event
async def on_daily(daily: gd.Level) -> None:
    print(daily_info(daily=daily))


client.listen_for_daily()


@entrypoint(__name__)
def main() -> None:
    client.create_controller().run()

Documentation

You can find the documentation here.

Support

If you need support with the library, you can send an email or refer to the official Discord server.

Changelog

You can find the changelog here.

Security Policy

You can find the Security Policy of gd.py here.

Contributing

If you are interested in contributing to gd.py, make sure to take a look at the Contributing Guide, as well as the Code of Conduct.

License

gd.py is licensed under the MIT License terms. See License for details.