Wie implementiere ich ignorierte blockierte Benutzer in Telegrammgruppen?

Bild alt

UPD: Danke an die Hilfe TkachovDieser Artikel verwandelte sich immer noch von einer Bitte um Hilfe in eine Arbeitsanweisung. In den Kommentaren gab er einen Arbeitscode zum Erstellen eines Ignorierens im Telegramm-Desktop-Client an. Für alle Fälle werde ich am Ende des Artikels eine Erklärung einfügen. Ferner wird der Artikel in derselben Form fortgesetzt, in der er geschrieben wurde.

* * *

Ich möchte die Community um Hilfe bitten, da ich alle meine eigenen Möglichkeiten völlig ausgeschöpft habe.

Man könnte eine Frage zum Q & A-Service (auch bekannt als ehemaliger Toaster) stellen - nur ich habe dies bereits getan, und es ist nicht viel daraus geworden.

Trotzdem scheint es mir nicht sehr richtig, nur eine Frage unter dem Deckmantel eines Artikels zu stellen. Daher werde ich versuchen, den Hintergrund des gesamten Prozesses zum Text hinzuzufügen und zu erläutern, welche Schritte bereits unternommen wurden.

Wenn Sie Glück haben, wird Ihnen jemand in den Kommentaren die Lösung mitteilen. Und dann können auch diejenigen, die diesen Artikel in den Suchmaschinen finden, dieses Problem lösen.

Problem und Hintergrund


Wie allen Telegrammbenutzern bekannt ist, gibt es in den Gruppenchats dieses Messengers keine Benutzer-Ignorierfunktion. Sie können einen Benutzer blockieren, der für Sie unangenehm ist. Dies verhindert jedoch, dass er Ihnen private Nachrichten schreibt. In Gruppenchat - und jetzt scheinen Gruppen - Chats zu 10 Tausend Benutzer zu beherbergen - Sie einfach müssen alles , dass andere Mitglieder der Gruppe sehen weg geworfen haben.

Im „Black Mirror“ gab es sogar eine Serie darüber.


Pass auf! Pass auf! Pass auf!

Wenn wir versuchen, im Internet eine Lösung für dieses Problem zu finden, werden wir auf eine typische Kriegsgeschichte eines großen Unternehmens und einer kleinen Gruppe verärgerter Menschen stoßen. Die Stadien dieses Krieges sind auf Github deutlich sichtbar.

Hier ist die erste Anfrage für diese Funktion aus dem Jahr 2015.In diesem Thread finden Sie Links zu den folgenden Themen. In den folgenden Jahren wurde ständig nach dieser Funktion gefragt, aber jeder Anruf wurde mit einer ziemlich dummen Antwort "Dies ist kein Client-Problem, sondern ein API-Problem" abgeschlossen.

Für den Programmierer ist nicht einmal klar, dass die Daten dem Benutzer mit Hilfe des Clients angezeigt werden. Und selbst wenn die API Ihnen alle Nachrichten vom Server sendet, gibt es kein Problem, einige davon auf der Clientseite zu verbergen.

Aber seit fünf Jahren, jedes Jahr und manchmal mehrmals im Jahr, kommen die Leute nach Github mit der Bitte, Ignorieren in Gruppen einzuführen - und jedes Mal, wenn sie abgelehnt und das Thema geschlossen werden. Vor mehr als sechs Monaten, anscheinend müde von den ständigen Anforderungen, haben die Entwickler eine unverbindliche Entschuldigung veröffentlicht : Sie sagen, ja, ja, wir werden eines Tages alles in ferner Zukunft tun.


Ich habe dich gehört! Ich habe es nur geäußert, bis ich bereit bin, Ihnen zu antworten. Sagen wir, ich verstehe Ihre Position. Komm, ruf an, geh nicht verloren!

Diese Ausrede hat genau einen Vorteil: Jetzt beziehen sich tdesktop-Administratoren auf Github bei allen Beschwerden auf diese Nachricht. Sagen Sie - schauen Sie, sie wissen alles, sie werden alles tun, es tut mir leid, die Filiale ist geschlossen. In den letzten sechs Monaten wurden viele zeitaufwändige Änderungen am Telegramm vorgenommen, z. B. wurden Chatrooms animierte Aufkleber und REDUZIERENDE bewegliche Formen für Umfragen hinzugefügt. Aber kein Ignorieren kam auch nur annähernd. Ich denke, es wird in einem Jahr nicht erscheinen.

Gleichzeitig sieht die Situation sogar ein wenig unheimlich aus - es besteht das Gefühl, dass es verboten ist, diese Funktion mit speziellen Anweisungen für offizielle Gabeln einzuführen. Telegramm hat mindestens ein Dutzend bekannte Gabeln (wie Unigram) und hundert wenig bekannte Gabeln, aber keine von ihnen hat diese Funktion. Ich schrieb zur Unterstützung der beliebtesten Gabeln, erhielt aber keine Antwort.

Gleichzeitig können mit blockierten Benutzern clientseitige Nachrichten verwaltet werden . Dies wird durch die Existenz von Telegreat bestätigt . Dies ist eine Abzweigung von Telegramm, in der die Option zum Ignorieren blockierter Benutzer deklariert wurde.

Leider ist dieses Ignorieren nicht real. Mit der Option "Blockierte Benutzer ignorieren" wird der Text von Nachrichten blockierter Benutzer nur grau eingefärbt. Bilder, Videos, Musik oder Aufkleber von blockierten Benutzern sind weiterhin sichtbar. Darüber hinaus ist die graue Farbe bei dunklen Themen perfekt lesbar.

Die Leute kommen regelmäßig zu einem Chat mit dem Entwickler, wo ich eine Weile saß, und bitten um ein "echtes Ignorieren". Zuvor lehnte er einfach ab; in den letzten sechs Monaten hat er sein Projekt komplett aufgegeben, weil er "keine Zeit hat". Nun, dies ist eine häufige Sache für kostenlose Open-Source-Projekte.

Ich erwähne dieses Projekt aus zwei Gründen.

  • Erstens wird es genau als "Client mit einer Ignorierfunktion" beworben und von Personen empfohlen, die nur die Beschreibung lesen und nicht wissen, wie dieses "Ignorieren" dort tatsächlich implementiert wird. Wie oben erwähnt, funktioniert diese Funktion nicht.
  • Zweitens ist es eine lebendige Bestätigung, dass es im Telegramm-Client möglich ist, die Nachricht eines blockierten Benutzers zu ermitteln und zu ändern. Das heißt, Ignorieren auf der Client-Seite ist tatsächlich möglich.

Dies tut jedoch niemand.

Das Beste ist, dass meine Gefühle in einem Kommentar zu einem ähnlichen Thema auf Reddit vor vier Jahren vermittelt werden:
Ich bin schockiert, dass du es nicht kannst.

Ernsthaft?

Wenn ich einfach nichts lesen möchte, was ein Benutzer schreibt, sollte ich dazu in der Lage sein ... es ist wie eine der Grundfunktionen jedes Kommunikationsprotokolls, das es je gab!

Sie könnten es in den 90ern mit E-Mails und Newsgroups tun!

Überall dort, wo wir über die Gründe für die Abwesenheit eines Spielers sprechen, werden dieselben Dinge wiederholt:
- Sie werden nicht alle Nachrichten sehen und aus diesem Grund werden Sie nicht verstehen, was im Chat passiert.
- Sie werden Nachrichten duplizieren.
- Die Funktionalität des Systems der „Antworten“ wird verletzt.

Und wieder benutze ich ein Zitat, um Ihnen zu zeigen - dies sind nicht meine persönlichen Gedanken, dies ist unsere gemeinsame Position, Menschen, die diese Funktion einführen möchten:
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.
Hier ist nur ein Beispiel aus dem Leben in Bezug auf das Duplizieren: Ich sitze in mehreren Telegramm-Chats und während des Tages werfen mehrere Benutzer immer die gleichen Nachrichten / lustigen Screenshots / frischen beliebten Memes in den Chat. Trotz der Tatsache, dass es vor ihnen schon war. Trotz der Tatsache, dass es kein Ignorieren gibt, lesen sie immer noch nicht den Chat-Verlauf und duplizieren Nachrichten. Darüber, wie Leute nicht wissen, wie sie die Suche in den Foren verwenden sollen, und wiederholt dieselben Fragen wiederholen - ich werde es nicht einmal erwähnen, die meisten Leser sind wahrscheinlich darauf gestoßen. Auch hier besteht dieses Problem ohne Unwissenheit bereits. Und ignorieren Sie sie wird nicht erschweren.

Warum gibt es diese Funktion wirklich nicht?

Nun, die Verschwörungsthese besagt, dass das Hauptziel des Telegramms darin besteht, persönliche Daten und Benutzerinteraktionsdiagramme zu sammeln. In diesem Sinne können Sie mit jeder Telegrammgruppe eine typische kleine Gruppe festlegen, der der Benutzer zumindest standhalten kann und die ihm standhalten kann. Andernfalls wird er entweder aus der Gruppe geworfen oder er verlässt sich. Die Einführung von Ignorieren verletzt die Reinheit des Experiments.

Die Marketing-Version ist etwas einfacher.

Als Khaled Mardam Bay 1995 mIRC gründete, schrieb er ein Programm für Menschen. Ich meine, für unabhängige Menschen, die wissen, was sie wollen, wählen sie, was sie für richtig halten, und sind für die Konsequenzen ihres Handelns verantwortlich. Einerseits verursachte dies Probleme, zum Beispiel mit geskripteten Sicherheitslücken - Sie führen eine Zeile mit Befehlen aus und das war's, Sie werden gehackt. Auf der anderen Seite war es ein Bote, der von Erwachsenen und Verantwortlichen benutzt wurde. Und sie wussten, wie man in einem Chat mit Ignorieren existiert, in dem einige der Nachrichten einfach nicht sichtbar sind.

Als Pascha Durov 2013 Telegramm machte, machte er das Programm „für Hausfrauen“. Für einen dummen Massenbenutzer, der einen guten Vormund braucht. Daher all diese Registrierung nach Telefonnummer, Senden von Nachrichten an alle im Telefonbuch, Flaggen und Verbote von allen Seiten. Immerhin „drücken sie etwas und alles verschwindet!“. Und dann werden sie Beschwerden zur Unterstützung schreiben! Daher solche dummen Ausreden - "denn wenn Sie Ignorieren aktivieren, werden Sie die Nachrichten anderer Leute nicht sehen." Wenn Sie ein Massenprodukt herstellen, müssen Sie die Funktionalität einschränken. Das Produkt für den Narren muss vor dem Narren geschützt sein.

Hier kommt das Kronenargument, das immer am Ende steht: "Mag es nicht - benutze es nicht so." Ich werde nicht erklären, was mit ihm los ist, dies ist eine ethische Frage des Formats „Warum Menschen nicht gegessen werden sollten“ - wer ihn fragt, ist bedeutungslos zu erklären.

Aber im Fall von Telegramm ist dieses Argument leicht modifiziert: "Ich mag es nicht - mach es wie du willst, es ist Open Source . "

Versuch zu lösen


Ich war es leid, jahrelang zu suchen, und beschloss, wirklich zu versuchen, etwas selbst zu ändern. Es schien mir eine gute Idee zu sein, das Telegramm selbst zusammenzustellen. Nicht im Sinne einer öffentlichen Versammlung mit einer Website und Platzierung im Anwendungsspeicher, sondern einfach die Anwendung für sich selbst zusammenstellen und selbst verwenden.

In diesem Sinne würde mich weder eine mögliche "Bremse" beim Ausblenden von Nachrichten noch das "Problem des Verlusts des Kontexts in der Konversation" noch das Problem der "Verwaltung des Chats, wenn Sie einige der Nachrichten nicht sehen" stören. Das alles interessierte mich nicht.

Mir schien klar, dass ich nur eine Zeile wie diese hinzufügte:
Wenn message.author.isBlocked == true, dann message.value = 'Die Nachricht vom blockierten Benutzer'
Entschuldigung für den Pseudocode, aber es scheint mir, dass er die Idee richtig vermittelt. Ich wollte nur eine Nachricht in einem sehr frühen Stadium abfangen, wenn sie nur vom Server kommt, und sie durch eine Zeile über das Blockieren ersetzen. Somit würde das Problem mit Bildern / Aufklebern / Gifs gelöst - sie würden auch durch eine solche Nachricht ersetzt und wären nicht sichtbar. Und selbst wenn jemand auf eine Nachricht antwortete oder sie zitierte, würde sie dennoch ersetzt.

Aber wo soll ich anfangen?

Nachdem ich Freunde von Programmierern gefragt hatte, fand ich heraus, dass es zwei Möglichkeiten gibt. Der erste besteht darin, den nativen Telegramm-Client zu verwenden, und der zweite darin, einen Drittanbieter-Client zu verwenden, der mit der neueren TDLib-Bibliothek geschrieben wurde. Ich ging zu dem am Anfang des Artikels erwähnten Fragendienst und stellte dort eine Frage. Wie Sie sehen können, ist die Linie der Befragten nicht in einer Reihe. Der einzige Thread führte zum Kotatogram Messenger.

Ich habe mit dem Schöpfer dieses Boten gesprochen und er hat mir zwei nützliche Tipps gegeben.
Erstens sagte er, dass Nachrichten im nativen Client auf die übliche Weise angezeigt und nicht generiert werden (ich habe dies jedoch im Telegreat-Beispiel vermutet) - daher können Sie den nativen Client als Quelle verwenden.
Zweitens sagte er, wo er nach der Nachrichtenausgabe selbst suchen soll - im Block history_message.

Leider hatte er, wie der Schöpfer von Telegreat, auch keine freie Zeit, um unabhängig die Ignorierfunktion hinzuzufügen, die für seinen Kunden bestimmt ist, was für mich ist.

Wie bin ich als nächstes vorgegangen? Montageanleitungen sind auf Github vorhanden, spiegeln jedoch nicht alle Arbeitsschritte wider. Ich werde sie hier beschreiben, falls jemand anderes zu dem Artikel kommt, der mit der Programmierung nicht besonders vertraut ist, aber denselben Client mit Ignorieren für sich selbst machen möchte:

  1. Ich habe beschlossen, alles in einer virtuellen Maschine zu machen. Zu diesem Zweck habe ich Oracle VM Virtual Box für mich selbst installiert und die offizielle virtuelle Maschine mit vorinstalliertem Windows 10 und Visual Studio 2019 von der offiziellen Microsoft-Website heruntergeladen
  2. Visual Studio. , C++, Visual Studio Installer . Modify C++, . QT .
  3. Git c git-scm.com
  4. . !

Es gibt 2 Teams. Und wenn der erste Abschnitt ungefähr ein Dutzend Befehle enthält, die einfach zu kopieren und in die Befehlszeile einzufügen sind, dann erscheint es für den zweiten Abschnitt von ein paar Dutzend Befehlen natürlich, den gesamten Code in eine Bat-Datei zu kopieren und auszuführen. Dies ist ein Fehler, da der Prozess mindestens zweimal gestoppt wird.

Der erste Stopp erfolgt nach der Zeile:

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

Die zweite ist nach der vierten Zeile vom Ende die lange QT-Konfigurationsanweisung:

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

Wie meine Freunde mir sagten, liegt dies daran, dass während der Ausführung dieser Befehle andere Bat-Dateien gestartet werden, in denen bereits ein direkter Ausstieg aus dem Prozess registriert ist. Daher müssen Sie entweder einfach die Befehle kopieren und einfügen oder die Anweisung in 3 Bat-Dateien aufteilen (denken Sie jedoch in diesem Fall daran, dass die Befehle weiterhin in demselben Verzeichnis ausgeführt werden sollten, in dem der Prozess gestoppt wurde!).

Das Abrufen Ihrer eigenen api_id wird auch auf Github beschrieben .

Letztendlich habe ich eine voll funktionsfähige Telegramm-Exe-Datei zusammengestellt. Insgesamt dauert die Montage etwa drei Stunden (ohne die vorläufigen Downloads und Installationen). Möglicherweise hängt diese Zeit von der Leistung des Computers ab.

Hall Hilfe (und Lösung gefunden)


Und hier erscheint endlich meine Bitte an die Habrasociety. Wie die Leser bereits vermutet haben, weiß ich nicht, was und wie ich mich ändern soll. Es scheint mir, dass ich einen Ort gefunden habe, an dem die Nachricht angezeigt wird, aber ich bin mir nicht sicher, da ich C ++ nicht kenne. Ganz zu schweigen davon, dass es (vielleicht) richtig wäre, etwas nicht in history_message, sondern irgendwo in history_item zu ändern. "Etwas auf Elbisch, das ich nicht lesen kann" Vielleicht hat hier jemand bereits den Telegrammcode gefunden oder verfügt nur über eine sehr entwickelte Fähigkeit und kann dieselbe Zeile mit dem Ersetzen einer Nachricht von einem blockierten Benutzer schreiben und auch sagen, wo sie abgelegt werden soll dieser Code.






Ich nehme an, dass sich der Auszahlungsmechanismus des Telegramms selbst nicht plötzlich ändern wird. Wenn ich den Client aktualisiere, lade ich einfach die aktualisierte Version vom Github herunter und füge diese Zeile vor dem Kompilieren erneut mit einer Sperre hinzu.

UPD: Wie ich am Anfang des Artikels erwähnt habe, erschien in den Kommentaren eine funktionierende Version des Codes. Ich bringe es direkt zum Artikel.

Der erste Teil des Codes ersetzt den Text durch eine andere Nachricht. Dies ist notwendig, weil Dieser Text wird in Anführungszeichen angezeigt, wenn ein anderer Benutzer auf den blockierten antwortet, oder links im Chatfenster, wo die neuesten Nachrichten in Gruppenchats angezeigt werden.

In der Datei History_Message.cpp finden wir die Funktion genau an der gleichen Stelle wie im obigen Screenshot:

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


Und innen ersetzen wir den Originaltext:

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


Für Fortgeschrittene:


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


Wenn Sie nur diesen Code verwenden, werden die alten Nachrichten blockierter Benutzer angezeigt, die neuen jedoch nicht mehr.

Daher fügt der zweite Teil der in diesem Kommentar erwähnten Lösung

der Datei history_view_message.cpp den folgenden Code hinzu:

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


UPD: In der neuen Version schwört der Compiler auf eine leere Rückgabe, daher habe ich die Ausgabe von QSize (0,0) hinzugefügt.
PeerData* pd = item->from();
if (pd->isUser() && pd->asUser()->isBlocked()) return QSize(0,0);


Unmittelbar nach dem Deklarieren der
Elementvariablen in den Funktionen QSize Message :: performCountOptimalSize ()
und
void Message :: draw (
Painter & p,
QRect-Clip,
TextSelection-Auswahl,
crl :: time ms)

werden die Nachrichten von blockierten Benutzern im Chat-Protokoll vollständig verhindert.

Ein wichtiger Zusatz: Wenn plötzlich die Nachrichten des blockierten Benutzers immer noch sichtbar sind - Sie müssen nur auf sein Profil klicken, werden die Informationen, die er blockiert, aktualisiert und alle seine Nachrichten verschwinden aus dem Chat-Protokoll.

Für diejenigen, die es wünschen, fügte er Dropbox eine kompilierte Anwendung hinzu .

UPD: Eine "Site" zum Verteilen von sites.google.com/view/ignoram erstellt

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


All Articles