Comment implémenter ignorer les utilisateurs bloqués dans les groupes Telegram?

image alt

UPD: merci pour l'aide Tkachovcet article est toujours passé d'une demande d'aide à une instruction de travail. Dans les commentaires, il a donné un code de travail pour créer un ignorer dans le client de bureau Telegram. Au cas où, je mettrai une explication à la fin de l'article. En outre, l'article se poursuit sous la même forme dans laquelle il a été rédigé.

* * *

Je voudrais demander de l'aide à la communauté, car j'ai complètement épuisé toutes mes possibilités.

On pourrait poser une question sur le service Q&A (alias l'ancien grille-pain) - seulement je l'ai déjà fait, et peu de choses en sont sorties.

Néanmoins, le simple fait de poser une question sous couvert d'un article ne me semble pas très correct. Par conséquent, je vais essayer d'ajouter le contexte de l'ensemble du processus au texte et de dire quelles mesures ont déjà été prises.

Si vous avez de la chance, quelqu'un dans les commentaires vous expliquera la solution. Et puis, ceux qui trouveront cet article dans les moteurs de recherche pourront également résoudre ce problème.

Problème et contexte


Comme tous les utilisateurs de Telegram le savent bien, dans les discussions de groupe de ce messager, il n'y a pas de fonction d'ignorer l'utilisateur. Vous pouvez bloquer un utilisateur qui vous déplaît, mais cela lui interdit simplement de vous écrire des messages privés. Dans le chat de groupe - et maintenant les chats de groupe semblent accueillir jusqu'à 10 000 utilisateurs - il vous suffit de voir tout ce que les autres membres du groupe ont rejeté.

Dans le «Black Mirror», il y avait même une série à ce sujet.


Continuer de regarder! Continuer de regarder! Continuer de regarder!

Si nous essayons de trouver une solution à ce problème sur Internet, nous rencontrerons une histoire de guerre typique d'une grande entreprise et d'un petit groupe de gens mécontents. Les étapes de cette guerre sont clairement visibles sur Github.

Voici la première demande pour cette fonctionnalité depuis 2015.Vous pouvez trouver des liens vers les sujets suivants dans ce fil, les gens ont constamment demandé cette fonctionnalité dans les années suivantes, mais chaque appel s'est avéré être fermé avec une réponse plutôt stupide "Ce n'est pas un problème client, mais un problème API".

Il n'est même pas clair pour le programmeur que les données sont montrées à l'utilisateur avec l'aide du client. Et même si l'API vous envoie tous les messages du serveur - il n'y a aucun problème à en cacher certains côté client.

Mais depuis cinq ans maintenant, chaque année, et parfois plusieurs fois par an, les gens arrivent à Github avec une demande d'introduire ignorer dans les groupes - et chaque fois qu'ils sont refusés et le sujet fermé. Il y a plus de six mois, apparemment fatigués des exigences constantes, les développeurs ont affiché une excuse non contraignante : ils disent, oui, oui, nous ferons tout, un jour dans un avenir lointain.


Je vous ai entendu! Je viens de l'exprimer jusqu'à ce que je sois prêt à vous répondre, disons, je comprends votre position. Allez, appelle, ne te perds pas!

Il y a exactement un avantage à cette excuse - maintenant les administrateurs de tdesktop sur Github se réfèrent à ce message pour toutes les plaintes. Dites - regardez, ils savent tout, ils feront tout, je suis désolé, la succursale est fermée. Au cours des six derniers mois, de nombreux changements chronophages ont eu lieu dans le télégramme, par exemple, des autocollants animés et de BELLES formes d'agitation pour les sondages ont été ajoutés aux chats. Mais aucun ignorer n'est venu de près. Je pense que cela n'apparaîtra pas dans un an.

Dans le même temps, la situation semble même un peu sinistre - on a le sentiment qu'il est interdit d'introduire cette fonction avec des instructions spéciales pour les fourches officielles. Telegram possède au moins une douzaine de fourches bien connues (comme Unigram) et une centaine de fourches peu connues, mais aucune d'entre elles n'a cette fonctionnalité. J'ai écrit à l'appui des fourches les plus populaires, mais je n'ai reçu aucune réponse.

Dans le même temps, gérer avec les utilisateurs bloqués les messages côté client peuvent être . Ceci est confirmé par l'existence de Telegreat . Il s'agit d'un fork de Telegram, dans lequel l'option d'ignorer les utilisateurs bloqués a été déclarée.

Hélas, cette ignorance n'est pas réelle. L'option «Ignorer les utilisateurs bloqués» ne fait que coloriser le texte des messages des utilisateurs bloqués en gris. Les photos, vidéos, musique ou autocollants d'utilisateurs bloqués sont toujours visibles; De plus, la couleur grise sur les sujets sombres est parfaitement lisible.

Les gens viennent régulièrement discuter avec le développeur, où je me suis assis pendant un certain temps, et demandent de faire un «vrai ignorer». Auparavant, il avait simplement refusé; au cours des six derniers mois, il a complètement abandonné son projet, car il "n'a pas le temps". Eh bien, c'est une chose courante pour les projets open source gratuits.

Je mentionne ce projet pour deux raisons.

  • Premièrement, il est annoncé précisément comme un «client avec une fonction ignorer» et il est conseillé par des personnes qui ne lisent que la description, ne sachant pas comment cet «ignorer» y est réellement implémenté. Comme mentionné ci-dessus, cette fonction ne fonctionne pas.
  • Deuxièmement, c'est une confirmation vivante que dans le client Telegram, il est possible de déterminer le message d'un utilisateur bloqué et de le modifier. Autrement dit, ignorer du côté client est possible.

Cependant, personne ne le fait.

Mieux encore, mes sentiments sont exprimés dans un commentaire sur un sujet similaire sur Reddit il y a quatre ans:
Je suis choqué que vous ne puissiez pas le faire.

Sérieusement?

Si je ne veux pas lire quoi que ce soit écrit par certains utilisateurs, je devrais pouvoir le faire ... c'est comme, l'une des caractéristiques très basiques de tous les protocoles de communication JAMAIS!

Vous pourriez le faire dans les années 90 avec des e-mails et des groupes de discussion!

De plus, partout où nous parlons des raisons de l'absence d'un joueur, les mêmes choses se répètent:
- Vous ne verrez pas tous les messages et à cause de cela vous ne comprendrez pas ce qui se passe dans le chat.
- Vous dupliquerez les messages.
- La fonctionnalité du système de «réponses» sera violée.

Et, encore une fois, j'utilise une citation, juste pour vous montrer - ce ne sont pas mes pensées personnelles, c'est notre position commune, les gens qui veulent introduire cette fonction:
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.
Voici juste un exemple de vie concernant la duplication - Je participe à plusieurs chats de télégrammes et pendant la journée, plusieurs utilisateurs jettent toujours la même actualité / capture d'écran drôle / mème populaire frais dans le chat. Malgré le fait qu'avant eux c'était déjà. Malgré le fait qu'il n'y a pas d'ignorance, ils ne lisent toujours pas l'historique de discussion et les messages en double. À propos de la façon dont les gens ne savent pas comment utiliser la recherche sur les forums et répètent à plusieurs reprises les mêmes questions - je ne le mentionnerai même pas, la plupart des lecteurs l'ont probablement rencontré. Encore une fois, sans aucune ignorance, ce problème existe déjà. Et l'ignorer n'aggravera pas.

Alors , pourquoi ne cette fonction existe vraiment pas?

Eh bien, la thèse du complot dit que l'objectif principal du télégramme est de collecter des données personnelles et des graphiques d'interaction avec les utilisateurs. En ce sens, chaque groupe de télégrammes vous permet de fixer un petit groupe typique auquel l'utilisateur peut au moins résister et qui peut le supporter. Sinon, soit il est expulsé du groupe, soit il se quitte. L'introduction d'ignorer violera la pureté de l'expérience.

La version marketing est un peu plus simple.

Lorsque Khaled Mardam Bay a créé mIRC en 1995, il a écrit un programme pour les gens. Je veux dire, pour les personnes indépendantes qui savent ce qu'elles veulent, elles choisissent ce qu'elles pensent être juste et sont responsables des conséquences de leurs actions. D'une part, cela a causé des problèmes, par exemple, avec des vulnérabilités scriptées - vous exécutez une ligne avec des commandes et c'est tout, vous êtes piraté. D'un autre côté, c'était un messager utilisé par les adultes et les personnes responsables. Et ils savaient comment exister dans un chat avec ignore, où certains des messages ne sont tout simplement pas visibles.

Quand en 2013 Pasha Durov a fait Telegram, il a fait le programme «pour les femmes au foyer». Pour un utilisateur de masse stupide qui a besoin d'un bon tuteur. Par conséquent, tout cet enregistrement par numéro de téléphone, l'envoi de messages à tout le monde sur l'annuaire téléphonique, les drapeaux et les interdictions de tous les côtés. Après tout, ils "pressent quelque chose et tout disparaît!". Et puis ils écriront des plaintes à l'appui! D'où de telles excuses stupides - "parce que si vous activez Ignorer, alors vous ne verrez pas les messages des autres." Lorsque vous créez un produit de masse - vous êtes obligé de limiter toute fonctionnalité. Le produit pour le fou doit avoir une protection contre le fou.

Voici l'argument de la couronne, qui est toujours donné à la fin: "Ne l'aimez pas - ne l'utilisez pas comme ça." Je ne vais pas expliquer ce qui ne va pas chez lui, c'est une question éthique du format «pourquoi les gens ne devraient pas être mangés» - celui qui lui demande n'a pas de sens à expliquer.

Mais dans le cas de Telegram, cet argument est légèrement modifié: "Je n'aime pas ça - faites-le comme vous voulez, c'est open source . "

Tenter de résoudre


Fatigué de nombreuses années de recherche, j'ai décidé d'essayer vraiment de changer quelque chose par moi-même. Cela m'a semblé une bonne idée de faire ma propre assemblée du Télégramme. Pas dans le sens d'une assemblée publique, avec un site Web et un placement dans le magasin d'applications, mais simplement en compilant l'application pour vous-même et en l'utilisant vous-même.

En ce sens, je ne serais pas dérangé par d'éventuels "freins" à cacher des messages, ni par le "problème de perte de contexte dans la conversation", ni le problème de "comment administrer le chat si vous ne voyez pas une partie des messages". Tout cela ne m'intéressait pas.

Il m'a semblé évident que le simple fait d'ajouter une ligne comme celle-ci:
si message.author.isBlocked == true alors message.value = 'Le message de l'utilisateur bloqué'
Désolé pour le pseudo-code, mais il me semble qu'il transmet correctement l'idée. Je voulais juste attraper n'importe quel message au tout début, quand il ne vient que du serveur, et le remplacer par une ligne sur le blocage. Ainsi, le problème serait résolu avec des images / autocollants / gifs - ils seraient également remplacés par un tel message et ils ne seraient pas visibles. Et même si quelqu'un répondait ou citait un message, il serait toujours remplacé.

Mais par où commencer?

Après avoir demandé aux amis des programmeurs, j'ai découvert qu'il y avait deux façons. La première consiste à utiliser le client Telegram natif, et la seconde à utiliser un client tiers qui est écrit à l'aide de la bibliothèque TDLib plus récente. Je suis allé au service de questions mentionné au début de l'article et y ai posé une question. Comme vous pouvez le voir, la liste des répondants n'est pas alignée. Le seul fil a conduit au messager Kotatogram.

J'ai parlé avec le créateur de ce messager, et il m'a donné deux conseils utiles.
Premièrement, il a dit que les messages dans le client natif sont affichés de la manière habituelle et ne sont pas générés (je le soupçonnais cependant avec l'exemple de Telegreat) - par conséquent, vous pouvez utiliser le client natif comme source.
Deuxièmement, il a dit où chercher le message lui-même - dans le bloc history_message.

Malheureusement, lui, comme le créateur de Telegreat, n'a pas non plus eu de temps libre pour ajouter indépendamment la fonction ignorer, qui est à son client, qui est pour moi.

Comment ai-je procédé ensuite? Les instructions de montage existent sur Github, mais elles ne reflètent pas toutes les étapes du travail. Je vais les décrire ici, au cas où quelqu'un d'autre viendrait à l'article qui n'est pas particulièrement familier avec la programmation, mais qui veut faire le même client avec ignorer pour lui-même:

  1. J'ai décidé de tout faire dans une machine virtuelle. Pour ce faire, j'ai installé Oracle VM Virtual Box pour moi-même et téléchargé leur machine virtuelle officielle avec Windows 10 et Visual Studio 2019 préinstallés sur le site officiel de Microsoft
  2. Visual Studio. , C++, Visual Studio Installer . Modify C++, . QT .
  3. Git c git-scm.com
  4. . !

Il y a 2 sections d'équipes. Et si la première section contient une douzaine de commandes faciles à copier et coller dans la ligne de commande, alors pour la deuxième section de plusieurs dizaines de commandes, il semble naturel de copier tout le code dans un fichier bat et de l'exécuter. Il s'agit d'une erreur, car le processus s'arrête au moins deux fois.

Le premier arrêt se produit après la ligne:

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

La seconde est après la quatrième ligne de la fin, la longue instruction de configuration QT:

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

Comme mes amis me l'ont dit, cela est dû au fait que pendant l'exécution de ces commandes, d'autres fichiers bat sont lancés, dans lesquels une sortie directe du processus est déjà enregistrée. Par conséquent, vous devez simplement copier et coller les commandes, ou diviser l'instruction en 3 fichiers bat (mais dans ce cas, n'oubliez pas que les commandes doivent continuer à être exécutées à partir du même répertoire dans lequel le processus s'est arrêté!).

Obtenir votre propre api_id est également décrit sur Github .

En fin de compte, j'ai compilé un fichier exe Telegram pleinement fonctionnel. Au total, l'assemblage prend environ trois heures (sans compter les téléchargements et installations préliminaires), ce temps dépend peut-être de la puissance de l'ordinateur.

Aide Hall (et solution trouvée)


Et voici enfin ma demande à la habrasociety apparaît. Comme les lecteurs l'ont déjà deviné, je ne sais pas quoi et comment changer. Il me semble que j'ai trouvé un endroit où le message est affiché, mais je ne suis pas sûr, car je ne connais pas le C ++. Sans oublier que (peut-être) il serait correct de changer quelque chose non pas dans history_message, mais quelque part dans history_item. "Quelque chose en elfique, je ne peux pas lire" Peut-être que quelqu'un ici a déjà rencontré le code Telegram ou a juste une compétence très développée et peut écrire la même ligne avec le remplacement de tout message d'un utilisateur bloqué, et aussi dire où le mettre ce code.






Je suppose que le mécanisme de retrait du télégramme lui-même ne changera pas soudainement. Donc, lors de la mise à jour du client, je vais simplement télécharger la version mise à jour depuis le github et ajouter à nouveau cette ligne avec un verrou avant de compiler.

UPD: Comme je l'ai mentionné au début de l'article, une version de travail du code est apparue dans les commentaires . Je l'apporte directement à l'article.

La première partie du code remplace le texte par un autre message. Ceci est nécessaire car ce texte est visible entre guillemets si un autre utilisateur répond au bloqué, ou à gauche dans la fenêtre de discussion, où les derniers messages des discussions de groupe sont affichés.

Dans le fichier History_Message.cpp, nous trouvons la fonction juste au même endroit que dans la capture d'écran ci-dessus:

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


Et à l'intérieur, nous remplaçons le texte original:

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


Sur avancé:


	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())
			});
	}


Si vous utilisez uniquement ce code, les anciens messages des utilisateurs bloqués seront visibles, mais les nouveaux ne le seront plus.

Par conséquent, la deuxième partie de la solution mentionnée dans ce commentaire

ajoute le code suivant au fichier history_view_message.cpp:

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


UPD: dans la nouvelle version, le compilateur jure sur un retour vide, j'ai donc ajouté la sortie de QSize (0,0)
PeerData* pd = item->from();
if (pd->isUser() && pd->asUser()->isBlocked()) return QSize(0,0);


Immédiatement après avoir déclaré la variable item dans les fonctions
QSize Message :: performCountOptimalSize ()
et
void Message :: draw (
Painter & p,
QRect clip,
TextSelection selection,
crl :: time ms) ,

cela vous permettra de voir complètement les messages des utilisateurs bloqués dans le journal de discussion.

Ajout important: si tout à coup les messages de l'utilisateur bloqué sont toujours visibles - il vous suffit de cliquer sur son profil, les informations qu'il est bloqué seront mises à jour, et tous ses messages disparaîtront du journal de chat.

Pour ceux qui le souhaitent, il a ajouté une application compilée à Dropbox .

UPD: création d' un «site» pour la distribution de sites.google.com/view/ignoram

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


All Articles