Единственное универсальное решение - записывать id пользователя вместе с id сообщения. Когда админы будут отвечать на сообщение, сервер будет по его id доставать пользователя и писать ему.
Удаление кнопки - это изменение клавиатуры. Это делается методом editMessageReplyMarkup или другими методами, если необходимо изменить также и само сообщение.
Вместо каждого из console.log вы можете поставить функцию, одну и ту же, принимающую событие. Внутри этой функции через if else можно проверять параметр type передаваемого события.
Вы можете сохранять идентификатор первого сообщения, отправленного пользователю, и периодически незначительно обновлять текст сообщения. В ответ вы получаете объект Message, который содержит данные о чате.
Даже ориентироваться на media_group_id будет недостаточным, потому что пользователь может не сгруппировать фотографии, либо отправить файлы разных типов, в таком случае они так или иначе не сгруппируются. Надо переделываать логику бота с учетом того, что от пользователя в любой момент может придти несколько файлов.
В ReplyKeyboardMarkup используются кнопки без данных в отличии от InlineKeyboardMarkup, где у InlineKeyboardButton есть callback_data, в котором по нажатию можно передать скрытые данные. Так что надо либо использовать InlineKeyboardMarkup, либо записывать сессию пользователя на сервере.