Merge branch 'master' into develop

This commit is contained in:
Matthew Cech
2020-03-26 17:47:28 -07:00
36 changed files with 1599 additions and 1025 deletions
+1
View File
@@ -27,5 +27,6 @@
<classpathentry kind="lib" path="lib/google-http-client-1.32.0.jar"/> <classpathentry kind="lib" path="lib/google-http-client-1.32.0.jar"/>
<classpathentry kind="lib" path="lib/google-api-services-youtube-v3-rev212-1.25.0.jar"/> <classpathentry kind="lib" path="lib/google-api-services-youtube-v3-rev212-1.25.0.jar"/>
<classpathentry kind="lib" path="lib/LavaPlayerJar-0.0.1-jar-with-dependencies.jar"/> <classpathentry kind="lib" path="lib/LavaPlayerJar-0.0.1-jar-with-dependencies.jar"/>
<classpathentry kind="lib" path="lib/nanohttpd-2.3.1.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

+12
View File
@@ -17,6 +17,8 @@
"Localized Commands","dbstats","" "Localized Commands","dbstats",""
"Localized Commands","defaultdance","" "Localized Commands","defaultdance",""
"Localized Commands","derp","" "Localized Commands","derp",""
"Localized Commands","derpi",""
"Localized Commands","e6",""
"Localized Commands","e621","" "Localized Commands","e621",""
"Localized Commands","eightball, 8ball","" "Localized Commands","eightball, 8ball",""
"Localized Commands","fetch","" "Localized Commands","fetch",""
@@ -48,6 +50,7 @@
"Localized Commands","stats","" "Localized Commands","stats",""
"Localized Commands","teey","" "Localized Commands","teey",""
"Localized Commands","tony, stark, dontfeelgood, dontfeelsogood","tony, stark, dontfeelgood, dontfeelsogood, snap" "Localized Commands","tony, stark, dontfeelgood, dontfeelsogood","tony, stark, dontfeelgood, dontfeelsogood, snap"
"Localized Commands","tradebeans, trade",""
"Localized Commands","tweet","" "Localized Commands","tweet",""
"Localized Commands","vote","" "Localized Commands","vote",""
"Localized Commands","wolfram","" "Localized Commands","wolfram",""
@@ -110,8 +113,10 @@
"Localized Strings","DBFlushInfo","Takes all objects queued for the database and writes them to the database, then says how many were written." "Localized Strings","DBFlushInfo","Takes all objects queued for the database and writes them to the database, then says how many were written."
"Localized Strings","DBStatsInfo","Shows current statistics for the database" "Localized Strings","DBStatsInfo","Shows current statistics for the database"
"Localized Strings","DefaultDanceInfo","y'all know forknife, get ready to dance, or make a friend dance with @!" "Localized Strings","DefaultDanceInfo","y'all know forknife, get ready to dance, or make a friend dance with @!"
"Localized Strings","DerpiError",""
"Localized Strings","DoWorkFinished","I finished with my work! :D" "Localized Strings","DoWorkFinished","I finished with my work! :D"
"Localized Strings","DoWorkInfo","Occupies a core for a few seconds" "Localized Strings","DoWorkInfo","Occupies a core for a few seconds"
"Localized Strings","E6Blacklisted","I can't show that image ;3; (it may be blacklisted)"
"Localized Strings","EightBallError","Hmm? You'll need to ask a question!" "Localized Strings","EightBallError","Hmm? You'll need to ask a question!"
"Localized Strings","EightBallInfo","Answers a yes or no question! Warning: Kitty can not actually tell the future, she claims no responsibility for any lion mauling, lack of lottery wins, or felony charges." "Localized Strings","EightBallInfo","Answers a yes or no question! Warning: Kitty can not actually tell the future, she claims no responsibility for any lion mauling, lack of lottery wins, or felony charges."
"Localized Strings","EightBallMaybe1","Reply hazy, try again." "Localized Strings","EightBallMaybe1","Reply hazy, try again."
@@ -182,7 +187,11 @@
"Localized Strings","MapVersion","Using mapgen v0.1" "Localized Strings","MapVersion","Using mapgen v0.1"
"Localized Strings","MapWidth","" "Localized Strings","MapWidth",""
"Localized Strings","ModInfo","Mod is a super command for admin or mod use only!\n\t`mod ban @user` will ban a user from the server\n\t`mod kick @user` will kick the user from the server" "Localized Strings","ModInfo","Mod is a super command for admin or mod use only!\n\t`mod ban @user` will ban a user from the server\n\t`mod kick @user` will kick the user from the server"
"Localized Strings","MusicAddTrack",""
"Localized Strings","MusicInfo","" "Localized Strings","MusicInfo",""
"Localized Strings","MusicVolChanged","Volume set to %s!"
"Localized Strings","MusicVolCurrent","Volume is at %s!"
"Localized Strings","MusicVolOOB",""
"Localized Strings","PerishInfo","Adds a red, 'a n g e r y' overlay to your icon or the icon of a friend you mentioned" "Localized Strings","PerishInfo","Adds a red, 'a n g e r y' overlay to your icon or the icon of a friend you mentioned"
"Localized Strings","PingInfo","Will respond with Pong!" "Localized Strings","PingInfo","Will respond with Pong!"
"Localized Strings","PingResponse","Pong!" "Localized Strings","PingResponse","Pong!"
@@ -271,6 +280,8 @@
"Command Enabler","dbstats","1" "Command Enabler","dbstats","1"
"Command Enabler","defaultdance","1" "Command Enabler","defaultdance","1"
"Command Enabler","derp","1" "Command Enabler","derp","1"
"Command Enabler","derpi","1"
"Command Enabler","e6","1"
"Command Enabler","e621","1" "Command Enabler","e621","1"
"Command Enabler","eightball, 8ball","1" "Command Enabler","eightball, 8ball","1"
"Command Enabler","fetch","1" "Command Enabler","fetch","1"
@@ -313,6 +324,7 @@
"Command Enabler","stats","1" "Command Enabler","stats","1"
"Command Enabler","teey","1" "Command Enabler","teey","1"
"Command Enabler","tony, stark, dontfeelgood, dontfeelsogood","1" "Command Enabler","tony, stark, dontfeelgood, dontfeelsogood","1"
"Command Enabler","tradebeans, trade","1"
"Command Enabler","tweet","1" "Command Enabler","tweet","1"
"Command Enabler","vote","1" "Command Enabler","vote","1"
"Command Enabler","wolfram","1" "Command Enabler","wolfram","1"
1 Type Key Value
17 Localized Commands dbstats
18 Localized Commands defaultdance
19 Localized Commands derp
20 Localized Commands derpi
21 Localized Commands e6
22 Localized Commands e621
23 Localized Commands eightball, 8ball
24 Localized Commands fetch
50 Localized Commands stats
51 Localized Commands teey
52 Localized Commands tony, stark, dontfeelgood, dontfeelsogood tony, stark, dontfeelgood, dontfeelsogood, snap
53 Localized Commands tradebeans, trade
54 Localized Commands tweet
55 Localized Commands vote
56 Localized Commands wolfram
113 Localized Strings DBFlushInfo Takes all objects queued for the database and writes them to the database, then says how many were written.
114 Localized Strings DBStatsInfo Shows current statistics for the database
115 Localized Strings DefaultDanceInfo y'all know forknife, get ready to dance, or make a friend dance with @!
116 Localized Strings DerpiError
117 Localized Strings DoWorkFinished I finished with my work! :D
118 Localized Strings DoWorkInfo Occupies a core for a few seconds
119 Localized Strings E6Blacklisted I can't show that image ;3; (it may be blacklisted)
120 Localized Strings EightBallError Hmm? You'll need to ask a question!
121 Localized Strings EightBallInfo Answers a yes or no question! Warning: Kitty can not actually tell the future, she claims no responsibility for any lion mauling, lack of lottery wins, or felony charges.
122 Localized Strings EightBallMaybe1 Reply hazy, try again.
187 Localized Strings MapVersion Using mapgen v0.1
188 Localized Strings MapWidth
189 Localized Strings ModInfo Mod is a super command for admin or mod use only!\n\t`mod ban @user` will ban a user from the server\n\t`mod kick @user` will kick the user from the server
190 Localized Strings MusicAddTrack
191 Localized Strings MusicInfo
192 Localized Strings MusicVolChanged Volume set to %s!
193 Localized Strings MusicVolCurrent Volume is at %s!
194 Localized Strings MusicVolOOB
195 Localized Strings PerishInfo Adds a red, 'a n g e r y' overlay to your icon or the icon of a friend you mentioned
196 Localized Strings PingInfo Will respond with Pong!
197 Localized Strings PingResponse Pong!
280 Command Enabler dbstats 1
281 Command Enabler defaultdance 1
282 Command Enabler derp 1
283 Command Enabler derpi 1
284 Command Enabler e6 1
285 Command Enabler e621 1
286 Command Enabler eightball, 8ball 1
287 Command Enabler fetch 1
324 Command Enabler stats 1
325 Command Enabler teey 1
326 Command Enabler tony, stark, dontfeelgood, dontfeelsogood 1
327 Command Enabler tradebeans, trade 1
328 Command Enabler tweet 1
329 Command Enabler vote 1
330 Command Enabler wolfram 1
Binary file not shown.
+22
View File
@@ -0,0 +1,22 @@
function plugin(message, user)
local index;
local concat;
if(string.find(message, "https://derpicdn.net/img"))then
if(string.find(message, "view/"))then
index = string.find(message, "/[^/]*$");
return "!derpi ID:" .. string.sub(message, index + 1, string.find(message, ".[^.]*$")-1);
else
if(string.find(message, "download/"))then
index = string.find(message, "_");
concat = string.sub(message, 0, index-1);
return "!derpi ID:" .. string.sub(concat, string.find(message, "/[^/]*$") + 1);
else
index = string.find(message, "/[^/]*$");
concat = string.sub(message, 0, index - 1);
index = string.find(concat, "/[^/]*$");
return "!derpi ID:" .. string.sub(concat, index + 1);
end
end
end
end
+8
View File
@@ -0,0 +1,8 @@
function plugin(message, user)
if(string.find(message, "https://static1.e621.net/data") or string.find(message, "https://static1.e926.net/data"))then
if(string.find(message, " "))then
message = string.sub(message, 0, string.find(message, " "));
end
return "!e6 md5:" .. string.sub(message, string.find(message, "/[^/]*$") + 1 ,string.find(message, ".[^.]*$") - 1);
end
end
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.
+96 -2
View File
@@ -1,8 +1,23 @@
package commands.general; package commands.general;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import core.Command; import core.Command;
import core.Constants;
import core.LocStrings; import core.LocStrings;
import dataStructures.*; import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.Response;
import dataStructures.UserInput;
public class CommandBeansShow extends Command public class CommandBeansShow extends Command
{ {
@@ -15,7 +30,15 @@ public class CommandBeansShow extends Command
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{ {
if(input.mentions == null) if(input.mentions == null)
res.send(String.format(LocStrings.stub("BeansShowDisplay"), user.getBeans())); {
res.send("" + user.getBeans());
try {
res.sendFile(combineImages(user.getBeans()), "png");
} catch (IOException e) {
e.printStackTrace();
}
// res.send(String.format(LocStrings.stub("BeansShowDisplay"), user.getBeans()));
}
else else
{ {
String mentionedBeans = ""; String mentionedBeans = "";
@@ -26,4 +49,75 @@ public class CommandBeansShow extends Command
res.send(String.format(LocStrings.stub("BeansShowMentioned"), mentionedBeans)); res.send(String.format(LocStrings.stub("BeansShowMentioned"), mentionedBeans));
} }
} }
private File combineImages(long beans) throws IOException
{
// Acquire images
BufferedImage imageBase = ImageIO.read(new File(Constants.AssetDirectory + "beans/BeansBG.png"));
BufferedImage thouBean = ImageIO.read(new File(Constants.AssetDirectory + "beans/thouBean.png"));
BufferedImage hunBean = ImageIO.read(new File(Constants.AssetDirectory + "beans/hunBean.png"));
BufferedImage tenBean = ImageIO.read(new File(Constants.AssetDirectory + "beans/tenBean.png"));
BufferedImage oneBean = ImageIO.read(new File(Constants.AssetDirectory + "beans/oneBean.png"));
final int baseWidth = imageBase.getWidth();
final int baseHeight = imageBase.getHeight();
long calcBean = beans;
System.out.println("BEANS: " + beans);
long thousands = beans / 1000;
calcBean = beans % 1000;
long hundreds = (calcBean / 100);
calcBean = calcBean % 100;
long tens = (calcBean / 10);
calcBean = calcBean % 10;
long ones = calcBean;
BufferedImage beanImage = new BufferedImage(baseWidth, baseHeight, BufferedImage.TYPE_INT_ARGB);
Graphics beanGraphics = beanImage.getGraphics();
for(int i = 0; i < ones; i++)
{
int x = (int)(Math.random() * (baseWidth - oneBean.getWidth())) + 1;
int y = (int)(Math.random() * (baseHeight - oneBean.getHeight())) + 1;
beanGraphics.drawImage(oneBean, x, y, null);
}
for(int i = 0; i < tens; i++)
{
int x = (int)(Math.random() * (baseWidth - tenBean.getWidth())) + 1;
int y = (int)(Math.random() * (baseHeight - tenBean.getHeight())) + 1;
beanGraphics.drawImage(tenBean, x, y, null);
}
for(int i = 0; i < hundreds; i++)
{
int x = (int)(Math.random() * (baseWidth - hunBean.getWidth())) + 1;
int y = (int)(Math.random() * (baseHeight - hunBean.getHeight())) + 1;
beanGraphics.drawImage(hunBean, x, y, null);
}
for(int i = 0; i < thousands; i++)
{
int x = (int)(Math.random() * (baseWidth - thouBean.getWidth())) + 1;
int y = (int)(Math.random() * (baseHeight - thouBean.getHeight())) + 1;
beanGraphics.drawImage(thouBean, x, y, null);
}
try {
@SuppressWarnings("unused")
Font font = null;
font = Font.createFont(Font.TRUETYPE_FONT, new File(Constants.AssetDirectory +"fonts/B612Mono-Regular.ttf"));
} catch (Exception e)
{
}
Font beanFont = new Font("font", Font.BOLD, 45);
beanGraphics.setFont(beanFont);
beanGraphics.drawString("YOU GOT " + beans + " BEANS", 0, baseHeight / 2);
ImageIO.write(beanImage, "PNG", new File("beanImage.png"));
return new File("beanImage.png");
}
} }
+1 -1
View File
@@ -20,7 +20,7 @@ public class CommandBetBeans extends Command
{ {
String call = ""; String call = "";
int min = 50; int min = 20;
int bet = 0; int bet = 0;
int win = 0; int win = 0;
+3 -2
View File
@@ -68,22 +68,23 @@ public class CommandBoop extends Command
{ {
if(input.mentions == null) if(input.mentions == null)
{ {
// No one is booped, just the bot!
boopTracker.applyBoop(); boopTracker.applyBoop();
res.send(String.format(LocStrings.stub("BoopStandard"), user.name, boopTracker.howMany())); res.send(String.format(LocStrings.stub("BoopStandard"), user.name, boopTracker.howMany()));
} }
else else
{ {
// When someone boops one other person
if(input.mentions.length == 1) if(input.mentions.length == 1)
{ {
boopTracker.applyBoop();
res.send(String.format(LocStrings.stub("BoopPerson"), user.name, input.mentions[0].name)); res.send(String.format(LocStrings.stub("BoopPerson"), user.name, input.mentions[0].name));
return; return;
} }
// A number of people have been booped
String booped = ""; String booped = "";
for(int i = 0; i < input.mentions.length; i++) for(int i = 0; i < input.mentions.length; i++)
{ {
boopTracker.applyBoop();
if(i < input.mentions.length-1) if(i < input.mentions.length-1)
booped += input.mentions[i].name + ", "; booped += input.mentions[i].name + ", ";
else else
+1 -1
View File
@@ -32,7 +32,7 @@ public class CommandColor extends Command
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{ {
// First, try and parse out the color to make sure we can even get it. // First, try and parse out the color to make sure we can even get it.
ColorData colorData = theColorAPI.lookupHex(input.args.trim()); ColorData colorData = theColorAPI.lookupHex(input.args);
// Verify the color was even found // Verify the color was even found
if(colorData == null) if(colorData == null)
+72
View File
@@ -0,0 +1,72 @@
package commands.general;
import core.Command;
import core.LocStrings;
import dataStructures.KittyChannel;
import dataStructures.KittyEmbed;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.Response;
import dataStructures.UserInput;
import network.NetworkDerpi;
public class CommandDerpi extends Command
{
NetworkDerpi searcher = new NetworkDerpi();
KittyEmbed response;
// Required constructor
public CommandDerpi(KittyRole level, KittyRating rating) { super(level, rating); }
@Override
public String getHelpText() { return "Will search derpibooru for the tags entered, if KittyBot's content filter allows it"; }
@Override
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{
if(guild.contentRating == KittyRating.Filtered)
{
try
{
response = searcher.getDerpi(input.args.replace(',', ' ') + " safe").output();
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("DerpiError"));
}
}
else
{
if(input.args == null || input.args.length() == 0)
res.send("DerpiNoSearchError");
else
{
response = searcher.getDerpi(input.args).output();
try
{
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("DerpiError"));
}
}
}
if(input.args.startsWith("ID:"))
{
response = searcher.getDerpiByID(input.args.substring(input.args.indexOf(':'))).output();
try
{
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("DerpiError"));
}
}
}
}
+71
View File
@@ -0,0 +1,71 @@
package commands.general;
import core.Command;
import core.LocStrings;
import dataStructures.*;
import network.NetworkE6;
public class CommandE6 extends Command
{
NetworkE6 searcher = new NetworkE6();
KittyEmbed response;
GenericImage image;
public CommandE6(KittyRole level, KittyRating rating) { super(level, rating); }
@Override
public String getHelpText()
{
String toRet = "Will search e6";
toRet += "21 for the tags entered, if KittyBot's content filter allows it";
return toRet;
}
@Override
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{
if(guild.contentRating == KittyRating.Filtered)
{
image = searcher.getE6(input.args + " rating:safe");
try
{
response = image.output();
}
catch(Exception e)
{
res.send(LocStrings.stub("E6Blacklisted"));
return;
}
try
{
if(response.bodyImageURL == null)
{
Exception e = new Exception();
throw e;
}
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("E6Blacklisted"));
}
}
else
{
if(input.args == null || input.args.length() == 0)
res.send("E6NoSearchError");
else
{
try
{
response = searcher.getE6(input.args).output();
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("E6Blacklisted"));
}
}
}
}
}
+10 -1
View File
@@ -27,14 +27,23 @@ public class CommandTradeBeans extends Command
} }
int beans = 0; int beans = 0;
try {
try
{
beans = Integer.parseInt(input.args.split(" ")[0]); beans = Integer.parseInt(input.args.split(" ")[0]);
} }
catch (NumberFormatException e) catch (NumberFormatException e)
{
try
{
beans = Integer.parseInt(input.args.split(" ")[1]);
}
catch(Exception eInner)
{ {
res.send(LocStrings.stub("TradeBeansIntParseError")); res.send(LocStrings.stub("TradeBeansIntParseError"));
return; return;
} }
}
if(user.getBeans() < beans) if(user.getBeans() < beans)
{ {
+1
View File
@@ -18,6 +18,7 @@ public class CommandMusicMain extends Command
framework.addCommand("skip", new SubCommandSkip(KittyRole.General, KittyRating.Safe)); framework.addCommand("skip", new SubCommandSkip(KittyRole.General, KittyRating.Safe));
framework.addCommand("stop", new SubCommandStop(KittyRole.General, KittyRating.Safe)); framework.addCommand("stop", new SubCommandStop(KittyRole.General, KittyRating.Safe));
framework.addCommand("playlist", new SubCommandPlaylist(KittyRole.General, KittyRating.Safe)); framework.addCommand("playlist", new SubCommandPlaylist(KittyRole.General, KittyRating.Safe));
framework.addCommand("volume", new SubCommandVolume(KittyRole.General, KittyRating.Safe));
} }
@Override @Override
+2 -1
View File
@@ -1,5 +1,6 @@
package commands.music; package commands.music;
import core.LocStrings;
import core.SubCommand; import core.SubCommand;
import core.SubCommandFormattable; import core.SubCommandFormattable;
import dataStructures.KittyChannel; import dataStructures.KittyChannel;
@@ -27,6 +28,6 @@ public class SubCommandAddTrack extends SubCommand
video = YT.getYT(video); video = YT.getYT(video);
} }
guild.audio.playVideo(video); guild.audio.playVideo(video);
return new SubCommandFormattable(video); return new SubCommandFormattable(String.format(LocStrings.stub("MusicAddTrack"), video));
} }
} }
+42
View File
@@ -0,0 +1,42 @@
package commands.music;
import core.LocStrings;
import core.SubCommand;
import core.SubCommandFormattable;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.UserInput;
public class SubCommandVolume extends SubCommand
{
public SubCommandVolume(KittyRole level, KittyRating rating) { super(level, rating); }
{
}
@Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{
int newVol = guild.audio.getVolume(guild.audio.player);
if(input.args != null)
{
try
{
newVol = Integer.parseInt(input.args);
if(newVol > 100 || newVol <1)
{
return new SubCommandFormattable(String.format(LocStrings.stub("MusicVolOOB")));
}
guild.audio.changeVolume(guild.audio.player, newVol);
}
catch(Exception e)
{
return new SubCommandFormattable(String.format(LocStrings.stub("MusicVolCurrent"), newVol));
}
}
return new SubCommandFormattable(String.format(LocStrings.stub("MusicVolChanged"), newVol));
}
}
+4
View File
@@ -108,6 +108,10 @@ public class CommandManager
this.register(LocCommands.stub("music"), new CommandMusicMain(KittyRole.General, KittyRating.Safe)); this.register(LocCommands.stub("music"), new CommandMusicMain(KittyRole.General, KittyRating.Safe));
this.register(LocCommands.stub("defaultdance"), new CommandDefaultDance(KittyRole.General, KittyRating.Safe)); this.register(LocCommands.stub("defaultdance"), new CommandDefaultDance(KittyRole.General, KittyRating.Safe));
this.register(LocCommands.stub("getsauce"), new CommandGetSauce(KittyRole.General, KittyRating.Safe)); this.register(LocCommands.stub("getsauce"), new CommandGetSauce(KittyRole.General, KittyRating.Safe));
this.register(LocCommands.stub("tradebeans, trade"), new CommandTradeBeans(KittyRole.General, KittyRating.Safe));
this.register(LocCommands.stub("e6"), new CommandE6(KittyRole.General, KittyRating.Filtered));
this.register(LocCommands.stub("derpi"), new CommandDerpi(KittyRole.General, KittyRating.Filtered));
} }
// Allows the command manager to keep track of a command. Takes a pair (the un-localized and localzied commands) // Allows the command manager to keep track of a command. Takes a pair (the un-localized and localzied commands)
+7 -6
View File
@@ -142,8 +142,10 @@ public class ObjectBuilderFactory
List<Emote> emotes = event.getGuild().getEmotes(); List<Emote> emotes = event.getGuild().getEmotes();
ArrayList<String> emotesString = new ArrayList<String>(); ArrayList<String> emotesString = new ArrayList<String>();
HashMap<Long, KittyChannel> channels = new HashMap<Long, KittyChannel>();
String emote; String emote;
String emoteFix; String emoteFix;
channels.put(Long.getLong(uid), extractChannel(event));
for(int i = 0; i < emotes.size(); i++) for(int i = 0; i < emotes.size(); i++)
{ {
emote = emotes.get(i).toString(); emote = emotes.get(i).toString();
@@ -165,7 +167,7 @@ public class ObjectBuilderFactory
else else
{ {
// Construct a new guild with defaults // Construct a new guild with defaults
guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString, new AudioUtils(event.getGuild(), playerManager)); guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString, new AudioUtils(event.getGuild(), playerManager), channels);
DatabaseManager.instance.globalRegister(guild); DatabaseManager.instance.globalRegister(guild);
guildCache.put(uid, guild); guildCache.put(uid, guild);
} }
@@ -223,14 +225,13 @@ public class ObjectBuilderFactory
public static KittyChannel extractChannel(GuildMessageReceivedEvent event) public static KittyChannel extractChannel(GuildMessageReceivedEvent event)
{ {
lazyInit(); lazyInit();
String channelID = event.getChannel().getId(); String channelID = event.getChannel().getId();
String guildID = event.getGuild().getId();
KittyChannel channel = null; KittyChannel channel = null;
synchronized(channelCache) synchronized(channelCache)
{ {
KittyChannel cachedChannel = channelCache.get(channelID); KittyChannel cachedChannel = channelCache.get(channelID);
boolean mature;
if(cachedChannel != null) if(cachedChannel != null)
{ {
@@ -238,8 +239,8 @@ public class ObjectBuilderFactory
} }
else else
{ {
KittyGuild cachedGuild = guildCache.get(guildID); mature = event.getChannel().isNSFW();
channel = new KittyChannel(channelID, cachedGuild); channel = new KittyChannel(channelID, mature);
channelCache.put(channelID, channel); channelCache.put(channelID, channel);
} }
} }
@@ -386,7 +387,7 @@ public class ObjectBuilderFactory
// Determine token based on config. Default to test token. // Determine token based on config. Default to test token.
String tokenToUse = Ref.TestToken; String tokenToUse = Ref.TestToken;
if(ConfigGlobals.getStartupMode() == KittyStartupMode.Release) if(ConfigGlobals.getStartupMode() == KittyStartupMode.Release)
tokenToUse = Ref.Token; tokenToUse = Ref.PoguToken;
// Construct bot based on token // Construct bot based on token
kitty = new JDABuilder(AccountType.BOT) kitty = new JDABuilder(AccountType.BOT)
+31 -14
View File
@@ -1,40 +1,57 @@
package dataStructures; package dataStructures;
// This is a structure representing an image reponse for handing around. import java.awt.Color;
// This is a structure representing an image response for handing around.
public class GenericImage public class GenericImage
{ {
private String artist; private KittyEmbed response= new KittyEmbed();
private String postURL;
private String imageURL;
public GenericImage(String artist, String postURL, String imageURL) public GenericImage(String artist, String postURL, String imageURL)
{ {
this.artist = artist; response.authorText = null;
this.postURL = postURL; response.color = new Color(0,0,0);
this.imageURL = imageURL;
} }
public void editArtist(String artist) public void editArtist(String artist)
{ {
this.artist = artist; response.authorText = artist;
}
public void editAuthorImage(String URL)
{
response.authorImage = URL;
} }
public void editPostURL(String postURL) public void editPostURL(String postURL)
{ {
this.postURL = postURL; response.authorLink = postURL;
} }
public void editImageURL(String imageURL) public void editImageURL(String imageURL)
{ {
this.imageURL = imageURL; response.imageURL = imageURL;
} }
public String toString() public void editDescriptionText(String score)
{ {
if(imageURL.isEmpty()) response.descriptionText = score;
}
public void editFooterText(String tags)
{ {
return "I couldn't find anything! Please try again!"; response.footerText = tags;
} }
return "Artist: " + artist + "\n<" + postURL.trim() + ">\n" + imageURL;
public KittyEmbed output()
{
return response;
}
public boolean isValid()
{
if(response.title != null)
return true;
return false;
} }
} }
+4 -20
View File
@@ -1,31 +1,15 @@
package dataStructures; package dataStructures;
//import core.DatabaseTrackedObject;
public class KittyChannel //extends DatabaseTrackedObject public class KittyChannel
{ {
public String uniqueID; public String uniqueID;
public KittyGuild guild; public boolean mature;
//public KittyRating rating; public KittyChannel(String uniqueID, boolean mature)
//public bool isVoice;
public KittyChannel(String uniqueID, KittyGuild guild)
{ {
//super(uniqueID); //super(uniqueID);
this.uniqueID = uniqueID; this.uniqueID = uniqueID;
this.guild = guild; this.mature = false;
} }
// @Override
// public String serialize()
// {
// return "";
// }
//
// @Override
// public void deSerialzie(String string)
// {
//
// }
} }
+7 -3
View File
@@ -1,6 +1,7 @@
package dataStructures; package dataStructures;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import core.DatabaseManager; import core.DatabaseManager;
import core.DatabaseTrackedObject; import core.DatabaseTrackedObject;
@@ -21,6 +22,7 @@ public class KittyGuild extends DatabaseTrackedObject
public ArrayList<String> hasVoted = new ArrayList<String>(); public ArrayList<String> hasVoted = new ArrayList<String>();
public ArrayList<String> emoji = new ArrayList<String>(); public ArrayList<String> emoji = new ArrayList<String>();
public ArrayList <KittyPoll> choices = new ArrayList<KittyPoll>(); public ArrayList <KittyPoll> choices = new ArrayList<KittyPoll>();
public HashMap <Long, KittyChannel> channels;
public AdminControl control; public AdminControl control;
public AudioUtils audio; public AudioUtils audio;
public ArrayList <KittyUser> raffleUsersUnchosen = new ArrayList<KittyUser>(); public ArrayList <KittyUser> raffleUsersUnchosen = new ArrayList<KittyUser>();
@@ -42,7 +44,7 @@ public class KittyGuild extends DatabaseTrackedObject
} }
// Default content for a guild // Default content for a guild
public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList <String> emoji, AudioUtils audio) public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList <String> emoji, AudioUtils audio, HashMap<Long, KittyChannel> channels)
{ {
super(uniqueID); super(uniqueID);
@@ -56,11 +58,12 @@ public class KittyGuild extends DatabaseTrackedObject
this.polling = false; this.polling = false;
this.emoji = emoji; this.emoji = emoji;
this.audio = audio; this.audio = audio;
this.channels = channels;
setCommandIndicator("!"); setCommandIndicator("!");
} }
// Explicit constructor // Explicit constructor
public KittyGuild(String commandIndicator, KittyRating contentRating, KittyUser guildOwner, String uniqueID, AudioUtils audio) public KittyGuild(String commandIndicator, KittyRating contentRating, KittyUser guildOwner, String uniqueID, AudioUtils audio, HashMap<Long, KittyChannel> channels)
{ {
super(uniqueID); super(uniqueID);
this.uniqueID = uniqueID; this.uniqueID = uniqueID;
@@ -73,6 +76,7 @@ public class KittyGuild extends DatabaseTrackedObject
this.polling = false; this.polling = false;
this.guildOwner = guildOwner; this.guildOwner = guildOwner;
this.audio = audio; this.audio = audio;
this.channels = channels;
} }
public String startPoll(String poll) public String startPoll(String poll)
@@ -126,7 +130,7 @@ public class KittyGuild extends DatabaseTrackedObject
{ {
if(!raffleUsersChosen.contains(user) && !raffleUsersUnchosen.contains(user) && user.getBeans() > raffleCost && raffling) if(!raffleUsersChosen.contains(user) && !raffleUsersUnchosen.contains(user) && user.getBeans() > raffleCost && raffling)
{ {
user.changeBeans(raffleCost); user.changeBeans(-raffleCost);
raffleUsersUnchosen.add(user); raffleUsersUnchosen.add(user);
return true; return true;
} }
+29 -2
View File
@@ -6,13 +6,40 @@ public class NetworkColiru
{ {
public String compileCPlusPlus(String query) public String compileCPlusPlus(String query)
{ {
// Escape characters that need escaping. // Escape characters that need escaping - mostly whitespace.
// Primarily types of whitespace.
query = query.replace("\\n", "\\\\n"); query = query.replace("\\n", "\\\\n");
query = query.replace("\\t", "\\\\t"); query = query.replace("\\t", "\\\\t");
query = query.replace("\n", "\\n"); query = query.replace("\n", "\\n");
query = query.replace("\"", "\\\""); query = query.replace("\"", "\\\"");
query = query.replace("\t", "\\t"); query = query.replace("\t", "\\t");
query = query.replace("`", "");
// // replace backticks on only the edges of the string.
// StringBuilder s = new StringBuilder(query);
//
// for(int i = 0; i < s.length(); ++i)
// {
// if(s.charAt(i) != '`')
// break;
//
// s.setCharAt(i, ' ');
// }
//
// for(int i = s.length() - 1; i >= 0; --i)
// {
// if(s.charAt(i) != '`')
// break;
//
// s.setCharAt(i, ' ');
// }
//
// query = s.toString().trim();
// Determine if the query is effectively empty or not. If it is, don't attempt to compile it.
if(query.trim().length() == 0)
{
return "I can't compile nothing!";
}
// Send the compilation request! // Send the compilation request!
String result = HTTPUtils.sendPOSTRequest("http://coliru.stacked-crooked.com/compile" String result = HTTPUtils.sendPOSTRequest("http://coliru.stacked-crooked.com/compile"
+68 -3
View File
@@ -14,6 +14,7 @@ public class NetworkDerpi
{ {
public String image; public String image;
public String tags; public String tags;
public String score;
} }
private class InitialRequest private class InitialRequest
@@ -29,16 +30,26 @@ public class NetworkDerpi
String res = HTTPUtils.sendGETRequest(mainURL + query + "&random_image=1&key=" + Ref.derpiKey); String res = HTTPUtils.sendGETRequest(mainURL + query + "&random_image=1&key=" + Ref.derpiKey);
if(res != null) if(res != null)
{ {
InitialRequest obj;
// Use class evaluation on an array of the response object to be able to hold multiple. // Use class evaluation on an array of the response object to be able to hold multiple.
InitialRequest obj = jsonParser_.fromJson(res, InitialRequest.class); try
{
obj = jsonParser_.fromJson(res, InitialRequest.class);
}
catch(Exception e)
{
return null;
}
if(res != null) if(res != null)
{ {
String res2 = HTTPUtils.sendGETRequest("https://derpibooru.org/" + obj.id + ".json"); String res2 = HTTPUtils.sendGETRequest("https://derpibooru.org/" + obj.id + ".json");
image.editPostURL("<https://derpibooru.org/" + obj.id +">"); image.editPostURL("https://derpibooru.org/" + obj.id);
DerpiResponseObject imageObj = jsonParser_.fromJson(res2, DerpiResponseObject.class); DerpiResponseObject imageObj = jsonParser_.fromJson(res2, DerpiResponseObject.class);
image.editImageURL("https:" + imageObj.image.substring(0, imageObj.image.indexOf('_')) + imageObj.image.substring(imageObj.image.lastIndexOf('.'))); image.editImageURL("https:" + imageObj.image.substring(0, imageObj.image.indexOf('_')) +
imageObj.image.substring(imageObj.image.lastIndexOf('.')));
if(imageObj.tags.contains("artist:")) if(imageObj.tags.contains("artist:"))
{ {
String [] sepTags = imageObj.tags.split(","); String [] sepTags = imageObj.tags.split(",");
@@ -54,8 +65,20 @@ public class NetworkDerpi
artists += sepTags[i].substring(sepTags[i].indexOf(":")+1); artists += sepTags[i].substring(sepTags[i].indexOf(":")+1);
} }
} }
image.editAuthorImage("https://derpicdn.net/favicon.ico");
image.editArtist(artists); image.editArtist(artists);
String tags = "";
for(int i = 0; i < sepTags.length && i < 15; i++)
{
if(!sepTags[i].contains("artist:"))
{
tags += sepTags[i];
}
}
image.editFooterText("[Tags]" + tags);
image.editDescriptionText("Score: " + imageObj.score);
} }
else else
{ {
@@ -66,4 +89,46 @@ public class NetworkDerpi
return image; return image;
} }
public GenericImage getDerpiByID(String id)
{
GenericImage image = new GenericImage(" ", " ", " ");
String artists = "";
image.editAuthorImage("https://derpicdn.net/favicon.ico");
String res;
try
{
res = HTTPUtils.sendGETRequest("https://derpibooru.org/" + id + ".json");
}
catch(Exception e)
{
return null;
}
DerpiResponseObject imageObj = jsonParser_.fromJson(res, DerpiResponseObject.class);
if(imageObj.tags.contains("artist:"))
{
String [] sepTags = imageObj.tags.split(",");
for(int i = 0; i < sepTags.length; i++)
{
if(sepTags[i].contains("artist:"))
{
if(!artists.equals(""))
{
artists += " and ";
}
artists += sepTags[i].substring(sepTags[i].indexOf(":")+1);
}
}
}
if(artists != "")
image.editArtist(artists);
else
image.editArtist("Artist Unknown!");
image.editFooterText("[Tags]" + imageObj.tags);
image.editDescriptionText("Score: " + imageObj.score);
image.editImageURL("https:" + imageObj.image.substring(0, imageObj.image.indexOf('_')) +
imageObj.image.substring(imageObj.image.lastIndexOf('.')));
return image;
}
} }
+201
View File
@@ -0,0 +1,201 @@
package network;
import com.google.gson.Gson;
import dataStructures.GenericImage;
import offline.Ref;
import utils.HTTPUtils;
/**
* This is the e621 request class, designed for form and parse requests that
* use the e621 API, and is entirely static.
*
* If you ever find this class randomly not working,
* it may be a good idea to make sure the user agent string is set in
* HTTPUtils to something other than a browser emulating string, or the default
* java one.
*
* @author Wisp
* Edited by Rin
*/
public class NetworkE6
{
///////////////////////////////////////
// Internal JSON class and variables //
//////////////////////////////////.////
private static final Gson jsonParser_ = new Gson();
private static final String API_ROOT = "https://e621.net/posts.json?";
private static int maxSearchResults_ = 10;
private static String[] blacklist = Ref.e621Blacklist;
private class E6ResponseObject
{
// public variables matching the case and the type we want for JSON.
// There are many more fields, but if we don't provide some it just
// doesn't bother parsing them.
public E6ResponseObjectPost [] posts;
}
private class E6ResponseObjectPost
{
public String id;
public String [] sources;
public String[] pools;
public String rating;
public E6ResponseObjectFile file;
public E6ResponseObjectScore score;
public E6ResponseObjectTags tags;
public E6ResponseObjectRelationships relationships;
}
private class E6ResponseObjectFile
{
public String url;
}
private class E6ResponseObjectScore
{
public String total;
}
private class E6ResponseObjectTags
{
public String[] general;
public String[] artist;
}
private class E6ResponseObjectRelationships
{
public String has_children;
public String[] children;
}
////////////////////
// Static methods //
////////////////////
// Requests a specific image, then returns a few.
public GenericImage getE6(String input)
{
GenericImage image = new GenericImage("","","");
boolean blacklisted;
// Clean up request and replace problematic characters for the query string.
input = input.trim();
input = input.replace("+", "%2B");
input = input.replace(" ", "%20");
// Configure and send request. Note: Random ordering added as first
// tag by default. User-provided tags, therefore, will override it.
// If order:score is provided, that will be honored over order:random.
String res = HTTPUtils.sendGETRequest(API_ROOT + "tags=order:random%20" + input + "&limit=" + maxSearchResults_);
if(res != null)
{
// Use class evaluation on an array of the response imageObject to be able to hold multiple.
System.out.println("Still");
E6ResponseObject imageObj = jsonParser_.fromJson(res, E6ResponseObject.class);
System.out.println("Broken");
// For now, we really just wanna display images and their source.
// Append them all separately to a response string w/ some flavor text.
if(imageObj.posts.length < 1)
{
}
else
{
for(int i = 0; i < imageObj.posts.length; ++i)
{
String [] TagsList = imageObj.posts[i].tags.general;
blacklisted = false;
for(int j = 0; j < blacklist.length; j++)
{
for(int k = 0; k < TagsList.length; k ++)
{
if(TagsList[k].equals(blacklist[j]))
{
System.out.println("BLACKLISTED " + blacklist[j]);
blacklisted = true;
}
}
}
if(blacklisted)
{
return null;
}
// We will always have a file URL. That's a given.
image.editImageURL(imageObj.posts[i].file.url);
image.editPostURL("https://e621.net/posts/" + imageObj.posts[i].id);
if(imageObj.posts[i].tags.artist.length > 0)
{
String artists = "";
for(int j = 0; j < imageObj.posts[i].tags.artist.length; j++)
artists += imageObj.posts[i].tags.artist[j];
image.editArtist(artists);
}
else
image.editArtist("Artist Not Found!");
image.editAuthorImage("https://e621.net/favicon.ico");
String sources = "";
if(imageObj.posts[i].sources != null)
{
for(int k = 0; k < imageObj.posts[i].sources.length; k ++)
{
if(!imageObj.posts[i].sources[k].endsWith(imageObj.posts[i].file.url.substring(imageObj.posts[i].file.url.lastIndexOf('.'))))
{
String source = imageObj.posts[i].sources[k];
if(source.contains("//www."))
{
source = source.substring(source.indexOf(".") + 1);
source = source.substring(0, source.indexOf('.'));
}
else
{
source = source.substring(source.indexOf("/") + 2);
source = source.substring(0, source.indexOf('.'));
}
sources += " [" + source + "](" + imageObj.posts[i].sources[k] + ") ";
}
}
image.editDescriptionText("Score: " + imageObj.posts[i].score.total + "\n**Source:**" + sources);
}
else
{
image.editDescriptionText("Score: " + imageObj.posts[i].score.total);
}
String descTags = "";
if(imageObj.posts[i].tags.general.length > 15)
{
for(int o = 0; o < 15; o++)
{
descTags += imageObj.posts[i].tags.general[o] + ", ";
}
image.editFooterText("[Tags] " + descTags + " etc.");
}
else
{
descTags = imageObj.posts[i].tags.general.toString();
image.editFooterText("[Tags] " + descTags);
}
if(image.output().authorText != null)
{
return image;
}
}
}
}
return image;
}
}
-104
View File
@@ -1,104 +0,0 @@
package network;
import com.google.gson.Gson;
import dataStructures.GenericImage;
import offline.Ref;
import utils.*;
/**
* This is the e621 request class, designed for form and parse requests that
* use the e621 API, and is entirely static.
*
* If you ever find this class randomly not working,
* it may be a good idea to make sure the user agent string is set in
* HTTPUtils to something other than a browser emulating string, or the default
* java one.
*
* @author Wisp
* Edited by Rin
*/
public class NetworkE621
{
///////////////////////////////////////
// Internal JSON class and variables //
//////////////////////////////////.////
private static final Gson jsonParser_ = new Gson();
private static final String API_ROOT = "https://e621.net/post/index.json?";
private static int maxSearchResults_ = 10;
private static String[] blacklist = Ref.e621Blacklist;
private class E621ResponseObject
{
// public varaibles matching the case and the type we want for JSON.
// There are many more fields, but if we don't provide some it just
// doesn't bother parsing them.
public String file_url;
public String id;
public String tags;
public String [] artist;
}
////////////////////
// Static methods //
////////////////////
// Requests a specific image, then returns a few.
public GenericImage getE621(String input)
{
GenericImage image = new GenericImage("","","");
boolean blacklisted;
// Clean up request and replace problematic characters for the query string.
input = input.trim();
input = input.replace("+", "%2B");
input = input.replace(" ", "%20");
// Configure and send request. Note: Random ordering added as first
// tag by default. User-provided tags, therefore, will override it.
// If order:score is provided, that will be honored over order:random.
String res = HTTPUtils.sendPOSTRequest(API_ROOT
, "tags=order:random%20" + input + "&limit=" + maxSearchResults_);
if(res != null)
{
// Use class evaluation on an array of the response imageObject to be able to hold multiple.
E621ResponseObject[] imageObj = jsonParser_.fromJson(res, E621ResponseObject[].class);
// For now, we really just wanna display images and their source.
// Append them all separately to a response string w/ some flavor text.
if(imageObj.length < 1)
{
}
else
{
for(int i = 0; i < imageObj.length; ++i)
{
blacklisted = false;
for(int j = 0; j < blacklist.length; j++)
{
if(imageObj[i].tags.contains(blacklist[j]))
{
blacklisted = true;
}
}
if(blacklisted)
{
continue;
}
// We will always have a file URL. That's a given.
image.editImageURL(imageObj[i].file_url);
image.editPostURL("https://e621.net/post/show/" + imageObj[i].id);
if(imageObj[i].artist.length > 0)
image.editArtist(imageObj[i].artist[0]);
else
image.editArtist("Artist Not Found!");
}
}
}
return image;
}
}
+4 -3
View File
@@ -10,8 +10,8 @@ import utils.HTTPUtils;
public class NetworkSauceNAO public class NetworkSauceNAO
{ {
private static final Gson jsonParser_ = new Gson(); private static final Gson jsonParser_ = new Gson();
private static final String API_ROOT = "https://saucenao.com/search.php?db=999&output_type=2&numres=10&api_key=" + Ref.SauceNAOKey +"&url="; private static final String API_ROOT = "https://saucenao.com/search.php?dbmask=268435456&output_type=2&numres=10&api_key=" + Ref.SauceNAOKey +"&url=";
NetworkE621 e621Sauce = new NetworkE621(); NetworkE6 e6Sauce = new NetworkE6();
private class SauceNAOResponseObject private class SauceNAOResponseObject
{ {
List<SauceNAOResult> results; List<SauceNAOResult> results;
@@ -40,7 +40,8 @@ public class NetworkSauceNAO
if(sauceUrl.startsWith("https://e621.net/post/show/")) if(sauceUrl.startsWith("https://e621.net/post/show/"))
{ {
System.out.println("id:" + sauceUrl.substring(26)); System.out.println("id:" + sauceUrl.substring(26));
return e621Sauce.getE621("id:" + sauceUrl.substring(27)).toString(); System.out.println("HERE");
return e6Sauce.getE6("id:" + sauceUrl.substring(27)).toString();
} }
return sauce.results.get(0).data.ext_urls[0]; return sauce.results.get(0).data.ext_urls[0];
} }
+28 -1
View File
@@ -73,9 +73,36 @@ public class NetworkTheColorAPI
public ColorData lookupHex(String hex) public ColorData lookupHex(String hex)
{ {
if(hex == null)
return null;
hex = hex.replace("#", "").trim();
int len = hex.length();
if(len == 0)
return null;
// Verify we're either a full or half length color. Intermediate colors not supported.
// Alpha is also not supported.
if(len != 6 && len != 3)
return null;
try try
{ {
hex = hex.replace("#", ""); String hexUpper = hex.toUpperCase();
// Verify the number is hex.
for(int i = 0; i < hexUpper.length(); ++i)
{
char current = hexUpper.charAt(i);
Boolean isValidNum = current >= '0' && current <= '9';
Boolean isValidChar = current >= 'A' && current <= 'F';
// If it's not a valid character or a valid number, return null/
if(!isValidNum && !isValidChar)
return null;
}
String response = HTTPUtils.sendGETRequest("https://www.thecolorapi.com/id?hex=" + hex); String response = HTTPUtils.sendGETRequest("https://www.thecolorapi.com/id?hex=" + hex);
ColorData data = jsonParser.fromJson(response, ColorData.class); ColorData data = jsonParser.fromJson(response, ColorData.class);
+13
View File
@@ -119,6 +119,16 @@ public class AudioUtils
return null; return null;
} }
public int getVolume(AudioPlayer player)
{
return player.getVolume();
}
public void changeVolume(AudioPlayer player, int newVol)
{
player.setVolume(newVol);
}
public String skipVideo(AudioPlayer player) public String skipVideo(AudioPlayer player)
{ {
player.stopTrack(); player.stopTrack();
@@ -152,6 +162,9 @@ class MusicController extends Thread
@Override @Override
public void run() public void run()
{ {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
AudioTrack nowPlaying = null; AudioTrack nowPlaying = null;
do do
{ {