Added YouTube RSS feed monitoring
This commit is contained in:
		
							parent
							
								
									6a77ea0c06
								
							
						
					
					
						commit
						8d2648a895
					
				
							
								
								
									
										5
									
								
								pom.xml
								
								
								
								
							
							
						
						
									
										5
									
								
								pom.xml
								
								
								
								
							| 
						 | 
					@ -151,5 +151,10 @@
 | 
				
			||||||
			<artifactId>pf4j</artifactId>
 | 
								<artifactId>pf4j</artifactId>
 | 
				
			||||||
			<version>3.13.0</version>
 | 
								<version>3.13.0</version>
 | 
				
			||||||
		</dependency>
 | 
							</dependency>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					  			<groupId>xom</groupId>
 | 
				
			||||||
 | 
					  			<artifactId>xom</artifactId>
 | 
				
			||||||
 | 
					  			<version>1.3.9</version>
 | 
				
			||||||
 | 
							</dependency>
 | 
				
			||||||
	</dependencies>
 | 
						</dependencies>
 | 
				
			||||||
</project>
 | 
					</project>
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,7 @@ import com.fpghoti.biscuit.commands.console.GuildSayCommand;
 | 
				
			||||||
import com.fpghoti.biscuit.commands.console.SayCommand;
 | 
					import com.fpghoti.biscuit.commands.console.SayCommand;
 | 
				
			||||||
import com.fpghoti.biscuit.commands.console.ShutdownConsoleCommand;
 | 
					import com.fpghoti.biscuit.commands.console.ShutdownConsoleCommand;
 | 
				
			||||||
import com.fpghoti.biscuit.commands.discord.AddCommand;
 | 
					import com.fpghoti.biscuit.commands.discord.AddCommand;
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.commands.discord.AddYTFeedCommand;
 | 
				
			||||||
import com.fpghoti.biscuit.commands.discord.ChanIDCommand;
 | 
					import com.fpghoti.biscuit.commands.discord.ChanIDCommand;
 | 
				
			||||||
import com.fpghoti.biscuit.commands.discord.DivideCommand;
 | 
					import com.fpghoti.biscuit.commands.discord.DivideCommand;
 | 
				
			||||||
import com.fpghoti.biscuit.commands.discord.GetConfigCommand;
 | 
					import com.fpghoti.biscuit.commands.discord.GetConfigCommand;
 | 
				
			||||||
| 
						 | 
					@ -100,6 +101,7 @@ public class Main {
 | 
				
			||||||
	private static Cage cage;
 | 
						private static Cage cage;
 | 
				
			||||||
	private static File pluginsDir;
 | 
						private static File pluginsDir;
 | 
				
			||||||
	public static File audioDir;
 | 
						public static File audioDir;
 | 
				
			||||||
 | 
						//public static File ytFeedDir;
 | 
				
			||||||
	private static PluginController pluginController;
 | 
						private static PluginController pluginController;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private static AudioPlayerManager playerManager;
 | 
						private static AudioPlayerManager playerManager;
 | 
				
			||||||
| 
						 | 
					@ -131,9 +133,7 @@ public class Main {
 | 
				
			||||||
		playerManager = new DefaultAudioPlayerManager();
 | 
							playerManager = new DefaultAudioPlayerManager();
 | 
				
			||||||
		AudioSourceManagers.registerLocalSource(playerManager);
 | 
							AudioSourceManagers.registerLocalSource(playerManager);
 | 
				
			||||||
		YoutubeAudioSourceManager ytSourceManager = new dev.lavalink.youtube.YoutubeAudioSourceManager();
 | 
							YoutubeAudioSourceManager ytSourceManager = new dev.lavalink.youtube.YoutubeAudioSourceManager();
 | 
				
			||||||
		//LocalAudioSourceManager localSourceManager = new LocalAudioSourceManager();
 | 
					 | 
				
			||||||
		playerManager.registerSourceManager(ytSourceManager);
 | 
							playerManager.registerSourceManager(ytSourceManager);
 | 
				
			||||||
		//playerManager.registerSourceManager(localSourceManager);
 | 
					 | 
				
			||||||
		AudioSourceManagers.registerRemoteSources(playerManager,
 | 
							AudioSourceManagers.registerRemoteSources(playerManager,
 | 
				
			||||||
				com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioSourceManager.class);
 | 
									com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioSourceManager.class);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
| 
						 | 
					@ -175,6 +175,7 @@ public class Main {
 | 
				
			||||||
		CommandManager.addCommand(new ToggleRoleCommand());
 | 
							CommandManager.addCommand(new ToggleRoleCommand());
 | 
				
			||||||
		CommandManager.addCommand(new SquareRootCommand());
 | 
							CommandManager.addCommand(new SquareRootCommand());
 | 
				
			||||||
		CommandManager.addCommand(new AddCommand());
 | 
							CommandManager.addCommand(new AddCommand());
 | 
				
			||||||
 | 
							CommandManager.addCommand(new AddYTFeedCommand());
 | 
				
			||||||
		CommandManager.addCommand(new SubtractCommand());
 | 
							CommandManager.addCommand(new SubtractCommand());
 | 
				
			||||||
		CommandManager.addCommand(new MultiplyCommand());
 | 
							CommandManager.addCommand(new MultiplyCommand());
 | 
				
			||||||
		CommandManager.addCommand(new DivideCommand());
 | 
							CommandManager.addCommand(new DivideCommand());
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,52 @@
 | 
				
			||||||
 | 
					package com.fpghoti.biscuit.commands.discord;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.Main;
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.commands.base.ClientCommand;
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.guild.BiscuitGuild;
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.rest.MessageText;
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.util.PermUtil;
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.util.Util;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import net.dv8tion.jda.api.entities.Guild;
 | 
				
			||||||
 | 
					import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
 | 
				
			||||||
 | 
					//import net.dv8tion.jda.api.entities.TextChannel;
 | 
				
			||||||
 | 
					import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class AddYTFeedCommand extends ClientCommand{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public AddYTFeedCommand() {
 | 
				
			||||||
 | 
							name = "Add YouTube Feed";
 | 
				
			||||||
 | 
							description = "Sets bot to post YouTube uploads for a specified YouTube channel RSS feed inside the text channel the command was run in";
 | 
				
			||||||
 | 
							usage = Main.getMainBiscuit().getProperties().getCommandSignifier() + "addytfeed <alias> <channel-rss-url> <message>";
 | 
				
			||||||
 | 
							minArgs = 1;
 | 
				
			||||||
 | 
							maxArgs = 1000000;
 | 
				
			||||||
 | 
							identifiers.add("addytfeed");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void execute(String[] args, MessageReceivedEvent event) {
 | 
				
			||||||
 | 
							System.out.println("0");
 | 
				
			||||||
 | 
							BiscuitGuild b = BiscuitGuild.getBiscuitGuild(event.getGuild());
 | 
				
			||||||
 | 
							b.log(event.getAuthor().getName() + " issued a command: -addytfeed " + args[0]);
 | 
				
			||||||
 | 
							System.out.println("A");
 | 
				
			||||||
 | 
							if((PermUtil.isAdmin(event.getMember()))) {
 | 
				
			||||||
 | 
								System.out.println("B");
 | 
				
			||||||
 | 
								Guild g = event.getGuild();
 | 
				
			||||||
 | 
								TextChannel c = event.getChannel().asTextChannel();
 | 
				
			||||||
 | 
								String alias = args[0];
 | 
				
			||||||
 | 
								String channelURL = args[1];
 | 
				
			||||||
 | 
								String message = Util.getArgsMessage(2, args);
 | 
				
			||||||
 | 
								System.out.println("C");
 | 
				
			||||||
 | 
								boolean success = b.addYoutubeFeed(alias, c, channelURL, message);
 | 
				
			||||||
 | 
								System.out.println("D");
 | 
				
			||||||
 | 
								if(success) {
 | 
				
			||||||
 | 
									MessageText.send(event.getChannel().asTextChannel(), "YouTube Feed has been created.");
 | 
				
			||||||
 | 
								}else {
 | 
				
			||||||
 | 
									MessageText.send(event.getChannel().asTextChannel(), "There was an error creating the YouTube feed.");
 | 
				
			||||||
 | 
								}		
 | 
				
			||||||
 | 
							}else {
 | 
				
			||||||
 | 
								MessageText.send(event.getChannel().asTextChannel(), "You do not have permission to create a YouTube feed.");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -152,7 +152,7 @@ public class BiscuitConfig {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//Add properties to appear in both types of configs here
 | 
							//Add properties to appear in both types of configs here
 | 
				
			||||||
		added = addProperty("ChatLog", "true", prop, added, silent);
 | 
							added = addProperty("ChatLog", "true", prop, added, silent);
 | 
				
			||||||
		added = addProperty("AllowSpamPunish", "true", prop,  added, silent);
 | 
							added = addProperty("AllowSpamPunish", "false", prop,  added, silent);
 | 
				
			||||||
		added = addProperty("Channels-To-Not-Chatlog", "ignore_me,ignore_me2,ignore_me3", prop,  added, silent);
 | 
							added = addProperty("Channels-To-Not-Chatlog", "ignore_me,ignore_me2,ignore_me3", prop,  added, silent);
 | 
				
			||||||
		added = addProperty("NaughtyList", "piff,word123,another1", prop,  added, silent);
 | 
							added = addProperty("NaughtyList", "piff,word123,another1", prop,  added, silent);
 | 
				
			||||||
		added = addProperty("Restrict-Cmd-Channels", "false", prop,  added, silent);
 | 
							added = addProperty("Restrict-Cmd-Channels", "false", prop,  added, silent);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,18 @@
 | 
				
			||||||
package com.fpghoti.biscuit.guild;
 | 
					package com.fpghoti.biscuit.guild;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.FileInputStream;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.io.InputStream;
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.HashMap;
 | 
					import java.util.HashMap;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Properties;
 | 
				
			||||||
import java.util.Timer;
 | 
					import java.util.Timer;
 | 
				
			||||||
import java.util.concurrent.CopyOnWriteArrayList;
 | 
					import java.util.concurrent.CopyOnWriteArrayList;
 | 
				
			||||||
 | 
					import java.util.concurrent.Executors;
 | 
				
			||||||
 | 
					import java.util.concurrent.ScheduledExecutorService;
 | 
				
			||||||
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.fpghoti.biscuit.Main;
 | 
					import com.fpghoti.biscuit.Main;
 | 
				
			||||||
import com.fpghoti.biscuit.PluginCore;
 | 
					import com.fpghoti.biscuit.PluginCore;
 | 
				
			||||||
| 
						 | 
					@ -15,6 +22,8 @@ import com.fpghoti.biscuit.config.BiscuitProperties;
 | 
				
			||||||
import com.fpghoti.biscuit.logging.BColor;
 | 
					import com.fpghoti.biscuit.logging.BColor;
 | 
				
			||||||
import com.fpghoti.biscuit.logging.BiscuitLogger;
 | 
					import com.fpghoti.biscuit.logging.BiscuitLogger;
 | 
				
			||||||
import com.fpghoti.biscuit.rest.MessageText;
 | 
					import com.fpghoti.biscuit.rest.MessageText;
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.rss.YTFeed;
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.rss.YTFeedConfig;
 | 
				
			||||||
import com.fpghoti.biscuit.timer.BiscuitTimer;
 | 
					import com.fpghoti.biscuit.timer.BiscuitTimer;
 | 
				
			||||||
import com.fpghoti.biscuit.timer.task.ChatCountTimer;
 | 
					import com.fpghoti.biscuit.timer.task.ChatCountTimer;
 | 
				
			||||||
import com.fpghoti.biscuit.timer.task.DecrementTimer;
 | 
					import com.fpghoti.biscuit.timer.task.DecrementTimer;
 | 
				
			||||||
| 
						 | 
					@ -29,7 +38,6 @@ import net.dv8tion.jda.api.entities.Guild;
 | 
				
			||||||
import net.dv8tion.jda.api.entities.Invite;
 | 
					import net.dv8tion.jda.api.entities.Invite;
 | 
				
			||||||
import net.dv8tion.jda.api.entities.Member;
 | 
					import net.dv8tion.jda.api.entities.Member;
 | 
				
			||||||
import net.dv8tion.jda.api.entities.Role;
 | 
					import net.dv8tion.jda.api.entities.Role;
 | 
				
			||||||
//import net.dv8tion.jda.api.entities.TextChannel;
 | 
					 | 
				
			||||||
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
 | 
					import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
 | 
				
			||||||
import net.dv8tion.jda.api.entities.User;
 | 
					import net.dv8tion.jda.api.entities.User;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,9 +91,11 @@ public class BiscuitGuild {
 | 
				
			||||||
	private Timer timer;
 | 
						private Timer timer;
 | 
				
			||||||
	private List<BiscuitTimer> timers;
 | 
						private List<BiscuitTimer> timers;
 | 
				
			||||||
	private File captchaDir;
 | 
						private File captchaDir;
 | 
				
			||||||
 | 
						private File ytFeedDir;
 | 
				
			||||||
	//private Cage cage;
 | 
						//private Cage cage;
 | 
				
			||||||
	private Guild guild;
 | 
						private Guild guild;
 | 
				
			||||||
	private HashMap<String, Integer> inviteUses;
 | 
						private HashMap<String, Integer> inviteUses;
 | 
				
			||||||
 | 
						private HashMap<String, YTFeedConfig> ytfeeds;
 | 
				
			||||||
	private BiscuitConfig config;
 | 
						private BiscuitConfig config;
 | 
				
			||||||
	private BiscuitProperties properties;
 | 
						private BiscuitProperties properties;
 | 
				
			||||||
	private GuildMessageStore messageStore;
 | 
						private GuildMessageStore messageStore;
 | 
				
			||||||
| 
						 | 
					@ -106,6 +116,7 @@ public class BiscuitGuild {
 | 
				
			||||||
		this.properties = new BiscuitProperties(this);
 | 
							this.properties = new BiscuitProperties(this);
 | 
				
			||||||
		this.rolequeue = new HashMap<Member, Role>();
 | 
							this.rolequeue = new HashMap<Member, Role>();
 | 
				
			||||||
		this.player = Main.getPlayerManager().createPlayer();
 | 
							this.player = Main.getPlayerManager().createPlayer();
 | 
				
			||||||
 | 
							this.ytfeeds = new HashMap<String, YTFeedConfig>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		scheduler = new AudioScheduler(this);
 | 
							scheduler = new AudioScheduler(this);
 | 
				
			||||||
		player.addListener(scheduler);
 | 
							player.addListener(scheduler);
 | 
				
			||||||
| 
						 | 
					@ -115,9 +126,19 @@ public class BiscuitGuild {
 | 
				
			||||||
		if(!Main.isPlugin) {
 | 
							if(!Main.isPlugin) {
 | 
				
			||||||
			captchaDir = new File("captcha");
 | 
								captchaDir = new File("captcha");
 | 
				
			||||||
			captchaDir.mkdir();
 | 
								captchaDir.mkdir();
 | 
				
			||||||
 | 
								if(guild != null) {
 | 
				
			||||||
 | 
									File f = new File("ytchannels");
 | 
				
			||||||
 | 
									f.mkdir();
 | 
				
			||||||
 | 
									ytFeedDir = new File(f, guild.getId());
 | 
				
			||||||
 | 
									ytFeedDir.mkdir();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}else {
 | 
							}else {
 | 
				
			||||||
			captchaDir = new File(PluginCore.plugin.getDataFolder(), "captcha");
 | 
								captchaDir = new File(PluginCore.plugin.getDataFolder(), "captcha");
 | 
				
			||||||
			captchaDir.mkdir();
 | 
								captchaDir.mkdir();
 | 
				
			||||||
 | 
								if(guild != null) {
 | 
				
			||||||
 | 
									ytFeedDir = new File(PluginCore.plugin.getDataFolder(), "ytchannels\\" + guild.getId());
 | 
				
			||||||
 | 
									ytFeedDir.mkdirs();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}	
 | 
							}	
 | 
				
			||||||
		if(isMain) {
 | 
							if(isMain) {
 | 
				
			||||||
			wipeCaptchaDir();
 | 
								wipeCaptchaDir();
 | 
				
			||||||
| 
						 | 
					@ -131,6 +152,20 @@ public class BiscuitGuild {
 | 
				
			||||||
				});
 | 
									});
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(guild != null) {
 | 
				
			||||||
 | 
								loadYoutubeFeeds();
 | 
				
			||||||
 | 
								Runnable post = () -> {
 | 
				
			||||||
 | 
									try {
 | 
				
			||||||
 | 
										log("Updating Youtube feeds...");
 | 
				
			||||||
 | 
										postYoutubeFeeds();
 | 
				
			||||||
 | 
									} catch (IOException e) {
 | 
				
			||||||
 | 
										e.printStackTrace();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 | 
				
			||||||
 | 
								scheduler.scheduleAtFixedRate(post, 0, 1, TimeUnit.MINUTES);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public BiscuitConfig getConfig() {
 | 
						public BiscuitConfig getConfig() {
 | 
				
			||||||
| 
						 | 
					@ -161,6 +196,87 @@ public class BiscuitGuild {
 | 
				
			||||||
		return scheduler;
 | 
							return scheduler;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public YTFeedConfig loadYouTubeFeedConfig(String alias) {
 | 
				
			||||||
 | 
							alias = alias.toLowerCase();
 | 
				
			||||||
 | 
							String channelID = "null";
 | 
				
			||||||
 | 
							String youTubeChannelURL = "null";
 | 
				
			||||||
 | 
							String message = "null";
 | 
				
			||||||
 | 
							String lastVideo = "null";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Properties prop = new Properties();
 | 
				
			||||||
 | 
							InputStream input = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							File config = new File(ytFeedDir, alias);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(!config.exists()) {
 | 
				
			||||||
 | 
								logger.error("Could not locate YouTube feed config.");
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								input = new FileInputStream(config);
 | 
				
			||||||
 | 
								prop.load(input);
 | 
				
			||||||
 | 
								channelID = prop.getProperty("TextChannelID");
 | 
				
			||||||
 | 
								youTubeChannelURL = prop.getProperty("YouTubeChannelURL");
 | 
				
			||||||
 | 
								message = prop.getProperty("Message");
 | 
				
			||||||
 | 
								lastVideo = prop.getProperty("LastVideo");
 | 
				
			||||||
 | 
							} catch (IOException ex) {
 | 
				
			||||||
 | 
								ex.printStackTrace();
 | 
				
			||||||
 | 
							} finally {
 | 
				
			||||||
 | 
								if (input != null) {
 | 
				
			||||||
 | 
									try {
 | 
				
			||||||
 | 
										input.close();
 | 
				
			||||||
 | 
									} catch (IOException e) {
 | 
				
			||||||
 | 
										e.printStackTrace();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							TextChannel textChannel = jda.getTextChannelById(channelID);
 | 
				
			||||||
 | 
							if(textChannel == null) {
 | 
				
			||||||
 | 
								logger.error("Error retrieving Text Channel from YouTube feed file.");
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							YTFeed feed = new YTFeed(alias, textChannel, youTubeChannelURL, message);
 | 
				
			||||||
 | 
							feed.setLastVideo(lastVideo);
 | 
				
			||||||
 | 
							return new YTFeedConfig(this, feed);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void loadYoutubeFeeds() {
 | 
				
			||||||
 | 
							ytfeeds.clear();
 | 
				
			||||||
 | 
							File[] files = ytFeedDir.listFiles();
 | 
				
			||||||
 | 
							for(File f : files) {
 | 
				
			||||||
 | 
								String alias = f.getName().toLowerCase();
 | 
				
			||||||
 | 
								ytfeeds.put(alias, loadYouTubeFeedConfig(alias));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public boolean addYoutubeFeed(String alias, TextChannel channel, String channelURL, String message) {
 | 
				
			||||||
 | 
							alias = alias.toLowerCase();
 | 
				
			||||||
 | 
							if(guild == null || ytfeeds.containsKey(alias)) {
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							YTFeed feed = new YTFeed(alias, channel, channelURL, message);
 | 
				
			||||||
 | 
							//Generate a file for the feed
 | 
				
			||||||
 | 
							new YTFeedConfig(this, feed);
 | 
				
			||||||
 | 
							//Loads all feeds from files into hash map
 | 
				
			||||||
 | 
							loadYoutubeFeeds();
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void postYoutubeFeeds() throws IOException  {
 | 
				
			||||||
 | 
							for(String s : ytfeeds.keySet()) {
 | 
				
			||||||
 | 
								YTFeedConfig config = ytfeeds.get(s);
 | 
				
			||||||
 | 
								YTFeed feed = config.getFeed();
 | 
				
			||||||
 | 
								feed.post();
 | 
				
			||||||
 | 
								config.setLastPosted(feed.getLastVideo());
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public File getYTFeedDir() {
 | 
				
			||||||
 | 
							return ytFeedDir;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public void log(String message) {
 | 
						public void log(String message) {
 | 
				
			||||||
		if(properties == null) {
 | 
							if(properties == null) {
 | 
				
			||||||
			logger.info(message);
 | 
								logger.info(message);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,67 @@
 | 
				
			||||||
 | 
					package com.fpghoti.biscuit.rss;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.awt.Color;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.util.Util;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import net.dv8tion.jda.api.EmbedBuilder;
 | 
				
			||||||
 | 
					import net.dv8tion.jda.api.entities.Member;
 | 
				
			||||||
 | 
					import net.dv8tion.jda.api.entities.MessageEmbed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class YTEntry {	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private String id;
 | 
				
			||||||
 | 
						private String title;
 | 
				
			||||||
 | 
						private String author;
 | 
				
			||||||
 | 
						private String description;
 | 
				
			||||||
 | 
						private String thumbnail;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public YTEntry(String id, String title, String author, String description, String thumbnail) {
 | 
				
			||||||
 | 
							this.id = id;
 | 
				
			||||||
 | 
							this.title = title;
 | 
				
			||||||
 | 
							this.author = author;
 | 
				
			||||||
 | 
							this.description = description;
 | 
				
			||||||
 | 
							this.thumbnail = thumbnail;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public String getId() {
 | 
				
			||||||
 | 
							return id;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public String getTitle() {
 | 
				
			||||||
 | 
							return title;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public String getAuthor() {
 | 
				
			||||||
 | 
							return author;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public String getDescription() {
 | 
				
			||||||
 | 
							return description;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public String getThumbnail() {
 | 
				
			||||||
 | 
							return thumbnail;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public String getURL() {
 | 
				
			||||||
 | 
							return "https://www.youtube.com/watch?v=" + id;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public MessageEmbed getEmbedMessage() {
 | 
				
			||||||
 | 
							EmbedBuilder embed = new EmbedBuilder();
 | 
				
			||||||
 | 
							embed.setTitle(title, getURL());	
 | 
				
			||||||
 | 
							embed.setColor(Color.RED);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							String descPreview = description.substring(0, Math.min(description.length(), 200));
 | 
				
			||||||
 | 
							if(descPreview.length() < description.length()) {
 | 
				
			||||||
 | 
								descPreview += "...";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							embed.setDescription(descPreview);
 | 
				
			||||||
 | 
							embed.setAuthor(author, null, null);
 | 
				
			||||||
 | 
							embed.setThumbnail(thumbnail);
 | 
				
			||||||
 | 
							return embed.build();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,143 @@
 | 
				
			||||||
 | 
					package com.fpghoti.biscuit.rss;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.awt.Color;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.guild.BiscuitGuild;
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.rest.MessageText;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
 | 
				
			||||||
 | 
					import nu.xom.Builder;
 | 
				
			||||||
 | 
					import nu.xom.Document;
 | 
				
			||||||
 | 
					import nu.xom.Element;
 | 
				
			||||||
 | 
					import nu.xom.Elements;
 | 
				
			||||||
 | 
					import nu.xom.ParsingException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class YTFeed {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private BiscuitGuild guild;
 | 
				
			||||||
 | 
						private String alias;
 | 
				
			||||||
 | 
						private TextChannel channel;
 | 
				
			||||||
 | 
						private String channelURL;
 | 
				
			||||||
 | 
						private String message;
 | 
				
			||||||
 | 
						private String lastVideo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public YTFeed(String alias, TextChannel channel, String channelURL, String message) {
 | 
				
			||||||
 | 
							this.guild = BiscuitGuild.getBiscuitGuild(channel.getGuild());
 | 
				
			||||||
 | 
							this.alias = alias;
 | 
				
			||||||
 | 
							this.channel = channel;
 | 
				
			||||||
 | 
							this.channelURL = channelURL;
 | 
				
			||||||
 | 
							this.message = message;
 | 
				
			||||||
 | 
							lastVideo = "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public String getAlias() {
 | 
				
			||||||
 | 
							return alias;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public TextChannel getTextChannel() {
 | 
				
			||||||
 | 
							return channel;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public String getChannelURL() {
 | 
				
			||||||
 | 
							return channelURL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public String getMesage() {
 | 
				
			||||||
 | 
							return message;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public String getLastVideo() {
 | 
				
			||||||
 | 
							return lastVideo;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void setLastVideo(String link) {
 | 
				
			||||||
 | 
							lastVideo = link;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void post(){
 | 
				
			||||||
 | 
							List<YTEntry> ytentries = getEntries();
 | 
				
			||||||
 | 
							int index = 0;
 | 
				
			||||||
 | 
							int lastVidIndex = -1;
 | 
				
			||||||
 | 
							for(YTEntry entry : ytentries) {
 | 
				
			||||||
 | 
								String link = entry.getURL();
 | 
				
			||||||
 | 
								if(link.equals(lastVideo)) {
 | 
				
			||||||
 | 
									lastVidIndex = index;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								index++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							index = 0;
 | 
				
			||||||
 | 
							for(YTEntry entry : ytentries) {
 | 
				
			||||||
 | 
								if(index > lastVidIndex) {
 | 
				
			||||||
 | 
									String link = entry.getURL();
 | 
				
			||||||
 | 
									lastVideo = link;
 | 
				
			||||||
 | 
									MessageText.send(channel, message);
 | 
				
			||||||
 | 
									MessageText.send(channel, entry.getEmbedMessage());
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								index++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public List<YTEntry> getEntries() {
 | 
				
			||||||
 | 
							List<YTEntry> ytentries = new ArrayList<YTEntry>();	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Builder builder = new Builder();
 | 
				
			||||||
 | 
							Document doc = null;
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								doc = builder.build(channelURL);
 | 
				
			||||||
 | 
							} catch (ParsingException | IOException e) {
 | 
				
			||||||
 | 
								guild.error("Unable to parse feed: " + channelURL);
 | 
				
			||||||
 | 
								MessageText.send(channel, "Unable to parse feed: " + channelURL);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Element rss = doc.getRootElement();
 | 
				
			||||||
 | 
							Elements entries = rss.getChildElements();
 | 
				
			||||||
 | 
							for(Element entry : entries){
 | 
				
			||||||
 | 
								if(entry.getLocalName().equals("entry")) {
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									String id = "";
 | 
				
			||||||
 | 
									String title = "";
 | 
				
			||||||
 | 
									String author = "";
 | 
				
			||||||
 | 
									String description = "";
 | 
				
			||||||
 | 
									String thumbnail = "";
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									Elements values = entry.getChildElements();
 | 
				
			||||||
 | 
									for(Element value : values){
 | 
				
			||||||
 | 
										if(value.getLocalName().equals("videoId")) {
 | 
				
			||||||
 | 
											id = value.getValue();
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if(value.getLocalName().equals("title")) {
 | 
				
			||||||
 | 
											title = value.getValue();
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if(value.getLocalName().equals("author")) {
 | 
				
			||||||
 | 
											Elements subvalues = value.getChildElements();
 | 
				
			||||||
 | 
											for(Element subvalue : subvalues) {
 | 
				
			||||||
 | 
												if(subvalue.getLocalName().equals("name")) {
 | 
				
			||||||
 | 
													author = subvalue.getValue();
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if(value.getLocalName().equals("group")) {
 | 
				
			||||||
 | 
											Elements subvalues = value.getChildElements();
 | 
				
			||||||
 | 
											for(Element subvalue : subvalues) {
 | 
				
			||||||
 | 
												if(subvalue.getLocalName().equals("description")) {
 | 
				
			||||||
 | 
													description = subvalue.getValue();
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
												if(subvalue.getLocalName().equals("thumbnail")) {
 | 
				
			||||||
 | 
													thumbnail = subvalue.getAttributeValue("url");
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									ytentries.add(new YTEntry(id, title, author, description, thumbnail));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return ytentries.reversed();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,149 @@
 | 
				
			||||||
 | 
					package com.fpghoti.biscuit.rss;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.FileInputStream;
 | 
				
			||||||
 | 
					import java.io.FileReader;
 | 
				
			||||||
 | 
					import java.io.FileWriter;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.io.InputStream;
 | 
				
			||||||
 | 
					import java.util.Properties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.apache.commons.configuration2.PropertiesConfiguration;
 | 
				
			||||||
 | 
					import org.apache.commons.configuration2.PropertiesConfigurationLayout;
 | 
				
			||||||
 | 
					import org.apache.commons.configuration2.ex.ConfigurationException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fpghoti.biscuit.guild.BiscuitGuild;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class YTFeedConfig {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private BiscuitGuild biscuit;
 | 
				
			||||||
 | 
						private YTFeed feed;
 | 
				
			||||||
 | 
						private File config;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public YTFeedConfig(BiscuitGuild b, YTFeed feed) {
 | 
				
			||||||
 | 
							this.biscuit = b;
 | 
				
			||||||
 | 
							this.feed = feed;
 | 
				
			||||||
 | 
							generateConfig();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public BiscuitGuild getGuild() {
 | 
				
			||||||
 | 
							return biscuit;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public YTFeed getFeed() {
 | 
				
			||||||
 | 
							return feed;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void generateConfig() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							String name = feed.getAlias();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							File config = new File(biscuit.getYTFeedDir(), name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!config.exists()) {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									config.createNewFile();
 | 
				
			||||||
 | 
									updateConfig(config);
 | 
				
			||||||
 | 
								} catch (Exception e) {
 | 
				
			||||||
 | 
									e.printStackTrace();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}else {
 | 
				
			||||||
 | 
								updateConfig(config);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							this.config = config;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void setLastPosted(String link) {
 | 
				
			||||||
 | 
							PropertiesConfiguration prop = new PropertiesConfiguration();
 | 
				
			||||||
 | 
							PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout();
 | 
				
			||||||
 | 
							prop.setLayout(layout);
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								layout.load(prop, new FileReader(config));
 | 
				
			||||||
 | 
								FileWriter fw = new FileWriter(config);
 | 
				
			||||||
 | 
								prop.setProperty("LastVideo", link);	
 | 
				
			||||||
 | 
								feed.setLastVideo(link);
 | 
				
			||||||
 | 
								layout.save(prop, fw);
 | 
				
			||||||
 | 
							} catch (ConfigurationException e) {
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
								biscuit.error("There was an issue updating a YouTube feed file.");
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							} catch (IOException e) {
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
								biscuit.error("There was an issue updating a YouTube feed file.");
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private void updateConfig(File config) {
 | 
				
			||||||
 | 
							PropertiesConfiguration prop = new PropertiesConfiguration();
 | 
				
			||||||
 | 
							PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout();
 | 
				
			||||||
 | 
							prop.setLayout(layout);
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								layout.load(prop, new FileReader(config));
 | 
				
			||||||
 | 
								FileWriter fw = new FileWriter(config);
 | 
				
			||||||
 | 
								addNewOptions(prop);			
 | 
				
			||||||
 | 
								layout.save(prop, fw);
 | 
				
			||||||
 | 
							} catch (ConfigurationException e) {
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
								biscuit.error("There was an issue preparing a YouTube feed config for updates.");
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							} catch (IOException e) {
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
								biscuit.error("There was an issue preparing a YouTube feed config for updates.");
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private void addNewOptions(PropertiesConfiguration prop) {
 | 
				
			||||||
 | 
							if(feed == null) {
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							addProperty("Alias", feed.getAlias(), prop);
 | 
				
			||||||
 | 
							addProperty("TextChannelID", feed.getTextChannel().getId(), prop);
 | 
				
			||||||
 | 
							addProperty("YouTubeChannelURL", feed.getChannelURL(), prop);
 | 
				
			||||||
 | 
							addProperty("Message", feed.getMesage(), prop);
 | 
				
			||||||
 | 
							addProperty("LastVideo", "", prop);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private void addProperty(String key, String value, PropertiesConfiguration prop) {
 | 
				
			||||||
 | 
							if(prop.getProperty(key) == null) {
 | 
				
			||||||
 | 
								prop.addProperty(key, value);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public String getFromConfig(String property){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String setting = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Properties prop = new Properties();
 | 
				
			||||||
 | 
					        InputStream input = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        File config = new File(biscuit.getYTFeedDir(), feed.getAlias());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(!config.exists()) {
 | 
				
			||||||
 | 
					            return "";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            input = new FileInputStream(config);
 | 
				
			||||||
 | 
					            prop.load(input);
 | 
				
			||||||
 | 
					            setting = prop.getProperty(property);
 | 
				
			||||||
 | 
					        } catch (IOException ex) {
 | 
				
			||||||
 | 
					            ex.printStackTrace();
 | 
				
			||||||
 | 
					        } finally {
 | 
				
			||||||
 | 
					            if (input != null) {
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    input.close();
 | 
				
			||||||
 | 
					                } catch (IOException e) {
 | 
				
			||||||
 | 
					                    e.printStackTrace();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return setting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -83,5 +83,16 @@ public class Util {
 | 
				
			||||||
		String last = s[s.length - 1];
 | 
							String last = s[s.length - 1];
 | 
				
			||||||
		return last;
 | 
							return last;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static String getArgsMessage(int startAt, String[] args) {
 | 
				
			||||||
 | 
							String message = "";
 | 
				
			||||||
 | 
							for(int i = startAt; i < args.length; i++) {
 | 
				
			||||||
 | 
								message = message + args[i] + " ";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (message.length() > 0) {
 | 
				
			||||||
 | 
						        message = message.substring(0, message.length() - 1);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
							return message;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,4 +38,6 @@
 | 
				
			||||||
		<appender-ref ref="FILE-AUDIT" />
 | 
							<appender-ref ref="FILE-AUDIT" />
 | 
				
			||||||
	</logger>
 | 
						</logger>
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						<logger name="dev.lavalink.youtube.http.YoutubeOauth2Handler" level="INFO" />
 | 
				
			||||||
 | 
						
 | 
				
			||||||
</configuration> 
 | 
					</configuration> 
 | 
				
			||||||
		Loading…
	
		Reference in New Issue