Telegram Desktop — приложение для Windows — отзывы
Пользуюсь телеграм более трех лет. Решил создать еще один аккаунт в телеграм для упрощения задач и связи. Зарегистрировал аккаунт. Вступил в некоторые каналы, группы. И тут по понятно что за звиздец, мой аккаунт почему то.
Достоинства: Не вижу никаких плюсов
Недостатки: Ненадежная система с множеством недостатков
Читать весь отзыв Отзыв рекомендуют 6 1
Репутация
61
Россия, Истра
15 авг 2022
Как приложение топчик
К сожалению не нашел раздела о Телеграмм, как об экосистеме. Ибо с приложением, для любой платформы почти все окей. Есть только проблема в свободе слова, и эта проблема возникает уже везде. Я понимаю, когда люди.
Достоинства: Техническая часть, функциональность, возможности.
Недостатки: Правила
Читать весь отзыв Отзыв рекомендуют 5 0
Репутация
3
8 янв 2024
Телеграмм
Телеграмм — это не просто мессенджер, это целая платформа для общения, обмена информацией и совместной работы. Я пользуюсь Телеграммом уже несколько лет, и могу с уверенностью сказать, что это один из лучших мессенджеров на рынке.
Достоинства: Все рассказал в своем отзыве.
Недостатки: Как токовых минусов нет.
Читать весь отзыв Отзыв рекомендуют 3 0
Репутация
39
Украина, Киев
4 авг 2021
Отличный месенджер
Отличная платформа/месенджер для общения. Для меня не было ещё более удобного приложения, где я могу спокойно переписываться со своими друзьями, вступать в группы по интересам, читать интересные статьи в разных каналах и чатах, даже смотреть.
Достоинства: Удобный в использовании
Недостатки: Нет
Читать весь отзыв Отзыв рекомендуют 3 1
Репутация
80
Россия, Москва
17 фев 2020
Отличная программа, если у Вас нет приложения
Если Вам необходим Telegram на компьютере, то можете смело устанавливать эту программу. Вообще, я раньше не воспринимал мессенджеры всерьез и считал, что они не нужны, так как у меня есть ВК. Позже меня начал интересовать.
Достоинства: Постоянная поддержка программы. Кастомизация. Хороший дизайн. Возможность звонить бесплатно.
Недостатки: Такие же, как и в приложении.
Читать весь отзыв Отзыв рекомендуют 3 0
Репутация
203
Россия, Москва
14 янв 2018
Ещё одна достойная программа от Павла Дурова
Отличная программа, понятный интерфейс, простая в использование! Насколько я знаю в данной программе используется специальное кодирование переписки, что обеспечивает безопасное общение, без участия «третьих лиц». Ещё одним огромным плюсом является скорость отправки и приёма сообщений.
Достоинства: Новые возможности
Недостатки: Программа на стадии развития и распространения еще
Читать весь отзыв Отзыв рекомендуют 3 1
Репутация
8
Россия, Смоленск
16 дек 2017
В целом, программа заслуживает должного внимания, но.
Сначала пользовался программой на телефоне, ну, очень она мне понравилась, просто жуть. Потом перешёл на программу для персонального компьютера и тут понеслись баги и глюки. Во-первых, стали появляться баги с отправкой сообщения и картинок. Во-вторых.
Достоинства: Большой функционал, простота работы и интерфейса
Недостатки: Описаны выше.
Читать весь отзыв Отзыв рекомендуют 5 0
Репутация
33
Россия, Владивосток
14 фев 2024
Хотелось хорошее рассказать увы придётся.
Неделю, каждый день пытался установить! Операционку семёрку поменял на десятку, интернет заменил кабельным. Код на телефон не приходит. Потихоньку возникает мысль. Если на такой простой задаче твориться такая <>, дальше тоже геморрой. Уже в двух.
Достоинства: Говорят многим нравиться?
Недостатки: Безразличие к нам!
Читать весь отзыв Отзыв рекомендуют 1 0
Репутация
23
Россия, Прекрасный
11 ноя 2022
Отстой! А. тут требуется в 2-х словах. Не рабочий
Скачивал неоднократно с официального сайта. С лета нынешнего года пытаюсь воспользоваться «телегой». Сейчас уже Ноябрь. Скачивал и просто «для Windows», и конкретно для Windows 64. (виндовс стоит одна из последних сборок, лицензионная. Ей всего 8.
Достоинства: Вы имеете ввиду крестики?
Недостатки: Минус, минус, минус. А, требуют писать «реальные минусы». Реальный минус, реальный минус, реальный минус.
Читать весь отзыв Отзыв рекомендуют 1 0
Репутация
12
Украина, Одесса
10 дек 2019
Очень удобная и полезная программа на Windows
И так давайте начнём по порядку! Первое — это полезность использования этой программы. Лично я ее использую для связи с моим мобильным устройством. Каким же образом я это делаю? Просто скинуть по быстрому какие-то файлы.
Достоинства: Полезность, дизайн
Недостатки: Никаких
Читать весь отзыв Отзыв рекомендуют 1 0
Репутация
1
Россия, Пермь
21 июл 2019
Удобный меседжер
Хороший и безопасный меседжер. Очень быстрая загрузка. Много функция для написания ботов. Мы например автоматизировали ретрансляцию из группы ВК в свой канал в телеге. Благодаря этому получили новый канал продажи рекламы. Вообщем
Достоинства: удобно и безопасно
Недостатки: иногда сложно подключится, но это не их недоработки. Это из за запрета телеги правительством
Читать весь отзыв Отзыв рекомендуют 1 0
Репутация
49
Украина, Krivoy Rog
31 мар 2019
Очень достойно,не уступает уровню аналога на смартфоне
После пользования telegram на Android очень был доволен минималистичным, но приятным дизайном, множеством удобных функций и чуть большей безопасностью, думал, что в приложении для Windows будет как минимум чуть хуже, однако ошибался. Все также красивые.
Достоинства: дизайн,безопасность,удобность
Недостатки: не обнаружено
Читать весь отзыв Отзыв рекомендуют 1 0
Репутация
-7
Россия, Иркутск
19 янв 2019
Лучший менеджер
Обожаю телеграм. На фоне других программ и даже соц. сетей — мой фаворит. Очень бы хотело чёткого распределения по категориям. Например, чаты, которые 1on1, группы, инфо каналы, боты. А то чем больше у меня общения.
Достоинства: удобный , анонимность
Недостатки: Иногда беспорядок
Читать весь отзыв Отзыв рекомендуют 1 0
Репутация
46
Украина, Одесса
27 сен 2018
Всё идеально
Телеграмм это месенджер нового поколения который использует для шифрования DH-2048 и RSA-2048 алгоритмы, грубо говоря ваша переписка защищена в разы сильнее чем в других месенджерах а всё благодаря еще и AES ключу шифрования, который кстати.
Достоинства: Надежность, скорость, безопасность
Недостатки: Для меня их нет.
Читать весь отзыв Отзыв рекомендуют 1 0
Репутация
726
Россия, Новосибирск
15 апр 2018
Достойная программа
Это пожалуй пока что единственный более менее зашифрованный мессенджер, из доступных массовой аудитории в интернете. Как многие возможно слышали в скором времени а может и на днях его собираются заблокировать (попытаться), из-за политики руководства проекта.
Достоинства: Удобен, безопасен
Недостатки: для меня нет
Читать весь отзыв Отзыв рекомендуют 2 0
Репутация
-9
Украина, Киев
13 апр 2018
Лучший десктоп клиент лучшего мессенджера
Telegram — это лучший мессенджер, который я знаю. До его функционала его конкурентам (Viber, Facebook, Watsapp) еще очень далеко. С ним лишь может потягаться Вконтакте — и то только потому, что егл тоже создал Павел.
Достоинства: Дизайн, простота использования, функции которых больше нигде нет
Недостатки: Нет мультиаккаунтов
Читать весь отзыв Отзыв рекомендуют 1 0
Репутация
15
Россия, Москва
14 янв 2018
Замечательно
Прекрасный месенджер. Пользуюсь с того момента, как вк начал выпендриватся с музыкой. Думал телеграмм будет альтернативой и не ошибся. Не смотря на то, что это все таки месенджер, а не социальная сеть хотелось бы видеть.
Достоинства: Можно загружать музыку, фильмы без проблем, удобный и приятный интерфейс
Недостатки: Сыроват
Читать весь отзыв Отзыв рекомендуют 1 0
Репутация
11
Россия, Москва
12 дек 2017
Удобная связь
Приветствую вас в своем отзыве о программе для Windows, а именно Telegram Desktop. Этот мессенджер аналог обычного Telegram`а для настольных ПК. Весь функционал мобильной версии успешно перенесен и в Desktop. На момент написания этого отзыва.
Достоинства: Дизайн, защищенные и быстрые каналы связи, Night Mode, функциональность, оптимизация.
Недостатки: Отсутствие русского языка. (в комментариях один добрый человек скинул инструкцию по переводу любой из версий телеграмма на русский язык, ссылка на проверенный сайт без вирусов)
Читать весь отзыв Отзыв рекомендуют 1 5
Репутация
1
17 янв 2024
Ужасная система
Свой первый отзыв я хочу написать о системе телеграм и собственно самой программе для виндовс. Сначала это была интересная система. Но потом когда система обрела массовый спрос они «телеграм» начали сходить с ума до безумия.
Достоинства: Я не вижу никаких плюсов. Только одни минусы
Недостатки: Спам. Обман. Насилие. Вранье. Поддержки нет.
Читать весь отзыв Отзыв рекомендуют 0 0
Репутация
34
10 авг 2023
The best
Телеграм нравится тем, что это не просто мессенджер а-ля Ватсап или Вайбер, это экосистема, живой организм. В одном приложении можно всё: смотреть фильмы, музыку слушать, новости читать, читать книги, переписываться, созваниваться и так далее. Это.
Telegram for Desktop
Общайтесь со всеми контактами в Telegram с рабочего стола своего компьютера
Скачать последнюю версию
Telegram for Desktop — официальное приложение Telegram для операционных систем Windows, которое позволит вам использовать этот популярный мессенджер прямо на рабочем столе вашего ПК. Однако для того, чтобы начать им пользоваться, вам сначала необходимо зарегистрировать учетную запись пользователя, что можно легко и просто сделать всего за несколько секунд, используя свой номер телефона.
При первом запуске Telegram for Desktop вам придется подождать несколько секунд, пока все ваши переписки и группы будут синхронизированы. Как только этот процесс будет завершен, вы сможете продолжить любую переписку, начатую в мобильном приложении. Аналогичным образом вы можете получить доступ ко всем файлам, изображениям и голосовым заметкам, которыми вы поделились, используя приложение для Android или iOS. Более того, многие пользователи используют Telegram для удобной пересылки всевозможных файлов между настольным компьютером и мобильным устройством.
Хотя Telegram for Desktop по сути является инструментом для обмена мгновенными сообщениями, на самом деле он обладает гораздо более широкими возможностями. Его функция видеозвонков является одной из самых используемых, позволяя вам звонить по VOIP любому пользователю или группе. Эти звонки могут быть индивидуальными, в рамках разговора с любым из ваших контактов, или групповыми, при этом группа может включать до 1000 пользователей. Какой бы вариант вы ни выбрали, качество звука обычно очень хорошее. Кроме того, в вашем распоряжении будет несколько интересных инструментов, таких как совместное использование экрана во время видеозвонков или регулировка громкости звука индивидуально для каждого участника.
Еще одна функция, которая иногда остается незамеченной, но очень полезна, — это создание опросов. Этот инструмент, ориентированный исключительно на группы, позволит вам очень легко создавать опросы; вы также можете выбрать, хотите ли вы, чтобы голоса были публичными или анонимными. Вы также можете решить, хотите ли вы, чтобы опрос состоял из нескольких ответов, а также создать опрос в режиме экзамена.
Помимо всех своих функций, Telegram for Desktop выделяется простотой и универсальностью своего интерфейса. Из выпадающего меню слева вы можете активировать и деактивировать ночной режим всего одним щелчком мыши, что очень полезно. Но еще более полезной является опция автоматического включения ночного режима, которую можно найти в настройках. Кроме того, в вашем распоряжении более полудюжины различных цветовых палитр, которые позволят придать вашему настольному клиенту уникальный вид.
Telegram for Desktop — просто обязательная программа для всех, кто постоянно пользуетя приложением Telegram. Клиент к тому же не занимает много места и потребляет очень мало ресурсов, в отличие от других подобных мессенджеров, которые гораздо более громоздки. Но, стоит отметить одну вещь, за которой вам стоит следить. Если вы вдруг заметите, что у вас заканчивается место на жестком диске, — это папка загрузки Telegram, так как ее можно заполнить очень быстро, даже не заметив этого.
Проверено Andrés López Переведено Uptodown Localization Team
Часто задаваемые вопросы
В чем разница между Telegram for Desktop и Telegram Web?
Если говорить о функциональных возможностях, Telegram for Desktop и Telegram Web предлагают одни и те же функции. Обе версии позволяют отправлять и получать файлы, участвовать в видеозвонках, создавать опросы, отправлять голосовые заметки и так далее. Основное отличие заключается в том, что веб-версия требует, чтобы у вас был открыт браузер.
Безопасно ли пользоваться приложением Telegram for Desktop ?
Telegram for Desktop на 100% безопасно. Virus Total не нашел в установщике никаких положительных результатов, в то время как в более старой версии 2018 года Яндекс по ошибке находил вирусы.
Как войти в Telegram for Desktop ?
Войти в Telegram for Desktop очень просто: отсканируйте появившийся на экране QR-код с помощью приложения Telegram на вашем устройстве Android или iOS. Если у вас не установлено приложение, вы можете воспользоваться верификацией через электронную почту.
Больше информации
Лицензия | Бесплатно |
ОС | Windows |
Раздел | Клиенты |
Язык | Pусский |
Telegram Desktop Portable
Telegram Desktop Portable — это портативная версия популярного приложения для обмена мгновенными сообщениями. С его помощью вы можете использовать Telegram на Windows без необходимости его установки. После распаковки файла вы обнаружите исполняемый файл Telegram.exe. Когда вы запустите его, вам нужно будет выполнить сопряжение с ним через устройство, с которого вы ранее обращались к Telegram Desktop Portable, или с помощью SMS-подтверждения.
Сканирование QR-кода с помощью мобильного приложения — это самый быстрый способ синхронизировать Telegram Desktop Portable с вашей учетной записью. Когда вы отсканируете его, вся информация о вашем приложении будет синхронизирована, включая открытые вами чаты и наиболее часто используемые смайлики и стикеры. Вы также сможете получить доступ ко всем файлам и мультимедийному контенту, которые вы отправляли в своих чатах, включая фотографии, видео и файлы.
Telegram Desktop Portable имеет те же функции, что и устанавливаемая версия. Вы можете отправлять и получать сообщения, использовать ботов, подписываться на каналы, использовать темный режим и все функции, которые предлагает Telegram. Вы можете выбрать, какие уведомления вы хотите получать, а также отправлять файлы любого формата. Все чаты Telegram Desktop Portable защищены шифрованием, так что никто не сможет за ними шпионить. Кроме того, вы можете совершать звонки или видеозвонки, используя микрофон и веб-камеру вашего компьютера. Вы также можете отправлять и получать аудио- и видеосообщения.
Если вы хотите изначально пользоваться Telegram на Windows, не полагаясь на веб-версию, или вы не хотите устанавливать программу, то загрузка Telegram Desktop Portable — ваш лучший вариант.
Проверено Alberto García Переведено Uptodown Localization Team
Больше информации
Лицензия | Бесплатно |
ОС | Windows |
Раздел | Клиенты |
Язык | Pусский |
Telegram Desktop и Compose Multiplatform
Всем привет! В своей прошлой статье я рассказывал как можно запустить Telegram клиент в качестве backend‑сервиса. В описываемой там библиотеке с тех пор были внесены некоторые оптимизации, и в целом, я остался доволен возможностями, которые получил. После чего возникло желание добавить визуальную часть к имеющемуся бэкенду и заодно изучить что‑то новое для себя. Выбор пал на фреймворк Compose Multiplatform. Давайте сделаем десктопную версию Telegram!
С чего начать?
Compose Multiplatform — это декларативный фреймворк для построения интерфейсов под различные платформы с использованием Kotlin и Jetpack Compose. И так как это был мой первый опыт работы с Jetpack Compose, то поэтому в начале я прочитал некоторые статьи и прошел несколько лабораторок на портале разработчиков для android. После можно посмотреть tutorials непосредственно в репозитории Compose Multiplatform от JetBrains.
Создаем проект
Создать проект можно из IntelliJ IDEA(достаточно версии community) выбрав шаблон Compose for Desktop или через wizard. В итоге формируется Gradle проект, где уже подключены необходимые плагины и зависимости для фреймворка, а если нам нужно что‑то дополнительно, то это можно добавить в виде зависимости. В нашем случае помимо UI‑части будет еще и бэкенд, то есть при запуске нативного приложения должен будет запуститься еще java‑процесс параллельно. Получается, что при компиляции нативного приложения Compose‑плагин должен знать какие сторонние ресурсы мы используем и учесть это, а у нас должна быть возможность обращаться к ним из нашего кода. Указать каталог с ресурсами можно через установку appResourcesRootDir , давайте назовем его resources и расположим в корне проекта:
compose.desktop < application < mainClass = "TelegramComposeMultiplatformKt" jvmArgs += listOf("-Xmx256m") nativeDistributions < targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "TelegramComposeMultiplatform" packageVersion = "1.0.0" appResourcesRootDir.set(project.layout.projectDirectory.dir("resources")) >> >
Теперь мы можем с помощью свойства compose.application.resources.dir обращаться к подключаемым ресурсам, я для этого сделал вспомогательный класс:
class Resources < companion object < private val resourcesDirectory: File = File(System.getProperty("compose.application.resources.dir")) fun resourcesDirectory(): File = resourcesDirectory fun resolve(relative: String) : File = resourcesDirectory.resolve(relative) >>
Давайте посмотрим как выглядит итоговая структура каталога ресурсов, чтобы обратить внимание на еще одну важную вещь:
resources ├── common │ ├── backend-0.0.1.jar │ └── content_loader.gif ├── linux-arm64 │ └── libtdjni.so ├── linux-x64 │ └── libtdjni.so ├── macos-arm64 │ └── libtdjni.dylib ├── macos-x64 │ └── libtdjni.dylib └── windows-x64 ├── libcrypto-1_1-x64.dll ├── libssl-1_1-x64.dll ├── tdjni.dll └── zlib1.dll src ├── main │ ├── kotlin
У Compose-плагина есть правило по работе с подкаталогами ресурсов. Каталог common содержит файлы, которые будут включены в сборку для любой платформы. Для включения файлов под конкретную ОС и архитектуру существуют правила именования — / или /- (возможные ОС — windows , macos , linux ; архитектуры — x64 , arm64 ). При сборке приложения плагин самостоятельно сможет взять необходимые файлы под нужную архитектуру. В нашем случае в каталог common отправится jar бэкенда, а в специфичных каталогах платформ будут лежать скомпилированные нативные библиотеки TDLib для бэкенда(особенности работы с данной библиотекой можно посмотреть в моей статье).
Начнем реализацию
При старте приложения мы покажем первое окно в котором будет отображаться статус запуска, а также запустим бэкенд параллельно.
fun main() = application < val backendStarted = remember < mutableStateOf(false) >val appScope = rememberCoroutineScope() appScope.launch < startBackend() awaitReadiness(backendStarted) >Window( title = "Telegram Compose Multiplatform", state = WindowState(width = 1200.dp, height = 800.dp), onCloseRequest = < terminatingApp.set(true) appScope.launch < delay(300) httpClient.post("$/$/shutdown") >.invokeOnCompletion < exitApplication() httpClient.close() >> ) < if (backendStarted.value) < App() >else < LoadingDisclaimer("Starting. ") >> >
На следующем шаге нам нужно проверить авторизован ли клиент, чтобы продолжить работу.
@Composable fun App() < Row < var waitCode by remember < mutableStateOf(false) >var waitPass by remember < mutableStateOf(false) >var status by remember < mutableStateOf(Status.NOT_AUTHORIZED) >LaunchedEffect(Unit) < status = authorizationStatus() >val mainScope = rememberCoroutineScope() mainScope.launch < while (!terminatingApp.get()) < status = authorizationStatus() if (status == Status.AUTHORIZED) break waitCode = waitCode() delay(300) waitPass = waitPass() delay(300) >> if (status == Status.AUTHORIZED) < InitialLoad() >else if (waitCode) < AuthForm(AuthType.CODE, mainScope) >else if (waitPass) < AuthForm(AuthType.PASSWORD, mainScope) >> >
Если необходима авторизация, то появится простая форма ввода кода, который придет в официальный клиент.
Если активирован второй фактор верификации, то его тоже придется ввести.
После авторизации и загрузки списка чатов(кэширование иконок и прочей информации) можно отобразить основную сцену клиента. Я сделал максимально простой вариант — это список чатов с их фильтрацией слева, а также справа место под окно чата, который мы выбрали. Чтобы отображать список чатов корректно, недостаточно их просто загрузить — нужно выполнить подписку на обновления, которые в этом списке могут происходить, а именно:
- Может появиться новый чат
- Чат в списке может быть удален
- В чате может измениться иконка, заголовок
- Меняется последнее сообщение, которые мы тоже отображаем
- Должен появляться счетчик непрочитанных сообщений, он может менять значение
- Меняется позиция чата в списке, чаты с новыми сообщениями поднимаются в списке выше.
Чтобы разобраться, что это за обновления и как их получать давайте немного посмотрим в бэкенд. В данном случае это обычный Spring Boot проект. В нем я создал пакет tdlib , в котором зарегистрировал компоненты самых необходимых на данном этапе оповещений от TDLib, вот его состав:
tdlib ├── UpdateBasicGroup.java ├── UpdateBasicGroupFullInfo.java ├── UpdateChatLastMessageHandler.java ├── UpdateChatNewOrder.java ├── UpdateChatPhoto.java ├── UpdateChatReadInbox.java ├── UpdateChatTitleHandler.java ├── UpdateDeleteMessages.java ├── UpdateFile.java ├── UpdateMessageContent.java ├── UpdateNewChat.java ├── UpdateNewMessage.java ├── UpdateSupergroup.java ├── UpdateSupergroupFullInfo.java ├── UpdateUser.java
Для примера, давайте посмотрим на событие обновления иконки чата:
@Service public class UpdateChatPhoto implements UpdateNotificationListener < private final UpdatesQueues updatesQueues; public UpdateChatPhoto(UpdatesQueues updatesQueues) < this.updatesQueues = updatesQueues; >@Override public void handleNotification(TdApi.UpdateChatPhoto updateChatPhoto) < TdApi.Chat chat = Caches.initialChatCache.get(updateChatPhoto.chatId); if (chat != null) < synchronized (chat) < chat.photo = updateChatPhoto.photo; >updatesQueues.addIncomingSidebarUpdate(updateChatPhoto); > > @Override public Class notificationType() < return TdApi.UpdateChatPhoto.class; >>
В данном случае это обычный Spring компонент, в котором к нам прилетает нотификация, что иконка обновилась. Дальше мы вольны делать с этим что угодно. Я просто кэширую объект и перекладываю обновление в очередь. Аналогично можно работать с любыми другими обновлениями в клиенте. В итоге я сделал сервис, который может собирать и передавать обновления для списка чатов.
@Component public class GetSidebarUpdates implements Supplier> < @Autowired private GetChatLastMessage getChatLastMessage; @Autowired private GetChatNewTitle getChatNewTitle; @Autowired private GetChatNewOrder getChatNewOrder; @Autowired private GetChatReadInbox getChatReadInbox; @Autowired private GetNewChat getNewChat; @Autowired private GetNewChatPhoto getNewChatPhoto; @Autowired private UpdatesQueues updatesQueues; @Override public Listget() < Listpreviews = new ArrayList<>(); for (int i = 0; i < 100; i++) < TdApi.Update update = updatesQueues.pollIncomingSidebarUpdate(); if (update == null) break; if (update instanceof TdApi.UpdateChatLastMessage upd) < addPreviewFromUpdate(getChatLastMessage, upd, previews); >else if (update instanceof TdApi.UpdateChatTitle upd) < addPreviewFromUpdate(getChatNewTitle, upd, previews); >else if (update instanceof TdApi.UpdateChatPosition upd) < addPreviewFromUpdate(getChatNewOrder, upd, previews); >else if (update instanceof TdApi.UpdateChatReadInbox upd) < addPreviewFromUpdate(getChatReadInbox, upd, previews); >else if (update instanceof TdApi.UpdateNewChat upd) < addPreviewFromUpdate(getNewChat, upd, previews); >else if (update instanceof TdApi.UpdateChatPhoto upd) < addPreviewFromUpdate(getNewChatPhoto, upd, previews); >> return previews; > private void addPreviewFromUpdate(Function func, T update, List previews) < ChatPreview preview = func.apply(update); if (preview != null) previews.add(preview); >>
Вернемся к UI. Теперь мы можем отобразить список карточек чатов:
LazyColumn(state = lazyListState, modifier = sidebarWidthModifier.background(MaterialTheme.colors.surface).fillMaxHeight()) < itemsIndexed(clientStates.chatPreviews, < _, v ->v>) < _, chatPreview ->if (chatSearchInput.value.isBlank() || chatPreview.title.contains(chatSearchInput.value, ignoreCase = true)) < var hasUnread = false chatPreview.unreadCount?.let < if (it != 0) < hasUnread = true >> val onChatClick = < selectedChatId.value = chatPreview.id clientStates.selectedChatPreview.value = chatPreview >if (filterUnreadChats.value && hasUnread) < ChatCard(chatListUpdateScope = chatListUpdateScope, chatPreview = chatPreview, selectedChatId = selectedChatId, onClick = onChatClick) Divider(modifier = sidebarWidthModifier.height(2.dp), color = greyColor) >else if (!filterUnreadChats.value) < ChatCard(chatListUpdateScope = chatListUpdateScope, chatPreview = chatPreview, selectedChatId = selectedChatId, onClick = onChatClick) Divider(modifier = sidebarWidthModifier.height(2.dp), color = greyColor) >> > >
По данному списку возможен скролл, фильтрация, переключение на непрочитанные чаты, а также можно удалить чат или отметить прочитанным.
Окно со списком чатов для выбора
@Composable fun MainScene(clientStates: ClientStates) < val selectedChatId: MutableState= remember < mutableStateOf(-1) >var needToScrollUpSidebar by remember < mutableStateOf(false) >val chatSearchInput: MutableState = remember < mutableStateOf("") >val chatListUpdateScope = rememberCoroutineScope() val lazyListState = rememberLazyListState() val filterUnreadChats: MutableState = remember < mutableStateOf(false) >chatListUpdateScope.launch < while (!terminatingApp.get()) < val chatsSizeBeforeUpdates = clientStates.chatPreviews.size var firstChatPreviewBeforeUpdates: ChatPreview? = null if (clientStates.chatPreviews.isNotEmpty()) < firstChatPreviewBeforeUpdates = clientStates.chatPreviews[0] >handleSidebarUpdates(clientStates.chatPreviews) needToScrollUpSidebar = (clientStates.chatPreviews.size > chatsSizeBeforeUpdates) || (clientStates.chatPreviews.isNotEmpty() && lazyListState.firstVisibleItemIndex < 3 && firstChatPreviewBeforeUpdates != clientStates.chatPreviews[0]) if (needToScrollUpSidebar) < lazyListState.scrollToItem(0) >delay(1000) > > Scaffold( topBar = < ScaffoldTopBar(clientStates, chatSearchInput, filterUnreadChats) >, backgroundColor = greyColor ) < Row < Box < LazyColumn(state = lazyListState, modifier = sidebarWidthModifier.background(MaterialTheme.colors.surface).fillMaxHeight()) < itemsIndexed(clientStates.chatPreviews, < _, v ->v>) < _, chatPreview ->if (chatSearchInput.value.isBlank() || chatPreview.title.contains(chatSearchInput.value, ignoreCase = true)) < var hasUnread = false chatPreview.unreadCount?.let < if (it != 0) < hasUnread = true >> val onChatClick = < selectedChatId.value = chatPreview.id clientStates.selectedChatPreview.value = chatPreview >if (filterUnreadChats.value && hasUnread) < ChatCard(chatListUpdateScope = chatListUpdateScope, chatPreview = chatPreview, selectedChatId = selectedChatId, onClick = onChatClick) Divider(modifier = sidebarWidthModifier.height(2.dp), color = greyColor) >else if (!filterUnreadChats.value) < ChatCard(chatListUpdateScope = chatListUpdateScope, chatPreview = chatPreview, selectedChatId = selectedChatId, onClick = onChatClick) Divider(modifier = sidebarWidthModifier.height(2.dp), color = greyColor) >> > > if (lazyListState.firstVisibleItemIndex > 3) < Row(modifier = sidebarWidthModifier) < Row(modifier = Modifier.fillMaxSize().padding(top = 12.dp, end = 12.dp), horizontalArrangement = Arrangement.End) < ScrollButton( direction = ScrollDirection.UP, onClick = < chatListUpdateScope.launch < lazyListState.animateScrollToItem(0) >> ) > > > > Column < if (selectedChatId.value == -1L && clientStates.chatPreviews.isNotEmpty()) < SelectChatOffer() >else if (selectedChatId.value != -1L) < var readChat by remember < mutableStateOf(-1L) >Row < Divider(modifier = Modifier.fillMaxHeight().width(2.dp), color = greyColor) ChatWindow(chatId = selectedChatId.value, chatListUpdateScope = chatListUpdateScope, clientStates = clientStates) >chatListUpdateScope.launch < clientStates.selectedChatPreview.let < it.value?.let < currentChat ->currentChat.unreadCount?.let < if (it >0 && readChat != currentChat.id) < readChat = currentChat.id markAsRead(readChat) >> > > > > > > > >
По такой же логике можно работать и с окном чата. Когда мы его открываем, то подгружаем из истории какой‑то первоначальный список сообщений, а при скролле выполняем загрузку уже динамически. Плюс нам нужно следить за обновлениями в открытом чате:
- Изменение названия чата
- Если это группа или канал, то следим за изменением счетчика участников.
- Если получаем новое сообщение, то дописываем в список.
- В отображенных сообщениях может быть изменен контент, поэтому тоже следим.
- Если сообщение удаляется, то нам его тоже нужно удалить.
Выглядеть это будет так.
Конечно, это очень базовая функциональность. Пока корректно отображаются только текстовые сообщения и фото, а в Telegram много различных типов сообщений(видео, анимации, документы, опросы, стикеры, эмодзи и т. д.). Также пока не выделяются текстовые блоки и ссылки, но я хочу скоро это добавить вместе с возможностью отправки сообщений. Чаты‑форумы пока тоже не поддерживаются, там все сообщения отображаются в корневом чате(в TDLib эта функциональность не до конца перенесена еще, думаю подождать).
Соберем проект
Compose-плагин позволяет запускать приложение для jvm-платформы в виде java-процесса( run ), собрать готовый к запуску jar для текущей платформы( packageUberJarForCurrentOS ), скомпилировать нативное приложение( createDistributable , packageDistributionForCurrentOS ), выполнить запуск нативного приложения из плагина( runDistributable ). Вот полный список задач плагина:
Compose desktop tasks
Compose desktop tasks --------------------- checkRuntime createDistributable createReleaseDistributable createRuntimeImage notarizeDmg notarizeReleaseDmg package packageDeb packageDistributionForCurrentOS packageDmg packageMsi packageReleaseDeb packageReleaseDistributionForCurrentOS packageReleaseDmg packageReleaseMsi packageReleaseUberJarForCurrentOS packageUberJarForCurrentOS prepareAppResources proguardReleaseJars run runDistributable runRelease runReleaseDistributable suggestRuntimeModules unpackDefaultComposeDesktopJvmApplicationResources
Давайте теперь посмотрим куда же отправляются в итоге подключаемые ресурсы на примере нативного приложения под MacOS. Если мы попросим показать содержимое .app пакета, то увидим(вывод сократил, конечно):
TelegramComposeMultiplatform.app └── Contents ├── Info.plist ├── MacOS │ └── TelegramComposeMultiplatform ├── PkgInfo ├── Resources │ └── TelegramComposeMultiplatform.icns ├── _CodeSignature │ └── CodeResources ├── app │ ├── TelegramComposeMultiplatform.cfg │ ├── animation-core-desktop-1.5.12-c65799cdb55518dd8ec9156ecfe547d.jar │ ├── animation-desktop-1.5.12-dc4e76c5a73ca9b53362d097ff8157.jar │ ├── annotations-23.0.0-8484cd17d040d837983323f760b2c660.jar │ ├── resources │ │ ├── backend-0.0.1.jar │ │ ├── content_loader.gif │ │ └── libtdjni.dylib │ ├── runtime-desktop-1.5.12-1698bf91f4fdffbbb15d2b84e7e0f69e.jar
А вот и они — наш бэкенд, нативная библиотека TDLib для него и gif c loader’ом загрузки контента. При запуске приложения оно к ним успешно обращается и все работает как ожидалось.
В репозитории проекта я описал подробную инструкцию, что нужно подготовить для приложения и добавил скрипт сборки. Нативное приложение получилось протестировать на MacOS(x64 + M) и Windows(x64). Поэтому если кому‑то интересно, то обязательно заходите:)
Итоги
Мы рассмотрели как можем создавать и собирать desktop приложение используя фреймворк Compose Multiplatform. Получился Telegram клиент с очень базовой функциональностью, но это может выступить скелетом для будущих доработок, а практическая реализация позволяет погрузиться в изучение Telegram API более детально. От Compose Multiplatform у меня остались приятные впечатления, постараюсь продолжить изучать возможности фреймворка. Надеюсь, что вам было интересно!
- telegram‑desktop‑compose‑multiplatform — репозиторий проекта данной статьи
- spring‑boot‑starter‑telegram — репозиторий фреймворка, который используется в бэкенде этого проекта
- compose‑multiplatform — страница Compose Multiplatform
- Jetpack Compose — страница для изучения Jetpack Compose
- Tutorials — туториалы по Compose Multiplatform от JetBrains