From 89c628c8a919e9d8410fc9f8d6636e08361468bc Mon Sep 17 00:00:00 2001 From: Evann Regnault Date: Mon, 13 May 2024 19:38:58 +0200 Subject: [PATCH] [Feature] Add possibility to add a role just by the mere presence in a guild --- README.md | 3 ++- .../social/discord/DiscordIdentityProvider.java | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b575663..c5c7824 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,8 @@ To sync roles from Discord -> Keycloak, do the following: 1. Under the `discord` Identity Provider, fill out `Discord Roles mapping` value with the roles you want synced: - The format is `Discord-Guild-ID:Discord-Role-ID:Group-Name`, like so: `613425648685547541:613426529623605268:discord-devs-moderators` - You can specify multiple roles by separating them with commas: `613425648685547541:613426529623605268:discord-devs-moderators,613425648685547541:936746847437983786:discord-devs-modmail` -2. Set up a Mapper under the `discord` Identity Provider: + - If you want to add a role just because the user is on the server, you can use the everyone role ID, which is the same as the guild ID : `613425648685547541:613425648685547541:everyone` +3. Set up a Mapper under the `discord` Identity Provider: - Set Mapper Type to `Claim to Group Mapper` - Set Claim to `discord-groups` - Tick Create Groups if not exists diff --git a/src/main/java/org/keycloak/social/discord/DiscordIdentityProvider.java b/src/main/java/org/keycloak/social/discord/DiscordIdentityProvider.java index 653f721..0414653 100755 --- a/src/main/java/org/keycloak/social/discord/DiscordIdentityProvider.java +++ b/src/main/java/org/keycloak/social/discord/DiscordIdentityProvider.java @@ -35,7 +35,6 @@ import org.keycloak.services.messages.Messages; import jakarta.ws.rs.core.Response; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -100,7 +99,7 @@ public class DiscordIdentityProvider extends AbstractOAuth2IdentityProvider> mappedRoles = getConfig().getMappedRolesAsMap(); for (String guild : mappedRoles.keySet()) { - JsonNode guildMember = null; + JsonNode guildMember; try { guildMember = SimpleHttp.doGet(String.format(GUILD_MEMBER_URL, guild), session).header("Authorization", "Bearer " + accessToken).asJson(); + if (guildMember.has("joined_at") && mappedRoles.get(guild).containsKey(guild) ) { + groups.add(mappedRoles.get(guild).get(guild)); + } for (JsonNode role : guildMember.get("roles")) { String roleString = role.textValue(); if (mappedRoles.get(guild).containsKey(roleString)) { @@ -132,7 +134,7 @@ public class DiscordIdentityProvider extends AbstractOAuth2IdentityProvider