329 lines
12 KiB
Java
329 lines
12 KiB
Java
package com.fpghoti.biscuit;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.Properties;
|
|
import java.util.Scanner;
|
|
|
|
import org.fusesource.jansi.AnsiConsole;
|
|
|
|
import com.fpghoti.biscuit.captcha.BCage;
|
|
import com.fpghoti.biscuit.commands.CommandManager;
|
|
import com.fpghoti.biscuit.commands.console.GuildSayCommand;
|
|
import com.fpghoti.biscuit.commands.console.SayCommand;
|
|
import com.fpghoti.biscuit.commands.console.ShutdownConsoleCommand;
|
|
import com.fpghoti.biscuit.commands.discord.AddCommand;
|
|
import com.fpghoti.biscuit.commands.discord.AddYTFeedCommand;
|
|
import com.fpghoti.biscuit.commands.discord.ChanIDCommand;
|
|
import com.fpghoti.biscuit.commands.discord.DivideCommand;
|
|
import com.fpghoti.biscuit.commands.discord.GetConfigCommand;
|
|
import com.fpghoti.biscuit.commands.discord.GuildIDCommand;
|
|
import com.fpghoti.biscuit.commands.discord.HelpCommand;
|
|
import com.fpghoti.biscuit.commands.discord.MakeInviteCommand;
|
|
import com.fpghoti.biscuit.commands.discord.MultiplyCommand;
|
|
import com.fpghoti.biscuit.commands.discord.NotSpammerCommand;
|
|
import com.fpghoti.biscuit.commands.discord.PingCommand;
|
|
import com.fpghoti.biscuit.commands.discord.PowerCommand;
|
|
import com.fpghoti.biscuit.commands.discord.RecentSpammersCommand;
|
|
import com.fpghoti.biscuit.commands.discord.SaveConfigCommand;
|
|
import com.fpghoti.biscuit.commands.discord.SoftMuteCommand;
|
|
import com.fpghoti.biscuit.commands.discord.SquareRootCommand;
|
|
import com.fpghoti.biscuit.commands.discord.SubtractCommand;
|
|
import com.fpghoti.biscuit.commands.discord.ToggleRoleCommand;
|
|
import com.fpghoti.biscuit.commands.discord.UIDCommand;
|
|
import com.fpghoti.biscuit.commands.discord.UnSoftMuteCommand;
|
|
import com.fpghoti.biscuit.commands.discord.WikiCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.ClearCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.ClearUserSongsCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.ForceSkipCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.ForceSkipToCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.LoopMusicCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.MoveToCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.NowPlayingCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.PauseCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.PlayCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.QueueCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.RemoveCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.ShuffleCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.SkipAllCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.SkipCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.TogglePauseCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.UnpauseCommand;
|
|
import com.fpghoti.biscuit.commands.discord.music.VolumeCommand;
|
|
import com.fpghoti.biscuit.guild.BiscuitGuild;
|
|
import com.fpghoti.biscuit.listener.CommandListener;
|
|
import com.fpghoti.biscuit.listener.DMListener;
|
|
import com.fpghoti.biscuit.listener.GuildListener;
|
|
import com.fpghoti.biscuit.listener.JoinListener;
|
|
import com.fpghoti.biscuit.listener.LeaveListener;
|
|
import com.fpghoti.biscuit.listener.MessageDeleteListener;
|
|
import com.fpghoti.biscuit.listener.MessageEditListener;
|
|
import com.fpghoti.biscuit.listener.MessageReceiveListener;
|
|
import com.fpghoti.biscuit.listener.NameListener;
|
|
import com.fpghoti.biscuit.listener.NicknameListener;
|
|
import com.fpghoti.biscuit.listener.ReactionListener;
|
|
import com.fpghoti.biscuit.listener.RoleListener;
|
|
import com.fpghoti.biscuit.logging.BColor;
|
|
import com.fpghoti.biscuit.logging.BiscuitLogger;
|
|
import com.fpghoti.biscuit.plugin.PluginController;
|
|
import com.github.cage.Cage;
|
|
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
|
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
|
|
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
|
|
import ch.qos.logback.core.rolling.RollingFileAppender;
|
|
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
|
|
import dev.lavalink.youtube.YoutubeAudioSourceManager;
|
|
import net.dv8tion.jda.api.JDA;
|
|
import net.dv8tion.jda.api.entities.Guild;
|
|
import net.dv8tion.jda.api.requests.GatewayIntent;
|
|
import net.dv8tion.jda.api.sharding.DefaultShardManagerBuilder;
|
|
import net.dv8tion.jda.api.sharding.ShardManager;
|
|
import net.dv8tion.jda.api.utils.ChunkingFilter;
|
|
import net.dv8tion.jda.api.utils.MemberCachePolicy;
|
|
|
|
public class Main {
|
|
|
|
private static JDA jda;
|
|
private static ShardManager shardm;
|
|
|
|
public RollingFileAppender<String> we;
|
|
public SizeAndTimeBasedRollingPolicy<String> wes;
|
|
|
|
private static final BiscuitLogger log = new BiscuitLogger();
|
|
|
|
private static ArrayList<BiscuitGuild> biscuits;
|
|
private static BiscuitGuild mainBiscuit;
|
|
public static Scanner sc;
|
|
public static boolean ready = false;
|
|
public static boolean isPlugin = false;
|
|
public static boolean shutdownStarted = false;
|
|
private static Cage cage;
|
|
private static File pluginsDir;
|
|
public static File audioDir;
|
|
//public static File ytFeedDir;
|
|
private static PluginController pluginController;
|
|
|
|
private static AudioPlayerManager playerManager;
|
|
|
|
@SuppressWarnings("deprecation")
|
|
public static void main(String[] args){
|
|
if(!isPlugin) {
|
|
pluginsDir = new File("plugins");
|
|
audioDir = new File("audio");
|
|
}else {
|
|
pluginsDir = new File(PluginCore.plugin.getDataFolder(), "plugins");
|
|
audioDir = new File(PluginCore.plugin.getDataFolder(), "audio");
|
|
}
|
|
pluginsDir.mkdir();
|
|
audioDir.mkdir();
|
|
|
|
final Properties properties = new Properties();
|
|
try {
|
|
properties.load(Main.class.getClassLoader().getResourceAsStream("info.properties"));
|
|
} catch (IOException e) {
|
|
log.error("Could not determine Biscuit version.");
|
|
}
|
|
String version = properties.getProperty("version");
|
|
|
|
AnsiConsole.systemInstall();
|
|
log.info(BColor.CYAN_BOLD + "========================= WELCOME TO BISCUIT =========================");
|
|
log.info("Running version: " + BColor.MAGENTA_BOLD + version);
|
|
|
|
playerManager = new DefaultAudioPlayerManager();
|
|
AudioSourceManagers.registerLocalSource(playerManager);
|
|
YoutubeAudioSourceManager ytSourceManager = new dev.lavalink.youtube.YoutubeAudioSourceManager();
|
|
playerManager.registerSourceManager(ytSourceManager);
|
|
AudioSourceManagers.registerRemoteSources(playerManager,
|
|
com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioSourceManager.class);
|
|
|
|
|
|
mainBiscuit = new BiscuitGuild(null, null, log);
|
|
startJDA();
|
|
|
|
cage = new BCage();
|
|
|
|
jda.addEventListener(new GuildListener());
|
|
jda.addEventListener(new MessageReceiveListener());
|
|
jda.addEventListener(new MessageEditListener());
|
|
jda.addEventListener(new MessageDeleteListener());
|
|
jda.addEventListener(new JoinListener());
|
|
jda.addEventListener(new LeaveListener());
|
|
jda.addEventListener(new DMListener());
|
|
jda.addEventListener(new ReactionListener());
|
|
jda.addEventListener(new RoleListener());
|
|
jda.addEventListener(new NicknameListener());
|
|
jda.addEventListener(new NameListener());
|
|
biscuits = new ArrayList<BiscuitGuild>();
|
|
for(Guild g : jda.getGuilds()) {
|
|
BiscuitGuild.loadGuild(g);
|
|
}
|
|
startCommandListener();
|
|
|
|
String link = "NULL";
|
|
|
|
//Client
|
|
|
|
CommandManager.addCommand(new HelpCommand());
|
|
CommandManager.addCommand(new PingCommand());
|
|
CommandManager.addCommand(new SoftMuteCommand());
|
|
CommandManager.addCommand(new UnSoftMuteCommand());
|
|
CommandManager.addCommand(new NotSpammerCommand());
|
|
CommandManager.addCommand(new RecentSpammersCommand());
|
|
CommandManager.addCommand(new ChanIDCommand());
|
|
CommandManager.addCommand(new UIDCommand());
|
|
CommandManager.addCommand(new ToggleRoleCommand());
|
|
CommandManager.addCommand(new SquareRootCommand());
|
|
CommandManager.addCommand(new AddCommand());
|
|
CommandManager.addCommand(new AddYTFeedCommand());
|
|
CommandManager.addCommand(new SubtractCommand());
|
|
CommandManager.addCommand(new MultiplyCommand());
|
|
CommandManager.addCommand(new DivideCommand());
|
|
CommandManager.addCommand(new PowerCommand());
|
|
CommandManager.addCommand(new MakeInviteCommand());
|
|
CommandManager.addCommand(new GetConfigCommand());
|
|
CommandManager.addCommand(new SaveConfigCommand());
|
|
CommandManager.addCommand(new GuildIDCommand());
|
|
CommandManager.addCommand(new WikiCommand());
|
|
|
|
//Music Client
|
|
|
|
CommandManager.addCommand(new PlayCommand());
|
|
CommandManager.addCommand(new ForceSkipCommand());
|
|
CommandManager.addCommand(new PauseCommand());
|
|
CommandManager.addCommand(new UnpauseCommand());
|
|
CommandManager.addCommand(new TogglePauseCommand());
|
|
CommandManager.addCommand(new QueueCommand());
|
|
CommandManager.addCommand(new SkipCommand());
|
|
CommandManager.addCommand(new NowPlayingCommand());
|
|
CommandManager.addCommand(new LoopMusicCommand());
|
|
CommandManager.addCommand(new VolumeCommand());
|
|
CommandManager.addCommand(new ShuffleCommand());
|
|
CommandManager.addCommand(new RemoveCommand());
|
|
CommandManager.addCommand(new ClearCommand());
|
|
CommandManager.addCommand(new MoveToCommand());
|
|
CommandManager.addCommand(new ForceSkipToCommand());
|
|
CommandManager.addCommand(new ClearUserSongsCommand());
|
|
CommandManager.addCommand(new SkipAllCommand());
|
|
|
|
//Console
|
|
|
|
CommandManager.addCommand(new SayCommand());
|
|
CommandManager.addCommand(new GuildSayCommand());
|
|
CommandManager.addCommand(new ShutdownConsoleCommand());
|
|
|
|
//Plugins
|
|
|
|
pluginController = new PluginController();
|
|
pluginController.loadPlugins();
|
|
pluginController.startPlugins();
|
|
|
|
link = "https://discord.com/oauth2/authorize?&client_id=" + jda.getSelfUser().getId() + "&permissions=8&scope=bot";
|
|
log.info("Connection successful!");
|
|
log.info("Startup successful!");
|
|
log.info("You can add this bot to Discord using this link:");
|
|
log.info(link);
|
|
log.info(BColor.CYAN_BOLD + "======================================================================");
|
|
log.info("CHAT LOGS BEGIN HERE:");
|
|
ready = true;
|
|
}
|
|
|
|
private static void startJDA() {
|
|
String token = mainBiscuit.getProperties().getToken();
|
|
log.info("Connecting bot to Discord.");
|
|
try{
|
|
shardm = DefaultShardManagerBuilder.createDefault(token)
|
|
.setChunkingFilter(ChunkingFilter.ALL)
|
|
.setMemberCachePolicy(MemberCachePolicy.ALL)
|
|
.enableIntents(GatewayIntent.getIntents(GatewayIntent.ALL_INTENTS))
|
|
.build();
|
|
jda = shardm.getShardById(0);
|
|
try {
|
|
jda.awaitReady();
|
|
} catch (InterruptedException e) {
|
|
e.printStackTrace();
|
|
}
|
|
jda.setAutoReconnect(true);
|
|
}catch(Exception e){
|
|
e.printStackTrace();
|
|
log.error("There was an issue connecting to Discord. Biscuit shutting down!");
|
|
shutdown();
|
|
}
|
|
}
|
|
|
|
public static BiscuitGuild getMainBiscuit() {
|
|
return mainBiscuit;
|
|
}
|
|
|
|
private static void startCommandListener() {
|
|
if(!isPlugin) {
|
|
sc = new Scanner(System.in);
|
|
CommandListener cl = new CommandListener(sc, log);
|
|
jda.addEventListener(cl);
|
|
new Thread(cl).start();
|
|
}else {
|
|
CommandListener cl = new CommandListener(null, log);
|
|
jda.addEventListener(cl);
|
|
}
|
|
}
|
|
|
|
public static ArrayList<BiscuitGuild> getBiscuits() {
|
|
return biscuits;
|
|
}
|
|
|
|
public static AudioPlayerManager getPlayerManager() {
|
|
return playerManager;
|
|
}
|
|
|
|
public static File getPluginDirectory() {
|
|
return pluginsDir;
|
|
}
|
|
|
|
|
|
|
|
public static void shutdown() {
|
|
if(!shutdownStarted) {
|
|
shutdownStarted = true;
|
|
mainBiscuit.log("Shutting down...");
|
|
pluginController.shutdownPlugins();
|
|
ArrayList<BiscuitGuild> list = new ArrayList<BiscuitGuild>(biscuits);
|
|
for(BiscuitGuild b : list) {
|
|
b.remove();
|
|
}
|
|
mainBiscuit.wipeCaptchaDir();
|
|
if(jda != null) {
|
|
jda.shutdown();
|
|
}
|
|
if(!isPlugin) {
|
|
sc.close();
|
|
System.exit(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static JDA getJDA() {
|
|
return jda;
|
|
}
|
|
|
|
public static Cage getCage() {
|
|
return cage;
|
|
}
|
|
|
|
public static BiscuitLogger getLogger() {
|
|
return log;
|
|
}
|
|
|
|
public static PluginController getPluginController() {
|
|
return pluginController;
|
|
}
|
|
|
|
public static void registerBiscuit(BiscuitGuild b) {
|
|
biscuits.add(b);
|
|
}
|
|
|
|
public static void unregisterBiscuit(BiscuitGuild b) {
|
|
biscuits.remove(b);
|
|
}
|
|
|
|
}
|