Подумай, что требуется для описания достижения:
1. Событие, которое вызвает его получение (сообщение, реакция, заход на канал, и т.д.)
2. Программный код, который получает данные о событии и обновляет состояние достижения (например, увеличивает счётчик сообщений). Он может сообщить, получено ли пользователем какое-то достижение вместе с этим событием.
3. База, где хранится информация о достижениях того или иного пользователя. В простейшем случае она будет иметь вид "пользователь-показатель-счётчик", т.е. например "вася - сообщения - 254". Код из п.2 будет читать этот показатель, увеличивать его, и если достигнуто желаемое значение, то выдавать сообщение. Для простоты можно хранить сообщения в отдельной таблице вида "показатель-порог-сообщение", тогда если показатель равен тому или иному порогу, бот должен послать соответствующее сообщение.
Отсюда получается, что бот или его компонент должен содержать набор маленьких процедур, которые устанавливают связь между событием и показателем. А после обновления показателя может использоваться общая логика, которая проверит, не достигнут ли очередной порог.