Мессенджер для локальной сети: десктопное приложение, сервер и веб-версия на одном протоколе.
Обмен сообщениями и файлами, групповые чаты, голосовая связь. Разворачивается копированием папки, без базы данных, контейнеров и внешних сервисов. Работает в изолированной сети без доступа в интернет.
Веб-версия открывается без установки: awpmastergames.github.io/Tebegram
Десктопное приложение: последний релиз, файл TebegramSetup-2.0.2.exe.
Наведите камеру телефона на код, чтобы открыть веб-версию. Страница добавляется на главный экран как обычное приложение.
- Возможности
- Быстрый старт
- Архитектура
- Структура репозитория
- Технологии
- Ограничения и планы
- Документация
| Раздел | Что реализовано |
|---|---|
| Переписка | личные и групповые чаты, папки, поиск по контактам и по всем пользователям сервера |
| Статусы сообщений | часики, затем галочка при приёме сервером, затем две галочки после открытия чата собеседником; красный восклицательный знак при ошибке |
| Файлы | любой тип размером до 16 МБ, превью фотографий и видео в чате, индикатор загрузки |
| Кэш медиаданных | скачанное хранится локально и повторно не загружается; объём и очистка доступны в настройках |
| Голосовая связь | звонки между двумя компьютерами либо между двумя браузерами, шумоподавление и нормализация громкости |
| Оформление | светлая и тёмная темы, переключение без перезапуска приложения |
| Веб-версия | PWA: устанавливается на телефон, работает офлайн, обновляется автоматически |
| Установка | установщик Windows с проверкой обновлений |
Требуется .NET 8 SDK. Сервер собирается под любой системой, десктопный клиент - только под Windows.
cd Tebegram-server
dotnet runСервер слушает порт 5000. Проверка: открыть http://localhost:5000/Test, ответ должен быть HI!.
dotnet run --project Tebegram-clientЛибо загрузить готовый установщик со страницы релизов.
Опубликованная копия доступна по адресу awpmastergames.github.io/Tebegram: устанавливать ничего не требуется, страница сама находит адрес сервера. Запущенный локально сервер раздаёт ту же версию по адресу http://localhost:5000/app.
При входе в левом верхнем углу выбирается источник адреса. Вариант «main» берёт адрес из файла Adress.txt в этом репозитории, вариант «Другой» позволяет ввести адрес вручную. Выбор сохраняется между запусками. Такая схема применяется потому, что сервер обычно поднимается за туннелем со сменным адресом.
┌──────────────────┐ ┌──────────────────┐
│ Клиент Windows │ │ Веб-клиент PWA │
│ C#, WPF │ │ JavaScript │
└────────┬─────────┘ └─────────┬────────┘
│ │
│ HTTP: запрос и ответ │
│ WebSocket: доставка по инициативе │
│ сервера │
└──────────────────┬───────────────────────────┘
▼
┌──────────────────┐
│ Сервер │
│ ASP.NET Core │
│ Minimal API │
└────────┬─────────┘
▼
┌──────────────────┐
│ Хранилище │
│ файлы, без СУБД │
└──────────────────┘
По HTTP выполняется то, что инициирует пользователь: вход, загрузка истории переписки, отправка файлов. По WebSocket приходит то, что должно появляться без запроса: новое сообщение, отметка о прочтении, входящий звонок. Периодический опрос сервера не применяется.
Оба клиента обращаются к серверу одинаково: одни и те же эндпоинты, единый формат сообщений, единый протокол передачи голоса. Веб-версия является вторым интерфейсом к той же системе, а не отдельным продуктом. Третий клиент добавляется без изменений серверной части.
| Путь | Содержимое |
|---|---|
Tebegram-client/ |
десктопное приложение под Windows: C#, WPF, .NET 8 |
Tebegram-server/ |
сервер: C#, ASP.NET Core, Minimal API |
docs/ |
веб-клиент PWA; эта же папка опубликована через GitHub Pages по адресу awpmastergames.github.io/Tebegram |
Installer/ |
сборка установщика на Inno Setup |
Adress.txt |
адрес сервера; клиенты читают первую строку при выборе источника «main» |
Tebegram-client/Adress.txt |
зеркало предыдущего файла для установленных клиентов версии 2.0.0; адрес в обоих файлах должен совпадать |
version.txt |
версия последнего релиза, по ней работает проверка обновлений |
C#, WPF, .NET 8. Интерфейс построен на привязке данных, элементы управления переопределены собственными шаблонами. Звук обрабатывается библиотекой NAudio; фильтрация, шумовой гейт и нормализация громкости реализованы самостоятельно.
C#, ASP.NET Core в стиле Minimal API. Около 26 HTTP-эндпоинтов и два канала WebSocket: для сообщений и для голоса. Данные хранятся в файлах с автосохранением по таймеру.
Чистый JavaScript без фреймворков и без этапа сборки. Офлайн-работа обеспечивается service worker, звонки построены на Web Audio API и AudioWorklet, установка на телефон описана манифестом PWA.
Текстовый, со служебными разделителями. Общий для обоих клиентов, благодаря чему они взаимозаменяемы.
Проект учебный и рассчитан на доверенную локальную сеть. Известные слабые места перечислены ниже вместе с корректными решениями.
| Ограничение | Корректное решение |
|---|---|
| Пароли хранятся открытым текстом | хэширование алгоритмом bcrypt или Argon2 |
| Вход выполняется методом GET, пароль попадает в адрес и журналы | POST с телом запроса |
| WebSocket не проверяет подлинность подключения | токен сессии вместо идентификатора в адресе |
| Права на запросах не проверяются | проверка владельца на стороне сервера |
| Хранение в файлах: нет транзакций и индексов | переход на SQLite |
| Голос передаётся без сжатия | кодек Opus |
| Групповые звонки отсутствуют, комната рассчитана на двоих | микширование потоков на сервере |
| Материал | Содержание |
|---|---|
| Wiki проекта | описание, установка, запуск, ответы на вопросы, кейсы тестирования, история версий |
| Веб-клиент и установка на телефон | публикация PWA, установка на Android и iPhone |
| Сборка установщика | параметры Inno Setup, выпуск релиза |
| Форма обратной связи | отзывы и замечания пользователей |
