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