Насчет ди не скажу, бот был для внутренних нужд, поэтому писал на Groovy и производительность скорее всего там будет под вопросом, плюшкой был простой dsl, в котором можно было описывать какие-то дополнительные команды, но этот функционал был сырой. Проверка прав через casbin. В основе что-то вроде паттерна команда (отдельно условие, по которому обрабатывается запрос и отдельно действие, которое вызывается), сам запрос идет через middleware, да и сама структура была похожа на простой веб-фреймворк request-response. Мультиязычность я сразу так и закладывал в сами команды, что /help и /помощь работали одинаково, хотя для множества языков такой себе способ. Получились команды двух видов - активные, которые запускаются по таймеру и отсылают там картинке в чат и пассивные - когда бот реагирует на команду от юзера. Админ может запросить просмотр активных и пассивных команд и выключать\включать их и т.п.
Но вот когда стала нужна клавиатура и прочая интерактивность, то начинаются проблемы и такая архитектура начинает напрягаться, появился диалог, который может быть с вопросом и без. Еще помню как по привычке сделал валидацию id чата на неотрицательное число и оно у меня навернулось). Еще боту прилетали разные команды в чатах и при прямой команде, что-то там нужно было вырезать то ли слеш, то ли еще что. В общем, такое себе, мне не особенно понравилась затея. Мне кажется какая-то аналогия с PHP - для кейса запрос-ответ хорошо подходит, но когда нужна интерактивность, очередность, сохранение состояния и т.п. начинаются проблемы.