{"id":14983558,"url":"https://github.com/toobeeh/typolinkedrolesservice","last_synced_at":"2026-02-18T00:32:31.592Z","repository":{"id":255240266,"uuid":"848965350","full_name":"toobeeh/TypoLinkedRolesService","owner":"toobeeh","description":"Service to save Palantir profile stats to Discord App Metadata","archived":false,"fork":false,"pushed_at":"2024-10-20T11:13:44.000Z","size":79,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-10T15:46:27.001Z","etag":null,"topics":["discord","dotnet","grpc","linked-roles","rest","skribbl-typo"],"latest_commit_sha":null,"homepage":"https://discord-roles.typo.rip","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/toobeeh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-28T18:19:55.000Z","updated_at":"2024-10-20T11:13:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"9df741af-380c-4891-943e-8dcd02a8c277","html_url":"https://github.com/toobeeh/TypoLinkedRolesService","commit_stats":{"total_commits":30,"total_committers":2,"mean_commits":15.0,"dds":"0.033333333333333326","last_synced_commit":"f55df749c80895e3c319af09cb43643db0383222"},"previous_names":["toobeeh/typolinkedrolesservice"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/toobeeh/TypoLinkedRolesService","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toobeeh%2FTypoLinkedRolesService","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toobeeh%2FTypoLinkedRolesService/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toobeeh%2FTypoLinkedRolesService/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toobeeh%2FTypoLinkedRolesService/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/toobeeh","download_url":"https://codeload.github.com/toobeeh/TypoLinkedRolesService/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/toobeeh%2FTypoLinkedRolesService/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279014484,"owners_count":26085535,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["discord","dotnet","grpc","linked-roles","rest","skribbl-typo"],"created_at":"2024-09-24T14:07:26.136Z","updated_at":"2025-10-13T09:12:18.983Z","avatar_url":"https://github.com/toobeeh.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Typo linked Roles Service\n[![part of Typo ecosystem](https://img.shields.io/badge/Typo%20ecosystem-TypoLinkedRolesService-blue?style=flat\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAACV0lEQVR4nO3dPUrDYByA8UQ8g15AI+gsOOnmrufoIBT0DAUFB+/R3bFTobOCwQvoJSouNcObhHyZ9n2eHwiirW3Th79J2iaJJEmSJEmSJIC06iGu1+vgz9M0Df9CY6t8PkP2fMrYDADOAOAMAM4A4OrWGl3bj0Pp8+wEgDMAuP2uD//w7I6+DEf19fbc6eadAHAGAGcAcAYAZwBwnbcCTrIj+jL8Fx/55yA34wSAMwA4A4AzADgDgDMAOAOAMwC4zjuCzi+uN9+fZgeNrvuefw+69FfL10H/fgycAHAGAGcAcAYAZwBwnbcCioZeq2+quIVS5NbBHycAnAHARffRsOksr71Ml38Bi/mk9XVH5EfDFGYAcHVbAWWjw08NbyePEaRmDADOAOAMAM4A4Fq9FjCd5cG1zaeHrPeleXnzsvl+MZ802vooe4fSatn9ftUILp/iYxlCm51UTgA4A4Dr9eXgsv3wtJdfhx71fXICwBkAXGUAv+cLCH0pHk4AOAOAMwA4A4AzALhedwRpXBVneSu9X04AOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzADgDgDMAOAOAMwA4A4AzALio3xG0bUcu3UZOADgDgDMAOAOAMwC4qLcCRjxG0M5wAsAZAJwBwBkAnAHAGQCcAcAZAJwBwBkAnAHA+Y4gOCcAnAHAGQCcAcAZAFyrrYDH++NGl7+6ZZ0yZpc4AeAMAC66HUFDnLwyZk4AOAOAKz+QfMXx58dScdz7se5o8A7t0HJzAtAZAJwBwBkAnAFIkiRJkiRJUtySJPkBweNXgRaWkYQAAAAASUVORK5CYII=)](https://github.com/topics/skribbl-typo)  \n\nThis microservice implements **Discord Linked Role Metadata** in .NET .  \nIt exposes:  \n- A gRPC service which is used internally from other services to trigger user metadata update events  \n- A REST API which implements endpoints for Discord OAuth and metadata management\n- A database for storing tokens\n\nFunctionality is split in service classes:\n- A service for managing and pushing metadata definition and user metadata to/from discord\n- A service for managing OAuth2 login and token refresh\n- A service to build metadata from palantir user details\n- A service to register the metadata scheme on discord\n\n## Metadata registration\nOn startup, a hosted service gets the metadata scheme (a static property in Util) and pushes it to discord.  \nVia Swagger (in development /swagger/index.html) the current metadata scheme can be checked.\n\n## User connection\nWhen users want to verify linked roles, they are redirected to the URL specified in the discord developer dashboard.  \nThey land at the REST /connect, where a session cookie is set, and are redirected to the discord OAuth login.  \nUpon successful authorization, the discord OAuth redirects the user to /connect-callback which trades the code grant to an access \u0026 refresh token, which are saved in the databaase so that the app can automatically update user metadata.  \nThe app also builds the current metadata and pushes it to discord, so that the user can aquire the role right now.  \n\n## User metadata update\nThe gRPC server enables other local services to trigger metadata update for users.  \nThe service receives a list of discord Id, for which it checks if a discord token is stored.  \nIf no token is stored, the user has not connected to linked roles. If the token is stored, but expired, it is refreshed.  \nThis might be inperformant when a large number of ids is passed, since DB actions must not be executed on the same DbContext in parallel.  \nWhen the tokens are fetched, the metadata for the users is built and pushed in parallel.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoobeeh%2Ftypolinkedrolesservice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftoobeeh%2Ftypolinkedrolesservice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftoobeeh%2Ftypolinkedrolesservice/lists"}