Skip to content

Commit

Permalink
NSFW Level for Guilds (servers).
Browse files Browse the repository at this point in the history
  • Loading branch information
ShindouMihou authored and felldo committed Jun 18, 2021
1 parent 1abd592 commit 96153d6
Show file tree
Hide file tree
Showing 7 changed files with 192 additions and 0 deletions.
@@ -0,0 +1,70 @@
package org.javacord.api.entity.server;

import java.util.Arrays;

/**
* An enum containing all the NSFW Levels a server can have.
*/
public enum NsfwLevel {

/**
* The server has not set a specific NSFW level and
* is considered as neutral.
*/
DEFAULT(0),

/**
* The server is considered explicit.
*/
EXPLICIT(1),

/**
* The server is safe for work.
*/
SAFE(2),

/**
* The server is age restricted.
*/
AGE_RESTRICTED(3),

/**
* An unknown NSFW level, most likely something new added by Discord.
*/
UNKNOWN(-1);

/**
* The id of the NSFW level.
*/
private final int id;

/**
* Creates a new NSFW level.
*
* @param id The id of the NSFW level.
*/
NsfwLevel(int id) {
this.id = id;
}

/**
* Gets the id of the NSFW level.
*
* @return The id of the NSFW level.
*/
public int getId() {
return id;
}

/**
* Gets the NSFW level by id.
* @param id The id of the NSFW level.
* @return The NSFW level with the given id.
*/
public static NsfwLevel fromId(int id) {
return Arrays.stream(values())
.filter(nsfwLevel -> nsfwLevel.getId() == id)
.findFirst().orElse(UNKNOWN);
}

}
Expand Up @@ -114,6 +114,13 @@ public interface Server extends DiscordEntity, Nameable, UpdatableFromCache<Serv
*/
Optional<String> getDescription();

/**
* Gets the NSFW level of the server.
*
* @return The NSFW level of the server.
*/
NsfwLevel getNsfwLevel();

/**
* Gets the moderators-only channel (sometimes also called "public updates channel").
*
Expand Down
@@ -0,0 +1,21 @@
package org.javacord.api.event.server;

import org.javacord.api.entity.server.NsfwLevel;

public interface ServerChangeNsfwLevelEvent extends ServerEvent {

/**
* The old NSFW level of the server.
*
* @return the old NSFW level of the server.
*/
NsfwLevel getOldNsfwLevel();

/**
* The new NSFW level of the server.
*
* @return the new NSFW level of the server.
*/
NsfwLevel getNewNsfwLevel();

}
@@ -0,0 +1,17 @@
package org.javacord.api.listener.server;

import org.javacord.api.event.server.ServerChangeNsfwLevelEvent;
import org.javacord.api.listener.GloballyAttachableListener;
import org.javacord.api.listener.ObjectAttachableListener;

public interface ServerChangeNsfwLevelListener extends ServerAttachableListener, GloballyAttachableListener,
ObjectAttachableListener {

/**
* This method is called every time a server changes its NSFW level.
*
* @param event The event.
*/
void onServerChangeNsfwLevel(ServerChangeNsfwLevelEvent event);

}
Expand Up @@ -30,6 +30,7 @@
import org.javacord.api.entity.server.DefaultMessageNotificationLevel;
import org.javacord.api.entity.server.ExplicitContentFilterLevel;
import org.javacord.api.entity.server.MultiFactorAuthenticationLevel;
import org.javacord.api.entity.server.NsfwLevel;
import org.javacord.api.entity.server.Server;
import org.javacord.api.entity.server.ServerFeature;
import org.javacord.api.entity.server.VerificationLevel;
Expand Down Expand Up @@ -228,6 +229,11 @@ public class ServerImpl implements Server, Cleanupable, InternalServerAttachable
*/
private volatile BoostLevel boostLevel;

/**
* The NSFW Level of the server.
*/
private volatile NsfwLevel nsfwLevel;

/**
* The server's premium subscription count.
*/
Expand Down Expand Up @@ -294,6 +300,7 @@ public ServerImpl(DiscordApiImpl api, JsonNode data) {
DefaultMessageNotificationLevel.fromId(data.get("default_message_notifications").asInt());
multiFactorAuthenticationLevel = MultiFactorAuthenticationLevel.fromId(data.get("mfa_level").asInt());
boostLevel = BoostLevel.fromId(data.get("premium_tier").asInt());
nsfwLevel = NsfwLevel.fromId(data.get("nsfw_level").asInt());
preferredLocale = new Locale.Builder().setLanguageTag(data.get("preferred_locale").asText()).build();
if (data.has("icon") && !data.get("icon").isNull()) {
iconHash = data.get("icon").asText();
Expand Down Expand Up @@ -868,6 +875,15 @@ public void setBoostLevel(BoostLevel boostLevel) {
this.boostLevel = boostLevel;
}

/**
* Sets the NSFW level of the server.
*
* @param nsfwLevel The NSFW level of the server.
*/
public void setNsfwLevel(NsfwLevel nsfwLevel) {
this.nsfwLevel = nsfwLevel;
}

/**
* Sets the preferred locale of the server.
*
Expand Down Expand Up @@ -1046,6 +1062,11 @@ public Optional<String> getDescription() {
return Optional.ofNullable(description);
}

@Override
public NsfwLevel getNsfwLevel() {
return nsfwLevel;
}

@Override
public Optional<ServerTextChannel> getModeratorsOnlyChannel() {
return getTextChannelById(moderatorsOnlyChannelId);
Expand Down
@@ -0,0 +1,43 @@
package org.javacord.core.event.server;

import org.javacord.api.entity.server.NsfwLevel;
import org.javacord.api.event.server.ServerChangeNsfwLevelEvent;
import org.javacord.core.entity.server.ServerImpl;

/**
* The implementation of {@link ServerChangeNsfwLevelEvent}.
*/
public class ServerChangeNsfwLevelEventImpl extends ServerEventImpl implements ServerChangeNsfwLevelEvent {

/**
* The old NSFW level of the server.
*/
private final NsfwLevel oldNsfwLevel;

/**
* The new NSFW level of the server.
*/
private final NsfwLevel newNsfwLevel;

/**
* Creates a new NSFW level change event.
* @param server The server of the event.
* @param newNsfwLevel The new NSFW level of the server.
* @param oldNsfwLevel The old NSFW level of the server.
*/
public ServerChangeNsfwLevelEventImpl(ServerImpl server, NsfwLevel newNsfwLevel, NsfwLevel oldNsfwLevel) {
super(server);
this.oldNsfwLevel = oldNsfwLevel;
this.newNsfwLevel = newNsfwLevel;
}

@Override
public NsfwLevel getOldNsfwLevel() {
return oldNsfwLevel;
}

@Override
public NsfwLevel getNewNsfwLevel() {
return newNsfwLevel;
}
}
Expand Up @@ -11,6 +11,7 @@
import org.javacord.api.entity.server.DefaultMessageNotificationLevel;
import org.javacord.api.entity.server.ExplicitContentFilterLevel;
import org.javacord.api.entity.server.MultiFactorAuthenticationLevel;
import org.javacord.api.entity.server.NsfwLevel;
import org.javacord.api.entity.server.ServerFeature;
import org.javacord.api.entity.server.VerificationLevel;
import org.javacord.api.event.server.ServerChangeAfkChannelEvent;
Expand All @@ -25,6 +26,7 @@
import org.javacord.api.event.server.ServerChangeModeratorsOnlyChannelEvent;
import org.javacord.api.event.server.ServerChangeMultiFactorAuthenticationLevelEvent;
import org.javacord.api.event.server.ServerChangeNameEvent;
import org.javacord.api.event.server.ServerChangeNsfwLevelEvent;
import org.javacord.api.event.server.ServerChangeOwnerEvent;
import org.javacord.api.event.server.ServerChangePreferredLocaleEvent;
import org.javacord.api.event.server.ServerChangeRegionEvent;
Expand All @@ -48,6 +50,7 @@
import org.javacord.core.event.server.ServerChangeModeratorsOnlyChannelEventImpl;
import org.javacord.core.event.server.ServerChangeMultiFactorAuthenticationLevelEventImpl;
import org.javacord.core.event.server.ServerChangeNameEventImpl;
import org.javacord.core.event.server.ServerChangeNsfwLevelEventImpl;
import org.javacord.core.event.server.ServerChangeOwnerEventImpl;
import org.javacord.core.event.server.ServerChangePreferredLocaleEventImpl;
import org.javacord.core.event.server.ServerChangeRegionEventImpl;
Expand Down Expand Up @@ -268,6 +271,16 @@ public void handle(JsonNode packet) {
api.getEventDispatcher().dispatchServerChangeBoostLevelEvent(server, server, event);
}

NsfwLevel oldNsfwLevel = server.getNsfwLevel();
NsfwLevel newNsfwLevel = NsfwLevel.fromId(packet.get("nsfw_level").asInt());
if (oldNsfwLevel != newNsfwLevel) {
server.setNsfwLevel(newNsfwLevel);
ServerChangeNsfwLevelEvent event =
new ServerChangeNsfwLevelEventImpl(server, newNsfwLevel, oldNsfwLevel);

api.getEventDispatcher().dispatchServerChangeNsfwLevelEvent(server, server, event);
}

Locale newPreferredLocale =
new Locale.Builder().setLanguageTag(packet.get("preferred_locale").asText()).build();
Locale oldPreferredLocale = server.getPreferredLocale();
Expand Down

0 comments on commit 96153d6

Please sign in to comment.