Skip to content

Commit

Permalink
more GuildMember refactoring
Browse files Browse the repository at this point in the history
Attaching an AuditLog reason doesn't seem to work for some odd reason.
  • Loading branch information
R3alCl0ud committed Nov 6, 2017
1 parent b8f3177 commit 6295171
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -918,17 +918,34 @@ public boolean isSyncing() {
return loader.isGuildSyncing(this);
}

public CompletableFuture<IGuildMember> kickMember(IGuildMember guildMember) {
public CompletableFuture<IGuildMember> kick(IGuildMember guildMember) {
return kick(guildMember, null);
}

@Override
public CompletableFuture<IGuildMember> kick(IGuildMember member, String reason) {
if (!isOwner() && getCurrentMember().getPermissions().hasPermission(Permissions.KICK_MEMBERS))
throw new PermissionsException();
throw new PermissionsException("Insufficient Permissions");

return loader.rest.removeMember(this, guildMember);
CompletableFuture<IGuildMember> future = new CompletableFuture<>();
CompletableFuture<Void> kickFuture = loader.rest.request(Methods.DELETE, Endpoints.guildMember(getID(), member.getID()), new RESTOptions(reason), Void.class);

kickFuture.thenAcceptAsync(n -> {
future.complete(member);
});

kickFuture.exceptionally(ex -> {
future.completeExceptionally(ex);
return null;
});

return future;
}

@Override
public CompletableFuture<IGuild> leave() {
CompletableFuture<IGuild> future = new CompletableFuture<>();
this.kickMember(getCurrentMember()).thenAcceptAsync(action -> {
this.kick(getCurrentMember()).thenAcceptAsync(action -> {
future.complete(this);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import io.discloader.discloader.common.DiscLoader;
import io.discloader.discloader.common.event.EventListenerAdapter;
import io.discloader.discloader.common.event.IEventListener;
import io.discloader.discloader.common.event.guild.member.GuildMemberUpdateEvent;
import io.discloader.discloader.common.exceptions.PermissionsException;
import io.discloader.discloader.common.exceptions.VoiceConnectionException;
Expand Down Expand Up @@ -75,18 +76,6 @@ public class GuildMember implements IGuildMember {
*/
public final OffsetDateTime joinedAt;

public GuildMember(IGuild guild, MemberJSON data) {
user = EntityRegistry.addUser(data.user);
this.guild = guild;
nick = data.nick != null ? data.nick : user.getUsername();
joinedAt = data.joined_at == null ? user.createdAt() : OffsetDateTime.parse(data.joined_at);
roleIDs = data.roles != null ? data.roles : new String[] {};

deaf = data.deaf;
mute = deaf || data.mute;

}

public GuildMember(IGuild guild, IUser user) {
this.user = user;

Expand All @@ -107,6 +96,18 @@ public GuildMember(IGuild guild, IUser user, String[] roles, boolean deaf, boole
this.mute = deaf || mute;
}

public GuildMember(IGuild guild, MemberJSON data) {
user = EntityRegistry.addUser(data.user);
this.guild = guild;
nick = data.nick != null ? data.nick : user.getUsername();
joinedAt = data.joined_at == null ? user.createdAt() : OffsetDateTime.parse(data.joined_at);
roleIDs = data.roles != null ? data.roles : new String[] {};

deaf = data.deaf;
mute = deaf || data.mute;

}

public GuildMember(IGuildMember member) {
user = member.getUser();
guild = member.getGuild();
Expand Down Expand Up @@ -146,6 +147,11 @@ public CompletableFuture<IGuildMember> ban() {
return guild.ban(this);
}

@Override
public CompletableFuture<IGuildMember> ban(String reason) {
return guild.ban(this, reason);
}

/**
* Server deafens a {@link GuildMember} if they are not already server deafened
*
Expand Down Expand Up @@ -186,6 +192,16 @@ public long getID() {
return user.getID();
}

/*
* (non-Javadoc)
*
* @see io.discloader.discloader.entity.guild.IGuildMember#getJoinTime()
*/
@Override
public OffsetDateTime getJoinTime() {
return joinedAt;
}

@Override
public DiscLoader getLoader() {
return guild.getLoader();
Expand Down Expand Up @@ -337,6 +353,16 @@ public int hashCode() {
return (getName() + getID()).hashCode();
}

@Override
public boolean hasRole(IRole role) {
for (IRole memberRole : getRoles()) {
if (memberRole.getID() == role.getID()) {
return true;
}
}
return false;
}

/**
* Determines if the member is connected to a voice channel in their
* {@link #guild}
Expand All @@ -358,6 +384,11 @@ public boolean isMuted() {
return hasVoiceConnection() ? (getVoiceState().mute || mute) : mute;
}

@Override
public boolean isOwner() {
return guild.isOwner(this);
}

/**
* Kicks the member from the {@link Guild} if the {@link DiscLoader client} has
* sufficient permissions
Expand All @@ -370,7 +401,12 @@ public boolean isMuted() {
*/
@Override
public CompletableFuture<IGuildMember> kick() {
return guild.kickMember(this);
return guild.kick(this);
}

@Override
public CompletableFuture<IGuildMember> kick(String reason) {
return guild.kick(this, reason);
}

public List<IRole> mergeRoles(IRole... roles) {
Expand Down Expand Up @@ -458,15 +494,47 @@ public CompletableFuture<IGuildMember> setNick(String nick) {
* if the current user doesn't have the MANAGE_ROLE permission.
*/
@Override
public CompletableFuture<IGuildMember> takeRole(IRole role) {
public CompletableFuture<IGuildMember> takeRole(IRole... roles) {
if (!guild.hasPermission(Permissions.MANAGE_ROLES)) {
throw new PermissionsException("Insuccficient Permissions");
}

if (!guild.isOwner() && role.getPosition() >= guild.getCurrentMember().getHighestRole().getPosition())
throw new PermissionsException("Cannot take away roles higher than your's");
List<IRole> rls = getRoles();

for (IRole role : roles) {
if (!guild.isOwner() && role.getPosition() >= guild.getCurrentMember().getHighestRole().getPosition()) {
throw new PermissionsException("Cannot take away roles higher than your's");
}

if (hasRole(role)) {
rls.remove(role);
}
}

CompletableFuture<IGuildMember> future = new CompletableFuture<>();

String[] ids = new String[rls.size()];
for (int i = 0; i < ids.length; i++) {
ids[i] = SnowflakeUtil.asString(rls.get(i));
}

return getLoader().rest.takeRole(this, role);
JSONObject payload = new JSONObject().put("roles", ids);
CompletableFuture<Void> tcf = getLoader().rest.request(Methods.PATCH, Endpoints.guildMember(getGuild().getID(), getID()), new RESTOptions(payload), Void.class);
IEventListener iel = new EventListenerAdapter() {
public void GuildMemberUpdate(GuildMemberUpdateEvent e) {
if (e.member.getID() == getID()) {
future.complete(e.member);
getLoader().removeEventHandler(this);
}
}
};
getLoader().addEventHandler(iel);
tcf.exceptionally(ex -> {
getLoader().removeEventHandler(iel);
future.completeExceptionally(ex);
return null;
});
return future;
}

@Override
Expand All @@ -484,29 +552,4 @@ public CompletableFuture<IGuildMember> unMute() {
return new ModifyMember(this, nick, getRoles(), false, deaf, getVoiceChannel()).execute();
}

/*
* (non-Javadoc)
*
* @see io.discloader.discloader.entity.guild.IGuildMember#getJoinTime()
*/
@Override
public OffsetDateTime getJoinTime() {
return joinedAt;
}

@Override
public boolean isOwner() {
return guild.isOwner(this);
}

@Override
public boolean hasRole(IRole role) {
for (IRole memberRole : getRoles()) {
if (memberRole.getID() == role.getID()) {
return true;
}
}
return false;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -414,8 +414,10 @@ public interface IGuild extends ISnowflake, ICreationTime {
* @throws PermissionsException Thrown if the current user doesn't have the
* {@link Permissions#KICK_MEMBERS} permission.
*/
CompletableFuture<IGuildMember> kickMember(IGuildMember guildMember);
CompletableFuture<IGuildMember> kick(IGuildMember member);

CompletableFuture<IGuildMember> kick(IGuildMember member, String reason);

/**
* Makes the client leave the guild
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ public interface IGuildMember extends ISnowflake, IMentionable {

CompletableFuture<IGuildMember> ban();

CompletableFuture<IGuildMember> ban(String reason);

CompletableFuture<IGuildMember> deafen();

IGuild getGuild();
Expand Down Expand Up @@ -60,10 +62,11 @@ public interface IGuildMember extends ISnowflake, IMentionable {
boolean isOwner();

CompletableFuture<IGuildMember> kick();
CompletableFuture<IGuildMember> kick(String reason);

CompletableFuture<IGuildMember> mute();

CompletableFuture<IGuildMember> takeRole(IRole role);
CompletableFuture<IGuildMember> takeRole(IRole... roles);

CompletableFuture<IGuildMember> unDeafen();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public RESTOptions(Object payload) {

public RESTOptions(String reason) {
this(true, reason, null);
System.out.println(this.reason);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,10 @@ public BaseRequest createRequest(Request<T> request) {
HttpRequest httprequest = base.getHttpRequest();
if (auth && rest.loader.token != null)
httprequest.header("Authorization", rest.loader.token);
if (request.getOptions() != null && request.getOptions().getReason() != null)
if (request.getOptions() != null && request.getOptions().getReason() != null) {
httprequest.header("X-Audit-Log-Reason", request.getOptions().getReason());
System.out.println("is this thing working?");
}
httprequest.header("user-agent", "DiscordBot (http://discloader.io, v0.2.0)");
httprequest.header("Accept-Encoding", "gzip");
return base;
Expand Down

0 comments on commit 6295171

Please sign in to comment.