Skip to main content

A basic wrapper for the Discord Linked Roles OAuth2 API.

Project description

Discord Linked Roles OAuth2

A basic wrapper for the Discord Linked Roles OAuth2 API.

Releases

Installation

$ pip install -U linked-roles

FastAPI Example:

from fastapi import FastAPI
from fastapi.responses import RedirectResponse

import config
from linked_roles import LinkedRolesOAuth2, OAuth2Scopes, RolePlatform, UserNotFound

app = FastAPI(title='Linked Roles OAuth2')

client = LinkedRolesOAuth2(
    client_id=config.DISCORD_CLIENT_ID,
    client_secret=config.DISCORD_CLIENT_SECRET,
    redirect_uri=config.DISCORD_REDIRECT_URI,
    # token=config.DISCORD_TOKEN, # Optinal for Resgister
    scopes=(OAuth2Scopes.role_connection_write, OAuth2Scopes.identify),
    state=config.COOKIE_SECRET,
)

@app.on_event('startup')
async def startup():
    await client.start()

@app.on_event('shutdown')
async def shutdown():
    await client.close()

@app.get('/linked-role')
async def linked_roles():
    url = client.get_oauth_url()
    return RedirectResponse(url=url)

@app.get('/verified-role')
async def verified_role(code: str):

    tokens = await client.get_oauth2_tokens(code)
    user = await client.fetch_user(tokens=tokens)

    if user is None:
        raise UserNotFound('User not found')

    platform = RolePlatform(name='VALORANT', username='STACIA#1234')
    platform.add_metadata(key='matches', value=100)
    platform.add_metadata(key='winrate', value=50)
    platform.add_metadata(key='combat_score', value=10)
    platform.add_metadata(key='last_update', value=datetime.datetime.now())
    platform.add_metadata(key='verified', value=True)

    await user.edit_role_metadata(platform=platform)

    return 'Verified role successfully'

Register Example:

import asyncio

import config
from linked_roles import AppRoleConnectionMetadataRecordType as RoleMetadataType, LinkedRolesOAuth2, RoleMetadataRecord


async def main():

    client = LinkedRolesOAuth2(client_id=config.DISCORD_CLIENT_ID, token=config.DISCORD_TOKEN)

    async with client:

        records = (
            RoleMetadataRecord(
                key='matches',
                name='Matches',
                description='Number of matches this season',
                type=2,
            ),
            RoleMetadataRecord(
                key='winrate',
                name='Win Rate',
                description='Win rate this season',
                type=RoleMetadataType.interger_greater_than_or_equal,
            ),
            RoleMetadataRecord(
                key='combat_score',
                name='Combat Score',
                description='Combat score this season',
                type=RoleMetadataType.interger_greater_than_or_equal,
            ),
            RoleMetadataRecord(
                key='last_update',
                name='Last Update',
                description='Last time this data was updated',
                type=RoleMetadataType.datetime_less_than_or_equal,
            ),
            RoleMetadataRecord(
                key='verified',
                name='Verified',
                description='Verified role',
                type=RoleMetadataType.boolean_equal,
            )
        )

        records = await client.register_role_metadata(records=records)
        print(records)


if __name__ == '__main__':
    asyncio.run(main())

Config Example:

DISCORD_TOKEN = '<your bot token>'
DISCORD_CLIENT_ID = '<your client id>'
DISCORD_CLIENT_SECRET = '<your client secret>'
DISCORD_REDIRECT_URI = 'http://localhost:8000/verified-role'  # example redirect uri
COOKIE_SECRET = '<your cookie secret>'

# cookie secret can be generated with:
import uuid
>> uuid.uuid4().hex

More Examples:

TODO:

  • Add more examples
  • Add documentation
  • Add database support (postgresql, sqlite, etc.) ?
  • add more class error

Code Style Inspiration

License

licensed under the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

linked-roles-1.1.1.tar.gz (14.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

linked_roles-1.1.1-py3-none-any.whl (16.5 kB view details)

Uploaded Python 3

File details

Details for the file linked-roles-1.1.1.tar.gz.

File metadata

  • Download URL: linked-roles-1.1.1.tar.gz
  • Upload date:
  • Size: 14.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for linked-roles-1.1.1.tar.gz
Algorithm Hash digest
SHA256 db38818ff52a6bd68710abec75bc2c37085ddd4e28f2dbb94ccb658982f71471
MD5 87723586511fd9c79a09733cc5f07943
BLAKE2b-256 b31a04fa1000c06b9d02abe1c0499bae880d0acf046323d94ed52f8908e67755

See more details on using hashes here.

File details

Details for the file linked_roles-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: linked_roles-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 16.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for linked_roles-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3a6ff9858578acb30b77eae71634dd3124d5c55be2efd92fee859afdc1b5645c
MD5 3667d8d5e67bd9b1b49a393603f4d7ca
BLAKE2b-256 de738b91c434c64a67bc478d9a25b6fb0e99853bcf024d80b44cbc4fa5eab873

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page