Some music bot functionality added
This commit is contained in:
parent
4838eee050
commit
82a25dbe09
|
@ -3,7 +3,7 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.fpghoti</groupId>
|
||||
<artifactId>Biscuit</artifactId>
|
||||
<version>1.6.3</version>
|
||||
<version>1.7</version>
|
||||
<build>
|
||||
<sourceDirectory>src/main/java</sourceDirectory>
|
||||
<resources>
|
||||
|
@ -53,6 +53,12 @@
|
|||
<include>**</include>
|
||||
</includes>
|
||||
</filter>
|
||||
<filter>
|
||||
<artifact>commons-logging:commons-logging</artifact>
|
||||
<includes>
|
||||
<include>**</include>
|
||||
</includes>
|
||||
</filter>
|
||||
</filters>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
@ -109,55 +115,6 @@
|
|||
<version>1.15-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna</artifactId>
|
||||
<version>4.5.0</version>
|
||||
<type>pom</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
<artifactId>json</artifactId>
|
||||
<version>20171018</version>
|
||||
<type>pom</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sf.trove4j</groupId>
|
||||
<artifactId>trove4j</artifactId>
|
||||
<version>3.0.3</version>
|
||||
<type>pom</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-collections4</artifactId>
|
||||
<version>4.1</version>
|
||||
<type>pom</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.6</version>
|
||||
<type>pom</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>2.7.5</version>
|
||||
<type>pom</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.neovisionaries</groupId>
|
||||
<artifactId>nv-websocket-client</artifactId>
|
||||
<version>2.3</version>
|
||||
<type>pom</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<properties>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
|
|
56
pom.xml
56
pom.xml
|
@ -5,7 +5,7 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.fpghoti</groupId>
|
||||
<artifactId>Biscuit</artifactId>
|
||||
<version>1.6.3</version>
|
||||
<version>1.7</version>
|
||||
<build>
|
||||
<sourceDirectory>src/main/java</sourceDirectory>
|
||||
<resources>
|
||||
|
@ -57,6 +57,12 @@
|
|||
<include>**</include>
|
||||
</includes>
|
||||
</filter>
|
||||
<filter>
|
||||
<artifact>commons-logging:commons-logging</artifact>
|
||||
<includes>
|
||||
<include>**</include>
|
||||
</includes>
|
||||
</filter>
|
||||
</filters>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
@ -108,7 +114,6 @@
|
|||
<groupId>org.tuxdude.logback.extensions</groupId>
|
||||
<artifactId>logback-colorizer</artifactId>
|
||||
<version>1.0.1</version>
|
||||
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.CrabMustard</groupId>
|
||||
|
@ -174,48 +179,6 @@
|
|||
<artifactId>cage</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna</artifactId>
|
||||
<version>4.5.0</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
<artifactId>json</artifactId>
|
||||
<version>20171018</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sf.trove4j</groupId>
|
||||
<artifactId>trove4j</artifactId>
|
||||
<version>3.0.3</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-collections4</artifactId>
|
||||
<version>4.1</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.6</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>2.7.5</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.neovisionaries</groupId>
|
||||
<artifactId>nv-websocket-client</artifactId>
|
||||
<version>2.3</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
<artifactId>activation</artifactId>
|
||||
|
@ -226,5 +189,10 @@
|
|||
<artifactId>mail</artifactId>
|
||||
<version>1.4.7</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sedmelluq</groupId>
|
||||
<artifactId>lavaplayer</artifactId>
|
||||
<version>1.3.50</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
|
@ -2,39 +2,48 @@ package com.fpghoti.biscuit;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Scanner;
|
||||
|
||||
import org.fusesource.jansi.AnsiConsole;
|
||||
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.BaseCommand;
|
||||
import com.fpghoti.biscuit.commands.CommandListener;
|
||||
import com.fpghoti.biscuit.commands.CommandManager;
|
||||
import com.fpghoti.biscuit.commands.client.AddCommand;
|
||||
import com.fpghoti.biscuit.commands.client.ChanIDCommand;
|
||||
import com.fpghoti.biscuit.commands.client.DivideCommand;
|
||||
import com.fpghoti.biscuit.commands.client.ForceSkipCommand;
|
||||
import com.fpghoti.biscuit.commands.client.GetConfigCommand;
|
||||
import com.fpghoti.biscuit.commands.client.GuildIDCommand;
|
||||
import com.fpghoti.biscuit.commands.client.ToggleRoleCommand;
|
||||
import com.fpghoti.biscuit.commands.client.HelpCommand;
|
||||
import com.fpghoti.biscuit.commands.client.LoopMusicCommand;
|
||||
import com.fpghoti.biscuit.commands.client.MultiplyCommand;
|
||||
import com.fpghoti.biscuit.commands.client.NotSpammerCommand;
|
||||
import com.fpghoti.biscuit.commands.client.NowPlayingCommand;
|
||||
import com.fpghoti.biscuit.commands.client.PauseCommand;
|
||||
import com.fpghoti.biscuit.commands.client.TogglePauseCommand;
|
||||
import com.fpghoti.biscuit.commands.client.MakeInviteCommand;
|
||||
import com.fpghoti.biscuit.commands.client.PingCommand;
|
||||
import com.fpghoti.biscuit.commands.client.PlayCommand;
|
||||
import com.fpghoti.biscuit.commands.client.PlayFirstCommand;
|
||||
import com.fpghoti.biscuit.commands.client.PowerCommand;
|
||||
import com.fpghoti.biscuit.commands.client.QueueCommand;
|
||||
import com.fpghoti.biscuit.commands.client.RecentSpammersCommand;
|
||||
import com.fpghoti.biscuit.commands.client.SaveConfigCommand;
|
||||
import com.fpghoti.biscuit.commands.client.SkipCommand;
|
||||
import com.fpghoti.biscuit.commands.client.SoftMuteCommand;
|
||||
import com.fpghoti.biscuit.commands.client.SquareRootCommand;
|
||||
import com.fpghoti.biscuit.commands.client.SubtractCommand;
|
||||
import com.fpghoti.biscuit.commands.client.UIDCommand;
|
||||
import com.fpghoti.biscuit.commands.client.UnSoftMuteCommand;
|
||||
import com.fpghoti.biscuit.commands.client.UnpauseCommand;
|
||||
import com.fpghoti.biscuit.commands.client.WikiCommand;
|
||||
import com.fpghoti.biscuit.commands.client.WipeQueueCommand;
|
||||
import com.fpghoti.biscuit.commands.console.GuildSayCommand;
|
||||
import com.fpghoti.biscuit.commands.console.SayCommand;
|
||||
import com.fpghoti.biscuit.commands.console.ShutdownConsoleCommand;
|
||||
import com.fpghoti.biscuit.listener.CommandListener;
|
||||
import com.fpghoti.biscuit.listener.DMListener;
|
||||
import com.fpghoti.biscuit.listener.GuildListener;
|
||||
import com.fpghoti.biscuit.listener.JoinListener;
|
||||
|
@ -46,19 +55,24 @@ import com.fpghoti.biscuit.listener.ReactionListener;
|
|||
import com.fpghoti.biscuit.listener.RoleListener;
|
||||
import com.fpghoti.biscuit.logging.BColor;
|
||||
import com.fpghoti.biscuit.logging.BiscuitLog;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
|
||||
|
||||
import ch.qos.logback.core.rolling.RollingFileAppender;
|
||||
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
|
||||
import net.dv8tion.jda.api.JDA;
|
||||
import net.dv8tion.jda.api.JDABuilder;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.requests.GatewayIntent;
|
||||
import net.dv8tion.jda.api.sharding.DefaultShardManagerBuilder;
|
||||
import net.dv8tion.jda.api.sharding.ShardManager;
|
||||
import net.dv8tion.jda.api.utils.ChunkingFilter;
|
||||
import net.dv8tion.jda.api.utils.MemberCachePolicy;
|
||||
|
||||
public class Main {
|
||||
|
||||
private static JDA jda;
|
||||
private static ShardManager shardm;
|
||||
|
||||
public RollingFileAppender<String> we;
|
||||
public SizeAndTimeBasedRollingPolicy<String> wes;
|
||||
|
@ -72,6 +86,8 @@ public class Main {
|
|||
public static boolean isPlugin = false;
|
||||
public static boolean shutdownStarted = false;
|
||||
|
||||
private static AudioPlayerManager playerManager;
|
||||
|
||||
public static void main(String[] args){
|
||||
final Properties properties = new Properties();
|
||||
try {
|
||||
|
@ -84,8 +100,13 @@ public class Main {
|
|||
AnsiConsole.systemInstall();
|
||||
log.info(BColor.CYAN_BOLD + "========================= WELCOME TO BISCUIT =========================");
|
||||
log.info("Running version: " + BColor.MAGENTA_BOLD + version);
|
||||
|
||||
playerManager = new DefaultAudioPlayerManager();
|
||||
AudioSourceManagers.registerRemoteSources(playerManager);
|
||||
|
||||
mainBiscuit = new Biscuit(null, null, log);
|
||||
startJDA();
|
||||
|
||||
jda.addEventListener(new GuildListener());
|
||||
jda.addEventListener(new MessageReceiveListener());
|
||||
jda.addEventListener(new MessageEditListener());
|
||||
|
@ -103,36 +124,45 @@ public class Main {
|
|||
|
||||
String link = "NULL";
|
||||
|
||||
List<BaseCommand> commands = CommandManager.getCommands();
|
||||
|
||||
//Client
|
||||
|
||||
commands.add(new HelpCommand());
|
||||
commands.add(new PingCommand());
|
||||
commands.add(new SoftMuteCommand());
|
||||
commands.add(new UnSoftMuteCommand());
|
||||
commands.add(new NotSpammerCommand());
|
||||
commands.add(new RecentSpammersCommand());
|
||||
commands.add(new ChanIDCommand());
|
||||
commands.add(new UIDCommand());
|
||||
commands.add(new ToggleRoleCommand());
|
||||
commands.add(new SquareRootCommand());
|
||||
commands.add(new AddCommand());
|
||||
commands.add(new SubtractCommand());
|
||||
commands.add(new MultiplyCommand());
|
||||
commands.add(new DivideCommand());
|
||||
commands.add(new PowerCommand());
|
||||
commands.add(new MakeInviteCommand());
|
||||
commands.add(new GetConfigCommand());
|
||||
commands.add(new SaveConfigCommand());
|
||||
commands.add(new GuildIDCommand());
|
||||
commands.add(new WikiCommand());
|
||||
CommandManager.addCommand(new HelpCommand());
|
||||
CommandManager.addCommand(new PingCommand());
|
||||
CommandManager.addCommand(new SoftMuteCommand());
|
||||
CommandManager.addCommand(new UnSoftMuteCommand());
|
||||
CommandManager.addCommand(new NotSpammerCommand());
|
||||
CommandManager.addCommand(new RecentSpammersCommand());
|
||||
CommandManager.addCommand(new ChanIDCommand());
|
||||
CommandManager.addCommand(new UIDCommand());
|
||||
CommandManager.addCommand(new ToggleRoleCommand());
|
||||
CommandManager.addCommand(new SquareRootCommand());
|
||||
CommandManager.addCommand(new AddCommand());
|
||||
CommandManager.addCommand(new SubtractCommand());
|
||||
CommandManager.addCommand(new MultiplyCommand());
|
||||
CommandManager.addCommand(new DivideCommand());
|
||||
CommandManager.addCommand(new PowerCommand());
|
||||
CommandManager.addCommand(new MakeInviteCommand());
|
||||
CommandManager.addCommand(new GetConfigCommand());
|
||||
CommandManager.addCommand(new SaveConfigCommand());
|
||||
CommandManager.addCommand(new GuildIDCommand());
|
||||
CommandManager.addCommand(new WikiCommand());
|
||||
CommandManager.addCommand(new PlayCommand());
|
||||
CommandManager.addCommand(new PlayFirstCommand());
|
||||
CommandManager.addCommand(new ForceSkipCommand());
|
||||
CommandManager.addCommand(new PauseCommand());
|
||||
CommandManager.addCommand(new UnpauseCommand());
|
||||
CommandManager.addCommand(new TogglePauseCommand());
|
||||
CommandManager.addCommand(new QueueCommand());
|
||||
CommandManager.addCommand(new SkipCommand());
|
||||
CommandManager.addCommand(new NowPlayingCommand());
|
||||
CommandManager.addCommand(new WipeQueueCommand());
|
||||
CommandManager.addCommand(new LoopMusicCommand());
|
||||
|
||||
//Console
|
||||
|
||||
commands.add(new SayCommand());
|
||||
commands.add(new GuildSayCommand());
|
||||
commands.add(new ShutdownConsoleCommand());
|
||||
CommandManager.addCommand(new SayCommand());
|
||||
CommandManager.addCommand(new GuildSayCommand());
|
||||
CommandManager.addCommand(new ShutdownConsoleCommand());
|
||||
|
||||
link = "https://discord.com/oauth2/authorize?&client_id=" + jda.getSelfUser().getId() + "&permissions=8&scope=bot";
|
||||
log.info("Connection successful!");
|
||||
|
@ -148,12 +178,13 @@ public class Main {
|
|||
String token = mainBiscuit.getProperties().getToken();
|
||||
log.info("Connecting bot to Discord.");
|
||||
try{
|
||||
jda = JDABuilder.createDefault(token)
|
||||
shardm = DefaultShardManagerBuilder.createDefault(token)
|
||||
.setChunkingFilter(ChunkingFilter.ALL)
|
||||
.setMemberCachePolicy(MemberCachePolicy.ALL)
|
||||
.enableIntents(GatewayIntent.getIntents(GatewayIntent.DEFAULT))
|
||||
.enableIntents(GatewayIntent.GUILD_MEMBERS)
|
||||
.build();
|
||||
jda = shardm.getShardById(0);
|
||||
try {
|
||||
jda.awaitReady();
|
||||
} catch (InterruptedException e) {
|
||||
|
@ -187,6 +218,10 @@ public class Main {
|
|||
return biscuits;
|
||||
}
|
||||
|
||||
public static AudioPlayerManager getPlayerManager() {
|
||||
return playerManager;
|
||||
}
|
||||
|
||||
public static void shutdown() {
|
||||
if(!shutdownStarted) {
|
||||
shutdownStarted = true;
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
package com.fpghoti.biscuit.audio;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
|
||||
|
||||
import net.dv8tion.jda.api.audio.AudioSendHandler;
|
||||
|
||||
public class AudioHandler implements AudioSendHandler {
|
||||
|
||||
private final AudioPlayer audioPlayer;
|
||||
private AudioFrame lastFrame;
|
||||
|
||||
public AudioHandler(AudioPlayer audioPlayer) {
|
||||
this.audioPlayer = audioPlayer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canProvide() {
|
||||
lastFrame = audioPlayer.provide();
|
||||
return lastFrame != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ByteBuffer provide20MsAudio() {
|
||||
return ByteBuffer.wrap(lastFrame.getData());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpus() {
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,104 @@
|
|||
package com.fpghoti.biscuit.audio;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
|
||||
public class AudioResultHandler implements AudioLoadResultHandler {
|
||||
|
||||
private Biscuit biscuit;
|
||||
private String uid;
|
||||
private TextChannel channel;
|
||||
private String searchPhrase;
|
||||
private boolean search;
|
||||
private boolean first;
|
||||
private boolean stop;
|
||||
|
||||
public AudioResultHandler(Biscuit biscuit, String uid, TextChannel channel, boolean search,
|
||||
String searchPhrase, boolean first, boolean stop) {
|
||||
this.biscuit = biscuit;
|
||||
this.uid = uid;
|
||||
this.channel = channel;
|
||||
this.search = search;
|
||||
this.searchPhrase = searchPhrase;
|
||||
this.first = first;
|
||||
this.stop = stop;
|
||||
}
|
||||
|
||||
public AudioResultHandler(Biscuit biscuit, String uid, TextChannel channel, boolean search,
|
||||
String searchPhrase, boolean first) {
|
||||
this.biscuit = biscuit;
|
||||
this.uid = uid;
|
||||
this.channel = channel;
|
||||
this.search = search;
|
||||
this.searchPhrase = searchPhrase;
|
||||
this.first = first;
|
||||
this.stop = false;
|
||||
}
|
||||
|
||||
public AudioResultHandler(Biscuit biscuit, String uid, TextChannel channel, boolean search, String searchPhrase) {
|
||||
this.biscuit = biscuit;
|
||||
this.uid = uid;
|
||||
this.channel = channel;
|
||||
this.search = search;
|
||||
this.searchPhrase = searchPhrase;
|
||||
this.first = false;
|
||||
this.stop = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trackLoaded(AudioTrack track) {
|
||||
if(!stop) {
|
||||
//TODO fix vevo
|
||||
//Try to avoid Vevo results if possible.
|
||||
String title = track.getInfo().title;
|
||||
if(title.toLowerCase().contains("vevo") || track.getInfo().author.toLowerCase().contains("vevo")) {
|
||||
title = title.toLowerCase().replace("vevo", "") + " lyrics";
|
||||
channel.sendMessage("You tried to load a Vevo video. These are not compatible with the music player."
|
||||
+ " Trying to find alternate song...").queue();
|
||||
Main.getPlayerManager().loadItemOrdered(biscuit.getGuild(),"ytsearch:" + title, new AudioResultHandler(biscuit, uid, channel, true, title, first, true));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
channel.sendMessage("**Adding to queue: **\n```" + track.getInfo().title + "\nBy: "
|
||||
+ track.getInfo().author + "\nLength: " + Util.getTime(track.getDuration()) +"```").queue();
|
||||
if(first) {
|
||||
biscuit.getAudioScheduler().queueFirst(track, uid, channel);
|
||||
}else {
|
||||
biscuit.getAudioScheduler().queue(track, uid, channel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playlistLoaded(AudioPlaylist playlist) {
|
||||
AudioTrack track = playlist.getTracks().get(0);
|
||||
channel.sendMessage("**Adding to queue: **\n" + track.getInfo().uri + "\n```" + track.getInfo().title + "\nBy: "
|
||||
+ track.getInfo().author + "\nLength: " + Util.getTime(track.getDuration()) +"```").queue();
|
||||
biscuit.getAudioScheduler().queue(track, uid);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void noMatches() {
|
||||
if(!search) {
|
||||
biscuit.log("Exact match not found. Searching instead...");
|
||||
Main.getPlayerManager().loadItemOrdered(biscuit.getGuild(),"ytsearch:" + searchPhrase, new AudioResultHandler(biscuit, uid, channel, true, searchPhrase));
|
||||
}else {
|
||||
channel.sendMessage("Song match not found.").queue();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFailed(FriendlyException exception) {
|
||||
exception.printStackTrace();
|
||||
channel.sendMessage("An error was encountered while attempting to load audio.").queue();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,216 @@
|
|||
package com.fpghoti.biscuit.audio;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.fpghoti.biscuit.audio.queue.AudioQueue;
|
||||
import com.fpghoti.biscuit.audio.queue.QueuedTrack;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
|
||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
|
||||
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
|
||||
public class AudioScheduler extends AudioEventAdapter {
|
||||
|
||||
private Biscuit biscuit;
|
||||
private AudioQueue queue;
|
||||
private ArrayList<String> skips;
|
||||
private boolean loop;
|
||||
|
||||
public AudioScheduler(Biscuit biscuit) {
|
||||
this.biscuit = biscuit;
|
||||
this.queue = new AudioQueue();
|
||||
this.skips = new ArrayList<String>();
|
||||
this.loop = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerPause(AudioPlayer player) {
|
||||
log("The current track was paused.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerResume(AudioPlayer player) {
|
||||
log("The current track was unpaused.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrackStart(AudioPlayer player, AudioTrack track) {
|
||||
log("Starting track " + track.getInfo().title + ".");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
|
||||
|
||||
QueuedTrack qt = queue.getLastTrack();
|
||||
String title = track.getInfo().title;
|
||||
|
||||
switch(endReason) {
|
||||
|
||||
case LOAD_FAILED:
|
||||
warn("Something went wrong while trying to load the current track. The next track will be played instead if available.");
|
||||
if(qt != null && qt.getCommandChannel() != null)
|
||||
qt.getCommandChannel().sendMessage("There was an error loading **" + title + "**.").queue();
|
||||
break;
|
||||
case CLEANUP:
|
||||
log("A track stopped playing due to audio player cleanup.");
|
||||
if(qt != null && qt.getCommandChannel() != null)
|
||||
qt.getCommandChannel().sendMessage("Track **" + track.getInfo().title + "** stopped playing due to audio player cleanup.").queue();
|
||||
break;
|
||||
case FINISHED:
|
||||
log("Finished playing track " + title + ".");
|
||||
break;
|
||||
case REPLACED:
|
||||
log("Skipped track " + title + ".");
|
||||
break;
|
||||
case STOPPED:
|
||||
log("Stopped playing track " + title + ".");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if (endReason.mayStartNext) {
|
||||
if(loop) {
|
||||
queueFirst(track.makeClone(), qt.getUserId(), qt.getCommandChannel());
|
||||
}
|
||||
startPlaying();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrackException(AudioPlayer player, AudioTrack track, FriendlyException exception) {
|
||||
//TODO fix vevo
|
||||
if(track.getInfo().title.toLowerCase().contains("vevo") || track.getInfo().author.toLowerCase().contains("vevo")) {
|
||||
QueuedTrack qt = queue.getPreviousTrack(track);
|
||||
qt.getCommandChannel().sendMessage("**" + track.getInfo().title + "** could not be loaded, because it is a Vevo video.").queue();
|
||||
}
|
||||
biscuit.error("An exception occurred while trying to play a certain track. The next track will be played instead if available.");
|
||||
startPlaying();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrackStuck(AudioPlayer player, AudioTrack track, long thresholdMs) {
|
||||
QueuedTrack qt = queue.getPreviousTrack(track);
|
||||
if(qt != null && qt.getCommandChannel() != null) {
|
||||
qt.getCommandChannel().sendMessage("The current track has become stuck and will be skipped.").queue();
|
||||
}
|
||||
}
|
||||
|
||||
public void queue(AudioTrack track, String uid) {
|
||||
queue(track, uid, null);
|
||||
}
|
||||
|
||||
public void queue(AudioTrack track, String uid, TextChannel channel) {
|
||||
if(queue.isEmpty() && biscuit.getAudioPlayer().getPlayingTrack() == null) {
|
||||
queue.addPreviousTrack(new QueuedTrack(biscuit, track, uid, channel));
|
||||
biscuit.getAudioPlayer().playTrack(track);
|
||||
}else {
|
||||
queue.add(new QueuedTrack(biscuit, track, uid, channel));
|
||||
}
|
||||
}
|
||||
|
||||
public void queueFirst(AudioTrack track, String uid, TextChannel channel) {
|
||||
if(queue.isEmpty() && biscuit.getAudioPlayer().getPlayingTrack() == null) {
|
||||
queue.addPreviousTrack(new QueuedTrack(biscuit, track, uid, channel));
|
||||
biscuit.getAudioPlayer().playTrack(track);
|
||||
}else {
|
||||
queue.addAtPlace(new QueuedTrack(biscuit, track, uid, channel), 1);
|
||||
}
|
||||
}
|
||||
|
||||
public void startPlaying() {
|
||||
if(queue.isEmpty()) {
|
||||
if(loop) {
|
||||
return;
|
||||
}
|
||||
biscuit.getGuild().getAudioManager().closeAudioConnection();
|
||||
skips.clear();
|
||||
return;
|
||||
}
|
||||
queue.playNext();
|
||||
skips.clear();
|
||||
}
|
||||
|
||||
public void setLooping(boolean b) {
|
||||
loop = b;
|
||||
}
|
||||
|
||||
public boolean isLooping() {
|
||||
return loop;
|
||||
}
|
||||
|
||||
public boolean hasSkipped(String id) {
|
||||
return skips.contains(id);
|
||||
}
|
||||
|
||||
public boolean voteSkip(String id) {
|
||||
if(!hasSkipped(id)) {
|
||||
skips.add(id);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public int getVotes() {
|
||||
return skips.size();
|
||||
}
|
||||
|
||||
public AudioQueue getQueue(){
|
||||
return queue;
|
||||
}
|
||||
|
||||
public void skip() {
|
||||
biscuit.getAudioPlayer().stopTrack();
|
||||
startPlaying();
|
||||
}
|
||||
|
||||
public String getNextMessage() {
|
||||
if(queue.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
AudioTrack track = queue.getNext().getTrack();
|
||||
return getMessage(track);
|
||||
}
|
||||
|
||||
public String getMessage(AudioTrack track) {
|
||||
return getMessage(track, false);
|
||||
}
|
||||
|
||||
public String getMessage(AudioTrack track, Boolean showRemaining) {
|
||||
String msg ="**Now Playing: **\n" + track.getInfo().uri + "\n```" + track.getInfo().title + "\nBy: "
|
||||
+ track.getInfo().author + "\nLength: " + Util.getTime(track.getDuration());
|
||||
if(showRemaining) {
|
||||
msg = msg + "\nTime Remaining: " + Util.getTime(track.getDuration() - track.getPosition()) + "```";
|
||||
}else {
|
||||
msg = msg + "```";
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
||||
public void wipeQueue() {
|
||||
queue.clear();
|
||||
}
|
||||
|
||||
public Biscuit getBiscuit() {
|
||||
return biscuit;
|
||||
}
|
||||
|
||||
public void log(String message) {
|
||||
if(biscuit.getProperties().logMusicPlayer()) {
|
||||
biscuit.log(message);
|
||||
}
|
||||
}
|
||||
|
||||
public void warn(String message) {
|
||||
if(biscuit.getProperties().logMusicPlayer()) {
|
||||
biscuit.warn(message);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,132 @@
|
|||
package com.fpghoti.biscuit.audio.queue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
|
||||
public class AudioQueue {
|
||||
|
||||
private ArrayList<QueuedTrack> tracks;
|
||||
private ArrayList<QueuedTrack> previousTracks;
|
||||
|
||||
public AudioQueue() {
|
||||
this.tracks = new ArrayList<QueuedTrack>();
|
||||
this.previousTracks = new ArrayList<QueuedTrack>();
|
||||
}
|
||||
|
||||
public ArrayList<QueuedTrack> getUserTracks(String userId){
|
||||
ArrayList<QueuedTrack> tracks = new ArrayList<QueuedTrack>();
|
||||
for(QueuedTrack qt : tracks) {
|
||||
if(qt.getUserId().equals(userId)) {
|
||||
tracks.add(qt);
|
||||
}
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
|
||||
public void removeUserTracks(String userId) {
|
||||
for(QueuedTrack qt : getUserTracks(userId)) {
|
||||
tracks.remove(qt);
|
||||
}
|
||||
}
|
||||
|
||||
public void playNext() {
|
||||
QueuedTrack next = tracks.iterator().next();
|
||||
tracks.remove(next);
|
||||
addPreviousTrack(next);
|
||||
next.getBiscuit().getAudioPlayer().playTrack(next.getTrack());
|
||||
}
|
||||
|
||||
public QueuedTrack getTrack(int index){
|
||||
return tracks.get(index);
|
||||
}
|
||||
|
||||
public QueuedTrack getTrack(AudioTrack track) {
|
||||
for(QueuedTrack qt : tracks) {
|
||||
if(qt.getTrack() == track) {
|
||||
return qt;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public QueuedTrack getPreviousTrack(AudioTrack track) {
|
||||
for(QueuedTrack qt : previousTracks) {
|
||||
if(qt.getTrack() == track) {
|
||||
return qt;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public QueuedTrack getLastTrack() {
|
||||
if(previousTracks.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return previousTracks.get(previousTracks.size() - 1);
|
||||
}
|
||||
|
||||
public void addPreviousTrack(QueuedTrack track) {
|
||||
//AudioQueue will remember up to three
|
||||
//previous tracks for the purposes of
|
||||
//reporting errors ect.
|
||||
previousTracks.add(track);
|
||||
if(previousTracks.size() > 3) {
|
||||
previousTracks.remove(0);
|
||||
}
|
||||
}
|
||||
|
||||
public void add(QueuedTrack track) {
|
||||
tracks.add(track);
|
||||
}
|
||||
|
||||
//Goes by viewable place rather than index for
|
||||
//easy implementation into command.
|
||||
public boolean addAtPlace(QueuedTrack track, int place) {
|
||||
if(place < 1 || place > tracks.size()) {
|
||||
return false;
|
||||
}
|
||||
int index = place - 1;
|
||||
tracks.add(index, track);
|
||||
return true;
|
||||
}
|
||||
|
||||
//Goes by viewable place rather than index for
|
||||
//easy implementation into command.
|
||||
public boolean moveToPlace(int oldPlace, int newPlace) {
|
||||
QueuedTrack track = tracks.get(oldPlace - 1);
|
||||
if(track == null) {
|
||||
return false;
|
||||
}
|
||||
tracks.remove(track);
|
||||
return addAtPlace(track, newPlace);
|
||||
}
|
||||
|
||||
//Goes by viewable place rather than index for
|
||||
//easy implementation into command.
|
||||
public boolean removeTrack(int place) {
|
||||
QueuedTrack track = tracks.get(place - 1);
|
||||
if(track == null) {
|
||||
return false;
|
||||
}
|
||||
tracks.remove(track);
|
||||
return true;
|
||||
}
|
||||
|
||||
public QueuedTrack getNext() {
|
||||
return tracks.get(0);
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return tracks.isEmpty();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
tracks.clear();
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return tracks.size();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package com.fpghoti.biscuit.audio.queue;
|
||||
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
|
||||
public class QueuedTrack {
|
||||
|
||||
private Biscuit biscuit;
|
||||
private AudioTrack track;
|
||||
private String userId;
|
||||
private TextChannel channel;
|
||||
|
||||
public QueuedTrack(Biscuit biscuit, AudioTrack track, String userId, TextChannel channel) {
|
||||
this.biscuit = biscuit;
|
||||
this.track = track;
|
||||
this.userId = userId;
|
||||
this.channel = channel;
|
||||
}
|
||||
|
||||
public Biscuit getBiscuit() {
|
||||
return biscuit;
|
||||
}
|
||||
|
||||
public AudioTrack getTrack() {
|
||||
return track;
|
||||
}
|
||||
|
||||
public String getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public Member getMember() {
|
||||
return biscuit.getGuild().getMemberById(userId);
|
||||
}
|
||||
|
||||
public TextChannel getCommandChannel() {
|
||||
return channel;
|
||||
}
|
||||
|
||||
}
|
|
@ -9,6 +9,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.PluginCore;
|
||||
import com.fpghoti.biscuit.audio.AudioScheduler;
|
||||
import com.fpghoti.biscuit.captcha.BCage;
|
||||
import com.fpghoti.biscuit.config.BiscuitConfig;
|
||||
import com.fpghoti.biscuit.config.BiscuitProperties;
|
||||
|
@ -20,6 +21,7 @@ import com.fpghoti.biscuit.timer.task.DecrementTimer;
|
|||
import com.fpghoti.biscuit.timer.task.SoftMuteTimer;
|
||||
import com.fpghoti.biscuit.user.PreUser;
|
||||
import com.github.cage.Cage;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
|
||||
import net.dv8tion.jda.api.JDA;
|
||||
import net.dv8tion.jda.api.Permission;
|
||||
|
@ -85,6 +87,8 @@ public class Biscuit {
|
|||
private BiscuitConfig config;
|
||||
private BiscuitProperties properties;
|
||||
private BiscuitMessageStore messageStore;
|
||||
private AudioPlayer player;
|
||||
private AudioScheduler scheduler;
|
||||
|
||||
private CopyOnWriteArrayList<PreUser> users = new CopyOnWriteArrayList<PreUser>();
|
||||
private HashMap<Member, Role> rolequeue;
|
||||
|
@ -99,6 +103,11 @@ public class Biscuit {
|
|||
config.generateConfig();
|
||||
this.properties = new BiscuitProperties(this);
|
||||
this.rolequeue = new HashMap<Member, Role>();
|
||||
this.player = Main.getPlayerManager().createPlayer();
|
||||
|
||||
scheduler = new AudioScheduler(this);
|
||||
player.addListener(scheduler);
|
||||
|
||||
timer = new Timer();
|
||||
timers = new ArrayList<BiscuitTimer>();
|
||||
if(!Main.isPlugin) {
|
||||
|
@ -143,6 +152,14 @@ public class Biscuit {
|
|||
return guild.getSelfMember().hasPermission(Permission.MANAGE_SERVER);
|
||||
}
|
||||
|
||||
public AudioPlayer getAudioPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public AudioScheduler getAudioScheduler() {
|
||||
return scheduler;
|
||||
}
|
||||
|
||||
public void log(String message) {
|
||||
if(properties == null) {
|
||||
logger.info(message);
|
||||
|
|
|
@ -5,6 +5,10 @@ import java.util.List;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ConsoleCommand;
|
||||
import com.fpghoti.biscuit.commands.base.CustomCommand;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
|
||||
|
@ -69,6 +73,11 @@ public class CommandManager {
|
|||
}
|
||||
|
||||
if(match != null) {
|
||||
|
||||
if(match instanceof MusicClientCommand && !b.getProperties().allowMusicBot()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (trimmedArgs == null || (trimmedArgs.length > 0 && trimmedArgs[0].equals("?"))) {
|
||||
commandReply(e, "``Command:" + " " + match.getName() + "``");
|
||||
commandReply(e, "``Description:" + " " + match.getDescription() + "``");
|
||||
|
@ -118,6 +127,9 @@ public class CommandManager {
|
|||
}
|
||||
|
||||
public static void addCommand(BaseCommand command) {
|
||||
if(command instanceof MusicClientCommand && !Main.getMainBiscuit().getProperties().musicBotEnabled()) {
|
||||
return;
|
||||
}
|
||||
commands.add(command);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
package com.fpghoti.biscuit.commands;
|
||||
package com.fpghoti.biscuit.commands.base;
|
||||
|
||||
import com.fpghoti.biscuit.commands.BaseCommand;
|
||||
import com.fpghoti.biscuit.commands.CommandType;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
@ -1,4 +1,7 @@
|
|||
package com.fpghoti.biscuit.commands;
|
||||
package com.fpghoti.biscuit.commands.base;
|
||||
|
||||
import com.fpghoti.biscuit.commands.BaseCommand;
|
||||
import com.fpghoti.biscuit.commands.CommandType;
|
||||
|
||||
public abstract class ConsoleCommand extends BaseCommand{
|
||||
|
|
@ -1,6 +1,8 @@
|
|||
package com.fpghoti.biscuit.commands;
|
||||
package com.fpghoti.biscuit.commands.base;
|
||||
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.BaseCommand;
|
||||
import com.fpghoti.biscuit.commands.CommandType;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package com.fpghoti.biscuit.commands.base;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public abstract class MusicClientCommand extends ClientCommand{
|
||||
|
||||
public abstract void execute(String[] args, MessageReceivedEvent event);
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public class ForceSkipCommand extends MusicClientCommand{
|
||||
|
||||
public ForceSkipCommand() {
|
||||
name = "Force Skip";
|
||||
description = "Forces the current song to be skipped.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "forceskip";
|
||||
minArgs = 0;
|
||||
maxArgs = 0;
|
||||
identifiers.add("forceskip");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Biscuit b = Biscuit.getBiscuit(event.getGuild());
|
||||
b.log(event.getAuthor().getName() + " issued a command: -forceskip");
|
||||
if(PermUtil.isMod(event.getMember())) {
|
||||
event.getChannel().sendMessage("Force skipping current song.").queue();
|
||||
if(b.getAudioScheduler().getNextMessage() != null ) {
|
||||
event.getChannel().sendMessage(b.getAudioScheduler().getNextMessage()).queue();
|
||||
}
|
||||
b.getAudioScheduler().skip();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -5,7 +5,7 @@ import java.util.function.Consumer;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.logging.BColor;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
|
@ -6,9 +6,10 @@ import java.util.List;
|
|||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.BaseCommand;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.CommandManager;
|
||||
import com.fpghoti.biscuit.commands.CustomCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.CustomCommand;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
@ -57,8 +58,14 @@ public class HelpCommand extends ClientCommand {
|
|||
for(BaseCommand bc : CommandManager.getCommands()) {
|
||||
String bclabel = bc.getUsage().split(" ")[0];
|
||||
if(!Util.contains(biscuit.getProperties().disabledCommands(), bclabel.replace(Main.getMainBiscuit().getProperties().getCommandSignifier(), ""))) {
|
||||
if(bc instanceof MusicClientCommand) {
|
||||
if(biscuit.getProperties().allowMusicBot()) {
|
||||
commands.add(bc);
|
||||
}
|
||||
}else {
|
||||
commands.add(bc);
|
||||
}
|
||||
}
|
||||
}
|
||||
int pageCount = (int) Math.ceil((double) commands.size() / 8);
|
||||
if (pg > pageCount) {
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public class LoopMusicCommand extends MusicClientCommand{
|
||||
|
||||
public LoopMusicCommand() {
|
||||
name = "Loop Music";
|
||||
description = "Enables looping of all songs played.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "loopmusic";
|
||||
minArgs = 0;
|
||||
maxArgs = 0;
|
||||
identifiers.add("loopmusic");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Biscuit b = Biscuit.getBiscuit(event.getGuild());
|
||||
b.log(event.getAuthor().getName() + " issued a command: -loopmusic");
|
||||
if(PermUtil.isMod(event.getMember())) {
|
||||
if(!b.getAudioScheduler().isLooping()) {
|
||||
event.getChannel().sendMessage("Setting all music to loop.").queue();
|
||||
b.getAudioScheduler().setLooping(true);
|
||||
}else {
|
||||
event.getChannel().sendMessage("Disabling music looping.").queue();
|
||||
b.getAudioScheduler().setLooping(false);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public class NowPlayingCommand extends MusicClientCommand{
|
||||
|
||||
public NowPlayingCommand() {
|
||||
name = "Now Playing";
|
||||
description = "Displays the currently playing song.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "nowplaying";
|
||||
minArgs = 0;
|
||||
maxArgs = 0;
|
||||
identifiers.add("nowplaying");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Biscuit b = Biscuit.getBiscuit(event.getGuild());
|
||||
b.log(event.getAuthor().getName() + " issued a command: -nowplaying");
|
||||
if(b.getAudioPlayer().getPlayingTrack() != null) {
|
||||
AudioTrack track = b.getAudioPlayer().getPlayingTrack();
|
||||
event.getChannel().sendMessage(b.getAudioScheduler().getMessage(track, true)).queue();
|
||||
}else {
|
||||
event.getChannel().sendMessage("No song is currently playing.").queue();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public class PauseCommand extends MusicClientCommand{
|
||||
|
||||
public PauseCommand() {
|
||||
name = "Pause";
|
||||
description = "Pauses the current track.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "pause";
|
||||
minArgs = 0;
|
||||
maxArgs = 0;
|
||||
identifiers.add("pause");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Biscuit b = Biscuit.getBiscuit(event.getGuild());
|
||||
b.log(event.getAuthor().getName() + " issued a command: -pause");
|
||||
if(PermUtil.isMod(event.getMember())) {
|
||||
if(!b.getAudioPlayer().isPaused()) {
|
||||
b.getAudioPlayer().setPaused(true);
|
||||
event.getChannel().sendMessage("Paused the current track.").queue();
|
||||
}else {
|
||||
event.getChannel().sendMessage("The music player is already paused.").queue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.audio.AudioHandler;
|
||||
import com.fpghoti.biscuit.audio.AudioResultHandler;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
import net.dv8tion.jda.api.entities.VoiceChannel;
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
import net.dv8tion.jda.api.managers.AudioManager;
|
||||
|
||||
public class PlayCommand extends MusicClientCommand{
|
||||
|
||||
public PlayCommand() {
|
||||
name = "Play";
|
||||
description = "Plays the specified song or plays a song found using search parameters.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "play <YouTube link OR Search Phrase>";
|
||||
minArgs = 1;
|
||||
maxArgs = 2000;
|
||||
identifiers.add("play");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Guild guild = event.getGuild();
|
||||
Biscuit b = Biscuit.getBiscuit(guild);
|
||||
TextChannel tchannel = event.getTextChannel();
|
||||
|
||||
String searchPhrase = args[0];
|
||||
if(args.length > 1) {
|
||||
for(int i = 1; i < args.length; i++) {
|
||||
searchPhrase = searchPhrase + " " + args[i];
|
||||
}
|
||||
}
|
||||
|
||||
b.log(event.getAuthor().getName() + " issued a command: -play " + searchPhrase);
|
||||
|
||||
String vcname = "";
|
||||
if(!event.getMember().getVoiceState().inVoiceChannel()) {
|
||||
tchannel.sendMessage("You must be in a voice channel to do this!").queue();
|
||||
return;
|
||||
}
|
||||
vcname = event.getMember().getVoiceState().getChannel().getName();
|
||||
String[] musicChannels = b.getProperties().getMusicChannels();
|
||||
if(musicChannels.length >= 1) {
|
||||
boolean found = false;
|
||||
for(String cname : musicChannels) {
|
||||
if(event.getMember().getVoiceState().getChannel().getName().equalsIgnoreCase(cname)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(found == false) {
|
||||
tchannel.sendMessage("You are not in a channel that is authorized to use the music player.").queue();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(b.getAudioPlayer().getPlayingTrack() != null && guild.getAudioManager().isConnected() && !guild.getAudioManager().getConnectedChannel().getMembers().contains(event.getMember())) {
|
||||
tchannel.sendMessage("Music is already playing in a voice channel. Connect to "
|
||||
+ "that channel, then queue your song.").queue();
|
||||
return;
|
||||
}
|
||||
|
||||
VoiceChannel channel = guild.getVoiceChannelsByName(vcname, true).get(0);
|
||||
AudioManager manager = guild.getAudioManager();
|
||||
|
||||
manager.setSendingHandler(new AudioHandler(b.getAudioPlayer()));
|
||||
manager.openAudioConnection(channel);
|
||||
|
||||
AudioPlayerManager playerManager = Main.getPlayerManager();
|
||||
String vidid = getID(event.getMessage().getContentRaw().split(" ")[1]);
|
||||
|
||||
playerManager.loadItemOrdered(guild, vidid, new AudioResultHandler(b,event.getAuthor().getId(), tchannel, false, searchPhrase));
|
||||
}
|
||||
|
||||
private String getID(String url) {
|
||||
String[] s = url.split("=");
|
||||
if(s.length > 1) {
|
||||
return s[1].split("&")[0];
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.audio.AudioHandler;
|
||||
import com.fpghoti.biscuit.audio.AudioResultHandler;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
import net.dv8tion.jda.api.entities.VoiceChannel;
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
import net.dv8tion.jda.api.managers.AudioManager;
|
||||
|
||||
public class PlayFirstCommand extends MusicClientCommand{
|
||||
|
||||
public PlayFirstCommand() {
|
||||
name = "Play First";
|
||||
description = "Places specified song at the front of the queue.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "playfirst <YouTube link OR Search Phrase>";
|
||||
minArgs = 1;
|
||||
maxArgs = 2000;
|
||||
identifiers.add("playfirst");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Guild guild = event.getGuild();
|
||||
Biscuit b = Biscuit.getBiscuit(guild);
|
||||
TextChannel tchannel = event.getTextChannel();
|
||||
|
||||
String searchPhrase = args[0];
|
||||
if(args.length > 1) {
|
||||
for(int i = 1; i < args.length; i++) {
|
||||
searchPhrase = searchPhrase + " " + args[i];
|
||||
}
|
||||
}
|
||||
|
||||
b.log(event.getAuthor().getName() + " issued a command: -play " + searchPhrase);
|
||||
|
||||
String vcname = "";
|
||||
|
||||
if(!PermUtil.isMod(event.getMember())) {
|
||||
tchannel.sendMessage("You do not have permission to do this!").queue();
|
||||
return;
|
||||
}
|
||||
|
||||
if(!event.getMember().getVoiceState().inVoiceChannel()) {
|
||||
tchannel.sendMessage("You must be in a voice channel to do this!").queue();
|
||||
return;
|
||||
}
|
||||
vcname = event.getMember().getVoiceState().getChannel().getName();
|
||||
String[] musicChannels = b.getProperties().getMusicChannels();
|
||||
if(musicChannels.length >= 1) {
|
||||
boolean found = false;
|
||||
for(String cname : musicChannels) {
|
||||
if(event.getMember().getVoiceState().getChannel().getName().equalsIgnoreCase(cname)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(found == false) {
|
||||
tchannel.sendMessage("You are not in a channel that is authorized to use the music player.").queue();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(b.getAudioPlayer().getPlayingTrack() != null && guild.getAudioManager().isConnected() && !guild.getAudioManager().getConnectedChannel().getMembers().contains(event.getMember())) {
|
||||
tchannel.sendMessage("Music is already playing in a voice channel. Connect to "
|
||||
+ "that channel, then queue your song.").queue();
|
||||
return;
|
||||
}
|
||||
|
||||
VoiceChannel channel = guild.getVoiceChannelsByName(vcname, true).get(0);
|
||||
AudioManager manager = guild.getAudioManager();
|
||||
|
||||
manager.setSendingHandler(new AudioHandler(b.getAudioPlayer()));
|
||||
manager.openAudioConnection(channel);
|
||||
|
||||
AudioPlayerManager playerManager = Main.getPlayerManager();
|
||||
String vidid = getID(event.getMessage().getContentRaw().split(" ")[1]);
|
||||
|
||||
playerManager.loadItemOrdered(guild, vidid, new AudioResultHandler(b,event.getAuthor().getId(), tchannel, false, searchPhrase, true));
|
||||
}
|
||||
|
||||
private String getID(String url) {
|
||||
String[] s = url.split("=");
|
||||
if(s.length > 1) {
|
||||
return s[1].split("&")[0];
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.audio.queue.AudioQueue;
|
||||
import com.fpghoti.biscuit.audio.queue.QueuedTrack;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public class QueueCommand extends MusicClientCommand{
|
||||
|
||||
public QueueCommand() {
|
||||
name = "Queue";
|
||||
description = "Displays the upcoming songs in the music queue.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "queue [Page #]";
|
||||
minArgs = 0;
|
||||
maxArgs = 1;
|
||||
identifiers.add("queue");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
|
||||
Biscuit biscuit = Biscuit.getBiscuit(event.getGuild());
|
||||
biscuit.log(event.getAuthor().getName() + " issued a command: -queue");
|
||||
int pg = 1;
|
||||
if (args.length > 0) {
|
||||
if(Util.isDigit(args[0])) {
|
||||
pg = Integer.parseInt(args[0]);
|
||||
}else {
|
||||
event.getTextChannel().sendMessage("Usage: ``" + usage + "``").queue();
|
||||
}
|
||||
}
|
||||
|
||||
AudioQueue queue = biscuit.getAudioScheduler().getQueue();
|
||||
|
||||
int pageCount = (int) Math.ceil((double) queue.size() / 8);
|
||||
if (pg > pageCount) {
|
||||
pg = pageCount;
|
||||
}
|
||||
|
||||
if(queue.size() == 0) {
|
||||
if(biscuit.getAudioPlayer().getPlayingTrack() == null) {
|
||||
event.getTextChannel().sendMessage("There is currently no song playing.").queue();
|
||||
}else {
|
||||
event.getTextChannel().sendMessage("Nothing is queued to play after the current track.").queue();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
event.getTextChannel().sendMessage("**Use " + Main.getMainBiscuit().getProperties().getCommandSignifier() + "queue [Page #] to navigate the different pages.**").queue();
|
||||
event.getTextChannel().sendMessage("[" + Integer.toString(pg) + "/" + Integer.toString(pageCount) + "] ** Upcoming Music Tracks:**").queue();
|
||||
String msg = "";
|
||||
for (int i = 0; i < 8; i++) {
|
||||
int index = (pg - 1) * 8 + i;
|
||||
int count = index + 1;
|
||||
String line = "";
|
||||
if (index < queue.size()) {
|
||||
QueuedTrack track = queue.getTrack(index);
|
||||
AudioTrack a = track.getTrack();
|
||||
Member m = track.getMember();
|
||||
line = "**" + count + ".** " + a.getInfo().title + " [" + Util.getTime(a.getInfo().length) + "]";
|
||||
if(m != null) {
|
||||
line = line + " Added by: **" + m.getEffectiveName() + "**";
|
||||
}
|
||||
}
|
||||
if(!(index + 1 >= queue.size() || index == 7)) {
|
||||
line = line + "\n";
|
||||
}
|
||||
if (index < queue.size()) {
|
||||
msg = msg + line;
|
||||
}
|
||||
}
|
||||
event.getTextChannel().sendMessage(msg).queue();
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import java.util.function.Consumer;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.logging.BColor;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public class SkipCommand extends MusicClientCommand{
|
||||
|
||||
public SkipCommand() {
|
||||
name = "Skip";
|
||||
description = "Sends a vote to skip the song that is currently playing.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "skip";
|
||||
minArgs = 0;
|
||||
maxArgs = 0;
|
||||
identifiers.add("skip");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Biscuit b = Biscuit.getBiscuit(event.getGuild());
|
||||
b.log(event.getAuthor().getName() + " issued a command: -skip");
|
||||
|
||||
if(b.getAudioPlayer().getPlayingTrack() == null) {
|
||||
event.getChannel().sendMessage("There is not a song playing for you to skip!").queue();
|
||||
return;
|
||||
}
|
||||
|
||||
if(!event.getGuild().getAudioManager().getConnectedChannel().getMembers().contains(event.getMember())) {
|
||||
event.getChannel().sendMessage("You need to be in the same voice channel in order to skip!").queue();
|
||||
return;
|
||||
}
|
||||
|
||||
if(b.getAudioScheduler().getVotes() >= (event.getGuild().getAudioManager().getConnectedChannel().getMembers().size() - 1) / 2) {
|
||||
event.getChannel().sendMessage("Skip vote status: **[" + ( b.getAudioScheduler().getVotes() + 1) + "/"
|
||||
+ (event.getGuild().getAudioManager().getConnectedChannel().getMembers().size() - 1) + "]**"
|
||||
+ "\nSkipping current track.").queue();
|
||||
if(b.getAudioScheduler().getNextMessage() != null ) {
|
||||
event.getChannel().sendMessage(b.getAudioScheduler().getNextMessage()).queue();
|
||||
}
|
||||
b.getAudioScheduler().skip();
|
||||
return;
|
||||
}
|
||||
if(b.getAudioScheduler().voteSkip(event.getAuthor().getId())) {
|
||||
event.getChannel().sendMessage("You voted to skip the current track.").queue();
|
||||
}else {
|
||||
event.getChannel().sendMessage("You cannot vote to skip this track again."
|
||||
+ "\nSkip vote status: **[" + b.getAudioScheduler().getVotes() + "/"
|
||||
+ (event.getGuild().getAudioManager().getConnectedChannel().getMembers().size() - 1) + "]**").queue();
|
||||
}
|
||||
|
||||
if(b.getAudioScheduler().getVotes() >= (event.getGuild().getAudioManager().getConnectedChannel().getMembers().size() - 1) / 2) {
|
||||
event.getChannel().sendMessage("Skip vote status: **[" + b.getAudioScheduler().getVotes() + "/"
|
||||
+ event.getGuild().getAudioManager().getConnectedChannel().getMembers().size() + "]**"
|
||||
+ "\nSkipping current track.").queue();
|
||||
if(b.getAudioScheduler().getNextMessage() != null ) {
|
||||
event.getChannel().sendMessage(b.getAudioScheduler().getNextMessage()).queue();
|
||||
}
|
||||
b.getAudioScheduler().skip();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -5,7 +5,7 @@ import java.util.function.Consumer;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public class TogglePauseCommand extends MusicClientCommand{
|
||||
|
||||
public TogglePauseCommand() {
|
||||
name = "Toggle Pause";
|
||||
description = "Toggles the pause status of the current track.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "togglepause";
|
||||
minArgs = 0;
|
||||
maxArgs = 0;
|
||||
identifiers.add("togglepause");
|
||||
identifiers.add("tp");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Biscuit b = Biscuit.getBiscuit(event.getGuild());
|
||||
b.log(event.getAuthor().getName() + " issued a command: -togglepause");
|
||||
if(PermUtil.isMod(event.getMember())) {
|
||||
if(b.getAudioPlayer().isPaused()) {
|
||||
b.getAudioPlayer().setPaused(false);
|
||||
event.getChannel().sendMessage("Unpaused the current track.").queue();
|
||||
}else {
|
||||
b.getAudioPlayer().setPaused(true);
|
||||
event.getChannel().sendMessage("Paused the current track.").queue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Emote;
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public class UnpauseCommand extends ClientCommand{
|
||||
|
||||
public UnpauseCommand() {
|
||||
name = "Unpause";
|
||||
description = "Unpauses the current track.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "unpause";
|
||||
minArgs = 0;
|
||||
maxArgs = 0;
|
||||
identifiers.add("unpause");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Biscuit b = Biscuit.getBiscuit(event.getGuild());
|
||||
b.log(event.getAuthor().getName() + " issued a command: -unpause");
|
||||
if(PermUtil.isMod(event.getMember())) {
|
||||
if(b.getAudioPlayer().isPaused()) {
|
||||
b.getAudioPlayer().setPaused(false);
|
||||
event.getChannel().sendMessage("Unpaused the current track.").queue();
|
||||
}else {
|
||||
event.getChannel().sendMessage("The music player is not paused.").queue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.client;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ClientCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
package com.fpghoti.biscuit.commands.client;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.base.MusicClientCommand;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
|
||||
public class WipeQueueCommand extends MusicClientCommand{
|
||||
|
||||
public WipeQueueCommand() {
|
||||
name = "Wipe Queue";
|
||||
description = "Removes all upcoming tracks from the queue.";
|
||||
usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "wipequeue";
|
||||
minArgs = 0;
|
||||
maxArgs = 0;
|
||||
identifiers.add("wipequeue");
|
||||
identifiers.add("wipeq");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String[] args, MessageReceivedEvent event) {
|
||||
Biscuit b = Biscuit.getBiscuit(event.getGuild());
|
||||
b.log(event.getAuthor().getName() + " issued a command: -wipequeue");
|
||||
if(PermUtil.isMod(event.getMember())) {
|
||||
b.getAudioScheduler().wipeQueue();
|
||||
event.getChannel().sendMessage("Removed upcoming songs from the music queue.").queue();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.console;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ConsoleCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ConsoleCommand;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.fpghoti.biscuit.commands.console;
|
|||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.ConsoleCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ConsoleCommand;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package com.fpghoti.biscuit.commands.console;
|
||||
|
||||
import com.fpghoti.biscuit.Main;
|
||||
import com.fpghoti.biscuit.commands.ConsoleCommand;
|
||||
import com.fpghoti.biscuit.commands.base.ConsoleCommand;
|
||||
|
||||
public class ShutdownConsoleCommand extends ConsoleCommand{
|
||||
|
||||
|
|
|
@ -132,6 +132,8 @@ public class BiscuitConfig {
|
|||
if(isMain) {
|
||||
added = addProperty("Command-Signifier", "-", prop, added, silent);
|
||||
added = addProperty("Bot-Token", "", prop, added, silent);
|
||||
added = addProperty("Enable-Music-Bot", "true", prop, added, silent);
|
||||
added = addProperty("Log-Music-Player", "true", prop, added, silent);
|
||||
}
|
||||
|
||||
added = addProperty("Guild-Identifier", name, prop, added, silent);
|
||||
|
@ -175,6 +177,8 @@ public class BiscuitConfig {
|
|||
added = addProperty("Custom-Command-Names", "", prop, added, silent);
|
||||
added = addProperty("DM-Before-Kick", "true", prop, added, silent);
|
||||
added = addProperty("Kick-DM-Invite", "", prop, added, silent);
|
||||
added = addProperty("Allow-Music-Bot", "true", prop, added, silent);
|
||||
added = addProperty("Music-Channels", "", prop, added, silent);
|
||||
|
||||
if(!isMain) {
|
||||
if(code != null) {
|
||||
|
|
|
@ -22,6 +22,28 @@ public class BiscuitProperties {
|
|||
return Main.getMainBiscuit().getConfig().getFromConfig(key, Main.getMainBiscuit());
|
||||
}
|
||||
|
||||
public boolean musicBotEnabled(){
|
||||
String key = "Enable-Music-Bot";
|
||||
return Main.getMainBiscuit().getConfig().getFromConfig(key, Main.getMainBiscuit()).equalsIgnoreCase("true");
|
||||
}
|
||||
|
||||
public boolean logMusicPlayer(){
|
||||
String key = "Log-Music-Player";
|
||||
return Main.getMainBiscuit().getConfig().getFromConfig(key, Main.getMainBiscuit()).equalsIgnoreCase("true");
|
||||
}
|
||||
|
||||
public boolean allowMusicBot(){
|
||||
if(!musicBotEnabled()) {
|
||||
return false;
|
||||
}
|
||||
String key = "Allow-Music-Bot";
|
||||
if(biscuit.getConfig().getFromConfig(key, biscuit).equalsIgnoreCase("[global]") && biscuit.getGuild() != null) {
|
||||
return Main.getMainBiscuit().getProperties().allowMusicBot();
|
||||
}
|
||||
String value = biscuit.getConfig().getFromConfig(key, biscuit);
|
||||
return value.equalsIgnoreCase("true");
|
||||
}
|
||||
|
||||
public String getGuildCode(){
|
||||
String key = "Guild-Code";
|
||||
if(biscuit.getGuild() == null) {
|
||||
|
@ -268,6 +290,19 @@ public class BiscuitProperties {
|
|||
return list;
|
||||
}
|
||||
|
||||
public String[] getMusicChannels(){
|
||||
String key = "Music-Channels";
|
||||
if(biscuit.getConfig().getFromConfig(key, biscuit).equalsIgnoreCase("[global]") && biscuit.getGuild() != null) {
|
||||
return Main.getMainBiscuit().getProperties().getMusicChannels();
|
||||
}
|
||||
String [] list = biscuit.getConfig().getFromConfig(key, biscuit).replace(" , ", ",").replace(", ", ",").split(",");
|
||||
if(list.length == 1 && list[0].equals("")) {
|
||||
String[] blank = {};
|
||||
return blank;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public String[] blockedUnicodeEmotes(){
|
||||
String key = "Block-Unicode-Emotes";
|
||||
if(biscuit.getConfig().getFromConfig(key, biscuit).equalsIgnoreCase("[global]") && biscuit.getGuild() != null) {
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
package com.fpghoti.biscuit.commands;
|
||||
package com.fpghoti.biscuit.listener;
|
||||
|
||||
import java.util.Scanner;
|
||||
|
||||
import com.fpghoti.biscuit.biscuit.Biscuit;
|
||||
import com.fpghoti.biscuit.commands.CommandManager;
|
||||
import com.fpghoti.biscuit.logging.BiscuitLog;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
|
|
@ -9,17 +9,15 @@ import com.fpghoti.biscuit.logging.BColor;
|
|||
import com.fpghoti.biscuit.util.ChatFilter;
|
||||
import com.fpghoti.biscuit.util.PermUtil;
|
||||
import com.fpghoti.biscuit.util.Util;
|
||||
import net.dv8tion.jda.api.entities.ChannelType;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import net.dv8tion.jda.api.entities.Message.Attachment;
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||
|
||||
public class MessageReceiveListener extends ListenerAdapter{
|
||||
|
||||
@Override
|
||||
public void onMessageReceived(MessageReceivedEvent event){
|
||||
if (event.isFromType(ChannelType.TEXT)) {
|
||||
public void onGuildMessageReceived(GuildMessageReceivedEvent event){
|
||||
Biscuit biscuit = Biscuit.getBiscuit(event.getGuild());
|
||||
if(event.getAuthor().isBot()) {
|
||||
logBot(event, biscuit);
|
||||
|
@ -40,10 +38,9 @@ public class MessageReceiveListener extends ListenerAdapter{
|
|||
checkNewSpammer(event, biscuit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void logBot(MessageReceivedEvent event, Biscuit biscuit) {
|
||||
if(Util.isLoggable(event.getTextChannel())) {
|
||||
private void logBot(GuildMessageReceivedEvent event, Biscuit biscuit) {
|
||||
if(Util.isLoggable(event.getChannel())) {
|
||||
if(biscuit.getProperties().logChat()) {
|
||||
biscuit.log("[" + BColor.BLACK_BOLD + "BOT" + BColor.RESET + "] [" + BColor.RED + "#" + event.getChannel().getName() + BColor.RESET + "] "
|
||||
+ BColor.RED_BOLD + event.getAuthor().getName() + ": " + BColor.RESET + event.getMessage().getContentDisplay());
|
||||
|
@ -51,8 +48,8 @@ public class MessageReceiveListener extends ListenerAdapter{
|
|||
}
|
||||
}
|
||||
|
||||
private void logUser(MessageReceivedEvent event, Biscuit biscuit) {
|
||||
if(Util.isLoggable(event.getTextChannel())) {
|
||||
private void logUser(GuildMessageReceivedEvent event, Biscuit biscuit) {
|
||||
if(Util.isLoggable(event.getChannel())) {
|
||||
if(biscuit.getProperties().logChat()) {
|
||||
biscuit.log("[" + BColor.CYAN_BOLD + "MSG" + BColor.RESET + "] " + BColor.GREEN + "ID: " + BColor.RESET +
|
||||
event.getMessageId() + BColor.GREEN + " Sender: " + BColor.RESET + event.getAuthor().getAsMention() +
|
||||
|
@ -75,10 +72,10 @@ public class MessageReceiveListener extends ListenerAdapter{
|
|||
}
|
||||
}
|
||||
|
||||
private boolean isNaughty(MessageReceivedEvent event) {
|
||||
private boolean isNaughty(GuildMessageReceivedEvent event) {
|
||||
// TODO make staff filter configurable
|
||||
if(!event.getChannel().getName().toLowerCase().contains("staff") && ChatFilter.filter(event, false)){
|
||||
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + " This message contains words not appropriate for this channel.").queue(new Consumer<Message>()
|
||||
event.getChannel().sendMessage(event.getAuthor().getAsMention() + " This message contains words not appropriate for this channel.").queue(new Consumer<Message>()
|
||||
{
|
||||
@Override
|
||||
public void accept(Message msg){
|
||||
|
@ -91,7 +88,7 @@ public class MessageReceiveListener extends ListenerAdapter{
|
|||
return false;
|
||||
}
|
||||
|
||||
private boolean handleSpammer(MessageReceivedEvent event, Biscuit biscuit) {
|
||||
private boolean handleSpammer(GuildMessageReceivedEvent event, Biscuit biscuit) {
|
||||
//TODO make numbers configurable
|
||||
BiscuitMessageStore store = biscuit.getMessageStore();
|
||||
String mention = event.getAuthor().getAsMention();
|
||||
|
@ -113,7 +110,7 @@ public class MessageReceiveListener extends ListenerAdapter{
|
|||
return false;
|
||||
}
|
||||
|
||||
private boolean handleSoftmuted(MessageReceivedEvent event, Biscuit biscuit) {
|
||||
private boolean handleSoftmuted(GuildMessageReceivedEvent event, Biscuit biscuit) {
|
||||
//TODO make numbers configurable
|
||||
BiscuitMessageStore store = biscuit.getMessageStore();
|
||||
String mention = event.getAuthor().getAsMention();
|
||||
|
@ -135,7 +132,7 @@ public class MessageReceiveListener extends ListenerAdapter{
|
|||
return false;
|
||||
}
|
||||
|
||||
private void checkNewSpammer(MessageReceivedEvent event, Biscuit biscuit) {
|
||||
private void checkNewSpammer(GuildMessageReceivedEvent event, Biscuit biscuit) {
|
||||
BiscuitMessageStore store = biscuit.getMessageStore();
|
||||
String mention = event.getAuthor().getAsMention();
|
||||
|
||||
|
@ -152,7 +149,7 @@ public class MessageReceiveListener extends ListenerAdapter{
|
|||
store.addSpammer(event.getAuthor());
|
||||
store.removeSpamWarned(event.getAuthor());
|
||||
event.getMessage().delete().submit();
|
||||
event.getTextChannel().sendMessage("*Flagging " + mention + " as spam!*").queue(new Consumer<Message>()
|
||||
event.getChannel().sendMessage("*Flagging " + mention + " as spam!*").queue(new Consumer<Message>()
|
||||
{
|
||||
@Override
|
||||
public void accept(Message msg){
|
||||
|
@ -165,7 +162,7 @@ public class MessageReceiveListener extends ListenerAdapter{
|
|||
}else if(!store.isSpammer(event.getAuthor()) && !store.isSpamWarned(event.getAuthor())){
|
||||
store.removeMessageCount(event.getAuthor());
|
||||
store.addSpamWarned(event.getAuthor());
|
||||
event.getTextChannel().sendMessage("**STOP spamming, " + mention + "! You have been warned!**").queue(new Consumer<Message>()
|
||||
event.getChannel().sendMessage("**STOP spamming, " + mention + "! You have been warned!**").queue(new Consumer<Message>()
|
||||
{
|
||||
@Override
|
||||
public void accept(Message msg){
|
||||
|
|
|
@ -5,17 +5,17 @@ import com.fpghoti.biscuit.logging.BColor;
|
|||
import com.vdurmont.emoji.EmojiParser;
|
||||
|
||||
import net.dv8tion.jda.api.entities.Emote;
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
public class ChatFilter {
|
||||
|
||||
public static String[] suffixes = {"ing","s","ed","er","es","y","ers","ier","iest","ies","ys"};
|
||||
|
||||
public static boolean filter(MessageReceivedEvent event) {
|
||||
public static boolean filter(GuildMessageReceivedEvent event) {
|
||||
return filter(event, true);
|
||||
}
|
||||
|
||||
public static boolean filter(MessageReceivedEvent event, boolean silent) {
|
||||
public static boolean filter(GuildMessageReceivedEvent event, boolean silent) {
|
||||
Biscuit biscuit = Biscuit.getBiscuit(event.getGuild());
|
||||
String msg = event.getMessage().getContentDisplay();
|
||||
|
||||
|
|
|
@ -60,4 +60,22 @@ public class Util {
|
|||
return s2.replace(".", "").matches("[0-9]+");
|
||||
}
|
||||
|
||||
public static String getTime(long t) {
|
||||
long rawseconds = Math.round(t / 1000);
|
||||
long rawminutes = Math.round(rawseconds/60);
|
||||
long hour = Math.round(rawminutes/60);
|
||||
long minute = rawminutes - (hour * 60);
|
||||
long second = rawseconds - (rawminutes * 60);
|
||||
if(hour < 0) {
|
||||
hour = 0;
|
||||
}
|
||||
if(minute < 0) {
|
||||
minute = 0;
|
||||
}
|
||||
if(second <= 1) {
|
||||
second = 2;
|
||||
}
|
||||
return String.format("%02d:%02d:%02d", hour, minute, second - 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -99,6 +99,27 @@ DM-Before-Kick = true
|
|||
#Use full link
|
||||
Kick-DM-Invite =
|
||||
|
||||
#Enable Music Bot functionality.
|
||||
#This command is for the bot admin only. If disabled, no guild
|
||||
#Will be allowed to enable and use the Music bot commands.
|
||||
Enable-Music-Bot = true
|
||||
|
||||
#Individual guild owners can enable/disable this to allow/disallow
|
||||
#Music bot features in their server. Defaults to the setting
|
||||
#Set in the main config.properties. This will do nothing if
|
||||
#Enable-Music-Bot is already set to false.
|
||||
Allow-Music-Bot = true
|
||||
|
||||
#This logs music player events to the terminal.
|
||||
#The music player logs may be annoyance. Disable them here.
|
||||
#Errors will still be logged.
|
||||
Log-Music-Player = true
|
||||
|
||||
#To restrict music to certain channels, add them here.
|
||||
#i.e:
|
||||
#Music-Channels = Room 1, Room 2
|
||||
Music-Channels =
|
||||
|
||||
#List your custom commands here. This line will always generate blank.
|
||||
#Example - Custom-Command-Names = hello,botcheck,apple
|
||||
Custom-Command-Names =
|
||||
|
|
Loading…
Reference in New Issue