Browse Source

[Feature] Add possibility to add a role just by the mere presence in a guild

pull/58/head
Evann Regnault 1 year ago
committed by Ike Johnson-Woods
parent
commit
89c628c8a9
  1. 3
      README.md
  2. 10
      src/main/java/org/keycloak/social/discord/DiscordIdentityProvider.java

3
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

10
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<Disc
@Override
protected BrokeredIdentityContext doGetFederatedIdentity(String accessToken) {
log.debug("doGetFederatedIdentity()");
JsonNode profile = null;
JsonNode profile;
try {
profile = SimpleHttp.doGet(PROFILE_URL, session).header("Authorization", "Bearer " + accessToken).asJson();
} catch (Exception e) {
@ -117,9 +116,12 @@ public class DiscordIdentityProvider extends AbstractOAuth2IdentityProvider<Disc
if (getConfig().hasMappedRoles()) {
Map<String, HashMap<String, String>> 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<Disc
}
}
if (profile instanceof ObjectNode) {
((ObjectNode) profile).put("discord-groups", groups);
((ObjectNode) profile).set("discord-groups", groups);
}
return extractIdentityFromProfile(null, profile);

Loading…
Cancel
Save