Ini akan tentang Telegrammer, kerangka kerja Telegram Bot untuk Linux / macOS , ditulis seluruhnya dalam Swift 4.1

Eksposisi: Bagaimana pemikiran seperti itu muncul dalam pikiran?
Salah satu proyek kesayangan saya (aplikasi iOS yang terkait dengan Telegram, tetapi sekarang ini bukan tentang dia) membutuhkan antarmuka web untuk pengelola konten untuk membuat deskripsi, tag, dan lainnya. Karena aplikasi sudah terhubung secara ideologis dengan Telegram, segera terlintas di benak saya untuk mengirim konten langsung ke messenger dan sudah ada tindakan di atas.
Ternyata Anda dapat mengirim data tersebut melalui bot (bagaimana bot diatur dalam Telegram ).
Awal: Saya mencari solusi yang sudah jadi, saya tidak bisa menemukan yang cocok.
Dan kemudian semua bintang berbaris berurutan, sekarang Anda akan mengerti apa yang saya maksud ...
Ada banyak kerangka kerja Sisi Server yang andal dan terbukti di Jawa, Go, Python, PHP, dan lainnya yang sudah memungkinkan Anda membuat bot tanpa masalah. Tapi ini bukan tentang kita (saksi Yehuwa Apple), kami tidak mencari cara mudah.
Bagaimana jika Anda menulis bot di Swift?
Baru-baru ini (berdasarkan standar bahasa pemrograman), komunitas Server Side Swift mulai berkembang secara aktif, dan beberapa kerangka kerja muncul, seperti Vapor, Perfect, Kitura, yang berhasil mendapatkan ketenaran yang cukup.
Plus, Apple melemparkan kayu bakar ke tungku, membuat hidup lebih mudah bagi pengembang dengan kerangka kerja SwiftNIO tingkat rendah dan kinerja tinggi
Mengapa SwiftNIO keren?SwiftNIO adalah kerangka kerja aplikasi jaringan yang digerakkan oleh platform asynchronous asinkron untuk pengembangan cepat dari server & klien protokol kinerja tinggi.
Ini seperti Netty , tetapi ditulis untuk Swift.
SwiftNIO pada dasarnya adalah alat tingkat rendah untuk membangun aplikasi jaringan berkinerja tinggi di Swift. Ini terutama menargetkan kasus-kasus penggunaan di mana menggunakan model konkurensi "thread-per-koneksi" tidak efisien atau tidak dapat dipertahankan. Ini adalah batasan umum ketika membangun server yang menggunakan sejumlah besar koneksi pemanfaatan yang relatif rendah, seperti server HTTP.
Untuk mencapai tujuannya SwiftNIO secara ekstensif menggunakan "I / O" yang tidak menghalangi ": itulah namanya! Non-blocking I / O berbeda dari model I / O blocking yang lebih umum karena aplikasi tidak menunggu data dikirim atau diterima dari jaringan: sebaliknya, SwiftNIO meminta kernel untuk memberitahukannya ketika operasi I / O dapat dilakukan tanpa menunggu.
SwiftNIO tidak bertujuan untuk memberikan solusi tingkat tinggi seperti, misalnya, kerangka kerja web lakukan. Alih-alih, SwiftNIO berfokus untuk menyediakan blok bangunan tingkat rendah untuk aplikasi tingkat tinggi ini. Ketika datang untuk membangun aplikasi web, sebagian besar pengguna tidak akan ingin menggunakan SwiftNIO secara langsung: sebagai gantinya, mereka akan ingin menggunakan salah satu dari banyak kerangka kerja web besar yang tersedia di ekosistem Swift. Kerangka kerja web tersebut, bagaimanapun, dapat memilih untuk menggunakan SwiftNIO di balik selimut untuk memberikan dukungan jaringan mereka.
Apa yang saya pertimbangkan dari perpustakaan Telegram Bot Swift yang sudah selesai:
zmeyc / telegram-bot-swift - Pustaka yang cukup canggih, seluruh API Telegram Bot diuraikan dari situs, baik metode dan model, perutean lanjutan, bekerja pada MacOS dan Linux.
Kerugian yang terkait dengan fakta bahwa itu ditulis sejak lama, dan pada saat itu, semua kerangka kerja Apple (terutama Foundation) bekerja di Linux sangat tidak stabil:
- Mengirim permintaan melalui ikal
- Pada saat penelitian, perpustakaan itu sendiri dan perpustakaan dependen tidak porting ke 4 cepat
- Tidak didukung oleh webhooks
- Sebuah repositori yang belum diperbarui untuk waktu yang lama, sebagai akibatnya, beberapa fitur API Telegram Bot yang diperbarui tidak didukung.
FabrizioBrancati / SwiftyBot - Maafkan saya, saya tidak mengerti mengapa bot ini memiliki bintang terbanyak, Uap 2.4.0 yang ketinggalan zaman berada di bawah tenda, dan main.swift yang kesepian, yang hanya menunjukkan pekerjaan paling sederhana dengan bot tersebut. Tidak ada model, pembantu, antrian pengiriman, tidak ada. Oh tidak! Tidak seperti pesaing, ini mendukung WebHooks.
ShaneQi / ZEGBot - Implementasi yang sangat sederhana, metode dasar, model, dan sekali lagi hanya LongPolling yang diimplementasikan.
Jadi, sudah diputuskan, kami akan menulis kerangka kerja kami sendiri. Sejujurnya, Andrey Fidrya mengilhami saya dengan botnya , tetapi saya memutuskan bahwa saya bisa mencoba melakukan yang lebih baik.
Climax: Selamat datang di dunia backend. SwiftNIO, terima kasih atas otaknya yang meledak.
Saya akui, setelah aplikasi iOS, menulis aplikasi untuk Server Side cukup sulit, saya harus berfikir berbeda.
Pada saat kerangka itu ditulis, orang-orang dari Vapor telah mengumumkan versi beta dan sudah berdasarkan pada SwiftNIO. Vapor memiliki arsitektur modular, setiap lapisan hidup dalam repositori sendiri, yang sangat nyaman, Anda hanya dapat menggunakan sebagian dari implementasinya.
Saya memutuskan untuk menggunakan:
Dalam prosesnya, beberapa bug ditemukan di Vapor HTTPClient, berhasil diperbaiki, HTTPServer ditingkatkan, untuk bekerja dengan https di luar kotak, tanpa perlu menggunakan nginx dan sejenisnya.
Apa yang terjadi:
- API bot dirancang dengan perhatian kuat pada pemain tepercaya di area ini python-telegram-bot
- Seperti zmeyc / telegram-bot-swift, semua model dan metode bot API Telegram Bot dapat dihasilkan dengan menjalankan skrip.
- Menerapkan mode Longpolling dan WebHooks
- Penangan yang diimplementasikan: CommandHandler, CallbackQueryHandler, RegexpHandler, MessageHandler
- Banyak filter untuk Pembaruan
- Dua bot sederhana, sebagai contoh, standar EchoBot dan HelloBot
Interchange: Kami menulis bot yang umumnya berguna, biarkan bot memeriksa ejaannya.
Bot: @yandex_spell_checker_bot
Kode sumber: https://github.com/givip/YandexSpellCheckerBot
main.swift terlihat seperti ini:
import Foundation import Telegrammer /// enviroment variable ( , ) guard let token = Enviroment.get("SPELL_CHECKER_BOT_TOKEN") else { exit(1) } do { /// let bot = try Bot(token: token) /// let dispatcher = Dispatcher(bot: bot) /// let controller = SpellCheckerController(bot: bot) /// /start, let commandHandler = CommandHandler(commands: ["/start"], callback: controller.start) dispatcher.add(handler: commandHandler) /// , let textHandler = MessageHandler(filters: .private, callback: controller.spellCheck) dispatcher.add(handler: textHandler) /// , . let inlineHandler = CallbackQueryHandler(pattern: "\\w+", callback: controller.inline) dispatcher.add(handler: inlineHandler) /// Longpolling _ = try Updater(bot: bot, dispatcher: dispatcher).startLongpolling().wait() } catch { print(error.localizedDescription) }
Epilog: Pengembang iOS dan banyak lagi, gunakan itu!
Kerangka kerja ini dalam versi beta, dan siapa pun dapat menggunakannya untuk kebutuhan mereka.
Setelah satu bulan pengujian dan peningkatan, ada beberapa kekurangan, Wishlist dan banyak masalah peningkatan, tetapi bagaimanapun, "Pemeriksaan Ejaan" telah berputar di Ubuntu untuk waktu yang lama.
Saya akan berterima kasih atas umpan balik, dan melemparkan kipas angin.