Bagaimana cara menerapkan pengabaian pengguna yang diblokir dalam grup Telegram?

alt gambar

UPD: terima kasih untuk membantu Tkachovartikel ini masih berubah dari permintaan bantuan menjadi instruksi yang berfungsi. Dalam komentarnya, dia memberikan kode kerja untuk membuat diabaikan di klien desktop Telegram. Untuk jaga-jaga, saya akan memberikan penjelasan di akhir artikel. Selanjutnya, artikel berlanjut dalam bentuk yang sama dengan yang ditulis.

* * *

Saya ingin meminta bantuan komunitas, karena saya sudah benar-benar kehabisan semua kemungkinan saya sendiri.

Orang bisa mengajukan pertanyaan pada layanan T&J (alias mantan pemanggang roti) - hanya saja saya sudah melakukan ini, dan tidak banyak yang keluar darinya.

Namun demikian, hanya mengajukan pertanyaan dengan kedok artikel tampaknya bagi saya tidak terlalu benar. Oleh karena itu, saya akan mencoba untuk menambahkan latar belakang seluruh proses ke teks dan memberi tahu langkah-langkah apa yang telah diambil.

Jika Anda beruntung, seseorang di komentar akan memberi tahu Anda solusinya. Dan kemudian mereka yang menemukan artikel ini di mesin pencari juga akan dapat menyelesaikan masalah ini.

Masalah dan Latar Belakang


Karena semua pengguna Telegram sangat menyadari, dalam obrolan grup dari messenger ini tidak ada fungsi abaikan pengguna. Anda dapat memblokir pengguna yang tidak menyenangkan bagi Anda, tetapi ini hanya melarangnya untuk menulis pesan pribadi kepada Anda. Dalam obrolan grup - dan sekarang obrolan grup tampaknya dapat mengakomodasi hingga 10 ribu pengguna - Anda hanya perlu melihat segala sesuatu yang dilemparkan oleh anggota grup lainnya.

Di "Black Mirror" bahkan ada seri tentang hal itu.


Terus awasi! Terus awasi! Terus awasi!

Jika kita mencoba menemukan solusi untuk masalah ini di Internet, kita akan menemukan kisah perang khas sebuah perusahaan besar dan sekelompok kecil orang yang tidak puas. Tahapan perang ini terlihat jelas di Github.

Ini adalah permintaan pertama untuk fitur ini mulai tahun 2015.Anda dapat menemukan tautan ke topik berikut di utas ini, orang-orang terus-menerus meminta fitur ini di tahun-tahun berikutnya, tetapi setiap panggilan ternyata ditutup dengan jawaban yang agak bodoh "Ini bukan masalah klien, tetapi masalah API".

Bahkan programmer tidak memahami bahwa data ditampilkan kepada pengguna dengan bantuan klien. Dan bahkan jika API mengirimi Anda semua pesan dari server - tidak ada masalah menyembunyikannya di sisi klien.

Tetapi selama lima tahun sekarang, setiap tahun, dan kadang-kadang beberapa kali dalam setahun, orang-orang sampai ke Github dengan permintaan untuk memperkenalkan pengabaian dalam kelompok - dan setiap kali mereka ditolak dan topik ditutup. Lebih dari enam bulan yang lalu, tampaknya bosan dengan persyaratan yang konstan, para pengembang memposting alasan yang tidak mengikat : mereka mengatakan, ya, ya, kami akan melakukan segalanya, suatu hari di masa depan yang jauh.


Saya mendengar mu! Saya baru saja menyuarakannya sampai saya siap menjawab Anda, katakanlah, saya mengerti posisi Anda. Ayo, telepon, jangan tersesat!

Hanya ada satu manfaat dari alasan ini - sekarang administrator tdesktop di Github merujuk pesan ini untuk semua keluhan. Katakanlah - lihat, mereka tahu segalanya, mereka akan melakukan segalanya, maaf, cabang sudah ditutup. Selama enam bulan terakhir, banyak perubahan yang memakan waktu terjadi di telegram, misalnya, stiker animasi dan formulir melambaikan INDAH untuk polling ditambahkan ke obrolan. Tapi tidak menghiraukan mendekat bahkan dekat. Saya pikir itu tidak akan muncul dalam setahun.

Pada saat yang sama, situasinya bahkan terlihat sedikit menyeramkan - ada perasaan bahwa dilarang untuk memperkenalkan fungsi ini dengan instruksi khusus untuk garpu resmi. Telegram memiliki setidaknya selusin fork yang terkenal (seperti Unigram) dan ratusan fork yang sedikit diketahui, tetapi tidak satupun dari mereka yang memiliki fitur ini. Saya menulis untuk mendukung garpu yang paling populer, tetapi tidak mendapat tanggapan.

Pada saat yang sama mengelola dengan pengguna diblokir pesan sisi klien bisa . Ini dikonfirmasi oleh keberadaan Telegreat . Ini adalah percabangan Telegram, di mana opsi untuk mengabaikan pengguna yang diblokir dinyatakan.

Sayangnya, pengabaian ini tidak nyata. Semua yang dilakukan opsi โ€œAbaikan pengguna yang diblokirโ€ adalah mewarnai teks pesan dari pengguna yang diblokir dalam warna abu-abu. Gambar, video, musik atau stiker dari pengguna yang diblokir masih terlihat; Selain itu, warna abu-abu pada topik gelap dapat dibaca dengan sempurna.

Orang-orang secara teratur datang ke obrolan ke pengembang, di mana saya duduk sebentar, dan meminta untuk membuat "diabaikan nyata". Sebelumnya, dia hanya menolak; dalam enam bulan terakhir, dia benar-benar meninggalkan proyeknya, karena dia "tidak punya waktu." Nah, ini adalah hal umum untuk proyek open source gratis.

Saya menyebutkan proyek ini karena dua alasan.

  • Pertama, ia diiklankan secara tepat sebagai "klien dengan fungsi pengabaian" dan disarankan oleh orang-orang yang hanya membaca deskripsi, tidak tahu bagaimana sebenarnya "pengabaian" ini diterapkan di sana. Seperti disebutkan di atas, fungsi ini tidak berfungsi.
  • Kedua, ini adalah konfirmasi langsung bahwa dalam klien Telegram dimungkinkan untuk menentukan pesan dari pengguna yang diblokir dan mengubahnya. Faktanya, mengabaikan di sisi klien adalah mungkin.

Namun, tidak ada yang melakukan ini.

Yang terbaik dari semuanya, perasaan saya disampaikan dalam komentar tentang topik serupa tentang Reddit empat tahun lalu:
Saya terkejut Anda tidak bisa melakukannya.

Serius?

Jika saya hanya tidak ingin membaca apa pun yang ditulis oleh beberapa pengguna, saya harus dapat melakukannya ... itu seperti, salah satu fitur paling mendasar dari setiap protokol komunikasi yang pernah ada!

Anda bisa melakukannya di tahun 90-an dengan email dan newsgroup!

Selain itu, di mana pun kita berbicara tentang alasan tidak adanya pemain, hal yang sama diulang:
- Anda tidak akan melihat semua pesan dan karena ini Anda tidak akan mengerti apa yang terjadi dalam obrolan.
- Anda akan menduplikasi pesan.
- Fungsionalitas sistem "jawaban" akan dilanggar.

Dan, sekali lagi, saya menggunakan kutipan hanya untuk menunjukkan kepada Anda - ini bukan pikiran pribadi saya, ini adalah posisi umum kami, orang yang ingin memperkenalkan fungsi ini:
I can assure you 100.00% of people asking for this feature, are fully aware of the side effects it has, and could not care less about those.

Yes just not show it at all. Yes including if it's a reply. Yes if the admin needs to see everything to moderate, then they don't have the luxury of using ignore. And most certainly we can compare TG groups to IRC, because they are both a mechanism for accomplishing the same thing, namely multi-user communication.
Berikut ini adalah contoh nyata tentang duplikasi - Saya duduk di beberapa obrolan telegram dan pada siang hari beberapa pengguna selalu membuang berita yang sama / tangkapan layar lucu / meme populer yang baru ke dalam obrolan. Terlepas dari kenyataan bahwa sebelum mereka sudah. Terlepas dari kenyataan bahwa tidak ada abaikan, mereka tetap saja tidak membaca riwayat obrolan dan menggandakan pesan. Tentang bagaimana orang tidak tahu cara menggunakan pencarian di forum, dan berulang kali mengulangi pertanyaan yang sama - Saya bahkan tidak akan menyebutkannya, sebagian besar pembaca mungkin telah menemukan ini. Sekali lagi, tanpa ketidaktahuan, masalah ini sudah ada. Dan mengabaikannya tidak akan memperburuk.

Jadi mengapa tidak fungsi ini benar-benar tidak ada?

Nah, tesis konspirasi mengatakan bahwa tujuan utama Telegram adalah untuk mengumpulkan data pribadi dan grafik interaksi pengguna. Dalam pengertian ini, setiap grup telegram memungkinkan Anda untuk memperbaiki grup kecil yang khas, yang paling tidak dapat ditahan oleh pengguna, dan yang dapat menahannya. Kalau tidak, dia diusir dari grup, atau dia pergi sendiri. Pengenalan pengabaian akan melanggar kemurnian percobaan.

Versi pemasarannya sedikit lebih mudah.

Ketika Khaled Mardam Bay menciptakan mIRC pada tahun 1995, ia menulis sebuah program untuk orang-orang. Maksud saya, untuk orang independen yang tahu apa yang mereka inginkan, mereka memilih apa yang mereka anggap benar dan bertanggung jawab atas konsekuensi dari tindakan mereka. Di satu sisi, ini menyebabkan masalah, misalnya, dengan kerentanan scripted - Anda menjalankan baris dengan perintah dan hanya itu, Anda diretas. Di sisi lain, itu adalah kurir yang digunakan oleh orang dewasa dan orang yang bertanggung jawab. Dan mereka tahu bagaimana cara hidup dalam obrolan dengan abaikan, di mana beberapa pesan sama sekali tidak terlihat.

Ketika pada 2013 Pasha Durov membuat Telegram, ia membuat program "untuk ibu rumah tangga". Untuk pengguna massal bodoh yang membutuhkan wali yang baik. Karenanya, semua pendaftaran ini berdasarkan nomor telepon, mengirim pesan ke semua orang di buku telepon, bendera, dan larangan dari semua pihak. Bagaimanapun, mereka โ€œmenekan sesuatu dan semuanya menghilang!โ€. Dan kemudian mereka akan menulis keluhan untuk mendukung! Karenanya alasan bodoh seperti itu - "karena jika Anda menghidupkan mengabaikan, maka Anda tidak akan melihat pesan orang lain." Ketika Anda membuat produk massal - Anda dipaksa untuk membatasi fungsionalitas apa pun. Produk untuk si bodoh harus memiliki perlindungan terhadap si bodoh.

Di sinilah argumen mahkota, yang selalu diberikan di bagian akhir: "Jangan suka itu - jangan menggunakannya seperti itu." Saya tidak akan menjelaskan apa yang salah dengannya, ini adalah pertanyaan etis dari format "mengapa orang tidak boleh dimakan" - siapa pun yang bertanya kepadanya tidak ada artinya untuk menjelaskan.

Tetapi dalam kasus Telegram, argumen ini sedikit dimodifikasi: "Saya tidak suka - lakukan sesuka Anda, ini open source . "

Mencoba memecahkannya


Bosan dengan pencarian bertahun-tahun, saya memutuskan untuk benar-benar mencoba mengubah sesuatu sendiri. Bagiku itu ide yang bagus untuk membuat kumpulan Telegram sendiri. Bukan dalam arti majelis publik, dengan situs web dan penempatan di toko aplikasi, tetapi cukup menyusun aplikasi untuk diri sendiri dan menggunakannya sendiri.

Dalam hal ini, saya tidak akan terganggu oleh "rem" yang mungkin dari menyembunyikan pesan, atau "masalah kehilangan konteks dalam percakapan," atau masalah "bagaimana mengelola obrolan jika Anda tidak melihat beberapa pesan." Semua ini tidak menarik minat saya.

Tampak jelas bagi saya bahwa hanya menambahkan garis seperti ini:
jika message.author.isBlocked == true maka message.value = 'Pesan dari pengguna yang diblokir'
Maaf untuk pseudo-code, tetapi bagi saya itu menyampaikan ide dengan benar. Saya hanya ingin menangkap pesan apa pun pada tahap sangat awal, ketika itu hanya datang dari server, dan menggantinya dengan garis tentang pemblokiran. Dengan demikian, masalah akan diselesaikan dengan gambar / stiker / gif - mereka juga akan diganti dengan pesan seperti itu dan tidak akan terlihat. Dan bahkan jika seseorang membalas atau mengutip pesan, itu masih akan diganti.

Tapi dari mana harus memulai?

Setelah bertanya kepada teman-teman programmer, saya menemukan bahwa ada dua cara. Yang pertama adalah menggunakan klien Telegram asli, dan yang kedua adalah menggunakan klien pihak ketiga yang ditulis menggunakan perpustakaan TDLib yang lebih baru. Saya pergi ke layanan pertanyaan yang disebutkan di awal artikel dan mengajukan pertanyaan di sana. Seperti yang Anda lihat, garis responden tidak berbaris. Satu-satunya utas mengarah ke kurir Kotatogram.

Saya berbicara dengan pencipta messenger ini, dan dia memberi saya dua tips yang berguna.
Pertama, ia mengatakan bahwa pesan di klien asli ditampilkan dengan cara biasa, dan tidak dihasilkan (namun, saya menduga ini dengan contoh Telegreat) - karena itu, Anda dapat menggunakan klien asli sebagai sumber.
Kedua, dia memberi tahu ke mana harus mencari output pesan itu sendiri - di blok history_message.

Sayangnya, dia, seperti pencipta Telegreat, juga tidak punya waktu luang untuk secara mandiri menambahkan fungsi abaikan, yaitu untuk kliennya, yang bagi saya.

Bagaimana saya melanjutkan selanjutnya? Instruksi perakitan ada di Github, tetapi itu tidak mencerminkan semua tahapan pekerjaan. Saya akan menjelaskannya di sini, kalau-kalau ada orang yang datang ke artikel yang tidak terlalu akrab dengan pemrograman, tetapi yang ingin membuat klien yang sama dengan mengabaikan untuk dirinya sendiri:

  1. Saya memutuskan untuk melakukan semuanya di mesin virtual. Untuk melakukan ini, saya menginstal Oracle VM Virtual Box untuk saya sendiri dan mengunduh mesin virtual resmi mereka dengan Windows 10 dan Visual Studio 2019 yang sudah diinstal dari situs web resmi Microsoft.
  2. Visual Studio. , C++, Visual Studio Installer . Modify C++, . QT .
  3. Git c git-scm.com
  4. . !

Ada 2 bagian tim. Dan jika bagian pertama berisi sekitar selusin perintah yang mudah untuk disalin dan ditempelkan ke baris perintah, maka untuk bagian kedua dari beberapa lusin perintah, tampaknya wajar untuk menyalin semua kode ke file bat dan menjalankannya. Ini kesalahan, karena proses berhenti setidaknya dua kali.

Pemberhentian pertama terjadi setelah baris:

gyp --no-circular-check breakpad_client.gyp --format=ninja

Yang kedua adalah setelah baris keempat dari ujung, instruksi konfigurasi QT yang panjang:

configure -prefix "%LibrariesPath%\Qt-5.12.5" ....... 

Seperti yang dikatakan teman saya kepada saya, ini disebabkan oleh fakta bahwa selama eksekusi perintah ini file bat lainnya diluncurkan, di mana jalan keluar langsung dari proses sudah terdaftar. Akibatnya, Anda harus menyalin dan menempelkan perintah, atau membagi instruksi menjadi 3 file bat (tetapi dalam hal ini, ingat bahwa perintah harus terus dijalankan dari direktori yang sama di mana proses berhenti!).

Mendapatkan api_id Anda sendiri juga dijelaskan di Github .

Pada akhirnya, saya mengkompilasi file exe Telegram yang berfungsi penuh. Secara total, perakitan membutuhkan waktu sekitar tiga jam (tidak termasuk unduhan awal dan instalasi), mungkin kali ini tergantung pada kekuatan komputer.

Bantuan hall (dan solusinya ditemukan)


Dan di sini akhirnya permintaan saya ke habrasociety muncul. Seperti yang sudah ditebak pembaca, saya tidak tahu apa dan bagaimana harus berubah. Sepertinya saya menemukan tempat di mana pesan ditampilkan, tetapi saya tidak yakin, karena saya tidak tahu C ++. Belum lagi bahwa (mungkin) akan benar untuk mengubah sesuatu yang tidak ada di history_message, tetapi di suatu tempat di history_item. "Sesuatu dalam Peri, saya tidak bisa membaca" Mungkin seseorang di sini telah menemukan kode Telegram atau hanya memiliki keterampilan yang sangat berkembang dan dapat menulis baris yang sama dengan penggantian pesan apa pun dari pengguna yang diblokir, dan juga mengatakan di mana harus meletakkannya kode ini.






Saya kira mekanisme penarikan telegram itu sendiri tidak akan tiba-tiba berubah. Jadi ketika memperbarui klien, saya hanya akan mengunduh versi yang diperbarui dari github dan menambahkan baris ini lagi dengan kunci sebelum kompilasi.

UPD: Seperti yang saya sebutkan di awal artikel, versi kode yang berfungsi muncul di komentar . Saya membawanya langsung ke artikel.

Bagian pertama dari kode menggantikan teks dengan pesan lain. Ini perlu karena teks ini terlihat dalam tanda kutip jika pengguna lain menjawab yang diblokir, atau di sebelah kiri di jendela obrolan, tempat pesan terbaru dalam obrolan grup ditampilkan.

Dalam file History_Message.cpp kita menemukan fungsinya di tempat yang sama seperti pada tangkapan layar di atas:

HistoryMessage::HistoryMessage(
	not_null<History*> history,
	const MTPDmessage &data,
	MTPDmessage_ClientFlags clientFlags)


Dan di dalam kami mengganti teks asli:

	if (const auto media = data.vmedia()) {
		setMedia(*media);
	}
	setText({
		TextUtilities::Clean(qs(data.vmessage())),
		Api::EntitiesFromMTP(data.ventities().value_or_empty())
	});


Sedang maju:


	UserId from = data.vfrom_id().value_or_empty();
	PeerData* pd = from ? history->owner().user(from) : history->peer;
	if (pd->isUser() && pd->asUser()->isBlocked()) {
		setText({
			TextUtilities::Clean(qs("The message from blocked user")),
			Api::EntitiesFromMTP(data.ventities().value_or_empty())
			});
	}
	else {
		//   442-448:
		if (const auto media = data.vmedia()) {
			setMedia(*media);
		}
		setText({
			TextUtilities::Clean(qs(data.vmessage())),
			Api::EntitiesFromMTP(data.ventities().value_or_empty())
			});
	}


Jika Anda hanya menggunakan kode ini, pesan lama dari pengguna yang diblokir akan terlihat, tetapi yang baru tidak akan lagi.

Oleh karena itu, bagian kedua dari solusi yang disebutkan dalam komentar ini

menambahkan kode berikut ke file history_view_message.cpp:

PeerData* pd = item->from();
if (pd->isUser() && pd->asUser()->isBlocked()) return;


UPD: dalam versi baru, kompiler bersumpah pengembalian kosong, jadi saya menambahkan output QSize (0,0)
PeerData* pd = item->from();
if (pd->isUser() && pd->asUser()->isBlocked()) return QSize(0,0);


Segera setelah mendeklarasikan variabel item dalam
Pesan QSize :: performCountOptimalSize ()
dan
void Message :: draw (
Painter & p,
QRect clip,
TextSelection selection,
crl :: time ms) fungsi,

ini akan sepenuhnya mencegah pesan dari pengguna yang diblokir di log obrolan.

Tambahan penting: Jika tiba-tiba pesan dari pengguna yang diblokir masih terlihat - Anda hanya perlu mengklik profilnya, informasi bahwa ia diblokir akan diperbarui, dan semua pesannya akan hilang dari log obrolan.

Bagi yang ingin, dia menambahkan aplikasi yang dikompilasi ke Dropbox .

UPD: Membuat "situs" untuk mendistribusikan sites.google.com/view/ignoram

Source: https://habr.com/ru/post/undefined/


All Articles