mirror of
https://github.com/chrisb09/MusicBot.git
synced 2026-11-05 17:02:35 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27fd75aa67 | ||
|
|
c5a583b96f | ||
|
|
f1e301b48e | ||
|
|
61d4c51276 | ||
|
|
cbdbe7bf4b | ||
|
|
baa3a60b05 | ||
|
|
338dafca0c | ||
|
|
b1dddb649b | ||
|
|
3eb284da55 | ||
|
|
5fb969283d |
No files matched your search
@@ -22,9 +22,8 @@ A clear and concise description of what you expected to happen.
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Version Info (please complete the following information):**
|
||||
- Operating System: [e.g. Windows 64bit]
|
||||
- JMusicBot Version: [e.g. 0.2.1]
|
||||
**Debug Info**
|
||||
Please run the `debug` command and paste it here or upload it as an attachment. If you cannot run the command, please provide information about your system such as operating system version, JMusicBot version, etc.
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
@@ -3,14 +3,19 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.jagrosh</groupId>
|
||||
<artifactId>JMusicBot</artifactId>
|
||||
<version>0.2.6</version>
|
||||
<version>Snapshot</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>central</id>
|
||||
<name>bintray</name>
|
||||
<url>http://jcenter.bintray.com</url>
|
||||
<url>https://jcenter.bintray.com</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>bintray-sedmelluq-com.sedmelluq</id>
|
||||
<name>bintray</name>
|
||||
<url>https://dl.bintray.com/sedmelluq/com.sedmelluq</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
@@ -23,7 +28,12 @@
|
||||
<dependency>
|
||||
<groupId>com.sedmelluq</groupId>
|
||||
<artifactId>lavaplayer</artifactId>
|
||||
<version>1.3.25</version>
|
||||
<version>1.3.50</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sedmelluq</groupId>
|
||||
<artifactId>lavaplayer-natives-extra</artifactId>
|
||||
<version>1.3.13</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.jagrosh</groupId>
|
||||
|
||||
@@ -23,7 +23,6 @@ import com.typesafe.config.*;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import net.dv8tion.jda.core.OnlineStatus;
|
||||
import net.dv8tion.jda.core.entities.Game;
|
||||
|
||||
@@ -64,7 +63,7 @@ public class BotConfig
|
||||
try
|
||||
{
|
||||
// get the path to the config, default config.txt
|
||||
path = Paths.get(System.getProperty("config.file", System.getProperty("config", "config.txt")));
|
||||
path = OtherUtil.getPath(System.getProperty("config.file", System.getProperty("config", "config.txt")));
|
||||
if(path.toFile().exists())
|
||||
{
|
||||
if(System.getProperty("config.file") == null)
|
||||
@@ -138,7 +137,7 @@ public class BotConfig
|
||||
if(owner<=0)
|
||||
{
|
||||
prompt.alert(Prompt.Level.ERROR, CONTEXT, "Invalid User ID! Exiting.\n\nConfig Location: " + path.toAbsolutePath().toString());
|
||||
System.exit(0);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -147,31 +146,7 @@ public class BotConfig
|
||||
}
|
||||
|
||||
if(write)
|
||||
{
|
||||
String original = OtherUtil.loadResource(this, "/reference.conf");
|
||||
byte[] bytes;
|
||||
if(original==null)
|
||||
{
|
||||
bytes = ("token = "+token+"\r\nowner = "+owner).getBytes();
|
||||
}
|
||||
else
|
||||
{
|
||||
bytes = original.substring(original.indexOf(START_TOKEN)+START_TOKEN.length(), original.indexOf(END_TOKEN))
|
||||
.replace("BOT_TOKEN_HERE", token)
|
||||
.replace("0 // OWNER ID", Long.toString(owner))
|
||||
.trim().getBytes();
|
||||
}
|
||||
try
|
||||
{
|
||||
Files.write(path, bytes);
|
||||
}
|
||||
catch(IOException ex)
|
||||
{
|
||||
prompt.alert(Prompt.Level.WARNING, CONTEXT, "Failed to write new config options to config.txt: "+ex
|
||||
+ "\nPlease make sure that the files are not on your desktop or some other restricted area.\n\nConfig Location: "
|
||||
+ path.toAbsolutePath().toString());
|
||||
}
|
||||
}
|
||||
writeToFile();
|
||||
|
||||
// if we get through the whole config, it's good to go
|
||||
valid = true;
|
||||
@@ -182,6 +157,33 @@ public class BotConfig
|
||||
}
|
||||
}
|
||||
|
||||
private void writeToFile()
|
||||
{
|
||||
String original = OtherUtil.loadResource(this, "/reference.conf");
|
||||
byte[] bytes;
|
||||
if(original==null)
|
||||
{
|
||||
bytes = ("token = "+token+"\r\nowner = "+owner).getBytes();
|
||||
}
|
||||
else
|
||||
{
|
||||
bytes = original.substring(original.indexOf(START_TOKEN)+START_TOKEN.length(), original.indexOf(END_TOKEN))
|
||||
.replace("BOT_TOKEN_HERE", token)
|
||||
.replace("0 // OWNER ID", Long.toString(owner))
|
||||
.trim().getBytes();
|
||||
}
|
||||
try
|
||||
{
|
||||
Files.write(path, bytes);
|
||||
}
|
||||
catch(IOException ex)
|
||||
{
|
||||
prompt.alert(Prompt.Level.WARNING, CONTEXT, "Failed to write new config options to config.txt: "+ex
|
||||
+ "\nPlease make sure that the files are not on your desktop or some other restricted area.\n\nConfig Location: "
|
||||
+ path.toAbsolutePath().toString());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isValid()
|
||||
{
|
||||
return valid;
|
||||
|
||||
@@ -58,15 +58,6 @@ public class JMusicBot
|
||||
Prompt prompt = new Prompt("JMusicBot", "Switching to nogui mode. You can manually start in nogui mode by including the -Dnogui=true flag.",
|
||||
"true".equalsIgnoreCase(System.getProperty("nogui", "false")));
|
||||
|
||||
// check deprecated nogui mode (new way of setting it is -Dnogui=true)
|
||||
for(String arg: args)
|
||||
if("-nogui".equalsIgnoreCase(arg))
|
||||
{
|
||||
prompt.alert(Prompt.Level.WARNING, "GUI", "The -nogui flag has been deprecated. "
|
||||
+ "Please use the -Dnogui=true flag before the name of the jar. Example: java -jar -Dnogui=true JMusicBot.jar");
|
||||
break;
|
||||
}
|
||||
|
||||
// get and check latest version
|
||||
String version = OtherUtil.checkVersion(prompt);
|
||||
|
||||
@@ -167,7 +158,7 @@ public class JMusicBot
|
||||
}
|
||||
}
|
||||
|
||||
log.info("Loaded config from "+config.getConfigLocation());
|
||||
log.info("Loaded config from " + config.getConfigLocation());
|
||||
|
||||
// attempt to log in and start
|
||||
try
|
||||
|
||||
@@ -29,6 +29,7 @@ import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Message;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||
import net.dv8tion.jda.core.exceptions.RateLimitedException;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -119,12 +120,13 @@ public class NowplayingHandler
|
||||
{
|
||||
try
|
||||
{
|
||||
if(wait)
|
||||
tchan.getManager().setTopic(text).complete();
|
||||
else
|
||||
tchan.getManager().setTopic(text).queue();
|
||||
// normally here if 'wait' was false, we'd want to queue, however,
|
||||
// new discord ratelimits specifically limiting changing channel topics
|
||||
// mean we don't want a backlog of changes piling up, so if we hit a
|
||||
// ratelimit, we just won't change the topic this time
|
||||
tchan.getManager().setTopic(text).complete(wait);
|
||||
}
|
||||
catch(PermissionException ignore) {}
|
||||
catch(PermissionException | RateLimitedException ignore) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public class PrefixCmd extends AdminCommand
|
||||
else
|
||||
{
|
||||
s.setPrefix(event.getArgs());
|
||||
event.replySuccess("Custom prefix set to `" + event.getArgs() + " on *" + event.getGuild().getName() + "*");
|
||||
event.replySuccess("Custom prefix set to `" + event.getArgs() + "` on *" + event.getGuild().getName() + "*");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,12 +16,10 @@
|
||||
package com.jagrosh.jmusicbot.commands.music;
|
||||
|
||||
import com.jagrosh.jdautilities.command.CommandEvent;
|
||||
import com.jagrosh.jlyrics.Lyrics;
|
||||
import com.jagrosh.jlyrics.LyricsClient;
|
||||
import com.jagrosh.jmusicbot.Bot;
|
||||
import com.jagrosh.jmusicbot.audio.AudioHandler;
|
||||
import com.jagrosh.jmusicbot.commands.MusicCommand;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import net.dv8tion.jda.core.EmbedBuilder;
|
||||
import net.dv8tion.jda.core.Permission;
|
||||
|
||||
@@ -57,7 +55,7 @@ public class LyricsCmd extends MusicCommand
|
||||
{
|
||||
if(lyrics == null)
|
||||
{
|
||||
event.replyError("Lyrics for `" + title + "` could not be found!");
|
||||
event.replyError("Lyrics for `" + title + "` could not be found!" + (event.getArgs().isEmpty() ? " Try entering the song name manually (`lyrics [song name]`)" : ""));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -115,8 +115,8 @@ public class SearchCmd extends MusicCommand
|
||||
}
|
||||
AudioHandler handler = (AudioHandler)event.getGuild().getAudioManager().getSendingHandler();
|
||||
int pos = handler.addTrack(new QueuedTrack(track, event.getAuthor()))+1;
|
||||
event.replySuccess("Added **"+track.getInfo().title
|
||||
+"** (`"+FormatUtil.formatTime(track.getDuration())+"`) "+(pos==0 ? "to begin playing"
|
||||
event.replySuccess("Added **" + FormatUtil.filter(track.getInfo().title)
|
||||
+ "** (`" + FormatUtil.formatTime(track.getDuration()) + "`) " + (pos==0 ? "to begin playing"
|
||||
: " to the queue at position "+pos));
|
||||
})
|
||||
.setCancel((msg) -> {})
|
||||
|
||||
@@ -49,7 +49,7 @@ public class DebugCmd extends OwnerCommand
|
||||
protected void execute(CommandEvent event)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("System Properties:");
|
||||
sb.append("```\nSystem Properties:");
|
||||
for(String key: PROPERTIES)
|
||||
sb.append("\n ").append(key).append(" = ").append(System.getProperty(key));
|
||||
sb.append("\n\nJMusicBot Information:")
|
||||
@@ -76,11 +76,12 @@ public class DebugCmd extends OwnerCommand
|
||||
.append("\n ID = ").append(event.getJDA().getSelfUser().getId())
|
||||
.append("\n Guilds = ").append(event.getJDA().getGuildCache().size())
|
||||
.append("\n Users = ").append(event.getJDA().getUserCache().size());
|
||||
sb.append("\n```");
|
||||
|
||||
if(event.isFromType(ChannelType.PRIVATE)
|
||||
|| event.getSelfMember().hasPermission(event.getTextChannel(), Permission.MESSAGE_ATTACH_FILES))
|
||||
event.getChannel().sendFile(sb.toString().getBytes(), "debug_information.txt").queue();
|
||||
else
|
||||
event.reply("Debug Information: ```\n" + sb.toString() + "\n```");
|
||||
event.reply("Debug Information: " + sb.toString());
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@
|
||||
package com.jagrosh.jmusicbot.playlist;
|
||||
|
||||
import com.jagrosh.jmusicbot.BotConfig;
|
||||
import com.jagrosh.jmusicbot.utils.OtherUtil;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||
@@ -24,7 +25,6 @@ import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -61,29 +61,29 @@ public class PlaylistLoader
|
||||
{
|
||||
try
|
||||
{
|
||||
Files.createDirectory(Paths.get(config.getPlaylistsFolder()));
|
||||
Files.createDirectory(OtherUtil.getPath(config.getPlaylistsFolder()));
|
||||
}
|
||||
catch (IOException ignore) {}
|
||||
}
|
||||
|
||||
public boolean folderExists()
|
||||
{
|
||||
return Files.exists(Paths.get(config.getPlaylistsFolder()));
|
||||
return Files.exists(OtherUtil.getPath(config.getPlaylistsFolder()));
|
||||
}
|
||||
|
||||
public void createPlaylist(String name) throws IOException
|
||||
{
|
||||
Files.createFile(Paths.get(config.getPlaylistsFolder()+File.separator+name+".txt"));
|
||||
Files.createFile(OtherUtil.getPath(config.getPlaylistsFolder()+File.separator+name+".txt"));
|
||||
}
|
||||
|
||||
public void deletePlaylist(String name) throws IOException
|
||||
{
|
||||
Files.delete(Paths.get(config.getPlaylistsFolder()+File.separator+name+".txt"));
|
||||
Files.delete(OtherUtil.getPath(config.getPlaylistsFolder()+File.separator+name+".txt"));
|
||||
}
|
||||
|
||||
public void writePlaylist(String name, String text) throws IOException
|
||||
{
|
||||
Files.write(Paths.get(config.getPlaylistsFolder()+File.separator+name+".txt"), text.trim().getBytes());
|
||||
Files.write(OtherUtil.getPath(config.getPlaylistsFolder()+File.separator+name+".txt"), text.trim().getBytes());
|
||||
}
|
||||
|
||||
public Playlist getPlaylist(String name)
|
||||
@@ -96,7 +96,7 @@ public class PlaylistLoader
|
||||
{
|
||||
boolean[] shuffle = {false};
|
||||
List<String> list = new ArrayList<>();
|
||||
Files.readAllLines(Paths.get(config.getPlaylistsFolder()+File.separator+name+".txt")).forEach(str ->
|
||||
Files.readAllLines(OtherUtil.getPath(config.getPlaylistsFolder()+File.separator+name+".txt")).forEach(str ->
|
||||
{
|
||||
String s = str.trim();
|
||||
if(s.isEmpty())
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package com.jagrosh.jmusicbot.settings;
|
||||
|
||||
import com.jagrosh.jdautilities.command.GuildSettingsManager;
|
||||
import com.jagrosh.jmusicbot.utils.OtherUtil;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
@@ -37,7 +38,7 @@ public class SettingsManager implements GuildSettingsManager
|
||||
{
|
||||
this.settings = new HashMap<>();
|
||||
try {
|
||||
JSONObject loadedSettings = new JSONObject(new String(Files.readAllBytes(Paths.get("serversettings.json"))));
|
||||
JSONObject loadedSettings = new JSONObject(new String(Files.readAllBytes(OtherUtil.getPath("serversettings.json"))));
|
||||
loadedSettings.keySet().forEach((id) -> {
|
||||
JSONObject o = loadedSettings.getJSONObject(id);
|
||||
settings.put(Long.parseLong(id), new Settings(this,
|
||||
@@ -99,7 +100,7 @@ public class SettingsManager implements GuildSettingsManager
|
||||
obj.put(Long.toString(key), o);
|
||||
});
|
||||
try {
|
||||
Files.write(Paths.get("serversettings.json"), obj.toString(4).getBytes());
|
||||
Files.write(OtherUtil.getPath("serversettings.json"), obj.toString(4).getBytes());
|
||||
} catch(IOException ex){
|
||||
LoggerFactory.getLogger("Settings").warn("Failed to write to file: "+ex);
|
||||
}
|
||||
|
||||
@@ -92,6 +92,9 @@ public class FormatUtil {
|
||||
|
||||
public static String filter(String input)
|
||||
{
|
||||
return input.replace("@everyone", "@\u0435veryone").replace("@here", "@h\u0435re").trim(); // cyrillic letter e
|
||||
return input.replace("\u202E","")
|
||||
.replace("@everyone", "@\u0435veryone") // cyrillic letter e
|
||||
.replace("@here", "@h\u0435re") // cyrillic letter e
|
||||
.trim();
|
||||
}
|
||||
}
|
||||
@@ -18,8 +18,11 @@ package com.jagrosh.jmusicbot.utils;
|
||||
import com.jagrosh.jmusicbot.JMusicBot;
|
||||
import com.jagrosh.jmusicbot.entities.Prompt;
|
||||
import java.io.*;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import net.dv8tion.jda.core.OnlineStatus;
|
||||
import net.dv8tion.jda.core.entities.Game;
|
||||
import okhttp3.*;
|
||||
@@ -37,7 +40,38 @@ public class OtherUtil
|
||||
+ "Current version: %s\n"
|
||||
+ "New Version: %s\n\n"
|
||||
+ "Please visit https://github.com/jagrosh/MusicBot/releases/latest to get the latest release.";
|
||||
private final static String WINDOWS_INVALID_PATH = "c:\\windows\\system32\\";
|
||||
|
||||
/**
|
||||
* gets a Path from a String
|
||||
* also fixes the windows tendency to try to start in system32
|
||||
* any time the bot tries to access this path, it will instead start in the location of the jar file
|
||||
*
|
||||
* @param path the string path
|
||||
* @return the Path object
|
||||
*/
|
||||
public static Path getPath(String path)
|
||||
{
|
||||
// special logic to prevent trying to access system32
|
||||
if(path.toLowerCase().startsWith(WINDOWS_INVALID_PATH))
|
||||
{
|
||||
String filename = path.substring(WINDOWS_INVALID_PATH.length());
|
||||
try
|
||||
{
|
||||
path = new File(JMusicBot.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParentFile().getPath() + File.separator + filename;
|
||||
}
|
||||
catch(URISyntaxException ex) {}
|
||||
}
|
||||
return Paths.get(path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a resource from the jar as a string
|
||||
*
|
||||
* @param clazz class base object
|
||||
* @param name name of resource
|
||||
* @return string containing the contents of the resource
|
||||
*/
|
||||
public static String loadResource(Object clazz, String name)
|
||||
{
|
||||
try(BufferedReader reader = new BufferedReader(new InputStreamReader(clazz.getClass().getResourceAsStream(name))))
|
||||
@@ -52,6 +86,12 @@ public class OtherUtil
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads image data from a URL
|
||||
*
|
||||
* @param url url of image
|
||||
* @return inputstream of url
|
||||
*/
|
||||
public static InputStream imageFromUrl(String url)
|
||||
{
|
||||
if(url==null)
|
||||
@@ -67,29 +107,40 @@ public class OtherUtil
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses an activity from a string
|
||||
*
|
||||
* @param game the game, including the action such as 'playing' or 'watching'
|
||||
* @return the parsed activity
|
||||
*/
|
||||
public static Game parseGame(String game)
|
||||
{
|
||||
if(game==null || game.trim().isEmpty() || game.trim().equalsIgnoreCase("default"))
|
||||
return null;
|
||||
String lower = game.toLowerCase();
|
||||
if(lower.startsWith("playing"))
|
||||
return Game.playing(game.substring(7).trim());
|
||||
return Game.playing(makeNonEmpty(game.substring(7).trim()));
|
||||
if(lower.startsWith("listening to"))
|
||||
return Game.listening(game.substring(12).trim());
|
||||
return Game.listening(makeNonEmpty(game.substring(12).trim()));
|
||||
if(lower.startsWith("listening"))
|
||||
return Game.listening(game.substring(9).trim());
|
||||
return Game.listening(makeNonEmpty(game.substring(9).trim()));
|
||||
if(lower.startsWith("watching"))
|
||||
return Game.watching(game.substring(8).trim());
|
||||
return Game.watching(makeNonEmpty(game.substring(8).trim()));
|
||||
if(lower.startsWith("streaming"))
|
||||
{
|
||||
String[] parts = game.substring(9).trim().split("\\s+", 2);
|
||||
if(parts.length == 2)
|
||||
{
|
||||
return Game.streaming(parts[1], "https://twitch.tv/"+parts[0]);
|
||||
return Game.streaming(makeNonEmpty(parts[1]), "https://twitch.tv/"+parts[0]);
|
||||
}
|
||||
}
|
||||
return Game.playing(game);
|
||||
}
|
||||
|
||||
public static String makeNonEmpty(String str)
|
||||
{
|
||||
return str == null || str.isEmpty() ? "\u200B" : str;
|
||||
}
|
||||
|
||||
public static OnlineStatus parseStatus(String status)
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user