Skip to content

A basic wrapper for the Discord Linked Roles OAuth2 API.

License

Notifications You must be signed in to change notification settings

staciax/discord-linked-roles

Repository files navigation

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

from linked_roles import LinkedRolesOAuth2, RoleConnection, UserNotFound

app = FastAPI(title='Linked Roles')

client = LinkedRolesOAuth2(
    client_id='client_id',
    client_secret='client_secret',
    redirect_uri='http://localhost:8000/verified-role',
    # token='discord_token',
    scopes=('role_connections.write', 'identify'),
)

@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):

    # get token
    token = await client.get_access_token(code)

    # get user
    user = await client.fetch_user(token)

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

    role = await user.fetch_role_connection()
    
    if role is None:
        # set role connection
        role = RoleConnection(platform_name='VALORANT', platform_username=str(user))

        # add metadata
        role.add_metadata(key='matches', value=10)
        role.add_metadata(key='winrate', value=20)
        role.add_metadata(key='combat_score', value=30)

        # set role metadata
        await user.edit_role_connection(role)

    return 'Role metadata set successfully. Please check your Discord profile.'

Register Example:

import asyncio

from linked_roles import RoleMetadataType, LinkedRolesOAuth2, RoleMetadataRecord

async def main():

    client = LinkedRolesOAuth2(client_id='client_id', token='discord_token')

    async with client:

        records = (
            RoleMetadataRecord(
                key='matches',
                name='Matches',
                type=2,
            ),
            RoleMetadataRecord(
                key='winrate',
                name='Win Rate',
                type=RoleMetadataType.interger_greater_than_or_equal,  # Union Between int and RoleMetadataType
            ),
            RoleMetadataRecord(
                key='combat_score',
                name='Combat Score',
                description='Combat score this season', # description is optional (default: '...')
                type=RoleMetadataType.interger_greater_than_or_equal,
            )
        )

        records = await client.register_role_metadata(records=records, force=True)
        print(records)

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

Cookie secret can be generated with:

import uuid
>> uuid.uuid4().hex

License

licensed under the MIT license.