Skip to content

Instantly share code, notes, and snippets.

@SocraticPhoenix
Created November 6, 2018 18:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SocraticPhoenix/280faa0253daf3cfb2deba0b65924169 to your computer and use it in GitHub Desktop.
Save SocraticPhoenix/280faa0253daf3cfb2deba0b65924169 to your computer and use it in GitHub Desktop.
package com.gmail.socraticphoenix.color;
import net.dv8tion.jda.core.AccountType;
import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.JDABuilder;
import net.dv8tion.jda.core.Permission;
import net.dv8tion.jda.core.entities.Game;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Role;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.core.hooks.ListenerAdapter;
import javax.security.auth.login.LoginException;
import java.awt.Color;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.stream.Collectors;
public class ColorBot extends ListenerAdapter {
private static final Map<String, Color> colors = new HashMap<String, Color>() {{
put("white", Color.WHITE);
put("light gray", Color.LIGHT_GRAY);
put("gray", Color.GRAY);
put("dark gray", Color.DARK_GRAY);
put("black", new Color(0, 0, 1));
put("red", Color.RED);
put("pink", Color.PINK);
put("orange", Color.ORANGE);
put("yellow", Color.YELLOW);
put("green", Color.GREEN);
put("magenta", Color.MAGENTA);
put("cyan", Color.CYAN);
put("blue", Color.BLUE);
}};
public static void main(String[] args) throws LoginException {
ColorBot bot = new ColorBot();
if (args.length != 1) {
System.out.println("Expected exactly 1 argument");
return;
}
String token = args[0];
JDA jda = new JDABuilder(AccountType.BOT)
.setToken(token)
.addEventListener(bot)
.buildAsync();
jda.getPresence().setGame(Game.playing("!color <hex>"));
Scanner scanner = new Scanner(System.in);
while (true) {
String k = scanner.nextLine();
if (k.equals("exit")) {
System.out.println("Exiting...");
jda.shutdown();
return;
} else if (k.startsWith("announce ")) {
k = k.replaceFirst("announce ", "");
System.out.println("Announcing...");
for (Guild guild : jda.getGuilds()) {
guild.getDefaultChannel().sendMessage("[Bot Announcement] " + k).submit();
}
System.out.println("Announced.");
} else if (k.equals("leave-all")) {
System.out.println("Leaving...");
jda.getGuilds().forEach(g -> g.leave().submit());
System.out.println("Left.");
}
}
}
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
String msg = event.getMessage().getContentStripped();
if (msg.startsWith("!color ")) {
String colorText = msg.replaceFirst("!color ", "");
Guild guild = event.getGuild();
Member member = event.getMember();
if(this.isColor(colorText)) {
Color color = this.parseColor(colorText);
if (color.equals(Color.BLACK)) {
color = colors.get("black");
}
this.getColorRole(member, guild, color,
role -> {
List<Role> colorRoles = getColorRoles(guild);
colorRoles.remove(role);
colorRoles.removeIf(r -> !member.getRoles().contains(r));
guild.getController().modifyMemberRoles(member, Collections.singleton(role), colorRoles).submit();
});
event.getChannel().sendMessage(member.getAsMention() + " updating your color now! :grin:").submit();
} else if (colorText.equals("remove")) {
List<Role> colorRoles = getColorRoles(guild);
colorRoles.removeIf(r -> !member.getRoles().contains(r));
guild.getController().modifyMemberRoles(member, Collections.emptyList(), colorRoles).submit();
event.getChannel().sendMessage(member.getAsMention() + " updating your color now! :grin:").submit();
} else if (colorText.equals("purge") && event.getMember().hasPermission(Permission.MANAGE_ROLES)) {
purge(event.getGuild());
event.getChannel().sendMessage(member.getAsMention() + " purging color roles now! :frowning:").submit();
}
}
}
private List<Role> getColorRoles(Guild guild) {
return guild.getRoles().stream().filter(r -> {
String name = r.getName();
if (this.isHexCode(name)) {
return this.toHexCode(this.getColor(r)).equals(name);
} else {
return false;
}
}).collect(Collectors.toList());
}
private void purge(Guild guild) {
List<Role> colors = getColorRoles(guild);
guild.getMembers().stream().forEach(m -> m.getRoles().stream().forEach(r -> {
if (colors.contains(r)) {
colors.remove(r);
}
}));
colors.forEach(r -> r.delete().submit());
}
private void getColorRole(Member member, Guild guild, Color color, Consumer<Role> acceptor) {
Role target = guild.getRoles().stream().filter(r -> color.equals(this.getColor(r)) && r.getName().equals(this.toHexCode(color))).findFirst().orElse(null);
if (target != null) {
hoistRole(member, target, guild);
acceptor.accept(target);
} else {
guild.getController().createRole()
.setColor(color)
.setName(this.toHexCode(color))
.setMentionable(false)
.setHoisted(false).queue(role -> {
hoistRole(member, role, guild);
acceptor.accept(role);
});
}
}
private void hoistRole(Member member, Role role, Guild guild) {
int rpos = role.getPosition();
int mpos = member.getRoles().stream().mapToInt(Role::getPosition).max().orElse(-1);
if (mpos >= rpos) {
guild.getController().modifyRolePositions()
.selectPosition(role)
.moveTo(mpos).submit();
}
}
private boolean isColor(String k) {
try {
Integer.parseUnsignedInt(k, 16);
return true;
} catch (NumberFormatException e) {
return colors.containsKey(k.toLowerCase());
}
}
private Color parseColor(String k) {
try {
return new Color(Integer.parseUnsignedInt(k.toLowerCase(), 16));
} catch (NumberFormatException e) {
Color c = colors.get(k.toLowerCase());
if (c == null) {
return Color.LIGHT_GRAY;
} else {
return c;
}
}
}
private boolean isHexCode(String k) {
if (k.startsWith("#")) {
k = k.replaceFirst("#", "");
try {
Integer.parseUnsignedInt(k, 16);
return true;
} catch (NumberFormatException e) {
return false;
}
} else {
return false;
}
}
private String toHexCode(Color color) {
return "#" + Integer.toUnsignedString(color.getRGB(), 16);
}
private Color getColor(Role role) {
return role.getColor() == null ? Color.LIGHT_GRAY : role.getColor();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment