Skip to content

Commit

Permalink
Fix bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
Evilur committed Nov 20, 2022
1 parent 7982d08 commit 16825d0
Show file tree
Hide file tree
Showing 5 changed files with 162 additions and 75 deletions.
4 changes: 3 additions & 1 deletion src/main/java/bragi/core/EventHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public void onMessageReceived (@NotNull MessageReceivedEvent event) {
case "ping" -> //Проверяем задержку отправки сообщений
GetPing.run(event);
case "join" -> //Подключаемся к голосовому каналу
JoinChannel.run(event);
JoinChannel.run(event, argument);
case "leave" -> //Покидаем голосовой канал
LeaveChannel.run(event);
case "list", "l" -> //Выводим состояние плейлиста
Expand All @@ -46,6 +46,8 @@ public void onMessageReceived (@NotNull MessageReceivedEvent event) {
SkipTracks.run(event, argument);
case "play", "p" -> //Воспроизводим отдельный трек или добавляем его в очередь
PlayTrack.run(event, argument);
case "attachment", "att" -> //Воспроизводим аудио-вложения
PlayAttachment.run(event);
case "next", "n" -> //Если нашелся неправильный трек, переходим к следующему результату
GetNextTrack.run(event, argument);
}
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/bragi/core/Methods.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import net.dv8tion.jda.api.entities.Message;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public final class Methods {
/** Метод для добавления трека в плейлист или его воспроизведения, в зависимости от состояния плейлиста
Expand Down Expand Up @@ -71,4 +76,32 @@ public void noMatches() { }

return trackInfo;
}

/** Метод для получения треков из вложений
* @param attachments Список вложений сообщения
* @return Список объектов с информацией о треке
*/
public static List<TrackInfo> getTracksFromAttachments(List<Message.Attachment> attachments) {
List<Message.Attachment> audioAttachments = new ArrayList<>(); //Список аудио-вложений
List<TrackInfo> result = new ArrayList<>(); //Список треков для возврата результата

for (Message.Attachment attachment : attachments) { //Проходимся циклом по вложениям
/* Если вложение — это аудиофайл, добавляем его в список */
if (Objects.requireNonNull(attachment.getContentType()).contains("audio"))
audioAttachments.add(attachment);
}

for (Message.Attachment attachment : audioAttachments) {
/* Создаем новый объект TrackInfo и присваиваем ему необходимые значения */
TrackInfo trackInfo = Methods.getTrackInfo(attachment.getProxyUrl());
trackInfo.setSource("Attachment"); //Устанавливаем информацию об источнике
trackInfo.setTrackIdentifier(attachment.getProxyUrl()); //Получаем url вложения
/* Если не удалось получить имя трека из метаданных, получаем его из имени вложения без расширения */
if (trackInfo.getTrackTitle() == null)
trackInfo.setTrackTitle(attachment.getFileName().replaceAll("\\..+$", ""));
result.add(trackInfo); //Добавляем полученный трек в результаты
}

return result; //Возвращаем результат
}
}
32 changes: 19 additions & 13 deletions src/main/java/bragi/core/event/JoinChannel.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,23 @@ public final class JoinChannel {
* @param event Событие получения сообщения
* @return True, если удалось подключиться. В противном случае - false
*/
public static boolean run(MessageReceivedEvent event) {
public static boolean run(MessageReceivedEvent event, String argument) {
AudioChannel audioChannel = Objects.requireNonNull(Objects.requireNonNull(event.getMember()).getVoiceState())
.getChannel(); //Получаем голосовой канал, к которому нужно присоединиться



/* Если в качестве аргумента был передан пользователь, получаем голосовой канал этого пользователя */
if (!event.getMessage().getMentions().getMembers().isEmpty()) {
audioChannel = Objects.requireNonNull(event.getMessage().getMentions().getMembers().get(0).getVoiceState())
.getChannel(); //Получаем голосовой канал
if (argument != null) { //Если бы передан аргумент
try {
/* Если в качестве аргумента был передан пользователь, получаем голосовой канал этого пользователя */
if (!event.getMessage().getMentions().getMembers().isEmpty())
audioChannel = Objects.requireNonNull(event.getMessage().getMentions().getMembers().get(0)
.getVoiceState()).getChannel(); //Получаем голосовой канал
else //В ином случае, пытаемся найти пользователя по id
audioChannel = Objects.requireNonNull(Objects.requireNonNull(event.getGuild().getMemberByTag(argument))
.getVoiceState()).getChannel(); //Получаем голосовой канал
} catch (Exception ignore) {
event.getChannel().sendMessage(":x:** Этот пользователь не находится в голосовом канале**").submit();
return false;
}

/* Если пользователь не в канале, выходим из метода */
if (audioChannel == null) {
Expand All @@ -39,20 +46,20 @@ public static boolean run(MessageReceivedEvent event) {
/* //Если бот не в голосовом канале */
if (!Objects.requireNonNull(Objects.requireNonNull(
event.getGuild()).getSelfMember().getVoiceState()).inAudioChannel()) {
if (Objects.requireNonNull(event.getMember()).getVoiceState().getChannel() ==
Objects.requireNonNull(Objects.requireNonNull(event.getGuild())
if (audioChannel == Objects.requireNonNull(Objects.requireNonNull(event.getGuild())
.getSelfMember().getVoiceState()).getChannel()) { //Если бот уже в этом канале
event.getChannel().sendMessage(":x:** Бот уже подключен к этому голосовому каналу**").submit();
} else {
AudioManager audioManager = Objects.requireNonNull(event.getGuild()).getAudioManager();
audioManager.openAudioConnection(audioChannel);

event.getChannel().sendMessage(String.format(":thumbsup:** Присоединился к каналу `%s`**",
Objects.requireNonNull(event.getMember().getVoiceState().getChannel()).getName())).submit();
Objects.requireNonNull(audioChannel).getName())).submit();
}
}
return true;
} catch (Exception ignore) {
System.out.println(ignore);
event.getChannel().sendMessage(":x:** Не удалось подключиться к голосовому каналу. Недостаточно прав**")
.submit();
return false;
Expand Down Expand Up @@ -87,16 +94,15 @@ public static boolean run(SlashCommandInteractionEvent event) {
/* //Если бот не в голосовом канале */
if (!Objects.requireNonNull(Objects.requireNonNull(
event.getGuild()).getSelfMember().getVoiceState()).inAudioChannel()) {
if (Objects.requireNonNull(event.getMember()).getVoiceState().getChannel() ==
Objects.requireNonNull(Objects.requireNonNull(event.getGuild())
if (audioChannel == Objects.requireNonNull(Objects.requireNonNull(event.getGuild())
.getSelfMember().getVoiceState()).getChannel()) { //Если бот уже в этом канале
event.reply(":x:** Бот уже подключен к этому голосовому каналу**").submit();
} else {
AudioManager audioManager = Objects.requireNonNull(event.getGuild()).getAudioManager();
audioManager.openAudioConnection(audioChannel);

event.reply(String.format(":thumbsup:** Присоединился к каналу** `%s`",
Objects.requireNonNull(event.getMember().getVoiceState().getChannel()).getName())).submit();
Objects.requireNonNull(audioChannel).getName())).submit();
}
}
return true;
Expand Down
78 changes: 70 additions & 8 deletions src/main/java/bragi/core/event/PlayAttachment.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,82 @@

import bragi.Bragi;
import bragi.core.Methods;
import bragi.core.Player;
import bragi.core.util.TrackInfo;
import net.dv8tion.jda.api.entities.Message.Attachment;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;

import java.util.List;
import java.util.Objects;

/** Класс для воспроизведения аудио-вложений */
public class PlayAttachment {
/** Метод для запуска воспроизведения аудио-вложений */
/** Метод для запуска воспроизведения аудио-вложений
* @param event Событие получения сообщения
*/
public static void run(MessageReceivedEvent event) {
boolean needToJoin = !Objects.requireNonNull(Objects.requireNonNull(event.getGuild()).getSelfMember()
.getVoiceState()).inAudioChannel();

/* Если нужно присоединяться, а пользователь не в голосовом канале */
if (needToJoin && !Objects.requireNonNull(Objects.requireNonNull(event.getMember()).getVoiceState())
.inAudioChannel()) {
event.getChannel().sendMessage(":x:** Вы должны находиться в голосовом канале**").submit();
return;
}

/* Получаем список треков из вложений */
List<TrackInfo> trackInfoList = Methods.getTracksFromAttachments(event.getMessage().getAttachments());

if (trackInfoList.isEmpty()) {
event.getChannel().sendMessage("**:x: Среди вложений не было аудио**").submit();
return;
}

/* Пытаемся подключиться к голосовому каналу, если надо */
if (needToJoin) {
if (!JoinChannel.run(event, null)) return; //Если не удалось подключиться к голосовому каналу
}

/* Пробегаем циклом по трекам и воспроизводим трек, либо добавляем его в плейлист, выводим результат */
for (byte i = 0; i < trackInfoList.size(); i++) {
try {
TrackInfo trackInfo = trackInfoList.get(i); //Получаем объект с информацией о треке

/* Добавляем трек в очередь или сразу воспроизводим его */
Methods.playTrackOrAddItToPlaylist(Bragi.Players.get(event.getGuild()), trackInfo);

/* Строка, в которую записываем результат */
String result = String
.format("**:notes: В плейлист добавлено: `%s`\n:watch: Продолжительность: `%s`**",
trackInfo.getTrackTitle(), trackInfo.getTrackDurationFormatted());

/* Если есть имя исполнителя */
result = trackInfo.getArtistName() != null ?
String.format("%s\n**:bust_in_silhouette: Исполнитель: `%s`**", result,
trackInfo.getArtistName()) : result;

if (i + 1 != trackInfoList.size()) //Если трек не последний, необходимо добавить разделитель
result += "\n**────────────────────**";

event.getChannel().sendMessage(result).submit(); //Выводим информацию
} catch (Exception ignore) { }
}
}

/** Метод для запуска воспроизведения аудио-вложений
* @param event Событие получения команды
*/
public static void run(SlashCommandInteractionEvent event) {
Player player = Bragi.Players.get(event.getGuild()); //Экземпляр проигрывателя
String state = "В плейлист добавлено"; //Состояние плеера
boolean needToJoin = !Objects.requireNonNull(Objects.requireNonNull(event.getGuild()).getSelfMember()
.getVoiceState()).inAudioChannel();

/* Если нужно присоединяться, а пользователь не в голосовом канале */
if (needToJoin && !Objects.requireNonNull(Objects.requireNonNull(event.getMember()).getVoiceState())
.inAudioChannel()) {
event.getChannel().sendMessage(":x:** Вы должны находиться в голосовом канале**").submit();
return;
}

/* Получаем вложение */
Attachment attachment = Objects.requireNonNull(event.getOption("audio")).getAsAttachment();
Expand All @@ -27,8 +90,7 @@ public static void run(SlashCommandInteractionEvent event) {

/* Пытаемся подключиться к голосовому каналу, если плейлист пуст */
boolean alreadyReplied = false;
if (player.getPlaylist().isEmpty()) { //Если плейлист пуст
state = "Сейчас играет";
if (needToJoin) { //Если плейлист пуст
if (!JoinChannel.run(event)) return; //Если не удалось подключиться к голосовому каналу
else alreadyReplied = true; //В ином случае уже будет ответ
}
Expand All @@ -47,8 +109,8 @@ public static void run(SlashCommandInteractionEvent event) {

/* Строка, в которую записываем результат */
String result = String
.format("**:notes: %s: `%s`\n:watch: Продолжительность: `%s`**",
state, trackInfo.getTrackTitle(), trackInfo.getTrackDurationFormatted());
.format("**:notes: В плейлист добавлено: `%s`\n:watch: Продолжительность: `%s`**",
trackInfo.getTrackTitle(), trackInfo.getTrackDurationFormatted());

/* Если есть имя исполнителя */
result = trackInfo.getArtistName() != null ?
Expand Down
Loading

0 comments on commit 16825d0

Please sign in to comment.