# Как использовать T-Hist для генерации статистики неподдерживаемых мейлеров

Чтобы использовать `T-Hist` вместе с мейлерами, которые он не поддерживает, необходимо сконвертировать логи мейлеров в один из форматов бинарных логов, понимаемых `T-Hist`.
Проще всего использовать формат бинарного лога `Binkd` и `T-Mail` до версии 2603 (так называемый старый формат).

Файл бинарного лога `Binkd` состоит из записей длиной 28 байт. Каждая запись имеет следующую структуру:
```C
struct {
    u16    fZone;		// номер зоны FTN-адреса
    u16    fNet;		// номер сети FTN-адреса
    u16    fNode;		// номер узла FTN-адреса
    u16    fPoint;		// номер пойнта FTN-адреса
    u32    fSTime;		// Unix-время начала сессии
    u32    fLTime;		// длительность сессии в секундах
    u32    fBReceive;	// количество принятых байт
    u32    fBSent;		// количество отправленных байт
    u8     fFReceive;	// количество принятых файлов
    u8     fFSent;   	// количество отправленных файлов
    u16    fStatus;   	// статус сессии
} TS;

// u8  - unsigned char 8 bit
// u16 - unsigned int 16 bit
// u32 - unsigned int 32 bit

// Статус сессии fStatus:
//	1 - успешно завершившаяся исходящая сессия
//	2 - успешно завершившаяся входящая сессия
//	3 - любая завершившаяся с ошибкой сессия (например, оборванная)
```

Описание структуры бинарного лога взято из репозитория `Binkd` на [GitHub](https://github.com/pgul/binkd),
файл https://github.com/pgul/binkd/blob/master/binlog.c

`T-Hist` при обработке бинарного лога не использует информацию о количестве принятых и отправленных файлов (`fFReceive` и `fFSent`), поэтому эти поля можно оставить пустыми.

Также следует отметить, что указанное в статусе направление сессии (входящая или исходящая) у `Binkd` противоположно тому, как указывает направление `T-Mail`.
Поэтому при обработке бинарного лога `Binkd` в конфигурационном файле необходимо использовать параметр `SwapInOut Yes`.
Если при конвертации в бинарный лог записывать статус сессии так:
```C
// Статус сессии fStatus:
//	1 - успешно завершившаяся входящая сессия
//	2 - успешно завершившаяся исходящая сессия
//	3 - любая завершившаяся с ошибкой сессия (например, оборванная)
```
то параметр `SwapInOut Yes` не нужен.
