Added mmultiple commands including music, added Music Module as well as Pagination(s, needs cleaning) and more

This commit is contained in:
Savvy
2017-12-13 20:01:04 -05:00
parent 67cc8c2b7a
commit b2d23bece2
49 changed files with 1853 additions and 111 deletions

View File

@@ -3,8 +3,12 @@ package io.rixa.bot.commands;
import io.rixa.bot.commands.perms.RixaPermission;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
@@ -32,5 +36,7 @@ public abstract class Command {
setAliases(aliases);
}
public abstract void execute(GuildMessageReceivedEvent event);
// public abstract void execute(GuildMessageReceivedEvent event);
public abstract void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) throws IOException;
}

View File

@@ -0,0 +1,48 @@
package io.rixa.bot.commands.cmds.admin;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.DiscordUtils;
import io.rixa.bot.utils.MessageFactory;
import lombok.Getter;
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.entities.TextChannel;
import net.dv8tion.jda.core.exceptions.ErrorResponseException;
import net.dv8tion.jda.core.requests.ErrorResponse;
public class PMCommand extends Command {
@Getter private RixaPermission rixaPermission;
public PMCommand(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
this.rixaPermission = rixaPermission;
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
String msg = String.join(" ", args);
Role role = DiscordUtils.getMentionedRole(guild, msg);
if (role == null) {
MessageFactory.create(String.format
("You must mention a role to private message! Example: `%s @role this is a test private message!`",
commandLabel)).queue(channel);
return;
}
msg = msg.replaceFirst(role.getAsMention(), "").replaceFirst("@" + role.getName(),"");
int usersWithRole = 0;
int sendingFailed = 0;
for (Member memberWithRole : guild.getMembersWithRoles(role)) {
try {
memberWithRole.getUser().openPrivateChannel().complete().sendMessage(msg).queue();
usersWithRole++;
} catch (ErrorResponseException ex) {
if (ex.getErrorResponse() == ErrorResponse.CANNOT_SEND_TO_USER)
sendingFailed++;
}
}
MessageFactory.create("```" + msg + "```")
.footer("Successful Deliveries: " + usersWithRole + " | Failed Deliveries: " + sendingFailed, guild.getIconUrl()).queue(channel);
}
}

View File

@@ -0,0 +1,39 @@
package io.rixa.bot.commands.cmds.general;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.MessageFactory;
import io.rixa.bot.utils.WebUtil;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import org.json.JSONObject;
import java.io.IOException;
public class AdviceCommand extends Command {
public AdviceCommand(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
MessageFactory.create(getAdvice()).setTitle("Advice Request").footer("Requested by: " + member.getEffectiveName(), member.getUser().getEffectiveAvatarUrl())
.setColor(member.getColor()).queue(channel);
}
private String getAdvice() {
String json;
try {
json = WebUtil.getWebPage("http://api.adviceslip.com/advice");
} catch (IOException e) {
return "Could not find any advice for you.";
}
JSONObject obj = new JSONObject(json);
JSONObject slip = obj.getJSONObject("slip");
return slip.getString("advice");
}
}

View File

@@ -0,0 +1,30 @@
package io.rixa.bot.commands.cmds.general;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.guild.RixaGuild;
import io.rixa.bot.guild.manager.GuildManager;
import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
public class FeaturesCommand extends Command {
private String[] features = {
"Music", "Economy", "Moderation", "Server List", "User Profiles",
"Role Management", "Fun Commands", "Custom Commands", "Games", "& more."
};
public FeaturesCommand(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
MessageFactory.create((features == null || features.length == 0) ? "There are currently no features listed." :
"Rixa Features: " + String.join("\n", features
)).setColor(member.getColor()).queue(channel);
}
}

View File

@@ -4,7 +4,10 @@ import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.EmbedBuilder;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.core.exceptions.ErrorResponseException;
import net.dv8tion.jda.core.exceptions.PermissionException;
@@ -16,24 +19,21 @@ public class HelpCommand extends Command {
}
@Override
public void execute(GuildMessageReceivedEvent event) {
try {
event.getMessage().delete().complete();
} catch (PermissionException ignored) {}
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
EmbedBuilder embedBuilder = new EmbedBuilder();
String stringBuilder = "\u2753" +
" **Help**" +
"\n" +
"Click the corresponding number for more information about the command menu.";
embedBuilder.setTitle(String.format("Help: %s", event.getGuild().getId()))
embedBuilder.setTitle(String.format("Help: %s", guild.getId()))
.setDescription(stringBuilder)
.addField("1 - General Commands", "Reveals usable commands intended for `everyone`", false)
.addField("2 - Staff Commands", "Reveals usable commands intended for `staff` use only", false)
.addField("3 - Music Commands", "Reveals usable commands to configure Rixa for your discord!", false)
.setColor(event.getMember().getColor());
Message message = event.getAuthor().openPrivateChannel().complete().sendMessage(embedBuilder.build()).complete();
MessageFactory.create(event.getMember().getAsMention()
+ ", the help menu has been private messaged to you!").setColor(event.getMember().getColor()).queue(event.getChannel());
.setColor(member.getColor());
Message message = member.getUser().openPrivateChannel().complete().sendMessage(embedBuilder.build()).complete();
MessageFactory.create(member.getAsMention()
+ ", the help menu has been private messaged to you!").setColor(member.getColor()).queue(channel);
try {
message.addReaction("\u0031\u20E3").queue();
message.addReaction("\u0032\u20E3").queue();

View File

@@ -8,15 +8,14 @@ import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.EmbedBuilder;
import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.JDAInfo;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.entities.MessageEmbed;
import net.dv8tion.jda.core.entities.User;
import net.dv8tion.jda.core.entities.*;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class InfoCommand extends Command {
@@ -26,33 +25,32 @@ public class InfoCommand extends Command {
}
@Override
public void execute(GuildMessageReceivedEvent event) {
System.out.println("INFO COMMAND TRIGGERED");
String[] messages = event.getMessage().getContent().split(" ");
System.out.println(messages.length);
if(messages.length >= 2) {
Member member = DiscordUtils.memberSearch(event.getGuild(), event.getMessage().getContent(), false).get(0);
public void execute(String commandLabel, Guild guild, Member author, TextChannel channel, String[] args) {
if(args.length >= 1) {
Member member = DiscordUtils.memberSearch(guild, String.join(" ", args), false).get(0);
User user = member.getUser();
OffsetDateTime time = user.getCreationTime();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM/dd/yyyy HH:mm:ss");
List<String> roles = new ArrayList<>();
member.getRoles().forEach(role -> roles.add(role.getName()));
MessageFactory.create("Playing **" + (member.getGame() == null ? "Unknown" : member.getGame().getName()) + "**")
.setColor(member.getColor())
.setThumbnail(user.getAvatarUrl())
.setAuthor("User Information: " + user.getName(), null, user.getAvatarUrl())
.addField("User", user.getAsMention(), true)
.addField("ID", user.getId(), true)
.addField("Roles", String.valueOf(member.getRoles().size()), true)
.addField("Roles: "+ member.getRoles().size(), String.join(" **,** " + roles), true)
.addField("Status", member.getOnlineStatus().name(), true)
.addField("Mutual Guilds", String.valueOf(user.getMutualGuilds().size()), true)
.addField("Nickname", member.getNickname() == null ? "None" : member.getNickname(), true)
.addField("Created", time.format(formatter), true)
.addField("Joined", member.getJoinDate().format(formatter), true)
.queue(event.getChannel());
.queue(channel);
return;
}
User botOwner = event.getJDA().getUserById("202944101333729280");
User botOwner = guild.getJDA().getUserById("202944101333729280");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
Date date1 = new Date(Rixa.getTimeUp());
Date date1 = new Date(Rixa.getInstance().getTimeUp());
long difference = new Date().getTime() - date1.getTime();
long seconds = difference / 1000;
int day = (int) TimeUnit.SECONDS.toDays(seconds);
@@ -71,13 +69,14 @@ public class InfoCommand extends Command {
"levels, and more. Rixa was created to bring ease and simplicity to managing Discord servers, and has since grown into much more than just a bot used for " +
"moderation.")
.setTitle("Rixa Discord Bot", "http://rixa.io/")
.addField("Created", event.getJDA().getSelfUser().getCreationTime().format(formatter), true)
.addField("Created", guild.getJDA().getSelfUser().getCreationTime().format(formatter), true)
.addField("Bot Uptime ", uptime, true)
.addField("Total Guilds", String.valueOf(guildCount), true)
.addField("Total Users", String.valueOf(userCount), true)
.addField("JDA Version", JDAInfo.VERSION, true)
.addField("Rixa Developer", botOwner.getName() + "#" + botOwner.getDiscriminator(), true)
.footer("Requested by " + event.getAuthor().getName() + "#" + event.getAuthor().getDiscriminator(), event.getAuthor().getAvatarUrl())
.queue(event.getChannel());
.footer("Requested by " + author.getUser().getName() + "#" + author.getUser().getDiscriminator(), author.getUser().getAvatarUrl())
.queue(channel);
}
}

View File

@@ -0,0 +1,60 @@
package io.rixa.bot.commands.cmds.general;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.MessageFactory;
import io.rixa.bot.utils.WebUtil;
import net.dv8tion.jda.core.entities.Channel;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import org.json.JSONObject;
import java.io.IOException;
import java.util.List;
public class MinecraftCommand extends Command {
public MinecraftCommand(String command, RixaPermission rixaPermission, String description, List<String>aliases) {
super(command, rixaPermission, description, aliases);
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
if (args.length == 0) {
MessageFactory.create("Incorrect Usage! Try " + args[0] + " {IP}:{PORT}").setColor(member.getColor()).queue(channel);
return;
}
String ipAddress = args[1];
JSONObject object = get(ipAddress);
if (object == null || !object.getBoolean("status")) {
// Not correct
MessageFactory.create("Server Information not found!").setColor(member.getColor()).queue(channel);
return;
}
JSONObject onlineObject = object.getJSONObject("players");
MessageFactory.create(
object.getJSONObject("motds").getString("clean"))
.setTitle(ipAddress)
.addField("Version", object.getString("version"), true)
.addField("Online Players", (onlineObject == null) ? "0/0" : onlineObject.getInt("online") + "/" + onlineObject.getInt("max"), true)
.addField("Ping", String.valueOf(object.getInt("ping")), true)
.setImage(String.format("https://use.gameapis.net/mc/query/banner/%s/night,caps", ipAddress))
.addThumbnail("https://use.gameapis.net/mc/query/icon/" + ipAddress)
.queue(channel);
}
private JSONObject get(String ip) {
String json;
try {
json = WebUtil.getWebPage("https://use.gameapis.net/mc/query/info/" + ip);
} catch (IOException e) {
return null;
}
return new JSONObject(json);
}
}

View File

@@ -0,0 +1,32 @@
package io.rixa.bot.commands.cmds.general;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.guild.RixaGuild;
import io.rixa.bot.guild.manager.GuildManager;
import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import java.util.ArrayList;
import java.util.List;
public class ModulesCommand extends Command {
public ModulesCommand(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
List<String> modules = new ArrayList<>();
rixaGuild.getModules().values().forEach
(module -> modules.add(String.format("%s [%s]", module.getName(), (module.isEnabled()) ? "Enabled" : "Disabled")));
String moduleMessage = String.format(
"Modules: \n%s",
String.join(",\n", modules));
MessageFactory.create(moduleMessage).setColor(member.getColor()).setThumbnail(guild.getIconId()).queue(channel);
}
}

View File

@@ -0,0 +1,344 @@
package io.rixa.bot.commands.cmds.general;
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.bandcamp.BandcampAudioSourceManager;
import com.sedmelluq.discord.lavaplayer.source.beam.BeamAudioSourceManager;
import com.sedmelluq.discord.lavaplayer.source.http.HttpAudioSourceManager;
import com.sedmelluq.discord.lavaplayer.source.local.LocalAudioSourceManager;
import com.sedmelluq.discord.lavaplayer.source.soundcloud.SoundCloudAudioSourceManager;
import com.sedmelluq.discord.lavaplayer.source.twitch.TwitchStreamAudioSourceManager;
import com.sedmelluq.discord.lavaplayer.source.vimeo.VimeoAudioSourceManager;
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioSourceManager;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import io.rixa.bot.apis.YoutubeSearch;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.guild.RixaGuild;
import io.rixa.bot.guild.manager.GuildManager;
import io.rixa.bot.guild.modules.module.MusicModule;
import io.rixa.bot.guild.modules.module.music.MusicManager;
import io.rixa.bot.pagination.QueuePagination;
import io.rixa.bot.utils.DiscordUtils;
import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.MessageBuilder;
import net.dv8tion.jda.core.Permission;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.entities.VoiceChannel;
import net.dv8tion.jda.core.exceptions.PermissionException;
import org.apache.commons.lang3.StringUtils;
import java.awt.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class MusicCommand extends Command {
private final int DEFAULT_VOLUME = 35;
private final AudioPlayerManager playerManager;
public MusicCommand(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
this.playerManager = new DefaultAudioPlayerManager();
this.playerManager.registerSourceManager(new YoutubeAudioSourceManager());
this.playerManager.registerSourceManager(new SoundCloudAudioSourceManager());
this.playerManager.registerSourceManager(new BandcampAudioSourceManager());
this.playerManager.registerSourceManager(new VimeoAudioSourceManager());
this.playerManager.registerSourceManager(new TwitchStreamAudioSourceManager());
this.playerManager.registerSourceManager(new HttpAudioSourceManager());
this.playerManager.registerSourceManager(new LocalAudioSourceManager());
this.playerManager.registerSourceManager(new BeamAudioSourceManager());
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
MusicManager musicManager = getMusicManager(rixaGuild);
AudioPlayer player = musicManager.getPlayer();
QueuePagination queuePagination = musicManager.getScheduler().getQueuePagination();
if (args.length == 1) {
switch (args[0].toLowerCase()) {
case "leave":
MessageFactory.create("Leaving voice channel...").setColor(member.getColor()).queue(channel);
reset(guild, musicManager);
channel.getGuild().getAudioManager().closeAudioConnection();
break;
case "join":
case "summon":
if (member.getVoiceState().getChannel() == null) {
MessageFactory.create("You must be in a voice channel to summon me!").setColor(member.getColor()).queue(channel);
return;
}
VoiceChannel voiceChannel = member.getVoiceState().getChannel();
joinVoice(voiceChannel, member, channel);
break;
case "pause":
case "resume":
case "play":
if (player.isPaused()) {
player.setPaused(false);
MessageFactory.create("MusicPlayer resumed track: " + player.getPlayingTrack().getInfo().title).setColor(member.getColor()).queue(channel);
} else if (!(player.isPaused())) {
player.setPaused(false);
MessageFactory.create("MusicPlayer paused track: " + player.getPlayingTrack().getInfo().title).setColor(member.getColor()).queue(channel);
} else if (player.getPlayingTrack() != null) {
MessageFactory.create("MusicPlayer already playing track: " + player.getPlayingTrack().getInfo().title).setColor(member.getColor()).queue(channel);
} else if (musicManager.getScheduler().getQueue().isEmpty()) {
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
}
break;
case "stop":
musicManager.getScheduler().getQueue().clear();
player.stopTrack();
player.setPaused(false);
MessageFactory.create("The music player has been stopped and queue has been cleared.").setColor(member.getColor()).queue(channel);
break;
case "skip":
AudioTrack audioTrack = musicManager.getScheduler().nextTrack();
if (audioTrack == null) {
MessageFactory.create("The queue is now empty, add more to continue to listen to music!").setColor(member.getColor()).queue(channel);
return;
}
MessageFactory.create("Successfully skipped current track. Now playing: " + audioTrack.getInfo().title).setColor(member.getColor()).queue(channel);
break;
case "nowplaying":
case "np":
audioTrack = musicManager.getScheduler().getPlayer().getPlayingTrack();
if (audioTrack == null) {
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
return;
}
MessageFactory.create().setAuthor(audioTrack.getInfo().title, "https://i.imgur.com/lOoybhD.png")
.addField("Author", audioTrack.getInfo().author, true)
.addField("Duration", getTimestamp(audioTrack.getInfo().length), true)
.addField("Position", getTimestamp(audioTrack.getPosition()), true).queue(channel);
break;
case "playlist":
case "queue":
case "list":
if (musicManager.getScheduler().getQueue().size() == 0) {
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
return;
}
List<AudioTrack> firstPage = queuePagination.getPage(1);
if (firstPage == null || firstPage.isEmpty()) {
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
return;
}
List<String> titles = new ArrayList<>();
for (int i = 0; i < firstPage.size(); i++) {
if (firstPage.get(i) == null) continue;
titles.add("`" + (i + 1) + ")` " + firstPage.get(i).getInfo().title);
}
MessageFactory.create(String.join("\n", titles)).setAuthor("Music Queue", "https://i.imgur.com/lOoybhD.png").queue(channel);
break;
case "restart":
audioTrack = player.getPlayingTrack();
if (audioTrack == null) {
audioTrack = musicManager.getScheduler().getLastTrack();
}
if (audioTrack == null) {
MessageFactory.create("No track has been previously played.").setColor(member.getColor()).queue(channel);
return;
}
MessageFactory.create("Restarting Track: " + audioTrack.getInfo().title).setColor(member.getColor()).queue(channel);
player.playTrack(audioTrack.makeClone());
break;
case "repeat":
musicManager.getScheduler().setRepeating(!musicManager.getScheduler().isRepeating());
MessageFactory.create("Music repeat has been " + (musicManager.getScheduler().isRepeating() ? "enabled" : "disabled"))
.setColor(member.getColor()).queue(channel);
break;
case "playlistrepeat":
case "pr":
musicManager.getScheduler().setPlaylistRepeat(!musicManager.getScheduler().isPlaylistRepeat());
MessageFactory.create("Playlist repeat has been " + (musicManager.getScheduler().isPlaylistRepeat() ? "enabled" : "disabled"))
.setColor(member.getColor()).queue(channel);
break;
case "reset":
reset(guild, musicManager);
guild.getAudioManager().setSendingHandler(musicManager.getSendHandler());
MessageFactory.create("The player has been completely reset!").setColor(member.getColor()).queue(channel);
break;
case "shuffle":
if (musicManager.getScheduler().getQueue().isEmpty()) {
MessageFactory.create("The queue is currently empty!").setColor(member.getColor()).queue(channel);
return;
}
musicManager.getScheduler().shuffle();
MessageFactory.create("The queue has been shuffled!").setColor(member.getColor()).queue(channel);
break;
}
} else if (args.length == 2) {
String string = StringUtils.join(args, " ", 1, args.length);
switch (args[0].toLowerCase()) {
case "join":
VoiceChannel voiceChannel = DiscordUtils.voiceChannelSearch(guild, string);
if (voiceChannel == null) {
return;
}
joinVoice(voiceChannel, member, channel);
break;
case "play":
case "playlist":
case "pplay":
if (member.getVoiceState().getChannel() == null) {
MessageFactory.create("You must be in a voice channel to summon me!").setColor(member.getColor()).queue(channel);
return;
}
if (guild.getSelfMember().getVoiceState().getChannel() == null) {
joinVoice(member.getVoiceState().getChannel(), member, channel);
}
loadAndPlay(musicManager, channel, args[1], (args[1].toLowerCase().contains("playlist")
|| args[0].equalsIgnoreCase("playlist")
|| args[0].equalsIgnoreCase("pplay")));
break;
case "volume":
case "vol":
try {
int newVolume = Math.max(10, Math.min(100, Integer.parseInt(args[1])));
int oldVolume = player.getVolume();
player.setVolume(newVolume);
MessageFactory.create("Music player volume updated from `" + oldVolume + "` to `" + newVolume + "`").setColor(member.getColor()).queue(channel);
} catch (NumberFormatException e) {
MessageFactory.create(args[1] + " is not a valid integer. Try a number between 10 and 100.").setColor(member.getColor()).queue(channel);
}
break;
case "forward":
if (player.getPlayingTrack() == null) {
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
return;
}
try {
player.getPlayingTrack().setPosition(Math.max(0, player.getPlayingTrack().getPosition() + (Integer.parseInt(args[1]) * 1000)));
} catch (NumberFormatException e) {
MessageFactory.create(args[1] + " is not a valid integer. Try `10`!").setColor(member.getColor()).queue(channel);
}
break;
case "back":
if (player.getPlayingTrack() == null) {
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
return;
}
try {
player.getPlayingTrack().setPosition(Math.max(0, player.getPlayingTrack().getPosition() - (Integer.parseInt(args[1]) * 1000)));
} catch (NumberFormatException e) {
MessageFactory.create(args[1] + " is not a valid integer. Try `10`!").setColor(member.getColor()).queue(channel);
}
break;
}
} else if (args.length >= 3) {
String string = StringUtils.join(args, " ", 1, args.length);
switch (args[0].toLowerCase()) {
case "join":
VoiceChannel voiceChannel = DiscordUtils.voiceChannelSearch(guild, string);
if (voiceChannel == null) {
MessageFactory.create("Sorry I was unable to find the VoiceChannel: `" + string + "`.").setColor(member.getColor()).queue(channel);
}
joinVoice(voiceChannel, member, channel);
break;
case "youtube":
case "ytsearch":
case "yt":
case "search":
try {
YoutubeSearch ytSearch = new YoutubeSearch(string);
loadAndPlay(musicManager, channel, ytSearch.getUrl(0), false);
} catch (IOException e) {
MessageFactory.create("Error Occurred: Could not play youtube video.").setColor(member.getColor()).queue(channel);
}
break;
}
}
}
private void joinVoice(VoiceChannel voiceChannel, Member member, TextChannel channel) {
try {
channel.getGuild().getAudioManager().openAudioConnection(voiceChannel);
MessageFactory.create("Entering Voice Channel: " + voiceChannel.getName()).setColor(member.getColor()).queue(channel);
} catch (PermissionException e) {
if (e.getPermission() == Permission.VOICE_CONNECT) {
MessageFactory.create("I do not have permission to join the requested voice channel.").setColor(member.getColor()).queue(channel);
}
}
}
private void reset(Guild guild, MusicManager musicManager) {
synchronized (musicManager) {
musicManager.getScheduler().getQueue().clear();
musicManager.getScheduler().getPlayer().destroy();
guild.getAudioManager().setSendingHandler(null);
}
}
private void loadAndPlay(MusicManager mng, final TextChannel channel, final String trackUrl, final boolean addPlaylist) {
playerManager.loadItemOrdered(mng, trackUrl, new AudioLoadResultHandler() {
@Override
public void trackLoaded(AudioTrack track) {
String msg = "Adding to queue: " + track.getInfo().title;
mng.getScheduler().queue(track);
MessageFactory.create(msg).setColor(Color.decode("#4CC276")).queue(channel);
}
@Override
public void playlistLoaded(AudioPlaylist playlist) {
AudioTrack firstTrack = playlist.getSelectedTrack();
List<AudioTrack> tracks = playlist.getTracks();
if (firstTrack == null) {
firstTrack = playlist.getTracks().get(0);
}
if (addPlaylist) {
MessageFactory.create("Adding (" + playlist.getTracks().size() + ") tracks to queue from playlist: " + playlist.getName()).setColor(Color.decode("#4CC276")).queue(channel);
tracks.forEach(mng.getScheduler()::queue);
} else {
MessageFactory.create("Adding to queue " + firstTrack.getInfo().title + " (first track of playlist " + playlist.getName() + ")").setColor(Color.decode("#4CC276")).queue(channel);
mng.getScheduler().queue(firstTrack);
}
}
@Override
public void noMatches() {
MessageFactory.create("Nothing found by " + trackUrl).setColor(Color.decode("#4CC276")).queue(channel);
}
@Override
public void loadFailed(FriendlyException exception) {
MessageFactory.create("Could not play: " + exception.getMessage()).setColor(Color.decode("#4CC276")).queue(channel);
exception.printStackTrace();
}
});
}
public MusicManager getMusicManager(RixaGuild guild) {
MusicModule musicModule = (MusicModule) guild.getModule("Music");
if (musicModule.getMusicManager() != null) {
return musicModule.getMusicManager();
}
MusicManager musicManager = new MusicManager(this.playerManager);
musicManager.getPlayer().setVolume(DEFAULT_VOLUME);
musicModule.setMusicManager(musicManager);
return musicManager;
}
private String getTimestamp(long milliseconds) {
int seconds = (int) (milliseconds / 1000) % 60;
int minutes = (int) ((milliseconds / (1000 * 60)) % 60);
int hours = (int) ((milliseconds / (1000 * 60 * 60)) % 24);
if (hours > 0)
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
else
return String.format("%02d:%02d", minutes, seconds);
}
}

View File

@@ -3,6 +3,9 @@ package io.rixa.bot.commands.cmds.general;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
public class PingCommand extends Command {
@@ -12,7 +15,7 @@ public class PingCommand extends Command {
}
@Override
public void execute(GuildMessageReceivedEvent event) {
MessageFactory.create("Pong! [" + event.getJDA().getPing() + "ms]").setColor(event.getMember().getColor()).queue(event.getChannel());
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
MessageFactory.create("Pong! [" + guild.getJDA().getPing() + "ms]").setColor(member.getColor()).queue(channel);
}
}

View File

@@ -0,0 +1,50 @@
package io.rixa.bot.commands.cmds.general;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.MessageFactory;
import io.rixa.bot.utils.WebUtil;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import org.json.JSONObject;
import java.io.IOException;
public class QuoteCommand extends Command {
public QuoteCommand(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
}
public void execute(GuildMessageReceivedEvent event) {
String[] quote = getAdvice();
MessageFactory.create(quote[0]).setTitle("Author: " + quote[1]).footer("Requested by: " + event.getMember().getEffectiveName(), event.getAuthor().getEffectiveAvatarUrl())
.setColor(event.getMember().getColor()).queue(event.getChannel());
}
private String[] getAdvice() {
String[] strings = new String[2];
String json;
try {
json = WebUtil.getWebPage("https://api.forismatic.com/api/1.0/?method=getQuote&lang=en&format=json");
} catch (IOException e) {
strings[0] = "Could not find any quotes for you.";
strings[1] = "Author not found";
return strings;
}
JSONObject obj = new JSONObject(json);
String quote = obj.getString("quoteText");
String author = obj.getString("quoteAuthor");
strings[0] = quote;
strings[1] = author;
return strings;
}
}

View File

@@ -0,0 +1,48 @@
package io.rixa.bot.commands.cmds.general;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.DiscordUtils;
import io.rixa.bot.utils.MessageFactory;
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.entities.TextChannel;
import java.util.ArrayList;
import java.util.List;
public class RoleMemberList extends Command {
public RoleMemberList(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
String string = String.join(" ", args);
Role role = DiscordUtils.searchFirstRole(guild, string);
if (role == null) {
MessageFactory.create("Incorrect Usage! Example: " + commandLabel + " Member!").setColor(member.getColor()).queue(channel);
return;
}
List<Member> roleMembers = guild.getMembersWithRoles(role);
if (roleMembers.isEmpty()) {
MessageFactory.create("Could not find any users with the role " + role.getName()).setColor(member.getColor()).queue(channel);
return;
}
StringBuilder builder = new StringBuilder("Users With Role `").append(role.getName()).append("`: ");
List<String> membersWithRole = new ArrayList<>();
roleMembers.forEach(roleMember -> membersWithRole.add(format(roleMember)));
builder.append(String.join(", ", membersWithRole));
MessageFactory.create(builder.toString().trim()).setColor(member.getColor()).queue(channel);
}
private String format(Member member) {
String name = member.getUser().getName() + "#" + member.getUser().getDiscriminator();
if (member.getNickname() != null && !member.getNickname().isEmpty()) {
name = name + String.format(" [%s]", member.getNickname());
}
return name;
}
}

View File

@@ -5,6 +5,9 @@ import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.guild.RixaGuild;
import io.rixa.bot.guild.manager.GuildManager;
import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.entities.User;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
@@ -17,25 +20,25 @@ public class ServerInfoCommand extends Command {
}
@Override
public void execute(GuildMessageReceivedEvent event) {
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(event.getGuild());
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
User owner = event.getGuild().getOwner().getUser();
User owner = guild.getOwner().getUser();
MessageFactory
.create(rixaGuild.getDescription())
.setTitle(event.getGuild().getName(), String.format("http://rixa.io/servers/%s", event.getGuild().getId()))
.addField("Created", event.getGuild().getCreationTime().format(formatter), true)
.addField("Region", event.getGuild().getRegion().toString(), true)
.addField("Users", String.valueOf(event.getGuild().getMembers().size()), true)
.addField("Channel Categories", String.valueOf(event.getGuild().getCategories().size()), true)
.addField("Text Channels", String.valueOf(event.getGuild().getTextChannels().size()), true)
.addField("Voice Channels", String.valueOf(event.getGuild().getVoiceChannels().size()), true)
.addField("Verification Level", event.getGuild().getVerificationLevel().toString(), true)
.addField("Roles", String.valueOf(event.getGuild().getRoles().size()), true)
.setTitle(guild.getName(), String.format("http://rixa.io/servers/%s", guild.getId()))
.addField("Created", guild.getCreationTime().format(formatter), true)
.addField("Region", guild.getRegion().toString(), true)
.addField("Users", String.valueOf(guild.getMembers().size()), true)
.addField("Channel Categories", String.valueOf(guild.getCategories().size()), true)
.addField("Text Channels", String.valueOf(guild.getTextChannels().size()), true)
.addField("Voice Channels", String.valueOf(guild.getVoiceChannels().size()), true)
.addField("Verification Level", guild.getVerificationLevel().toString(), true)
.addField("Roles", String.valueOf(guild.getRoles().size()), true)
.addField("Owner", owner.getName() + "#" + owner.getDiscriminator(), true)
.addField("Enlisted", String.valueOf(true), true)
.setThumbnail(event.getGuild().getIconUrl())
.footer("Server Id: " + event.getGuild().getId(), event.getGuild().getIconUrl())
.queue(event.getChannel());
.setThumbnail(guild.getIconUrl())
.footer("Server Id: " + guild.getId(), guild.getIconUrl())
.queue(channel);
}
}

View File

@@ -0,0 +1,39 @@
package io.rixa.bot.commands.cmds.general;
import io.rixa.bot.apis.UrbanDictionary;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.MessageBuilder;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class UrbanDictionaryCommand extends Command {
public UrbanDictionaryCommand(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) throws IOException {
String searchQuery = String.join(" ", args);
UrbanDictionary urbanDictionary = null;
try {
urbanDictionary = new UrbanDictionary(URLEncoder.encode(searchQuery, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if(urbanDictionary == null || !urbanDictionary.search()) {
MessageFactory.create("Search term not found.").setColor(member.getColor()).queue(channel);
return;
}
MessageFactory.create(urbanDictionary.getDefinition()).setAuthor(
String.format("Definition: %s", urbanDictionary.getWordToSearch()),
"https://s-media-cache-ak0.pinimg.com/originals/f2/aa/37/f2aa3712516cfd0cf6f215301d87a7c2.jpg").setColor(member.getColor()).queue(channel);
}
}

View File

@@ -0,0 +1,29 @@
package io.rixa.bot.commands.cmds.general;
import io.rixa.bot.apis.YoutubeSearch;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import java.io.IOException;
public class YoutubeCommand extends Command {
public YoutubeCommand(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
String searchQuery = String.join(" ", args);
try {
YoutubeSearch ytSearch = new YoutubeSearch(searchQuery);
channel.sendMessage(ytSearch.getUrl(0)).queue();
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,76 @@
package io.rixa.bot.commands.cmds.moderator;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.guild.RixaGuild;
import io.rixa.bot.guild.manager.GuildManager;
import io.rixa.bot.user.RixaUser;
import io.rixa.bot.utils.MessageFactory;
import io.rixa.bot.utils.Utils;
import lombok.Getter;
import net.dv8tion.jda.core.Permission;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.exceptions.PermissionException;
import java.util.ArrayList;
import java.util.List;
public class ClearCommand extends Command {
@Getter
private RixaPermission rixaPermission;
public ClearCommand(String command, RixaPermission rixaPermission, String description, List<String> aliases) {
super(command, rixaPermission, description, aliases);
this.rixaPermission = rixaPermission;
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
if (args == null || args.length == 0 || !Utils.isInteger(args[0])) {
MessageFactory.create(String.format("Incorrect Usage! Example: `%s%s 10`", rixaGuild.getSettings().getPrefix(),
commandLabel)).setColor(member.getColor()).queue(channel);
return;
}
RixaUser user = new RixaUser();
if (!(user.hasPermission(rixaPermission))) {
MessageFactory.create("Sorry! You do not have permission for this command!").setColor(member.getColor()).queue(channel);
return;
}
int amount = Integer.parseInt(args[0]);
if (amount < 1 || amount > 100) {
MessageFactory.create("Please try a number less than 100 and greater than 1 and :grimacing:").setColor(member.getColor()).queue(channel);
return;
}
int i = deleteMessages(channel, amount);
MessageFactory.create("Successfully deleted *" + i + "* messages in " + channel.getAsMention())
.footer("Requested by: " + member.getEffectiveName(), member.getUser().getEffectiveAvatarUrl())
.setColor(member.getColor())
.queue(channel);
}
private int deleteMessages(TextChannel channel, int amount) {
List<Message> messageHistory= channel.getHistory().retrievePast(amount).complete();
List<Message> pinnedMessages = channel.getPinnedMessages().complete();
List<Message> newMessages = new ArrayList<>();
int i = 0;
messageHistory.forEach(message -> {
if (!(pinnedMessages.contains(message))) {
newMessages.add(message);
}
});
// !mute Savvy 10s Hello Savvy!
try {
channel.deleteMessages(newMessages).queue();
i++;
} catch (PermissionException ex) {
if (ex.getPermission() == Permission.MESSAGE_MANAGE)
MessageFactory.create("I do not have permission to clear messages within this channel!").queue(channel);
} catch (IllegalArgumentException ignored) {
}
return i;
}
}

View File

@@ -0,0 +1,41 @@
package io.rixa.bot.commands.cmds.moderator;
import io.rixa.bot.commands.Command;
import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.utils.DiscordUtils;
import io.rixa.bot.utils.MessageFactory;
import io.rixa.bot.utils.Utils;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
public class MuteCommand extends Command {
private RixaPermission rixaPermission;
public MuteCommand(String command, RixaPermission rixaPermission, String description) {
super(command, rixaPermission, description);
this.rixaPermission = rixaPermission;
}
@Override
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
// RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
String argumentString = String.join(" ", args);
Object[] objArray = DiscordUtils.memberSearchArray(guild, argumentString, false);
if (objArray.length == 0) {
MessageFactory.create("Could not find member!").setColor(member.getColor()).queue(channel);
}
Member targetMember = (Member) objArray[1];
String targetMemberName = String.valueOf(objArray[0]);
if (targetMember == null) {
MessageFactory.create("Could not find member!").setColor(member.getColor()).queue(channel);
return;
}
argumentString = argumentString.replaceFirst(targetMemberName, "").trim();
args = argumentString.split(" ");
String time = args[0].trim();
argumentString = String.join(" ", args).replaceFirst(time, "");
long milliseconds = Utils.toMilliSec(time);
MessageFactory.create("Duration: " + time + "\nReason: " + argumentString + "\nDuration in Milliseconds: " + milliseconds).queue(channel);
}
}

View File

@@ -6,6 +6,9 @@ import io.rixa.bot.commands.perms.RixaPermission;
import io.rixa.bot.guild.RixaGuild;
import io.rixa.bot.guild.manager.GuildManager;
import io.rixa.bot.utils.MessageFactory;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
public class ShutdownCommand extends Command {
@@ -15,13 +18,14 @@ public class ShutdownCommand extends Command {
}
@Override
public void execute(GuildMessageReceivedEvent event) {
if (!(Rixa.getInstance().getConfiguration().isBotAdmin(event.getAuthor().getId()))) {
new MessageFactory(event.getMember().getAsMention() + ", you do not have permission for this command.").setColor(event.getMember().getColor()).queue(event.getChannel());
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
if (!(Rixa.getInstance().getConfiguration().isBotAdmin(member.getUser().getId()))) {
new MessageFactory(member.getAsMention()
+ ", you do not have permission for this command.").setColor(member.getColor()).queue(channel);
return;
}
try {
MessageFactory.create("Shutting down...").queue(event.getChannel());
MessageFactory.create("Shutting down...").selfDestruct(0).queue(channel);
for (RixaGuild rixaGuild : GuildManager.getInstance().getGuilds().values()) {
Thread.sleep(50);
rixaGuild.save();

View File

@@ -22,7 +22,7 @@ public class CommandHandler {
}
public Command getCommand(String commandName) throws CommandNotFoundException {
if (commandMap.containsKey(commandName)) return commandMap.get(commandName);
if (commandMap.containsKey(commandName.toLowerCase())) return commandMap.get(commandName.toLowerCase());
for(Command command: commandMap.values()) {
if (command.getAliases().contains(commandName)) {
return command;