Всё просто.
Есть несколько состояний: "Покой", "В поиске", "Общается". (Надо где-то хранить)
Где-то храним тех, кто в поиске.
И где-то храним пары, кто сейчас общается.
1. Переход "Покой" -> "В поиске" происходит, когда пользователь вводит соответсвующую команду (или нажимает на кнопку)
2. Переход "В поиске" -> "Общается" происходит, когда находится пара.
Кстати, нахождение пары можно сделать по каким-то критериям... (не суть)
Можно сделать поиск двумя способами.
1) В отдельном потоке ведётся поиск (много ресурсов)
2) Искать сразу же после перехода "Покой" -> "В поиске". Допустим, если никого не получилось найти, то можно написать о том, что придётся подождать. (Этот вариант более предпочтителен)
3. Если пользователь пишет что-то и у него состояние "Общается", то это может быть команда выхода (/exit) или сообщение (с медиа).
1) Если это /exit, то меняем состояние у обоих участников беседы на "Покой" (или "В поиске", главное, чтобы еще раз не встретились). И отправляем обоим сообщение о том, что переписка закончилась
2) Иначе пересылаем всё.
заносишь id человека в список, рандомно выбираешь другой id, удаляешь оба id из списка, и когда например 1-й человек пишет боту, то ты заносишь текст в переменную и отправляешь 2-му человеку, и наоборот.