Releases: voidforge-community/VoidBot
Release list
2.0.0-beta.5
Изменения на 06.07.2026
Бот 2.0.0-beta.5 (dev)
[ADD] Команда /feedback (скрытая, MANAGE_SERVER): постит embed-«приёмную» в channel.feedback.message с кнопками 💡/Feedback.java, FeedbackListener.onButtonInteraction)
[ADD] Обработка идей/жалоб через Modal (TextInput PARAGRAPH, 10–2000 символов) + EntitySelectMenu (SelectTarget.USER, requiredRange 1) для выбора цели жалобы (Modal.create, Label.of(label, input) для JDA 6.3.1)
[ADD] Кнопки ✅Одобрить/❌Отклонить на embed'е обращения; approve → перестройка embed (зелёный, копия полей + «Одобрил модератор») + DM автору; reject → modal причины → перестройка (красный + «Причина отклонения») + DM автору; требуют Permission.MANAGE_SERVER (ButtonStyle.SUCCESS/DANGER, setComponents(Collections.emptyList()))
[ADD] Система уровней: LevelService.requiredXpForLevel(level)=floor(base*growth^level), по умолч. base=100, growth=1.2 (+20%/уровень); XP за сообщения (xp-per-message, кулдаун message-cooldown-seconds) и за минуты в войсе (xp-per-voice-minute); level-up embed в levels.channel или в ЛС
[ADD] Команда /rank [user]: генерация PNG-карточки (900×240) через Java2D (RankCardRenderer): круглый аватар + статус-бейдж, имя с ellipsis, строка «Ур.N ◦ Опыт:X/Y ◦ Войс:NдHчMм ◦ Всего:N» с цветными частями, прогресс-бар, листья; отправка как FileUpload.fromData(image, "rank-<id>.png") через event.deferReply().getHook()
[ADD] Команда /serverstats [period] (today/week/all): embed с участниками (MemberEventRepository.countByTypeSince), активностью (MessageRepository.countAll/countSince/countDeleted, VoiceSessionRepository.sumAllDurationSeconds/countAllSessions), модерацией (Warn/Ban/MuteRepository.countAll/countActive), топ-5 по XP (ExperienceRepository.topByGuild)
[ADD] Команда /userinfo [user]: профиль — базовое (JDA: аватар, имя, ID, даты, роли, статус) + из БД (уровень/опыт/всего XP, войс-тайм через sumDurationSecondsByUser, варны через WarnRepository.countAll, активные баны/муты через countActive)
[ADD] Команда /serverinfo: ID/владелец/создание/участники/роли/бусты/каналы (text/voice/categories)/верификация/локаль + аналитика из БД (сообщения/войс/сессии/входы/баны/кики/варны)
[ADD] Подкоманда /mod warn (Warn.java): опции target-user/reason, права MODERATE_MEMBERS, canInteract-проверки, сохранение в warns + StatisticsService.onWarn + embed с общим числом варнов
[ADD] /mod ban (Ban.java) — после guild.ban().queue(success -> persistBan(...)) создаёт Ban с expiredAt для tempban
[ADD] /mod mute (Mute.java) — после timeoutFor().queue(success -> persistMute(...)) создаёт Mute с expiredAt
[ADD] Полный слой БД: MigrationInterface + MigrationManager (таблица schema_migrations, сортировка по version, пропуск применённых); DatabaseDialect (SQLite/MySQL: idColumn(), boolType()); 11 миграций (v1–v11, все CREATE TABLE IF NOT EXISTS с formatted(idColumn)): users, messages, voice_sessions, member_events, warns, bans, mutes, experience, daily_statistics, user_daily_statistics, server_statistics
[ADD] JdbcRepository<T> базовый (findById/findAll/deleteById/generatedId/prepareInsert) + 10 репозиториев: UserRepository, MessageRepository, VoiceSessionRepository, MemberEventRepository, WarnRepository, BanRepository, MuteRepository, DailyStatisticsRepository, UserDailyStatisticsRepository, ServerStatisticsRepository, ExperienceRepository (RepositoryManager агрегирует)
[ADD] MemberEventListener: JOIN/LEAVE/KICK/BAN/UNBAN (детект kick через retrieveAuditLogs().type(ActionType.KICK).limit(5) в течение 60с), сохранение в member_events, upsert в users (joined_at/left_at), StatisticsService.onMemberJoin/onMemberLeft
[ADD] MessageEventListener: запись каждого сообщения гильдии в messages + StatisticsService.onMessage + XP с кулдауном (ConcurrentHashMap<guildId+userId, timestamp>)
[ADD] MessageDeleteListener: onMessageDelete → MessageRepository.markDeleted + StatisticsService.onMessageDeleted
[ADD] StatisticsService: единый инкремент статистики (onMessage/onMessageDeleted/onMemberJoin/onMemberLeft/onVoiceMinutes/onWarn/onCommand) с atomic upsert через DailyStatisticsRepository.increment и UserDailyStatisticsRepository.increment (column-whitelist regex messages|new_members|...)
[ADD] Локализация: system.runtime.profile=dev — пропуск LangRepositorySync.sync() (не затирает локальные правки языков); LangHelper.getInfoLocale(src, path, Map<String,String>) для %placeholders% (LevelService использует %server-name%/%level%/%required-experience%)
[ADD] Файлы локализаций: command/server/{rank,serverstats,userinfo,serverinfo}.yml, command/moderation/warn.yml, command/system/feedback.yml (формы, embed'ы, DM, статусы, ошибки, кнопки)
[ADD] Config.getLong/getDouble (через getNested() с instanceof Number + parseXxx fallback) — нужны для levels.base-xp/growth/xp-per-*/message-cooldown-seconds
[ADD] ICommand.isHidden() + ICommand.getDefaultPermissions() (по умолч. DefaultMemberPermissions.ENABLED); CommandRegister применяет DefaultMemberPermissions.DISABLED для скрытых команд
[FIX] SQLFeatureNotSupportedException от SQLite JDBC при getGeneratedKeys() — JdbcRepository.generatedId ловит исключение и возвращает 0; UserRepository/MessageRepository/VoiceSessionRepository делают fallback re-fetch по natural key (findByDiscordId/findByMessageId/findOpenByUser) после INSERT
[FIX] Войс-сессии «вечно открыты» в БД после рестарта: VoiceStateListener переписан — работает напрямую через БД (findOpenByUser/closeSession), без in-memory ConcurrentHashMap; OnReady вызывает cleanupOrphanedSessions() (одним UPDATE ... WHERE left_at IS NULL)
[FIX] Modal.setTitle лимит 45 символов — добавлен clip(s, max) (getModalTitle), защищает от крашей при fallback'ах локализации
[FIX] Локализация feedback: ключи fb. → feedback. (все вызовы getInfo выровнены с YAML-структурой); добавлены отсутствующие ключи embed.idea/user/mod.title+description, success, error.empty, footer-status.pending/decided, modal.reason.reject.label/placeholder
[DEL] Удалены core/events/EventManager.java (static singleton jda + getEventHandler()) и core/events/discord/EventHandler.java (утилита addEventListener/removeEventListener); все слушатели теперь регистрируются напрямую в JDALoader.init() через jda.addEventListener(new ...())
What's Changed
- Dev by @Dev-prizrakk in #3
Full Changelog: 2.0.0-beta.4...2.0.0-beta.5
2.0.0-BETA.4 VoidBot v2 Небольшие фиксы
Изменено
- Перемещение lavalink из command -> core
- Небольшая чистка кода
Добавлено
- Автосоздание веток для новостей и изменений
What's Changed
- 2.0.0-beta.4 by @Dev-prizrakk in #2
Full Changelog: 2.0.0-beta.3...2.0.0-beta.4
2.0.0-BETA.3 VoidBot v2 Большое техническое обновление
1. Функциональные изменения (что появилось)
- Перевод ядра в
core/*и обновление архитектуры загрузки. - Полноценная система регистрации slash-команд через
CommandRegister. - Поддержка subcommands (
ICommand/ISubCommand/SubCommand). - Реализованы категории команд:
FUN: avatar, calc, coinflip, joke, emote, rps.MUSIC: play, stop, pause, nowplaying, volume.SERVER: moderation + help.
- Реализованы модерационные subcommands:
- ban, kick, mute, unmute, unban.
- Локализация через константы
LangMessage+ синхронизация language-репозитория. - Голосовой стек:
- JDA
6.3.1 - интеграция Lavalink client
- подготовка/интеграция DAVE/JDAVE.
- JDA
- Переход проекта на Java 25.
- Рефакторинг логирования, ошибок и bootstrap-компонентов.
2. Риски/проверки перед merge
- Проверить runtime-конфиги и секреты (токены/API keys/DB).
- Проверить запуск voice-части (Lavalink node + DAVE/JDAVE + JVM флаги).
- Проверить регистрацию и обновление slash/subcommands на guild.
- Проверить локализации на отсутствие missing-key при вызове новых команд.
3. TODO / Backlog (на будущее)
- Сделать полноценную очередь музыки:
- skip, previous, clear, remove-by-index, shuffle, loop(track/queue), autoplay.
- Реструктуризовать архитектуру бота:
- разделить слои
domain / application / infrastructure, - убрать сильные статические зависимости (
Utils, глобальные singleton-паттерны), - выделить сервисы и интерфейсы для тестируемости.
- разделить слои
- Добавить новые команды:
- moderation: warn, purge, slowmode, role/massrole,
- music: queue, skip, loop, shuffle, seek, lyrics,
- utility: ping, serverinfo, userinfo, uptime.
- Реализовать систему уровней (после готовности сайта):
- события XP, анти-спам, роли за уровни, leaderboard, web-профиль.
- Ввести миграции БД (Flyway/Liquibase) и версионирование схем.
- Покрыть критические сценарии тестами (unit + integration):
- команды, permission-check, time-parser, localization fallback.
- Усилить обработку ошибок:
- единый error-code формат, tracing-id, user-safe сообщения.
- Привести music runtime к стабильному состоянию:
- корректный lifecycle плеера, reconnect, обработка node failover.
- Настроить CI/CD:
- build, tests, static analysis, release artifact.
- Секьюрность:
- вынести секреты в env/secret manager, ротация токенов.
- Документация:
- ADR по архитектуре, CONTRIBUTING, release-process, command-spec.
What's Changed
- Dev by @Dev-prizrakk in #1
New Contributors
- @Dev-prizrakk made their first contribution in #1
Full Changelog: https://github.com/voidforge-community/VoidBot/commits/2.0.0-beta.3
1.2.0
Full Changelog: 1.1.0...1.2.0
EN Release 1.2.0
🎵 Music Fixes & Localization Overhaul
🔧 Changes & Fixes:
- Fixed music issues for a smoother experience.
- Rewritten Configuration & Localization Storage – Now using YAML instead of properties files.
- Localization Rework – Now prioritizes user settings over guild settings:
- If a user has their own localization setting, it takes priority.
- If no user setting exists, default localization is used for personal messages.
- For servers, the localization set by guild administrators is applied.
- Minor bug fixes and improvements.
🚀 Enjoy the update and let us know if you find any issues!
RU Релиз 1.2.0
🎵 Исправление музыки и переработка локализации
🔧 Изменения и исправления:
- Исправлены ошибки с музыкой для более стабильной работы.
- Переписаны конфигурация и хранилище локализаций – теперь используется YAML вместо properties-файлов.
- Новая логика локализации – теперь приоритет отдается настройкам пользователя:
- Если у пользователя установлена локализация, она будет в приоритете.
- Если локализация не указана, для личных сообщений используется дефолтный язык.
- Для серверов (гильдий) применяется локализация, установленная администраторами.
- Небольшие исправления и улучшения.
🚀 Наслаждайтесь обновлением и сообщайте о найденных ошибках!
1.1.0
Full Changelog: 1.0.0...1.1.0
RU
Много фиксов, оптимизация кода, и немного нового функционала
Пофикшено
- Систему прав slash команд
- Систему добавления опыта за сообщения (Ошибка была в том что проверка была криво написана XD)
- Оптимизировал немного код
Добавлено
- Систему прав slash командам
- Консольные команды
- slash команда unmute
- больше информации в guild web api
- появилась сайт с информацией о боте
EN
A lot of fixes, code optimization, and some new functionality
Fixed
- The rights system of slash commands
- A system for adding experience for messages (The mistake was that the check was crookedly written XD)
- Optimized the code a bit
Added
- A system of rights for slash teams
- Console commands
- slash command unmute
- more information in the guild web api
- a website with information about the bot has appeared
Release 1.0.0
Это первичный релиз и надеюсь к этому релизу я с умел пофиксить все баги, недочеты и тд
Со списком команд вы можете ознакомится в документации я ее все еще дописываю
Docs: CookiesBot docs