name: telegram-desktop
adopt-info: telegram
icon: Telegram/Resources/art/icon512@2x.png

base: core22
grade: stable
confinement: strict
compression: lzo

architectures:
  - build-on: amd64
  - build-on: arm64
  - build-on: armhf
  - build-on: ppc64el

apps:
  telegram-desktop:
    command: bin/desktop-launch telegram-desktop
    common-id: org.telegram.desktop
    desktop: usr/share/applications/telegram-desktop_telegram-desktop.desktop
    environment:
      # Tell glib to use portals on file associations handling.
      GTK_USE_PORTAL: 1
      # Use sandboxed ibus api
      IBUS_USE_PORTAL: 1
    plugs:
      - alsa
      - audio-playback
      - audio-record
      - camera
      - desktop
      - desktop-legacy
      - hardware-observe
      - home
      - network
      - network-status
      - opengl
      - removable-media
      - unity7
      - wayland
      - x11
    slots:
      - tdesktop-mpris

hooks:
  configure:
    command-chain:
      - bin/hooks-configure-desktop
    plugs:
      - desktop

plugs:
  desktop:
    mount-host-font-cache: false
  # Support for common GTK themes
  # https://forum.snapcraft.io/t/how-to-use-the-system-gtk-theme-via-the-gtk-common-themes-snap/6235
  gsettings:
  gtk-3-themes:
    interface: content
    target: $SNAP/data-dir/themes
    default-provider: gtk-common-themes
  icon-themes:
    interface: content
    target: $SNAP/data-dir/icons
    default-provider: gtk-common-themes
  sound-themes:
    interface: content
    target: $SNAP/data-dir/sounds
    default-provider: gtk-common-themes

slots:
  tdesktop-mpris:
    interface: mpris
    name: tdesktop

layout:
  /usr/share/alsa:
    bind: $SNAP/usr/share/alsa
  /usr/share/X11:
    bind: $SNAP/usr/share/X11
  /usr/lib/$CRAFT_ARCH_TRIPLET/webkit2gtk-4.1:
    bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET/webkit2gtk-4.1

parts:
  telegram:
    plugin: cmake
    source: .
    source-type: git
    parse-info: [usr/share/metainfo/telegram-desktop_telegram-desktop.metainfo.xml]
    build-environment:
      - LD_LIBRARY_PATH: $CRAFT_STAGE/usr/lib/$CRAFT_ARCH_TRIPLET${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
    build-packages:
      - clang
      - python3
      - libasound2-dev
      - libavif-dev
      - libglib2.0-dev
      - libglibmm-2.4-dev
      - libheif-dev
      - libopus-dev
      - libpulse-dev
      - libwayland-dev
      - libxcb1-dev
      - libxcb-keysyms1-dev
      - libxcb-record0-dev
      - libxcb-screensaver0-dev
      - zlib1g-dev
    stage-packages:
      - libasound2
      - libavif13
      - libglib2.0-0
      - libglibmm-2.4-1v5
      - libheif1
      - libopus0
      - libpulse0
      - libwayland-client0
      - libwebkit2gtk-4.1-0
      - libxcb1
      - libxcb-keysyms1
      - libxcb-record0
      - libxcb-screensaver0
      - zlib1g
      - glib-networking
      - systemd
    cmake-generator: Ninja
    cmake-parameters:
      - -DCMAKE_BUILD_TYPE=Release
      - -DCMAKE_INSTALL_PREFIX=/usr
      - -DTDESKTOP_API_ID=611335
      - -DTDESKTOP_API_HASH=d524b414d21f4d37f08684c1df41ac9c
      - -DDESKTOP_APP_USE_PACKAGED_LAZY=ON
      - -DTDESKTOP_LAUNCHER_BASENAME=telegram-desktop_telegram-desktop
    override-pull: |
      craftctl default

      version_file=Telegram/build/version
      version=$(sed -n "s/AppVersionStr[ ]\+\(.*\)\+/\1/p" $version_file)
      beta=$(sed -n "s/BetaChannel[ ]\+\(.*\)\+/\1/p" $version_file)

      if [ "$beta" != "0" ]; then
        version="$version-beta"
      fi

      version="${version}$(git describe --tags | sed 's,^v[^-]\+,,')"

      craftctl set version="$version"

      sed -i 's|^Icon=telegram$|Icon=${SNAP}/meta/gui/icon.png|g' lib/xdg/telegramdesktop.desktop
    override-build: |
      craftctl default
      rm -rf "$CRAFT_PART_INSTALL/usr/share/icons"
    stage:
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/libjpeg.so.8.2.2
    prime:
      - -./lib/systemd
    after:
      - desktop-qt
      - ffmpeg
      - kcoreaddons
      - libjxl
      - mozjpeg
      - openal
      - openssl
      - rnnoise
      - webrtc

  patches:
    source: https://github.com/desktop-app/patches.git
    source-depth: 1
    plugin: dump
    override-pull: |
      craftctl default
      cp -r . "$CRAFT_STAGE/patches"
    override-stage: |
      rm -rf patches
    stage: [-./*]

  desktop-qt:
    source: https://github.com/desktop-app/snapcraft-desktop-helpers.git
    source-subdir: qt
    plugin: make
    make-parameters: ["FLAVOR=qt5"]
    build-packages:
      - build-essential
      - dpkg-dev
    stage-packages:
      - libxkbcommon0
      - fonts-ubuntu
      - dmz-cursor-theme
      - light-themes
      - adwaita-icon-theme
      - gnome-themes-standard
      - shared-mime-info
      - libgdk-pixbuf2.0-0
      - locales-all
      - xdg-user-dirs
    stage:
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/libjpeg.so.8.2.2
    after:
      - mozjpeg
      - qt

  extra-cmake-modules:
    source: https://github.com/KDE/extra-cmake-modules.git
    source-depth: 1
    source-tag: v5.98.0
    plugin: cmake
    cmake-parameters:
      - -DCMAKE_BUILD_TYPE=Release
      - -DCMAKE_INSTALL_PREFIX=/usr
      - -DBUILD_TESTING=OFF
    prime: [-./*]

  ffmpeg:
    plugin: nil
    build-packages:
      - libavcodec-dev
      - libavformat-dev
      - libavutil-dev
      - libswresample-dev
      - libswscale-dev
    stage-packages:
      - libavcodec58
      - libavformat58
      - libavutil56
      - libswresample3
      - libswscale5
    stage:
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/libjpeg.so.8.2.2
    after:
      - mozjpeg

  kcoreaddons:
    source: https://github.com/KDE/kcoreaddons.git
    source-depth: 1
    source-tag: v5.98.0
    plugin: cmake
    build-packages:
      - curl
    cmake-parameters:
      - -DCMAKE_BUILD_TYPE=Release
      - -DCMAKE_INSTALL_PREFIX=/usr
      - -DBUILD_TESTING=OFF
      - -DBUILD_WITH_QT6=ON
      - -DEXCLUDE_DEPRECATED_BEFORE_AND_AT=5.78.0
    override-pull: |
      snapcraftctl pull
      curl -sSL https://invent.kde.org/frameworks/kcoreaddons/-/merge_requests/258.patch | git apply
      rm -rf po
    prime:
      - -./usr/bin
      - -./usr/include
      - -./usr/lib/$SNAPCRAFT_ARCH_TRIPLET/cmake
      - -./usr/lib/$SNAPCRAFT_ARCH_TRIPLET/*.so
      - -./usr/mkspecs
    after:
      - extra-cmake-modules
      - desktop-qt

  libjxl:
    source: https://github.com/libjxl/libjxl.git
    source-depth: 1
    source-tag: v0.7rc
    plugin: cmake
    build-packages:
      - libbrotli-dev
      - libhwy-dev
      - liblcms2-dev
    stage-packages:
      - libbrotli1
      - libhwy0
      - liblcms2-2
    cmake-parameters:
      - -DCMAKE_BUILD_TYPE=Release
      - -DCMAKE_INSTALL_PREFIX=/usr
      - -DBUILD_TESTING=OFF
      - -DJPEGXL_ENABLE_DEVTOOLS=OFF
      - -DJPEGXL_ENABLE_TOOLS=OFF
      - -DJPEGXL_ENABLE_DOXYGEN=OFF
      - -DJPEGXL_ENABLE_MANPAGES=OFF
      - -DJPEGXL_ENABLE_BENCHMARK=OFF
      - -DJPEGXL_ENABLE_EXAMPLES=OFF
      - -DJPEGXL_ENABLE_JNI=OFF
      - -DJPEGXL_ENABLE_SJPEG=OFF
      - -DJPEGXL_ENABLE_OPENEXR=OFF
      - -DJPEGXL_ENABLE_SKCMS=OFF
    prime:
      - -./usr/bin
      - -./usr/include
      - -./usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pkgocnfig
      - -./usr/lib/$SNAPCRAFT_ARCH_TRIPLET/*.so
      - -./usr/share

  mozjpeg:
    source: https://github.com/mozilla/mozjpeg.git
    source-depth: 1
    source-tag: v4.0.3
    plugin: cmake
    cmake-generator: Ninja
    cmake-parameters:
      - -DCMAKE_BUILD_TYPE=Release
      - -DCMAKE_INSTALL_PREFIX=/usr
      - -DENABLE_STATIC=OFF
      - -DWITH_JPEG8=ON
      - -DPNG_SUPPORTED=OFF
    prime:
      - -./usr/bin
      - -./usr/include
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/pkgconfig
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.so
      - -./usr/share

  openal:
    source: https://github.com/kcat/openal-soft.git
    source-depth: 1
    source-tag: 1.22.2
    plugin: cmake
    build-packages:
      - libasound2-dev
      - libdbus-1-dev
      - libpipewire-0.3-dev
      - libpulse-dev
    stage-packages:
      - libasound2
      - libdbus-1-3
      - libpipewire-0.3-0
      - libpulse0
    cmake-generator: Ninja
    cmake-parameters:
      - -DCMAKE_BUILD_TYPE=Release
      - -DCMAKE_INSTALL_PREFIX=/usr
      - -DALSOFT_EXAMPLES=OFF
      - -DALSOFT_UTILS=OFF
      - -DALSOFT_INSTALL_CONFIG=OFF
    prime:
      - -./usr/include
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/cmake
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/pkgconfig
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.so

  openssl:
    source: https://github.com/openssl/openssl.git
    source-depth: 1
    source-branch: OpenSSL_1_1_1-stable
    plugin: make
    override-build: |
      ./config \
        shared \
        --prefix=/usr \
        --openssldir=/usr/lib/ssl \
        --libdir=lib/$CRAFT_ARCH_TRIPLET \
        no-tests
      craftctl default
    prime:
      - -./usr/bin
      - -./usr/include
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/pkgconfig
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.a
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.so
      - -./usr/share

  qt:
    plugin: nil
    build-packages:
      - libdbus-1-dev
      - libegl-dev
      - libfontconfig1-dev
      - libfreetype-dev
      - libglib2.0-dev
      - libglx-dev
      - libgtk-3-dev
      - libharfbuzz-dev
      - libice-dev
      - libicu-dev
      - libopengl-dev
      - libpcre2-dev
      - libpng-dev
      - libsm-dev
      - libvulkan-dev
      - libwayland-dev
      - libx11-dev
      - libx11-xcb-dev
      - libxcb1-dev
      - libxcb-glx0-dev
      - libxcb-icccm4-dev
      - libxcb-image0-dev
      - libxcb-keysyms1-dev
      - libxcb-randr0-dev
      - libxcb-render0-dev
      - libxcb-render-util0-dev
      - libxcb-shape0-dev
      - libxcb-shm0-dev
      - libxcb-sync-dev
      - libxcb-util-dev
      - libxcb-xfixes0-dev
      - libxcb-xkb-dev
      - libxcursor-dev
      - libxkbcommon-dev
      - libxkbcommon-x11-dev
      - zlib1g-dev
    stage-packages:
      - libdbus-1-3
      - libegl1
      - libfontconfig1
      - libfreetype6
      - libglib2.0-0
      - libglx0
      - libgtk-3-0
      - libharfbuzz0b
      - libice6
      - libicu70
      - libopengl0
      - libpcre2-16-0
      - libpng16-16
      - libsm6
      - libvulkan1
      - libwayland-client0
      - libwayland-cursor0
      - libwayland-egl1
      - libx11-6
      - libx11-xcb1
      - libxcb1
      - libxcb-glx0
      - libxcb-icccm4
      - libxcb-image0
      - libxcb-keysyms1
      - libxcb-randr0
      - libxcb-render0
      - libxcb-render-util0
      - libxcb-shape0
      - libxcb-shm0
      - libxcb-sync1
      - libxcb-util1
      - libxcb-xfixes0
      - libxcb-xkb1
      - libxcursor1
      - libxkbcommon0
      - libxkbcommon-x11-0
      - zlib1g
    override-pull: |
      QT=6_4_0

      git clone -b v6.4.0-rc1 --depth=1 git://code.qt.io/qt/qt5.git .
      perl init-repository --module-subset=qtbase,qtwayland,qtimageformats,qtsvg,qt5compat

      cd qtbase
      find $CRAFT_STAGE/patches/qtbase_${QT} -type f -print0 | sort -z | xargs -r0 git apply
      cd ..
    override-build: |
      ./configure \
        -prefix /usr \
        -libdir /usr/lib/$CRAFT_ARCH_TRIPLET \
        -release \
        -opensource \
        -confirm-license \
        -no-feature-getentropy \
        -no-feature-renameat2 \
        -no-feature-statx \
        -no-feature-egl-extension-platform-wayland \
        -no-feature-wayland-server \
        -no-feature-highdpiscaling \
        -openssl-linked \
        -nomake examples \
        -nomake tests

      cmake --build . -j$CRAFT_PARALLEL_BUILD_COUNT
      DESTDIR="$CRAFT_PART_INSTALL" cmake --install .
    stage:
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/libjpeg.so.8.2.2
    prime:
      - -./usr/bin
      - -./usr/doc
      - -./usr/include
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/cmake
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/metatypes
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.a
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.la
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.prl
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.so
      - -./usr/libexec
      - -./usr/mkspecs
      - -./usr/modules
    after:
      - mozjpeg
      - openssl
      - patches

  rnnoise:
    source: https://gitlab.xiph.org/xiph/rnnoise.git
    source-depth: 1
    source-commit: 7f449bf8bd3b933891d12c30112268c4090e4d59
    plugin: autotools
    autotools-configure-parameters:
      - --prefix=/usr
      - --libdir=\${exec_prefix}/lib/$CRAFT_ARCH_TRIPLET
      - --disable-static
      - --disable-examples
      - --disable-doc
    prime:
      - -./usr/include
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/pkgconfig
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.la
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.so
      - -./usr/share

  webrtc:
    source: https://github.com/desktop-app/tg_owt.git
    source-depth: 1
    source-commit: 10d5f4bf77333ef6b43516f90d2ce13273255f41
    plugin: cmake
    build-packages:
      - yasm
      - libdrm-dev
      - libegl-dev
      - libgbm-dev
      - libgl-dev
      - libglib2.0-dev
      - libopenh264-dev
      - libopus-dev
      - libpipewire-0.3-dev
      - libvpx-dev
      - libx11-dev
      - libxcomposite-dev
      - libxdamage-dev
      - libxext-dev
      - libxfixes-dev
      - libxrender-dev
      - libxrandr-dev
      - libxtst-dev
    stage-packages:
      - libdrm2
      - libegl1
      - libgbm1
      - libgl1
      - libglib2.0-0
      - libopenh264-6
      - libopus0
      - libpipewire-0.3-0
      - libvpx7
      - libx11-6
      - libxcomposite1
      - libxdamage1
      - libxext6
      - libxfixes3
      - libxrender1
      - libxrandr2
      - libxtst6
    cmake-generator: Ninja
    cmake-parameters:
      - -DCMAKE_BUILD_TYPE=Release
      - -DCMAKE_INSTALL_PREFIX=/usr
    prime:
      - -./usr/include
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/cmake
      - -./usr/lib/$CRAFT_ARCH_TRIPLET/*.a
    after:
      - ffmpeg
      - mozjpeg
      - openssl
