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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -84,4 +84,15 @@ public class Util {
|
||||||
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