Строки 112-115. Получение списка каналов. Подпрограмма list_channels () возвращает список доступных каналов путем отправки пользователю ряда сообщений о событиях CHANNEL_ITEM. К примеру, одним из таких каналов может быть анонсовая рассылка новостей с http://www.svoysite.info/ Она вызывает метод channels () класса ChatObjects::Channel для выборки списка всех каналов и оформляет информацию о каждом канале в виде сообщения о событии channel__iтем. Сообщение о событии содержит информацию, возвращенную методом info () объекта канала. В текущей реализации она состоит из названия канала, числа подключенных к нему пользователей и предназначенного для восприятия человеком описания канала.
Строки 116-118. Преобразование упакованного адреса клиента в ключ-хеша. Как было описано выше, системный вызов recv () может возвращать ненужные данные в неиспользуемых частях структуры адреса сокета, что может усложнить сравнение адресов клиентов. Метод key () нормализует адрес, преобразуя его в строку, пригодную для использования в качестве ключа хеша, путем распаковки адреса с помощью функции sockaddr_in() и последующего соединения адреса хоста и номера порта с использованием символа “r”. Теперь два пакета, отправленные из одного хоста и сокета, будут иметь одинаковые ключи.
Поскольку в модуле уже определен метод join (), необходимо обозначить встроенную функцию с тем же именем, как CORE::join (), для предотвращения путаницы.
Класс ChatObjects::Channel
И наконец, рассмотрим класс ChatObjects::Channel. Основное назначение его состоит в широковещательной рассылке сообщений всем текущим абонентам канала, когда какой-то пользователь присоединяется к каналу, покидает его или отправляет общедоступное сообщение. Класс выполняет это путем последовательного перебора всех пользователей, подключенных в настоящее время, и вызова их метода send () для передачи соответствующего сообщения о Событии.