Restructured how events were being handled to clean up the mess
This commit is contained in:
		@@ -35,11 +35,8 @@ import java.nio.file.Path;
 | 
			
		||||
import java.nio.file.Paths;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.xml.sax.SAXException;
 | 
			
		||||
import com.mpatric.mp3agic.ID3v2;
 | 
			
		||||
import com.mpatric.mp3agic.InvalidDataException;
 | 
			
		||||
import com.mpatric.mp3agic.Mp3File;
 | 
			
		||||
import com.mpatric.mp3agic.UnsupportedTagException;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class Mp3UploadHandler {
 | 
			
		||||
@@ -74,13 +71,4 @@ public class Mp3UploadHandler {
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static void main(String args[]) throws IOException, SAXException, UnsupportedTagException, InvalidDataException {
 | 
			
		||||
    String file = "E:\\Music2\\AronChupa\\01 I'm an Albatraoz.mp3";
 | 
			
		||||
    Path path = Paths.get(file);
 | 
			
		||||
    
 | 
			
		||||
    Mp3UploadHandler fuh = new Mp3UploadHandler();
 | 
			
		||||
    System.out.println(fuh.parse(path));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,68 @@
 | 
			
		||||
package net.locusworks.discord.eighttrack.events;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import net.dv8tion.jda.api.Permission;
 | 
			
		||||
import net.dv8tion.jda.api.entities.Message;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
 | 
			
		||||
import net.dv8tion.jda.api.exceptions.ErrorResponseException;
 | 
			
		||||
import net.dv8tion.jda.api.requests.ErrorResponse;
 | 
			
		||||
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.handlers.ReactionHandler;
 | 
			
		||||
 | 
			
		||||
public abstract class AbstractEventHandler {
 | 
			
		||||
  
 | 
			
		||||
  private String command;
 | 
			
		||||
 | 
			
		||||
  public AbstractEventHandler(String command) {
 | 
			
		||||
    this.command = command;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  public String getCommand() {
 | 
			
		||||
    return this.command;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  public abstract void executeEvent(GuildMusicHandler musicHandler, GuildMessageReceivedEvent event, List<String> commands);
 | 
			
		||||
  
 | 
			
		||||
  
 | 
			
		||||
  public abstract String help();
 | 
			
		||||
  
 | 
			
		||||
  protected boolean isAdmin(GuildMessageReceivedEvent event) {
 | 
			
		||||
    if (!event.getMessage().getMember().hasPermission(Permission.ADMINISTRATOR, Permission.MANAGE_SERVER)) {
 | 
			
		||||
      event.getChannel().sendMessage(String.format("Sorry <@%s> i can't do that. *psst: you have to have manage server, or administrator role*", event.getMember().getIdLong())).queue();
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected boolean checkCommands(GuildMessageReceivedEvent event, List<String> commands, String msg) {
 | 
			
		||||
    return checkCommands(event, commands, 0, msg);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected boolean checkCommands(GuildMessageReceivedEvent event, List<String> commands, int minParams, String msg) {
 | 
			
		||||
    if (commands == null || commands.isEmpty() || commands.size() < minParams) {
 | 
			
		||||
      event.getChannel().sendMessage(msg).queue();
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected void sendMessage(GuildMessageReceivedEvent event, String msg) {
 | 
			
		||||
    event.getChannel().sendMessage(msg).queue();
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  protected void sendMessage(GuildMessageReceivedEvent event, String msgFmt, Object... args) {
 | 
			
		||||
    sendMessage(event, String.format(msgFmt, args));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected void deleteMessage(Message msg, ReactionHandler reactionHandler, Long guildId) {
 | 
			
		||||
    try {
 | 
			
		||||
      msg.delete().complete();
 | 
			
		||||
      if (reactionHandler != null) {
 | 
			
		||||
        reactionHandler.removeReactionListener(guildId, msg.getIdLong());
 | 
			
		||||
      }
 | 
			
		||||
    } catch (ErrorResponseException ex) {
 | 
			
		||||
      if (ex.getErrorResponse() != ErrorResponse.UNKNOWN_MESSAGE) throw ex;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,42 @@
 | 
			
		||||
package net.locusworks.discord.eighttrack.events.handlers;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
 | 
			
		||||
import net.locusworks.discord.eighttrack.events.AbstractEventHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.RepositoryService;
 | 
			
		||||
import net.locusworks.logger.ApplicationLogger;
 | 
			
		||||
import net.locusworks.logger.ApplicationLoggerFactory;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class NextSongHandler extends AbstractEventHandler {
 | 
			
		||||
 | 
			
		||||
  private ApplicationLogger logger;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private RepositoryService guildRepoService;
 | 
			
		||||
  
 | 
			
		||||
  public NextSongHandler() {
 | 
			
		||||
    super("-next");
 | 
			
		||||
    logger = ApplicationLoggerFactory.getLogger(NextSongHandler.class);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void executeEvent(GuildMusicHandler musicHandler, GuildMessageReceivedEvent event, List<String> commands) {
 | 
			
		||||
    try {
 | 
			
		||||
      musicHandler.next(event, commands);
 | 
			
		||||
    } catch (Exception ex) {
 | 
			
		||||
      logger.error("Unable to play next song: " + ex.getMessage(), ex);
 | 
			
		||||
      guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to play next song: %s", ex.getMessage());
 | 
			
		||||
      sendMessage(event, "Sorry I am unable to play next song: " + ex.getMessage());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  @Override
 | 
			
		||||
  public String help() {
 | 
			
		||||
    return "-next <id of song to play> (will stop song if one already playing)";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,43 @@
 | 
			
		||||
package net.locusworks.discord.eighttrack.events.handlers;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
 | 
			
		||||
import net.locusworks.discord.eighttrack.events.AbstractEventHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.RepositoryService;
 | 
			
		||||
import net.locusworks.logger.ApplicationLogger;
 | 
			
		||||
import net.locusworks.logger.ApplicationLoggerFactory;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class PlaySongHandler extends AbstractEventHandler {
 | 
			
		||||
 | 
			
		||||
  private ApplicationLogger logger;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private RepositoryService guildRepoService;
 | 
			
		||||
  
 | 
			
		||||
  public PlaySongHandler() {
 | 
			
		||||
    super("-play");
 | 
			
		||||
    logger = ApplicationLoggerFactory.getLogger(PlaySongHandler.class);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void executeEvent(GuildMusicHandler musicHandler, GuildMessageReceivedEvent event, List<String> commands) {
 | 
			
		||||
    try {
 | 
			
		||||
      musicHandler.play(event, commands);
 | 
			
		||||
      musicHandler.isPlaying(true);
 | 
			
		||||
    } catch (Exception ex) {
 | 
			
		||||
      logger.error("Unable to play song: " + ex.getMessage(), ex);
 | 
			
		||||
      guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to play song: %s", ex.getMessage());
 | 
			
		||||
      sendMessage(event, "Sorry I am unable to play requested song: " + ex.getMessage());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  @Override
 | 
			
		||||
  public String help() {
 | 
			
		||||
    return "-play <id of song to play> (will not play song if a song is already playing)";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,43 @@
 | 
			
		||||
package net.locusworks.discord.eighttrack.events.handlers;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
 | 
			
		||||
import net.locusworks.discord.eighttrack.events.AbstractEventHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.RepositoryService;
 | 
			
		||||
import net.locusworks.logger.ApplicationLogger;
 | 
			
		||||
import net.locusworks.logger.ApplicationLoggerFactory;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class RepeatSongHandler extends AbstractEventHandler {
 | 
			
		||||
 | 
			
		||||
  private ApplicationLogger logger;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private RepositoryService guildRepoService;
 | 
			
		||||
  
 | 
			
		||||
  public RepeatSongHandler() {
 | 
			
		||||
    super("-repeat");
 | 
			
		||||
    logger = ApplicationLoggerFactory.getLogger(RepeatSongHandler.class);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void executeEvent(GuildMusicHandler musicHandler, GuildMessageReceivedEvent event, List<String> commands) {
 | 
			
		||||
    try {
 | 
			
		||||
      musicHandler.repeat(event);
 | 
			
		||||
      musicHandler.isPlaying(true);
 | 
			
		||||
    } catch (Exception ex) {
 | 
			
		||||
      logger.error("Unable to repeat songs: " + ex.getMessage(), ex);
 | 
			
		||||
      guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to repeat song: %s", ex.getMessage());
 | 
			
		||||
      sendMessage(event, "Sorry I am unable to repeat songs: " + ex.getMessage());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  @Override
 | 
			
		||||
  public String help() {
 | 
			
		||||
    return "-repeat (repeats the current song list)";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,44 @@
 | 
			
		||||
package net.locusworks.discord.eighttrack.events.handlers;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
 | 
			
		||||
import net.locusworks.discord.eighttrack.events.AbstractEventHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.RepositoryService;
 | 
			
		||||
import net.locusworks.logger.ApplicationLogger;
 | 
			
		||||
import net.locusworks.logger.ApplicationLoggerFactory;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class StopSongHandler extends AbstractEventHandler {
 | 
			
		||||
 | 
			
		||||
  private ApplicationLogger logger;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private RepositoryService guildRepoService;
 | 
			
		||||
  
 | 
			
		||||
  public StopSongHandler() {
 | 
			
		||||
    super("-stop");
 | 
			
		||||
    logger = ApplicationLoggerFactory.getLogger(StopSongHandler.class);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void executeEvent(GuildMusicHandler musicHandler, GuildMessageReceivedEvent event, List<String> commands) {
 | 
			
		||||
    try {
 | 
			
		||||
      musicHandler.isPlaying(false);
 | 
			
		||||
      musicHandler.stop(event);
 | 
			
		||||
      event.getGuild().getAudioManager().closeAudioConnection();
 | 
			
		||||
    } catch (Exception ex) {
 | 
			
		||||
      logger.error("Unable to stop song: " + ex.getMessage(), ex);
 | 
			
		||||
      guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to stop song: %s", ex.getMessage());
 | 
			
		||||
      sendMessage(event, "Sorry I am unable to stop current song: " + ex.getMessage());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  @Override
 | 
			
		||||
  public String help() {
 | 
			
		||||
    return "-stop (stops the current song)";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,43 @@
 | 
			
		||||
package net.locusworks.discord.eighttrack.events.handlers;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
 | 
			
		||||
import net.locusworks.discord.eighttrack.events.AbstractEventHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.RepositoryService;
 | 
			
		||||
import net.locusworks.logger.ApplicationLogger;
 | 
			
		||||
import net.locusworks.logger.ApplicationLoggerFactory;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class UpNextSongHandler extends AbstractEventHandler {
 | 
			
		||||
 | 
			
		||||
  private ApplicationLogger logger;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private RepositoryService guildRepoService;
 | 
			
		||||
  
 | 
			
		||||
  public UpNextSongHandler() {
 | 
			
		||||
    super("-upnext");
 | 
			
		||||
    logger = ApplicationLoggerFactory.getLogger(UpNextSongHandler.class);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void executeEvent(GuildMusicHandler musicHandler, GuildMessageReceivedEvent event, List<String> commands) {
 | 
			
		||||
    try {
 | 
			
		||||
      musicHandler.repeat(event);
 | 
			
		||||
      musicHandler.isPlaying(true);
 | 
			
		||||
    } catch (Exception ex) {
 | 
			
		||||
      logger.error("Unable to show the next songs: " + ex.getMessage(), ex);
 | 
			
		||||
      guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to show next song: %s", ex.getMessage());
 | 
			
		||||
      sendMessage(event, "Sorry I am unable to show next songs: " + ex.getMessage());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  @Override
 | 
			
		||||
  public String help() {
 | 
			
		||||
    return "-upnext (shows which song is up next)";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,204 @@
 | 
			
		||||
package net.locusworks.discord.eighttrack.events.handlers;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.nio.file.Files;
 | 
			
		||||
import java.nio.file.Path;
 | 
			
		||||
import java.time.OffsetDateTime;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import net.dv8tion.jda.api.EmbedBuilder;
 | 
			
		||||
import net.dv8tion.jda.api.entities.MessageEmbed;
 | 
			
		||||
import net.dv8tion.jda.api.entities.Message.Attachment;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
 | 
			
		||||
import net.locusworks.crypto.utils.HashUtils;
 | 
			
		||||
import net.locusworks.discord.eighttrack.audio.Mp3UploadHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.audio.Mp3UploadResults;
 | 
			
		||||
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
 | 
			
		||||
import net.locusworks.discord.eighttrack.database.entities.GuildSong;
 | 
			
		||||
import net.locusworks.discord.eighttrack.database.entities.Song;
 | 
			
		||||
import net.locusworks.discord.eighttrack.events.AbstractEventHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.ConfigurationService;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.RepositoryService;
 | 
			
		||||
import net.locusworks.logger.ApplicationLogger;
 | 
			
		||||
import net.locusworks.logger.ApplicationLoggerFactory;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class UploadHandler extends AbstractEventHandler {
 | 
			
		||||
 | 
			
		||||
  private ApplicationLogger logger;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private Mp3UploadHandler uploadHandler;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private RepositoryService guildSongRepoService;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private ConfigurationService confService;
 | 
			
		||||
  
 | 
			
		||||
  public UploadHandler() {
 | 
			
		||||
    super("+upload");
 | 
			
		||||
    logger = ApplicationLoggerFactory.getLogger(UploadHandler.class);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public void executeEvent(GuildMusicHandler musicHandler, GuildMessageReceivedEvent event, List<String> commands) {
 | 
			
		||||
    if (!isAdmin(event)) return;
 | 
			
		||||
    
 | 
			
		||||
    for(Attachment attachment : event.getMessage().getAttachments()) {
 | 
			
		||||
      attachment.retrieveInputStream().thenAccept((in) -> {
 | 
			
		||||
        Mp3UploadResults res = null;
 | 
			
		||||
        MessageEmbed embed = null;
 | 
			
		||||
        try {
 | 
			
		||||
 | 
			
		||||
          res = uploadHandler.parse(in);
 | 
			
		||||
          if (res.validFile()) {
 | 
			
		||||
            embed = persistSong(res, event, attachment.getFileName());
 | 
			
		||||
          } else {
 | 
			
		||||
            embed = wrongFile(event, attachment.getFileName());
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        } catch (Exception ex) {
 | 
			
		||||
          logger.error("Unable to get file information: %s", ex.getMessage());
 | 
			
		||||
          logger.error(ex);
 | 
			
		||||
          embed = error(event, ex, attachment.getFileName()); 
 | 
			
		||||
        } finally {
 | 
			
		||||
          event.getMessage().delete().queue();
 | 
			
		||||
          if (res != null) res.clear();
 | 
			
		||||
 | 
			
		||||
          if (embed != null) event.getChannel().sendMessage(embed).queue();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      }).exceptionally((err) -> {
 | 
			
		||||
        event.getMessage().delete().queue();
 | 
			
		||||
        MessageEmbed embed = error(event, err, attachment.getFileName());
 | 
			
		||||
        if (embed != null) event.getChannel().sendMessage(embed).queue();
 | 
			
		||||
        return null;
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  private MessageEmbed error(GuildMessageReceivedEvent event, Throwable ex, String fileName) {
 | 
			
		||||
    return new EmbedBuilder()
 | 
			
		||||
        .setTitle("Unable to upload file: " + fileName)
 | 
			
		||||
        .setDescription("There was an error uploading your file: " + ex.getMessage() + ". Please contact admin")
 | 
			
		||||
        .setColor(Color.RED)
 | 
			
		||||
        .setTimestamp(OffsetDateTime.now())
 | 
			
		||||
        .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
 | 
			
		||||
        .build();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private MessageEmbed wrongFile(GuildMessageReceivedEvent event, String fileName) {
 | 
			
		||||
    return new EmbedBuilder()
 | 
			
		||||
        .setTitle("Invalid File: " + fileName)
 | 
			
		||||
        .setDescription("Only music type files are allowed to be uploaded")
 | 
			
		||||
        .setColor(Color.RED)
 | 
			
		||||
        .setTimestamp(OffsetDateTime.now())
 | 
			
		||||
        .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
 | 
			
		||||
        .build();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private MessageEmbed persistSong(Mp3UploadResults result, GuildMessageReceivedEvent event, String fileName) throws Exception {
 | 
			
		||||
 | 
			
		||||
    DiscordGuild guild = guildSongRepoService.getGuildRepo().findByGuildId(event.getGuild().getIdLong());
 | 
			
		||||
    if(guild == null) {
 | 
			
		||||
      throw new IOException("Unable to find guild in database. Please contact administrator");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    String hash = HashUtils.hash("SHA-1", result.getData());
 | 
			
		||||
 | 
			
		||||
    GuildSong gs = guildSongRepoService.getGuildSongRepo().findByGuildAndSongHash(event.getGuild().getIdLong(), hash);
 | 
			
		||||
    if (gs != null) {
 | 
			
		||||
      MessageEmbed embed = new EmbedBuilder()
 | 
			
		||||
          .setColor(Color.ORANGE)
 | 
			
		||||
          .setThumbnail(event.getGuild().getIconUrl())
 | 
			
		||||
          .setTitle("Upload Results for " + fileName)
 | 
			
		||||
          .setDescription(String.format("**%s** by __%s__ already exists. ID: `%s`", gs.getSong().getTitle(), gs.getSong().getArtist(), gs.getUuid()))
 | 
			
		||||
          .setTimestamp(OffsetDateTime.now())
 | 
			
		||||
          .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
 | 
			
		||||
          .build();
 | 
			
		||||
      return embed;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    Song song = guildSongRepoService.getSongRepo().findByFileHash(hash);
 | 
			
		||||
    if (song == null) {
 | 
			
		||||
 | 
			
		||||
      Path output = confService.getMusicDirectory();
 | 
			
		||||
      if (result.getArtist() != null) {
 | 
			
		||||
        output = output.resolve(result.getArtist());
 | 
			
		||||
        if (result.getAlbum() != null) {
 | 
			
		||||
          output = output.resolve(result.getAlbum());
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      output = output.resolve(fileName);
 | 
			
		||||
 | 
			
		||||
      if (!Files.exists(output.toAbsolutePath().getParent())) {
 | 
			
		||||
        Files.createDirectories(output.toAbsolutePath().getParent());
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      Files.write(output, result.getData());
 | 
			
		||||
 | 
			
		||||
      song = new Song();
 | 
			
		||||
      song.setAlbum(result.getAlbum());
 | 
			
		||||
      song.setArtist(result.getArtist());
 | 
			
		||||
      song.setDateAdded(new Date());
 | 
			
		||||
      song.setDiscNumber(result.getDiscNumber());
 | 
			
		||||
      song.setFileHash(hash);
 | 
			
		||||
      song.setFilePath(output.toAbsolutePath().toString());
 | 
			
		||||
      song.setGenre(result.getGenre());
 | 
			
		||||
      song.setReleaseYear(result.getReleaseDate());
 | 
			
		||||
      song.setTitle(result.getTitle());
 | 
			
		||||
      song.setTrackNumber(result.getTrackNumber());
 | 
			
		||||
 | 
			
		||||
      guildSongRepoService.getSongRepo().save(song);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    gs = new GuildSong();
 | 
			
		||||
    gs.setDateAdded(new Date());
 | 
			
		||||
    gs.setGuild(guild);
 | 
			
		||||
    gs.setSong(song);
 | 
			
		||||
 | 
			
		||||
    String[] uuidArray = UUID.randomUUID().toString().split("-");
 | 
			
		||||
 | 
			
		||||
    gs.setUuid(uuidArray[uuidArray.length - 1]);
 | 
			
		||||
 | 
			
		||||
    guildSongRepoService.getGuildSongRepo().save(gs);
 | 
			
		||||
 | 
			
		||||
    EmbedBuilder builder = new EmbedBuilder()
 | 
			
		||||
        .setColor(Color.GREEN)
 | 
			
		||||
        .setThumbnail(event.getGuild().getIconUrl())
 | 
			
		||||
        .setTitle("Upload Results for " + fileName)
 | 
			
		||||
        .setTimestamp(OffsetDateTime.now())
 | 
			
		||||
        .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
 | 
			
		||||
        .addField("Title", result.getTitle(), true);
 | 
			
		||||
 | 
			
		||||
    if (!StringUtils.isBlank(result.getArtist()))         builder.addField("Artist", result.getArtist(), true);
 | 
			
		||||
    if (!StringUtils.isBlank(result.getAlbum()))          builder.addField("Album", result.getAlbum(), true);
 | 
			
		||||
    if (!StringUtils.isBlank(result.getTrackNumber()))    builder.addField("Track", result.getTrackNumber(), true);
 | 
			
		||||
    if (!StringUtils.isBlank(result.getDiscNumber()))     builder.addField("Disc", result.getDiscNumber(), true);
 | 
			
		||||
    if (!StringUtils.isBlank(result.getReleaseDate()))    builder.addField("Year", result.getReleaseDate(), true);
 | 
			
		||||
 | 
			
		||||
    builder.addField("ID", gs.getUuid(), true);
 | 
			
		||||
 | 
			
		||||
    MessageEmbed embed = builder.build();
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      guildSongRepoService.logEntry(event.getGuild().getIdLong(), "%s uploaded", result);
 | 
			
		||||
    } catch (Exception ex) {}
 | 
			
		||||
 | 
			
		||||
    return embed;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  public String help() {
 | 
			
		||||
    return "upload song";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -27,20 +27,22 @@
 | 
			
		||||
 */
 | 
			
		||||
package net.locusworks.discord.eighttrack.handlers;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.nio.file.Files;
 | 
			
		||||
import java.nio.file.Path;
 | 
			
		||||
import java.time.OffsetDateTime;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.PostConstruct;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.TreeMap;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.scheduling.annotation.Scheduled;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import net.dv8tion.jda.api.EmbedBuilder;
 | 
			
		||||
import net.dv8tion.jda.api.entities.ChannelType;
 | 
			
		||||
import net.dv8tion.jda.api.entities.TextChannel;
 | 
			
		||||
import net.dv8tion.jda.api.events.ExceptionEvent;
 | 
			
		||||
@@ -48,8 +50,8 @@ import net.dv8tion.jda.api.events.guild.GuildJoinEvent;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent;
 | 
			
		||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
 | 
			
		||||
import net.locusworks.discord.eighttrack.audio.Mp3UploadHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
 | 
			
		||||
import net.locusworks.discord.eighttrack.events.AbstractEventHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.ConfigurationService;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.GuildMusicService;
 | 
			
		||||
import net.locusworks.discord.eighttrack.services.RepositoryService;
 | 
			
		||||
@@ -63,24 +65,26 @@ public class DiscordEventHandler extends ListenerAdapter {
 | 
			
		||||
 | 
			
		||||
  private ApplicationLogger logger = ApplicationLoggerFactory.getLogger(DiscordEventHandler.class);
 | 
			
		||||
  
 | 
			
		||||
  @Autowired 
 | 
			
		||||
  private ConfigurationService confService;
 | 
			
		||||
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private Mp3UploadHandler uploadHandler;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private RepositoryService guildSongRepoService;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private ReactionHandler reactionHandler;
 | 
			
		||||
  
 | 
			
		||||
  @PostConstruct
 | 
			
		||||
  private void init() throws IOException {
 | 
			
		||||
    this.musicDir = confService.getMusicDirectory();
 | 
			
		||||
  private Map<String, AbstractEventHandler> events;
 | 
			
		||||
  
 | 
			
		||||
  @Autowired
 | 
			
		||||
  private void setup(ConfigurationService cService, List<AbstractEventHandler> eventHandlers) throws IOException {
 | 
			
		||||
    this.musicDir = cService.getMusicDirectory();
 | 
			
		||||
    if (!Files.exists(this.musicDir.toAbsolutePath())) {
 | 
			
		||||
      Files.createDirectories(this.musicDir.toAbsolutePath());
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    events = new TreeMap<>();
 | 
			
		||||
    
 | 
			
		||||
    for(AbstractEventHandler handler : eventHandlers) {
 | 
			
		||||
      events.put(handler.getCommand(), handler);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  @Scheduled(fixedRate = 300000L, initialDelay=300000L)
 | 
			
		||||
@@ -151,7 +155,7 @@ public class DiscordEventHandler extends ListenerAdapter {
 | 
			
		||||
    
 | 
			
		||||
    if (!GuildMusicService.getMap().containsKey(event.getGuild().getIdLong())) {
 | 
			
		||||
      GuildMusicService.getMap().put(event.getGuild().getIdLong(), 
 | 
			
		||||
          new GuildMusicHandler(musicDir, event.getGuild().getIdLong(), uploadHandler, reactionHandler, guildSongRepoService));
 | 
			
		||||
          new GuildMusicHandler(event.getGuild().getIdLong(), reactionHandler, guildSongRepoService));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    GuildMusicHandler gmh = GuildMusicService.getMap().get(event.getGuild().getIdLong());
 | 
			
		||||
@@ -161,29 +165,13 @@ public class DiscordEventHandler extends ListenerAdapter {
 | 
			
		||||
    
 | 
			
		||||
    String command = commands.remove(0);
 | 
			
		||||
    
 | 
			
		||||
    AbstractEventHandler aeh = events.get(command.toLowerCase());
 | 
			
		||||
    if (aeh != null) {
 | 
			
		||||
      aeh.executeEvent(gmh, event, commands);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    switch(command) {
 | 
			
		||||
      case "+upload":
 | 
			
		||||
        gmh.upload(event);
 | 
			
		||||
        return;
 | 
			
		||||
      case "-play":
 | 
			
		||||
        gmh.play(event, commands);
 | 
			
		||||
        gmh.isPlaying(true);
 | 
			
		||||
        return;
 | 
			
		||||
      case "-stop":
 | 
			
		||||
        gmh.isPlaying(false);
 | 
			
		||||
        gmh.stop(event);
 | 
			
		||||
        event.getGuild().getAudioManager().closeAudioConnection();
 | 
			
		||||
        return;
 | 
			
		||||
      case "-next":
 | 
			
		||||
        gmh.next(event, commands);
 | 
			
		||||
        return;
 | 
			
		||||
      case "-repeat":
 | 
			
		||||
        gmh.repeat(event);
 | 
			
		||||
        gmh.isPlaying(true);
 | 
			
		||||
        return;
 | 
			
		||||
      case "-upnext":
 | 
			
		||||
        gmh.upNext(event, commands);
 | 
			
		||||
        return;
 | 
			
		||||
      case "-list":
 | 
			
		||||
        gmh.list(event);
 | 
			
		||||
        return;
 | 
			
		||||
@@ -196,8 +184,24 @@ public class DiscordEventHandler extends ListenerAdapter {
 | 
			
		||||
      case "+delete":
 | 
			
		||||
        gmh.delete(event, commands);
 | 
			
		||||
        return;
 | 
			
		||||
      default:
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if (!command.equalsIgnoreCase("-help")) return;
 | 
			
		||||
    
 | 
			
		||||
    StringBuilder sb = new StringBuilder();
 | 
			
		||||
    for (Entry<String, AbstractEventHandler> entry : events.entrySet()) {
 | 
			
		||||
      sb.append(String.format("%s | %s%n", entry.getKey(), entry.getValue().help()));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    EmbedBuilder builder = new EmbedBuilder()
 | 
			
		||||
        .setColor(Color.GREEN)
 | 
			
		||||
        .setThumbnail(event.getGuild().getIconUrl())
 | 
			
		||||
        .setTitle("Eight Track Help Menu")
 | 
			
		||||
        .setDescription(sb.toString())
 | 
			
		||||
        .setTimestamp(OffsetDateTime.now())
 | 
			
		||||
        .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl());
 | 
			
		||||
    
 | 
			
		||||
    event.getChannel().sendMessage(builder.build()).queue();
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,8 +29,6 @@ package net.locusworks.discord.eighttrack.handlers;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.nio.file.Files;
 | 
			
		||||
import java.nio.file.Path;
 | 
			
		||||
import java.time.OffsetDateTime;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
@@ -39,7 +37,6 @@ import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
import java.util.concurrent.atomic.AtomicBoolean;
 | 
			
		||||
import java.util.function.Consumer;
 | 
			
		||||
@@ -54,17 +51,13 @@ import net.dv8tion.jda.api.entities.ChannelType;
 | 
			
		||||
import net.dv8tion.jda.api.entities.GuildChannel;
 | 
			
		||||
import net.dv8tion.jda.api.entities.Member;
 | 
			
		||||
import net.dv8tion.jda.api.entities.Message;
 | 
			
		||||
import net.dv8tion.jda.api.entities.Message.Attachment;
 | 
			
		||||
import net.dv8tion.jda.api.entities.MessageEmbed;
 | 
			
		||||
import net.dv8tion.jda.api.entities.VoiceChannel;
 | 
			
		||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
 | 
			
		||||
import net.dv8tion.jda.api.exceptions.ErrorResponseException;
 | 
			
		||||
import net.dv8tion.jda.api.managers.AudioManager;
 | 
			
		||||
import net.dv8tion.jda.api.requests.ErrorResponse;
 | 
			
		||||
import net.locusworks.crypto.utils.HashUtils;
 | 
			
		||||
import net.locusworks.discord.eighttrack.audio.EightTrackAudioSendHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.audio.Mp3UploadHandler;
 | 
			
		||||
import net.locusworks.discord.eighttrack.audio.Mp3UploadResults;
 | 
			
		||||
import net.locusworks.discord.eighttrack.audio.TrackManager;
 | 
			
		||||
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
 | 
			
		||||
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist;
 | 
			
		||||
@@ -79,7 +72,6 @@ import net.locusworks.logger.ApplicationLoggerFactory;
 | 
			
		||||
 | 
			
		||||
public class GuildMusicHandler {
 | 
			
		||||
 | 
			
		||||
  private Path musicDir;
 | 
			
		||||
  private ApplicationLogger logger;
 | 
			
		||||
  private AtomicBoolean playing;
 | 
			
		||||
  private Long voiceChannelId;
 | 
			
		||||
@@ -87,7 +79,6 @@ public class GuildMusicHandler {
 | 
			
		||||
  private OffsetDateTime lastPlayed;
 | 
			
		||||
 | 
			
		||||
  private Consumer<Long> callback;
 | 
			
		||||
  private Mp3UploadHandler uploadHandler;
 | 
			
		||||
  private RepositoryService guildSongRepoService;
 | 
			
		||||
  private ReactionHandler reactionHandler;
 | 
			
		||||
  private long guildId;
 | 
			
		||||
@@ -96,12 +87,10 @@ public class GuildMusicHandler {
 | 
			
		||||
 | 
			
		||||
  private TrackManager trackManager;
 | 
			
		||||
 | 
			
		||||
  public GuildMusicHandler(Path musicDir, long guildId, Mp3UploadHandler uploadHandler, ReactionHandler reactionHandler, RepositoryService guildSongRepoService) throws IOException {
 | 
			
		||||
  public GuildMusicHandler(long guildId, ReactionHandler reactionHandler, RepositoryService guildSongRepoService) throws IOException {
 | 
			
		||||
    this.logger = ApplicationLoggerFactory.getLogger(GuildMusicHandler.class);
 | 
			
		||||
    this.playing = new AtomicBoolean(false);
 | 
			
		||||
    this.musicDir = musicDir;
 | 
			
		||||
    this.lastPlayed = OffsetDateTime.now();
 | 
			
		||||
    this.uploadHandler = uploadHandler;
 | 
			
		||||
    this.guildSongRepoService = guildSongRepoService;
 | 
			
		||||
    this.guildId = guildId;
 | 
			
		||||
    this.reactionHandler = reactionHandler;
 | 
			
		||||
@@ -197,6 +186,7 @@ public class GuildMusicHandler {
 | 
			
		||||
      playing.set(true);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    GuildChannel gc = event.getGuild().getGuildChannelById(ChannelType.VOICE, voiceChannelId);
 | 
			
		||||
    if (gc != null && gc.getMembers().size() == 1) {
 | 
			
		||||
      event.getChannel().sendMessage("Going silent since no one is currently listening to the channel").queue();
 | 
			
		||||
@@ -206,18 +196,20 @@ public class GuildMusicHandler {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    playing.set(false);
 | 
			
		||||
    stop(event, true);
 | 
			
		||||
    stop(event, true, true);
 | 
			
		||||
    play(event, commands);
 | 
			
		||||
    playing.set(true);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void stop(GuildMessageReceivedEvent event) {
 | 
			
		||||
    stop(event, false);
 | 
			
		||||
    stop(event, false, false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void stop(GuildMessageReceivedEvent event, boolean stoppedFromRepeat) {
 | 
			
		||||
  public void stop(GuildMessageReceivedEvent event, boolean stoppedFromRepeat, boolean stoppedFromNext) {
 | 
			
		||||
    trackManager.stopTrack();
 | 
			
		||||
    voiceChannelId = null;
 | 
			
		||||
    if (!stoppedFromNext) {
 | 
			
		||||
      voiceChannelId = null;
 | 
			
		||||
    }
 | 
			
		||||
    if (!stoppedFromRepeat) {
 | 
			
		||||
      currentPlaylist = null;
 | 
			
		||||
    }
 | 
			
		||||
@@ -264,7 +256,7 @@ public class GuildMusicHandler {
 | 
			
		||||
        event.getChannel().sendMessageFormat("Unable to find song with identifier: %s", uuid).queue();
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      stop(event, true);
 | 
			
		||||
      stop(event, true, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!trackManager.hasTracks()) {
 | 
			
		||||
@@ -292,42 +284,6 @@ public class GuildMusicHandler {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void upload(GuildMessageReceivedEvent event) {
 | 
			
		||||
    isAdmin(event);
 | 
			
		||||
 | 
			
		||||
    for(Attachment attachment : event.getMessage().getAttachments()) {
 | 
			
		||||
      attachment.retrieveInputStream().thenAccept((in) -> {
 | 
			
		||||
        Mp3UploadResults res = null;
 | 
			
		||||
        MessageEmbed embed = null;
 | 
			
		||||
        try {
 | 
			
		||||
 | 
			
		||||
          res = uploadHandler.parse(in);
 | 
			
		||||
          if (res.validFile()) {
 | 
			
		||||
            embed = persistSong(res, event, attachment.getFileName());
 | 
			
		||||
          } else {
 | 
			
		||||
            embed = wrongFile(event, attachment.getFileName());
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        } catch (Exception ex) {
 | 
			
		||||
          logger.error("Unable to get file information: %s", ex.getMessage());
 | 
			
		||||
          logger.error(ex);
 | 
			
		||||
          embed = error(event, ex, attachment.getFileName()); 
 | 
			
		||||
        } finally {
 | 
			
		||||
          event.getMessage().delete().queue();
 | 
			
		||||
          if (res != null) res.clear();
 | 
			
		||||
 | 
			
		||||
          if (embed != null) event.getChannel().sendMessage(embed).queue();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      }).exceptionally((err) -> {
 | 
			
		||||
        event.getMessage().delete().queue();
 | 
			
		||||
        MessageEmbed embed = error(event, err, attachment.getFileName());
 | 
			
		||||
        if (embed != null) event.getChannel().sendMessage(embed).queue();
 | 
			
		||||
        return null;
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void list(GuildMessageReceivedEvent event) {
 | 
			
		||||
    List<GuildSong> gsList = guildSongRepoService.getGuildSongRepo().findByGuild(guildId);
 | 
			
		||||
 | 
			
		||||
@@ -421,118 +377,6 @@ public class GuildMusicHandler {
 | 
			
		||||
    playing.set(true);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private MessageEmbed error(GuildMessageReceivedEvent event, Throwable ex, String fileName) {
 | 
			
		||||
    return new EmbedBuilder()
 | 
			
		||||
        .setTitle("Unable to upload file: " + fileName)
 | 
			
		||||
        .setDescription("There was an error uploading your file: " + ex.getMessage() + ". Please contact admin")
 | 
			
		||||
        .setColor(Color.RED)
 | 
			
		||||
        .setTimestamp(OffsetDateTime.now())
 | 
			
		||||
        .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
 | 
			
		||||
        .build();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private MessageEmbed wrongFile(GuildMessageReceivedEvent event, String fileName) {
 | 
			
		||||
    return new EmbedBuilder()
 | 
			
		||||
        .setTitle("Invalid File: " + fileName)
 | 
			
		||||
        .setDescription("Only music type files are allowed to be uploaded")
 | 
			
		||||
        .setColor(Color.RED)
 | 
			
		||||
        .setTimestamp(OffsetDateTime.now())
 | 
			
		||||
        .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
 | 
			
		||||
        .build();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private MessageEmbed persistSong(Mp3UploadResults result, GuildMessageReceivedEvent event, String fileName) throws Exception {
 | 
			
		||||
 | 
			
		||||
    DiscordGuild guild = guildSongRepoService.getGuildRepo().findByGuildId(event.getGuild().getIdLong());
 | 
			
		||||
    if(guild == null) {
 | 
			
		||||
      throw new IOException("Unable to find guild in database. Please contact administrator");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    String hash = HashUtils.hash("SHA-1", result.getData());
 | 
			
		||||
 | 
			
		||||
    GuildSong gs = guildSongRepoService.getGuildSongRepo().findByGuildAndSongHash(event.getGuild().getIdLong(), hash);
 | 
			
		||||
    if (gs != null) {
 | 
			
		||||
      MessageEmbed embed = new EmbedBuilder()
 | 
			
		||||
          .setColor(Color.ORANGE)
 | 
			
		||||
          .setThumbnail(event.getGuild().getIconUrl())
 | 
			
		||||
          .setTitle("Upload Results for " + fileName)
 | 
			
		||||
          .setDescription(String.format("**%s** by __%s__ already exists. ID: `%s`", gs.getSong().getTitle(), gs.getSong().getArtist(), gs.getUuid()))
 | 
			
		||||
          .setTimestamp(OffsetDateTime.now())
 | 
			
		||||
          .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
 | 
			
		||||
          .build();
 | 
			
		||||
      return embed;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    Song song = guildSongRepoService.getSongRepo().findByFileHash(hash);
 | 
			
		||||
    if (song == null) {
 | 
			
		||||
 | 
			
		||||
      Path output = musicDir;
 | 
			
		||||
      if (result.getArtist() != null) {
 | 
			
		||||
        output = output.resolve(result.getArtist());
 | 
			
		||||
        if (result.getAlbum() != null) {
 | 
			
		||||
          output = output.resolve(result.getAlbum());
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      output = output.resolve(fileName);
 | 
			
		||||
 | 
			
		||||
      if (!Files.exists(output.toAbsolutePath().getParent())) {
 | 
			
		||||
        Files.createDirectories(output.toAbsolutePath().getParent());
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      Files.write(output, result.getData());
 | 
			
		||||
 | 
			
		||||
      song = new Song();
 | 
			
		||||
      song.setAlbum(result.getAlbum());
 | 
			
		||||
      song.setArtist(result.getArtist());
 | 
			
		||||
      song.setDateAdded(new Date());
 | 
			
		||||
      song.setDiscNumber(result.getDiscNumber());
 | 
			
		||||
      song.setFileHash(hash);
 | 
			
		||||
      song.setFilePath(output.toAbsolutePath().toString());
 | 
			
		||||
      song.setGenre(result.getGenre());
 | 
			
		||||
      song.setReleaseYear(result.getReleaseDate());
 | 
			
		||||
      song.setTitle(result.getTitle());
 | 
			
		||||
      song.setTrackNumber(result.getTrackNumber());
 | 
			
		||||
 | 
			
		||||
      guildSongRepoService.getSongRepo().save(song);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    gs = new GuildSong();
 | 
			
		||||
    gs.setDateAdded(new Date());
 | 
			
		||||
    gs.setGuild(guild);
 | 
			
		||||
    gs.setSong(song);
 | 
			
		||||
 | 
			
		||||
    String[] uuidArray = UUID.randomUUID().toString().split("-");
 | 
			
		||||
 | 
			
		||||
    gs.setUuid(uuidArray[uuidArray.length - 1]);
 | 
			
		||||
 | 
			
		||||
    guildSongRepoService.getGuildSongRepo().save(gs);
 | 
			
		||||
 | 
			
		||||
    EmbedBuilder builder = new EmbedBuilder()
 | 
			
		||||
        .setColor(Color.GREEN)
 | 
			
		||||
        .setThumbnail(event.getGuild().getIconUrl())
 | 
			
		||||
        .setTitle("Upload Results for " + fileName)
 | 
			
		||||
        .setTimestamp(OffsetDateTime.now())
 | 
			
		||||
        .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
 | 
			
		||||
        .addField("Title", result.getTitle(), true);
 | 
			
		||||
 | 
			
		||||
    if (!StringUtils.isBlank(result.getArtist()))         builder.addField("Artist", result.getArtist(), true);
 | 
			
		||||
    if (!StringUtils.isBlank(result.getAlbum())) 		      builder.addField("Album", result.getAlbum(), true);
 | 
			
		||||
    if (!StringUtils.isBlank(result.getTrackNumber())) 	  builder.addField("Track", result.getTrackNumber(), true);
 | 
			
		||||
    if (!StringUtils.isBlank(result.getDiscNumber())) 	  builder.addField("Disc", result.getDiscNumber(), true);
 | 
			
		||||
    if (!StringUtils.isBlank(result.getReleaseDate()))    builder.addField("Year", result.getReleaseDate(), true);
 | 
			
		||||
 | 
			
		||||
    builder.addField("ID", gs.getUuid(), true);
 | 
			
		||||
 | 
			
		||||
    MessageEmbed embed = builder.build();
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      guildSongRepoService.logEntry(event.getGuild().getIdLong(), "%s uploaded", result);
 | 
			
		||||
    } catch (Exception ex) {}
 | 
			
		||||
 | 
			
		||||
    return embed;
 | 
			
		||||
  } 
 | 
			
		||||
 | 
			
		||||
  private void listPlayList(GuildMessageReceivedEvent event, List<String> commands) {
 | 
			
		||||
    if (commands == null || commands.isEmpty()) {
 | 
			
		||||
      List<GuildPlaylist> userPlaylist = guildSongRepoService.getGuildPlaylistRepo().findByGuildAndUserIdFetchSongs(event.getGuild().getIdLong(), event.getMember().getIdLong());
 | 
			
		||||
@@ -947,7 +791,7 @@ public class GuildMusicHandler {
 | 
			
		||||
  private void sendMessage(GuildMessageReceivedEvent event, String msg) {
 | 
			
		||||
    event.getChannel().sendMessage(msg).queue();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  private void deleteMessage(Message msg) {
 | 
			
		||||
    try {
 | 
			
		||||
      msg.delete().complete();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user