diff --git a/src/main/java/main/config/BotStart.java b/src/main/java/main/config/BotStart.java index c1fed78..3e7b82a 100644 --- a/src/main/java/main/config/BotStart.java +++ b/src/main/java/main/config/BotStart.java @@ -13,10 +13,8 @@ import main.model.entity.ActiveGiveaways; import main.model.entity.Participants; import main.model.entity.Scheduling; -import main.model.repository.ActiveGiveawayRepository; -import main.model.repository.ListUsersRepository; -import main.model.repository.ParticipantsRepository; -import main.model.repository.SchedulingRepository; +import main.model.entity.Settings; +import main.model.repository.*; import main.threads.StopGiveawayByTimer; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; @@ -40,7 +38,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; -import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @@ -67,7 +64,7 @@ public class BotStart { private static final JSONParsers jsonParsers = new JSONParsers(); public static final String activity = "/help | "; //String - guildLongId - private static final ConcurrentMap mapLanguages = new ConcurrentHashMap<>(); + private static final ConcurrentMap mapLanguages = new ConcurrentHashMap<>(); @Getter private static JDA jda; @@ -84,6 +81,7 @@ public class BotStart { private final ListUsersRepository listUsersRepository; private final UpdateController updateController; private final SchedulingRepository schedulingRepository; + private final SettingsRepository settingsRepository; //DataBase @Value("${spring.datasource.url}") @@ -98,12 +96,14 @@ public BotStart(ActiveGiveawayRepository activeGiveawayRepository, ParticipantsRepository participantsRepository, ListUsersRepository listUsersRepository, UpdateController updateController, - SchedulingRepository schedulingRepository) { + SchedulingRepository schedulingRepository, + SettingsRepository settingsRepository) { this.activeGiveawayRepository = activeGiveawayRepository; this.participantsRepository = participantsRepository; this.listUsersRepository = listUsersRepository; this.updateController = updateController; this.schedulingRepository = schedulingRepository; + this.settingsRepository = settingsRepository; } @PostConstruct @@ -150,7 +150,7 @@ public synchronized void startBot() { System.out.println("IsDevMode: " + Config.isIsDev()); //Обновить команды -// updateSlashCommands(); + updateSlashCommands(); System.out.println("20:22"); } catch (Exception e) { e.printStackTrace(); @@ -177,13 +177,17 @@ private void updateSlashCommands() { .setDescriptionLocalization(DiscordLocale.RUSSIAN, "Примеры: 1, 2... Если не указано -> стандартное значение при запуске")); //Set language - List optionsLanguage = new ArrayList<>(); - optionsLanguage.add(new OptionData(STRING, "bot", "Setting the bot language") + List optionsSettings = new ArrayList<>(); + optionsSettings.add(new OptionData(STRING, "language", "Setting the bot language") .addChoice("\uD83C\uDDEC\uD83C\uDDE7 English Language", "eng") .addChoice("\uD83C\uDDF7\uD83C\uDDFA Russian Language", "rus") .setRequired(true) .setDescriptionLocalization(DiscordLocale.RUSSIAN, "Настройка языка бота")); + optionsSettings.add(new OptionData(STRING, "color", "Embed color: #00FF00") + .setName("color") + .setDescriptionLocalization(DiscordLocale.RUSSIAN, "Embed цвет: #00FF00")); + //Scheduling Giveaway List optionsScheduling = new ArrayList<>(); @@ -302,10 +306,10 @@ private void updateSlashCommands() { .setGuildOnly(true) .setDescriptionLocalization(DiscordLocale.RUSSIAN, "Проверка разрешений бота")); - commands.addCommands(Commands.slash("language", "Setting language") - .addOptions(optionsLanguage) + commands.addCommands(Commands.slash("settings", "Bot settings") + .addOptions(optionsSettings) .setGuildOnly(true) - .setDescriptionLocalization(DiscordLocale.RUSSIAN, "Настройка языка") + .setDescriptionLocalization(DiscordLocale.RUSSIAN, "Настройки бота") .setDefaultPermissions(DefaultMemberPermissions.enabledFor(Permission.MANAGE_SERVER))); commands.addCommands(Commands.slash("start", "Create Giveaway") @@ -360,6 +364,7 @@ private void updateSlashCommands() { commands.addCommands(Commands.slash("cancel", "Cancel Giveaway") .setGuildOnly(true) + .setDefaultPermissions(DefaultMemberPermissions.enabledFor(Permission.ADMINISTRATOR)) .setDescriptionLocalization(DiscordLocale.RUSSIAN, "Отменить Giveaway")); commands.queue(); @@ -407,7 +412,7 @@ private void scheduleStartGiveaway() { Long role = scheduling.getRoleIdLong(); Boolean isOnlyForSpecificRole = scheduling.getIsForSpecificRole(); Long guildIdLong = scheduling.getGuildLongId(); - String guildId = String.valueOf(scheduling.getGuildLongId()); + Long guildId = scheduling.getGuildLongId(); Giveaway giveaway = new Giveaway( scheduling.getGuildLongId(), @@ -505,6 +510,7 @@ public void setGiveawayAndUsersInGift() { String url_image = activeGiveaways.getUrlImage(); long id_user_who_create_giveaway = activeGiveaways.getIdUserWhoCreateGiveaway(); Integer min_participants = activeGiveaways.getMinParticipants(); + boolean finishGiveaway = activeGiveaways.isFinishGiveaway(); Map participantsMap = new HashMap<>(); Set participantsList = activeGiveaways.getParticipants(); @@ -534,6 +540,7 @@ public void setGiveawayAndUsersInGift() { participantsRepository, listUsersRepository, giveawayData, + finishGiveaway, updateController); GiveawayRegistry instance = GiveawayRegistry.getInstance(); @@ -552,6 +559,10 @@ public void setGiveawayAndUsersInGift() { instance.putGiveawayTimer(guild_long_id, stopGiveawayByTimer, timer); } + + if (finishGiveaway) { + giveaway.stopGiveaway(count_winners); + } } catch (Exception e) { e.printStackTrace(); } @@ -559,9 +570,8 @@ public void setGiveawayAndUsersInGift() { } } - @Async - @Scheduled(fixedDelay = 240000, initialDelay = 25000) - public synchronized void updateUserList() { + @Scheduled(fixedDelay = 150, initialDelay = 25, timeUnit = TimeUnit.SECONDS) + public void updateUserList() { List giveawayDataList = new LinkedList<>(GiveawayRegistry.getAllGiveaway()); for (Giveaway giveaway : giveawayDataList) { try { @@ -573,8 +583,7 @@ public synchronized void updateUserList() { } } - @Async - public synchronized void updateGiveawayByGuild(Giveaway giveawayData) { + public void updateGiveawayByGuild(Giveaway giveawayData) { long guildIdLong = giveawayData.getGuildId(); boolean isForSpecificRole = giveawayData.isForSpecificRole(); long messageId = giveawayData.getMessageId(); @@ -671,20 +680,11 @@ public synchronized void updateGiveawayByGuild(Giveaway giveawayData) { private void getLocalizationFromDB() { try { - Connection connection = DriverManager.getConnection(URL_CONNECTION, USER_CONNECTION, PASSWORD_CONNECTION); - Statement statement = connection.createStatement(); - String sql = "SELECT * FROM language"; - ResultSet rs = statement.executeQuery(sql); - - while (rs.next()) { - mapLanguages.put(rs.getString("server_id"), rs.getString("language")); + List settingsList = settingsRepository.findAll(); + for (Settings settings : settingsList) { + mapLanguages.put(settings.getServerId(), settings); } - - rs.close(); - statement.close(); - connection.close(); - System.out.println("getLocalizationFromDB()"); - } catch (SQLException e) { + } catch (Exception e) { e.printStackTrace(); } } @@ -693,7 +693,7 @@ private boolean hasGift(long guildIdLong) { return GiveawayRegistry.getInstance().hasGiveaway(guildIdLong); } - public static Map getMapLanguages() { + public static Map getMapLanguages() { return mapLanguages; } } \ No newline at end of file diff --git a/src/main/java/main/controller/UpdateController.java b/src/main/java/main/controller/UpdateController.java index 0236781..4c2bcfb 100644 --- a/src/main/java/main/controller/UpdateController.java +++ b/src/main/java/main/controller/UpdateController.java @@ -27,10 +27,10 @@ public class UpdateController { //REPO private final ActiveGiveawayRepository activeGiveawayRepository; - private final LanguageRepository languageRepository; private final ParticipantsRepository participantsRepository; private final ListUsersRepository listUsersRepository; private final SchedulingRepository schedulingRepository; + private final SettingsRepository settingsRepository; //LOGGER private final static Logger LOGGER = Logger.getLogger(UpdateController.class.getName()); @@ -40,15 +40,15 @@ public class UpdateController { @Autowired public UpdateController(ActiveGiveawayRepository activeGiveawayRepository, - LanguageRepository languageRepository, ParticipantsRepository participantsRepository, ListUsersRepository listUsersRepository, - SchedulingRepository schedulingRepository) { + SchedulingRepository schedulingRepository, + SettingsRepository settingsRepository) { this.activeGiveawayRepository = activeGiveawayRepository; - this.languageRepository = languageRepository; this.participantsRepository = participantsRepository; this.listUsersRepository = listUsersRepository; this.schedulingRepository = schedulingRepository; + this.settingsRepository = settingsRepository; } public void registerBot(CoreBot coreBot) { @@ -99,10 +99,9 @@ private void slashEvent(@NotNull SlashCommandInteractionEvent event) { PredefinedCommand predefinedCommand = new PredefinedCommand(listUsersRepository, activeGiveawayRepository, participantsRepository); predefinedCommand.predefined(event, this); } - - case "language" -> { - LanguageCommand languageCommand = new LanguageCommand(languageRepository); - languageCommand.language(event); + case "settings" -> { + SettingsCommand settingsCommand = new SettingsCommand(settingsRepository); + settingsCommand.language(event); } case "list" -> { ListCommand listCommand = new ListCommand(participantsRepository); @@ -117,7 +116,7 @@ private void slashEvent(@NotNull SlashCommandInteractionEvent event) { changeCommand.change(event, this); } case "scheduling" -> { - SchedulingCommand schedulingCommand = new SchedulingCommand(schedulingRepository); + SchedulingCommand schedulingCommand = new SchedulingCommand(schedulingRepository, activeGiveawayRepository); schedulingCommand.scheduling(event); } case "participants" -> { @@ -142,7 +141,7 @@ private void slashEvent(@NotNull SlashCommandInteractionEvent event) { private void buttonEvent(@NotNull ButtonInteractionEvent event) { if (event.getGuild() == null) return; if (Objects.equals(event.getButton().getId(), event.getGuild().getId() + ":" + ButtonChangeLanguage.CHANGE_LANGUAGE)) { - ButtonChangeLanguage buttonChangeLanguage = new ButtonChangeLanguage(languageRepository); + ButtonChangeLanguage buttonChangeLanguage = new ButtonChangeLanguage(settingsRepository); buttonChangeLanguage.change(event); } } @@ -153,7 +152,7 @@ private void joinEvent(@NotNull GuildJoinEvent event) { } private void leaveEvent(@NotNull GuildLeaveEvent event) { - LeaveEvent leaveEvent = new LeaveEvent(activeGiveawayRepository, languageRepository); + LeaveEvent leaveEvent = new LeaveEvent(activeGiveawayRepository, schedulingRepository); leaveEvent.leave(event); } diff --git a/src/main/java/main/core/events/ButtonChangeLanguage.java b/src/main/java/main/core/events/ButtonChangeLanguage.java index d213415..12f3274 100644 --- a/src/main/java/main/core/events/ButtonChangeLanguage.java +++ b/src/main/java/main/core/events/ButtonChangeLanguage.java @@ -2,44 +2,45 @@ import main.config.BotStart; import main.jsonparser.JSONParsers; -import main.model.entity.Language; -import main.model.repository.LanguageRepository; +import main.model.entity.Settings; +import main.model.repository.SettingsRepository; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Objects; - @Service public class ButtonChangeLanguage { - private final LanguageRepository languageRepository; + private final SettingsRepository settingsRepository; public static final String CHANGE_LANGUAGE = "CHANGE_LANGUAGE"; private static final JSONParsers jsonParsers = new JSONParsers(); private static final String FLAG_RUS = "\uD83C\uDDF7\uD83C\uDDFA"; //🇷🇺 @Autowired - public ButtonChangeLanguage(LanguageRepository languageRepository) { - this.languageRepository = languageRepository; + public ButtonChangeLanguage(SettingsRepository settingsRepository) { + this.settingsRepository = settingsRepository; } public void change(@NotNull ButtonInteractionEvent event) { + if (event.getGuild() == null) return; + long guildId = event.getGuild().getIdLong(); + event.deferEdit().queue(); if (event.getButton().getEmoji() != null) { String buttonName = event.getButton().getEmoji().getName().contains(FLAG_RUS) ? "rus" : "eng"; event.editButton(event.getButton().asDisabled()).queue(); - Language language = new Language(); - language.setServerId(Objects.requireNonNull(event.getGuild()).getId()); - language.setLanguage(buttonName); - languageRepository.save(language); + Settings settings = new Settings(); + settings.setServerId(guildId); + settings.setLanguage(buttonName); + settingsRepository.save(settings); - BotStart.getMapLanguages().put(event.getGuild().getId(), buttonName); - String buttonLanguage = String.format(jsonParsers.getLocale("button_language", event.getGuild().getId()), buttonName); + BotStart.getMapLanguages().put(guildId, settings); + String buttonLanguage = String.format(jsonParsers.getLocale("button_language", guildId), buttonName); event.getHook().sendMessage(buttonLanguage).setEphemeral(true).queue(); } } -} +} \ No newline at end of file diff --git a/src/main/java/main/core/events/ChangeCommand.java b/src/main/java/main/core/events/ChangeCommand.java index abcae12..1720414 100644 --- a/src/main/java/main/core/events/ChangeCommand.java +++ b/src/main/java/main/core/events/ChangeCommand.java @@ -30,9 +30,8 @@ public ChangeCommand(ActiveGiveawayRepository activeGiveawayRepository) { } public void change(@NotNull SlashCommandInteractionEvent event, UpdateController updateController) { - var guildIdLong = Objects.requireNonNull(event.getGuild()).getIdLong(); - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = Objects.requireNonNull(event.getGuild()).getIdLong(); Giveaway giveaway = GiveawayRegistry.getInstance().getGiveaway(guildIdLong); if (giveaway == null) { diff --git a/src/main/java/main/core/events/CheckBot.java b/src/main/java/main/core/events/CheckBot.java index ed85f89..bfb0f1d 100644 --- a/src/main/java/main/core/events/CheckBot.java +++ b/src/main/java/main/core/events/CheckBot.java @@ -17,7 +17,7 @@ public class CheckBot { private static final JSONParsers jsonParsers = new JSONParsers(); public void check(@NotNull SlashCommandInteractionEvent event) { - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = Objects.requireNonNull(event.getGuild()).getIdLong(); GuildChannelUnion textChannel = event.getOption("textchannel", OptionMapping::getAsChannel); GuildChannel guildChannel = textChannel != null ? textChannel : event.getGuildChannel().asTextChannel(); diff --git a/src/main/java/main/core/events/HelpCommand.java b/src/main/java/main/core/events/HelpCommand.java index bc07e36..1e36600 100644 --- a/src/main/java/main/core/events/HelpCommand.java +++ b/src/main/java/main/core/events/HelpCommand.java @@ -20,7 +20,7 @@ public class HelpCommand { private final static JSONParsers jsonParsers = new JSONParsers(); public void help(@NotNull SlashCommandInteractionEvent event) { - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = Objects.requireNonNull(event.getGuild()).getIdLong(); EmbedBuilder info = new EmbedBuilder(); info.setColor(Color.GREEN); diff --git a/src/main/java/main/core/events/LanguageCommand.java b/src/main/java/main/core/events/LanguageCommand.java deleted file mode 100644 index 9b8f631..0000000 --- a/src/main/java/main/core/events/LanguageCommand.java +++ /dev/null @@ -1,47 +0,0 @@ -package main.core.events; - -import main.config.BotStart; -import main.jsonparser.JSONParsers; -import main.model.entity.Language; -import main.model.repository.LanguageRepository; -import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; -import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.awt.*; -import java.util.Objects; - -@Service -public class LanguageCommand { - - private final LanguageRepository languageRepository; - - private static final JSONParsers jsonParsers = new JSONParsers(); - - @Autowired - public LanguageCommand(LanguageRepository languageRepository) { - this.languageRepository = languageRepository; - } - - public void language(@NotNull SlashCommandInteractionEvent event) { - var guildId = Objects.requireNonNull(event.getGuild()).getId(); - - BotStart.getMapLanguages().put(guildId, event.getOptions().get(0).getAsString()); - - String lang = event.getOptions().get(0).getAsString().equals("rus") ? "Русский" : "English"; - String buttonLanguage = String.format(jsonParsers.getLocale("button_language", guildId), lang); - - EmbedBuilder button = new EmbedBuilder(); - button.setColor(Color.GREEN); - button.setDescription(buttonLanguage); - - event.replyEmbeds(button.build()).setEphemeral(true).queue(); - - Language language = new Language(); - language.setServerId(guildId); - language.setLanguage(event.getOptions().get(0).getAsString()); - languageRepository.save(language); - } -} diff --git a/src/main/java/main/core/events/LanguageHandler.java b/src/main/java/main/core/events/LanguageHandler.java index 38a9003..963a406 100644 --- a/src/main/java/main/core/events/LanguageHandler.java +++ b/src/main/java/main/core/events/LanguageHandler.java @@ -11,7 +11,7 @@ public class LanguageHandler { private static final JSONParsers jsonParsers = new JSONParsers(); public void handler(@NotNull SlashCommandInteractionEvent event, String json_line) { - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = Objects.requireNonNull(event.getGuild()).getIdLong(); String startInThread = jsonParsers.getLocale(json_line, guildId); event.reply(startInThread).queue(); } diff --git a/src/main/java/main/core/events/LeaveEvent.java b/src/main/java/main/core/events/LeaveEvent.java index 38162b6..9176d1f 100644 --- a/src/main/java/main/core/events/LeaveEvent.java +++ b/src/main/java/main/core/events/LeaveEvent.java @@ -1,7 +1,7 @@ package main.core.events; import main.model.repository.ActiveGiveawayRepository; -import main.model.repository.LanguageRepository; +import main.model.repository.SchedulingRepository; import net.dv8tion.jda.api.events.guild.GuildLeaveEvent; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; @@ -11,19 +11,20 @@ public class LeaveEvent { private final ActiveGiveawayRepository activeGiveawayRepository; - private final LanguageRepository languageRepository; + private final SchedulingRepository schedulingRepository; @Autowired - public LeaveEvent(ActiveGiveawayRepository activeGiveawayRepository, LanguageRepository languageRepository) { + public LeaveEvent(ActiveGiveawayRepository activeGiveawayRepository, + SchedulingRepository schedulingRepository) { this.activeGiveawayRepository = activeGiveawayRepository; - this.languageRepository = languageRepository; + this.schedulingRepository = schedulingRepository; } public void leave(@NotNull GuildLeaveEvent event) { try { System.out.println("Удаляем данные после удаления бота из Guild"); - languageRepository.deleteById(event.getGuild().getId()); activeGiveawayRepository.deleteById(event.getGuild().getIdLong()); + schedulingRepository.deleteById(event.getGuild().getIdLong()); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/main/core/events/ListCommand.java b/src/main/java/main/core/events/ListCommand.java index a83718a..f786596 100644 --- a/src/main/java/main/core/events/ListCommand.java +++ b/src/main/java/main/core/events/ListCommand.java @@ -28,7 +28,7 @@ public ListCommand(ParticipantsRepository participantsRepository) { public void list(@NotNull SlashCommandInteractionEvent event) { var guildIdLong = Objects.requireNonNull(event.getGuild()).getIdLong(); - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = Objects.requireNonNull(event.getGuild()).getIdLong(); event.deferReply().setEphemeral(true).queue(); if (GiveawayRegistry.getInstance().hasGiveaway(guildIdLong)) { diff --git a/src/main/java/main/core/events/ParticipantsCommand.java b/src/main/java/main/core/events/ParticipantsCommand.java index 3d10be2..12cba62 100644 --- a/src/main/java/main/core/events/ParticipantsCommand.java +++ b/src/main/java/main/core/events/ParticipantsCommand.java @@ -32,7 +32,7 @@ public ParticipantsCommand(ListUsersRepository listUsersRepository) { public void participants(@NotNull SlashCommandInteractionEvent event) { var userIdLong = event.getUser().getIdLong(); - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = Objects.requireNonNull(event.getGuild()).getIdLong(); event.deferReply().setEphemeral(true).queue(); String id = event.getOption("giveaway_id", OptionMapping::getAsString); diff --git a/src/main/java/main/core/events/PredefinedCommand.java b/src/main/java/main/core/events/PredefinedCommand.java index 6455196..7c1879f 100644 --- a/src/main/java/main/core/events/PredefinedCommand.java +++ b/src/main/java/main/core/events/PredefinedCommand.java @@ -43,7 +43,7 @@ public PredefinedCommand(ListUsersRepository listUsersRepository, ActiveGiveaway public void predefined(@NotNull SlashCommandInteractionEvent event, UpdateController updateController) { var guildIdLong = Objects.requireNonNull(event.getGuild()).getIdLong(); - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = Objects.requireNonNull(event.getGuild()).getIdLong(); var userIdLong = event.getUser().getIdLong(); if (GiveawayRegistry.getInstance().hasGiveaway(guildIdLong)) { @@ -72,7 +72,7 @@ public void predefined(@NotNull SlashCommandInteractionEvent event, UpdateContro String title = event.getOption("title", OptionMapping::getAsString); if (role != null) { - if (role.getId().equals(guildId)) { + if (role.getIdLong() == guildId) { String notificationForThisRole = String.format(jsonParsers.getLocale("gift_notification_for_everyone", guildId), "@everyone"); event.reply(notificationForThisRole).queue(); } diff --git a/src/main/java/main/core/events/ReactionEvent.java b/src/main/java/main/core/events/ReactionEvent.java index e1542e9..33566ac 100644 --- a/src/main/java/main/core/events/ReactionEvent.java +++ b/src/main/java/main/core/events/ReactionEvent.java @@ -51,7 +51,7 @@ public void reaction(@NotNull MessageReactionAddEvent event, UpdateController up LOGGER.info(String.format("\nНажал на эмодзи, но у него нет доступа к розыгрышу: %s", user.getId())); //Получаем ссылку на Giveaway - String buttonGiveawayNotAccess = String.format(jsonParsers.getLocale("button_giveaway_not_access", event.getGuild().getId()), url); + String buttonGiveawayNotAccess = String.format(jsonParsers.getLocale("button_giveaway_not_access", event.getGuild().getIdLong()), url); EmbedBuilder embedBuilder = new EmbedBuilder(); embedBuilder.setColor(Color.RED); embedBuilder.setDescription(buttonGiveawayNotAccess); diff --git a/src/main/java/main/core/events/RerollCommand.java b/src/main/java/main/core/events/RerollCommand.java index 7e38367..de54b47 100644 --- a/src/main/java/main/core/events/RerollCommand.java +++ b/src/main/java/main/core/events/RerollCommand.java @@ -32,7 +32,7 @@ public RerollCommand(ListUsersRepository listUsersRepository) { } public void reroll(@NotNull SlashCommandInteractionEvent event) { - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = Objects.requireNonNull(event.getGuild()).getIdLong(); event.deferReply().queue(); String id = event.getOption("giveaway_id", OptionMapping::getAsString); diff --git a/src/main/java/main/core/events/SchedulingCommand.java b/src/main/java/main/core/events/SchedulingCommand.java index ede4a8a..256fedf 100644 --- a/src/main/java/main/core/events/SchedulingCommand.java +++ b/src/main/java/main/core/events/SchedulingCommand.java @@ -1,16 +1,15 @@ package main.core.events; import main.giveaway.ChecksClass; -import main.giveaway.GiveawayRegistry; import main.giveaway.GiveawayUtils; import main.jsonparser.JSONParsers; +import main.model.entity.ActiveGiveaways; import main.model.entity.Scheduling; +import main.model.repository.ActiveGiveawayRepository; import main.model.repository.SchedulingRepository; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.channel.concrete.NewsChannel; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; -import net.dv8tion.jda.api.entities.channel.unions.GuildChannelUnion; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.OptionMapping; import org.jetbrains.annotations.NotNull; @@ -18,36 +17,40 @@ import org.springframework.stereotype.Service; import java.awt.*; -import java.sql.Timestamp; -import java.time.LocalDateTime; -import java.time.ZoneOffset; import java.util.Objects; +import static main.giveaway.GiveawayUtils.timeProcessor; + @Service public class SchedulingCommand { private final SchedulingRepository schedulingRepository; + private final ActiveGiveawayRepository activeGiveawayRepository; private static final JSONParsers jsonParsers = new JSONParsers(); @Autowired - public SchedulingCommand(SchedulingRepository schedulingRepository) { + public SchedulingCommand(SchedulingRepository schedulingRepository, + ActiveGiveawayRepository activeGiveawayRepository) { this.schedulingRepository = schedulingRepository; + this.activeGiveawayRepository = activeGiveawayRepository; } public void scheduling(@NotNull SlashCommandInteractionEvent event) { var guildIdLong = Objects.requireNonNull(event.getGuild()).getIdLong(); - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = event.getGuild().getIdLong(); var userIdLong = event.getUser().getIdLong(); - Long role = event.getOption("mention", OptionMapping::getAsLong); - String countString = event.getOption("count", OptionMapping::getAsString); - String title = event.getOption("title", OptionMapping::getAsString); - GuildChannelUnion textChannel = event.getOption("textchannel", OptionMapping::getAsChannel); - Message.Attachment image = event.getOption("image", OptionMapping::getAsAttachment); - String urlImage = image != null ? image.getUrl() : null; - Integer minParticipants = event.getOption("min_participants", OptionMapping::getAsInt); - String startTime = event.getOption("start_time", OptionMapping::getAsString); - String endTime = event.getOption("end_time", OptionMapping::getAsString); + var role = event.getOption("mention", OptionMapping::getAsLong); + var countString = event.getOption("count", OptionMapping::getAsString); + var title = event.getOption("title", OptionMapping::getAsString); + var textChannel = event.getOption("textchannel", OptionMapping::getAsChannel); + var image = event.getOption("image", OptionMapping::getAsAttachment); + var urlImage = image != null ? image.getUrl() : null; + var minParticipants = event.getOption("min_participants", OptionMapping::getAsInt); + var startTime = event.getOption("start_time", OptionMapping::getAsString); + var endTime = event.getOption("end_time", OptionMapping::getAsString); + var forbiddenRole = event.getOption("forbidden_role", OptionMapping::getAsRole); + boolean isOnlyForSpecificRole = Objects.equals(event.getOption("role", OptionMapping::getAsString), "yes"); if (textChannel == null) { event.reply("TextChannel is `Null`").queue(); @@ -57,28 +60,32 @@ public void scheduling(@NotNull SlashCommandInteractionEvent event) { boolean canSendGiveaway = ChecksClass.canSendGiveaway(textChannel, event); if (!canSendGiveaway) return; //Сообщение уже отправлено + //Обработать уведомление + event.deferReply().setEphemeral(true).queue(); + Scheduling scheduling = schedulingRepository.findByGuildLongId(guildIdLong); + ActiveGiveaways activeGiveaways = activeGiveawayRepository.findByGuildLongId(guildIdLong); - if (GiveawayRegistry.getInstance().hasGiveaway(guildIdLong)) { + if (activeGiveaways != null) { String messageGiftNeedStopGiveaway = jsonParsers.getLocale("message_gift_need_stop_giveaway", guildId); EmbedBuilder errors = new EmbedBuilder(); errors.setColor(Color.GREEN); errors.setDescription(messageGiftNeedStopGiveaway); - event.replyEmbeds(errors.build()).queue(); + event.getHook().sendMessageEmbeds(errors.build()).queue(); return; } else if (scheduling != null) { String messageGiftNeedStopGiveaway = jsonParsers.getLocale("message_gift_need_cancel_giveaway", guildId); EmbedBuilder errors = new EmbedBuilder(); errors.setColor(Color.GREEN); errors.setDescription(messageGiftNeedStopGiveaway); - event.replyEmbeds(errors.build()).queue(); + event.getHook().sendMessageEmbeds(errors.build()).queue(); return; } if ((startTime != null && !startTime.matches(GiveawayUtils.ISO_TIME_REGEX) || (endTime != null && !endTime.matches(GiveawayUtils.ISO_TIME_REGEX)))) { String wrongDate = jsonParsers.getLocale("wrong_date", guildId); - event.reply(wrongDate).queue(); + event.getHook().sendMessage(wrongDate).queue(); return; } @@ -86,7 +93,7 @@ public void scheduling(@NotNull SlashCommandInteractionEvent event) { int count = 1; if (countString != null) count = Integer.parseInt(countString); - if (minParticipants == null || minParticipants == 0 || minParticipants == 1) { + if (minParticipants == null || minParticipants < 2) { minParticipants = 2; } @@ -94,15 +101,13 @@ public void scheduling(@NotNull SlashCommandInteractionEvent event) { urlImage = image.getUrl(); } - boolean isOnlyForSpecificRole = Objects.equals(event.getOption("role", OptionMapping::getAsString), "yes"); - if (role == null && isOnlyForSpecificRole) { String slashErrorOnlyForThisRole = jsonParsers.getLocale("slash_error_only_for_this_role", guildId); - event.reply(slashErrorOnlyForThisRole).setEphemeral(true).queue(); + event.getHook().sendMessage(slashErrorOnlyForThisRole).setEphemeral(true).queue(); return; } else if (role != null && role == guildIdLong && isOnlyForSpecificRole) { String slashErrorRoleCanNotBeEveryone = jsonParsers.getLocale("slash_error_role_can_not_be_everyone", guildId); - event.reply(slashErrorRoleCanNotBeEveryone).setEphemeral(true).queue(); + event.getHook().sendMessage(slashErrorRoleCanNotBeEveryone).setEphemeral(true).queue(); return; } @@ -139,18 +144,10 @@ public void scheduling(@NotNull SlashCommandInteractionEvent event) { start.setColor(Color.GREEN); start.setDescription(scheduleStart); - event.replyEmbeds(start.build()).setEphemeral(true).queue(); + event.getHook().sendMessageEmbeds(start.build()).setEphemeral(true).queue(); } else { String startInNotTextChannels = jsonParsers.getLocale("start_in_not_text_channels", guildId); - event.reply(startInNotTextChannels).queue(); + event.getHook().sendMessage(startInNotTextChannels).queue(); } } - - private Timestamp timeProcessor(String time) { - if (time == null) return null; - ZoneOffset offset = ZoneOffset.UTC; - LocalDateTime localDateTime = LocalDateTime.parse(time, GiveawayUtils.FORMATTER); - long toEpochSecond = localDateTime.toEpochSecond(offset); - return new Timestamp(toEpochSecond * 1000); - } -} +} \ No newline at end of file diff --git a/src/main/java/main/core/events/SettingsCommand.java b/src/main/java/main/core/events/SettingsCommand.java new file mode 100644 index 0000000..8461bc2 --- /dev/null +++ b/src/main/java/main/core/events/SettingsCommand.java @@ -0,0 +1,78 @@ +package main.core.events; + +import main.config.BotStart; +import main.giveaway.GiveawayUtils; +import main.jsonparser.JSONParsers; +import main.model.entity.Settings; +import main.model.repository.SettingsRepository; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.awt.*; +import java.util.Optional; + +@Service +public class SettingsCommand { + + private final SettingsRepository settingsRepository; + + private static final JSONParsers jsonParsers = new JSONParsers(); + + @Autowired + public SettingsCommand(SettingsRepository settingsRepository) { + this.settingsRepository = settingsRepository; + } + + public void language(@NotNull SlashCommandInteractionEvent event) { + if (event.getGuild() == null) return; + var guildId = event.getGuild().getIdLong(); + + Optional optionalSettings = settingsRepository.findById(guildId); + Settings settings; + + String language = event.getOptions().get(0).getAsString(); + if (optionalSettings.isPresent()) { + settings = optionalSettings.get(); + settings.setLanguage(language); + } else { + settings = new Settings(); + settings.setServerId(guildId); + settings.setLanguage(language); + } + + if (event.getOptions().size() > 1) { + String color = event.getOptions().get(1).getAsString(); + if (color.length() == 7) { + char firstChar = color.charAt(0); + if (firstChar == '#') { + settings.setColorHex(color.toUpperCase()); + } + } else { + String settingsColorError = jsonParsers.getLocale("settings_color_error", guildId); + event.reply(settingsColorError).setEphemeral(true).queue(); + return; + } + } + + BotStart.getMapLanguages().put(guildId, settings); + + String lang = language.equals("rus") ? "Русский" : "English"; + String buttonLanguage; + if (event.getOptions().size() > 1) { + buttonLanguage = String.format(jsonParsers.getLocale("button_language_color", guildId), lang, settings.getColorHex()); + } else { + buttonLanguage = String.format(jsonParsers.getLocale("button_language", guildId), lang); + } + + EmbedBuilder button = new EmbedBuilder(); + Color userColor = GiveawayUtils.getUserColor(guildId); + button.setColor(userColor); + button.setDescription(buttonLanguage); + + event.replyEmbeds(button.build()).setEphemeral(true).queue(); + settingsRepository.save(settings); + } +} \ No newline at end of file diff --git a/src/main/java/main/core/events/StartCommand.java b/src/main/java/main/core/events/StartCommand.java index 43ac870..bc24dc0 100644 --- a/src/main/java/main/core/events/StartCommand.java +++ b/src/main/java/main/core/events/StartCommand.java @@ -49,7 +49,7 @@ public void start(@NotNull SlashCommandInteractionEvent event, UpdateController if (!canSendGiveaway) return; //Сообщение уже отправлено var guildIdLong = Objects.requireNonNull(event.getGuild()).getIdLong(); - var guildId = Objects.requireNonNull(event.getGuild()).getId(); + var guildId = Objects.requireNonNull(event.getGuild()).getIdLong(); var userIdLong = event.getUser().getIdLong(); String title = event.getOption("title", OptionMapping::getAsString); String countString = event.getOption("count", OptionMapping::getAsString); diff --git a/src/main/java/main/core/events/StopCommand.java b/src/main/java/main/core/events/StopCommand.java index e7e1f47..8f84c18 100644 --- a/src/main/java/main/core/events/StopCommand.java +++ b/src/main/java/main/core/events/StopCommand.java @@ -19,10 +19,10 @@ public class StopCommand { private static final JSONParsers jsonParsers = new JSONParsers(); public void stop(@NotNull SlashCommandInteractionEvent event) { - var guildId = Objects.requireNonNull(event.getGuild()).getId(); - var guildIdLong = event.getGuild().getIdLong(); + if (event.getGuild() == null) return; + var guildId = event.getGuild().getIdLong(); - Giveaway giveaway = GiveawayRegistry.getInstance().getGiveaway(guildIdLong); + Giveaway giveaway = GiveawayRegistry.getInstance().getGiveaway(guildId); if (giveaway == null) { String slashStopNoHas = jsonParsers.getLocale("slash_stop_no_has", guildId); EmbedBuilder notHas = new EmbedBuilder(); @@ -33,19 +33,20 @@ public void stop(@NotNull SlashCommandInteractionEvent event) { } //Это для того чтобы когда мы останавливаем Giveaway повторно + if (giveaway.isFinishGiveaway()) { + EmbedBuilder errorsAgain = new EmbedBuilder(); + String errorsWithApi = jsonParsers.getLocale("errors_with_api", guildId); + String errorsDescriptionsAgain = jsonParsers.getLocale("errors_descriptions_again", guildId); + errorsAgain.setColor(Color.RED); + errorsAgain.setTitle(errorsWithApi); + errorsAgain.setDescription(errorsDescriptionsAgain); + List