¿Cómo implementar ignorar usuarios bloqueados en grupos de Telegram?

imagen alt

UPD: gracias por ayudar TkachovEste artículo todavía pasó de una solicitud de ayuda a una instrucción de trabajo. En los comentarios, dio un código de trabajo para crear un ignorar en el cliente de escritorio Telegram. Por si acaso, pondré una explicación al final del artículo. Además, el artículo continúa en la misma forma en que fue escrito.

* * *

Me gustaría pedir ayuda a la comunidad, porque he agotado por completo todas mis posibilidades.

Uno podría hacer una pregunta sobre el servicio de preguntas y respuestas (también conocido como ex tostador), solo que ya lo he hecho y no ha salido mucho de eso.

Sin embargo, hacer una pregunta con el pretexto de un artículo no me parece muy correcto. Por lo tanto, intentaré agregar el fondo de todo el proceso al texto y decir qué pasos ya se han tomado.

Si tienes suerte, alguien en los comentarios te dirá la solución. Y luego, aquellos que encuentren este artículo en los motores de búsqueda también podrán resolver este problema.

Problema y antecedentes


Como todos los usuarios de Telegram saben, en los chats grupales de este mensajero no hay función de ignorar usuarios. Puede bloquear a un usuario que sea desagradable para usted, pero esto simplemente le prohíbe escribirle mensajes privados. En el chat grupal, y ahora los chats grupales parecen acomodar hasta 10 mil usuarios, simplemente tiene que ver todo lo que otros miembros del grupo han desechado.

En el "Black Mirror" incluso hubo una serie al respecto.


¡Sigue mirando! ¡Sigue mirando! ¡Sigue mirando!

Si tratamos de encontrar una solución a este problema en Internet, nos encontraremos con una típica historia de guerra de una gran corporación y un pequeño grupo de personas descontentas. Las etapas de esta guerra son claramente visibles en Github.

Aquí está la primera solicitud de esta función desde 2015.Puede encontrar enlaces a los siguientes temas en este hilo, las personas constantemente solicitaron esta función en los años siguientes, pero cada llamada se cerró con una respuesta bastante estúpida "Esto no es un problema del cliente, sino un problema de API".

Ni siquiera está claro para el programador que los datos se muestran al usuario con la ayuda del cliente. E incluso si la API le envía todos los mensajes desde el servidor, no hay problema para ocultar algunos de ellos en el lado del cliente.

Pero desde hace cinco años, todos los años, y a veces varias veces al año, las personas llegan a Github con una solicitud de ignorar en grupos, y cada vez que se les niega y se cierra el tema. Hace más de seis meses, aparentemente cansados ​​de los requisitos constantes, los desarrolladores publicaron una excusa no vinculante : dicen, sí, sí, haremos todo, algún día en un futuro lejano.


¡Te oí! Solo lo expresé hasta que estoy listo para responderte, digamos, entiendo tu posición. ¡Vamos, llama, no te pierdas!

Esta excusa tiene exactamente un beneficio: ahora los administradores de tdesktop en Github se refieren a este mensaje para todas las quejas. Diga, miren, lo saben todo, lo harán todo, lo siento, la sucursal está cerrada. En los últimos seis meses, se produjeron muchos cambios que consumieron mucho tiempo en el telegrama, por ejemplo, se agregaron a los chats pegatinas animadas y HERMOSOS formularios para agitar las encuestas. Pero no ignorar llegó incluso cerca. Creo que no aparecerá en un año.

Al mismo tiempo, la situación parece incluso un poco siniestra: existe la sensación de que está prohibido introducir esta función con instrucciones especiales para las horquillas oficiales. Telegram tiene al menos una docena de horquillas conocidas (como Unigram) y cien horquillas poco conocidas, pero ninguna de ellas tiene esta característica. Escribí en apoyo de los tenedores más populares, pero no recibí respuesta.

Al mismo tiempo, gestionar usuarios bloqueados con mensajes del lado del cliente pueden ser . Esto se confirma por la existencia de Telegreat . Esta es una bifurcación de Telegram, en la que se declaró la opción de ignorar a los usuarios bloqueados.

Por desgracia, este ignorar no es real. Todo lo que hace la opción "Ignorar usuarios bloqueados" es colorear el texto de los mensajes de los usuarios bloqueados en gris. Las imágenes, videos, música o calcomanías de usuarios bloqueados aún son visibles; Además, el color gris en temas oscuros es perfectamente legible.

Las personas acuden regularmente al chat con el desarrollador, donde me senté un rato, y me piden que haga un "verdadero ignorar". Anteriormente, simplemente se negaba; En los últimos seis meses, abandonó por completo su proyecto, porque "no tiene tiempo". Bueno, esto es algo común para proyectos de código abierto gratuitos.

Menciono este proyecto por dos razones.

  • En primer lugar, se anuncia precisamente como un "cliente con una función de ignorar" y es aconsejado por personas que leen solo la descripción, sin saber cómo se implementa realmente este "ignorar". Como se mencionó anteriormente, esta función no funciona.
  • En segundo lugar, es una confirmación viva de que en el cliente de Telegram es posible determinar el mensaje de un usuario bloqueado y cambiarlo. Eso es, de hecho, ignorar en el lado del cliente es posible.

Sin embargo, nadie hace esto.

Lo mejor de todo es que mis sentimientos se transmiten en un comentario sobre un tema similar en Reddit hace cuatro años:
Estoy sorprendido de que no puedas hacerlo.

¿Seriamente?

Si simplemente no quiero leer nada que escriban algunos usuarios, debería poder hacerlo ... ¡es como una de las características más básicas de todos los protocolos de comunicación!

¡Podrías hacerlo en los años 90 con correos electrónicos y grupos de noticias!

Además, dondequiera que hablemos sobre los motivos de la ausencia de un jugador, se repiten las mismas cosas:
- No verá todos los mensajes y por eso no entenderá lo que sucede en el chat.
- Duplicarás los mensajes.
- Se violará la funcionalidad del sistema de "respuestas".

Y, de nuevo, uso una cita, solo para mostrarle: estos no son mis pensamientos personales, esta es nuestra posición común, las personas que desean introducir esta función:
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.
Este es solo un ejemplo de vida con respecto a la duplicación: me siento en varios chats de telegramas y durante el día varios usuarios siempre lanzan las mismas noticias / capturas de pantalla divertidas / memes populares nuevos en el chat. A pesar de que antes de ellos ya estaba. A pesar del hecho de que no se ignora, simplemente no leen el historial de chat ni los mensajes duplicados. Acerca de cómo la gente no sabe cómo usar la búsqueda en los foros y repite repetidamente las mismas preguntas. Ni siquiera lo mencionaré, la mayoría de los lectores probablemente se han encontrado con esto. Nuevamente, sin ninguna ignorancia, este problema ya existe. E ignorarla no lo agravará.

Entonces, ¿por qué en realidad no existe esta función?

Bueno, la tesis de la conspiración dice que el objetivo principal de Telegram es recopilar datos personales y gráficos de interacción del usuario. En este sentido, cada grupo de telegramas le permite arreglar un grupo pequeño típico, que el usuario puede soportar al menos, y que puede soportarlo. De lo contrario, o es expulsado del grupo o se va. La introducción de ignorar violará la pureza del experimento.

La versión de marketing es un poco más fácil.

Cuando Khaled Mardam Bay creó mIRC en 1995, escribió un programa para personas. Quiero decir, para las personas independientes que saben lo que quieren, eligen lo que piensan que es correcto y son responsables de las consecuencias de sus acciones. Por un lado, esto causó problemas, por ejemplo, con vulnerabilidades programadas: ejecuta una línea con comandos y eso es todo, es pirateado. Por otro lado, era un mensajero utilizado por adultos y personas responsables. Y sabían cómo existir en un chat con ignorar, donde algunos de los mensajes simplemente no son visibles.

Cuando en 2013 Pasha Durov hizo Telegram, hizo el programa "para amas de casa". Para un usuario masivo tonto que necesita un buen tutor. Por lo tanto, todo este registro por número de teléfono, enviando mensajes a todos en la guía telefónica, banderas y prohibiciones desde todos los lados. Después de todo, "presionan algo y todo desaparece". ¡Y luego escribirán quejas en apoyo! De ahí esas estúpidas excusas: "porque si activas ignorar, no verás los mensajes de otras personas". Cuando crea un producto en masa, se ve obligado a limitar cualquier funcionalidad. El producto para el tonto debe tener protección contra el tonto.

Aquí viene el argumento de la corona, que siempre se da al final: "No me gusta, no lo use así". No explicaré qué le pasa, esta es una pregunta ética del formato "por qué no se debe comer a la gente": quien le pregunte no tiene sentido explicarlo.

Pero en el caso de Telegram, este argumento está ligeramente modificado: "No me gusta, hazlo como quieras, es de código abierto" .

Intento de resolver


Cansado de muchos años de búsqueda, decidí realmente intentar cambiar algo por mi cuenta. Me pareció una buena idea hacer mi propio ensamblaje del Telegram. No en el sentido de una asamblea pública, con un sitio web y ubicación en la tienda de aplicaciones, sino simplemente compilando la aplicación y usándola usted mismo.

En este sentido, no me molestarían los posibles "frenos" de ocultar mensajes, ni el "problema de perder el contexto en la conversación", ni el problema de "cómo administrar el chat si no ve parte de los mensajes". Todo esto no me interesaba.

Me pareció obvio que solo agregando una línea como esta:
if message.author.isBlocked == true, message.value = 'El mensaje del usuario bloqueado'
Perdón por el pseudocódigo, pero me parece que transmite la idea correctamente. Solo quería captar cualquier mensaje en una etapa muy temprana, cuando solo proviene del servidor, y reemplazarlo con una línea sobre bloqueo. Por lo tanto, el problema se resolvería con imágenes / pegatinas / gifs; también se reemplazarían con un mensaje de este tipo y no serían visibles. E incluso si alguien respondiera o citara un mensaje, aún sería reemplazado.

¿Pero por dónde empezar?

Después de preguntar a los amigos de los programadores, descubrí que hay dos formas. El primero es usar el cliente nativo de Telegram, y el segundo es usar un cliente de terceros que está escrito usando la nueva biblioteca TDLib. Fui al servicio de preguntas mencionado al principio del artículo y formulé una pregunta allí. Como puede ver, la línea de encuestados no está alineada. El único hilo condujo al mensajero Kotatogram.

Hablé con el creador de este mensajero, y él me dio dos consejos útiles.
En primer lugar, dijo que los mensajes en el cliente nativo se muestran de la manera habitual y no se generan (sin embargo, sospeché esto con el ejemplo de Telegreat), por lo tanto, puede usar el cliente nativo como fuente.
En segundo lugar, le dijo dónde buscar la salida del mensaje en sí, en el bloque history_message.

Desafortunadamente, él, como el creador de Telegreat, tampoco tuvo tiempo libre para agregar independientemente la función de ignorar, que es para su cliente, que es para mí.

¿Cómo procedí después? Las instrucciones de ensamblaje existen en Github, pero no refleja todas las etapas del trabajo. Los describiré aquí, en caso de que alguien más llegue al artículo que no esté particularmente familiarizado con la programación, pero que quiera hacer que el mismo cliente ignore por sí mismo:

  1. Decidí hacer todo en una máquina virtual. Para hacer esto, instalé Oracle VM Virtual Box para mí y descargué su máquina virtual oficial con Windows 10 y Visual Studio 2019 preinstalados del sitio web oficial de Microsoft
  2. Visual Studio. , C++, Visual Studio Installer . Modify C++, . QT .
  3. Git c git-scm.com
  4. . !

Hay 2 secciones de equipos. Y si la primera sección contiene aproximadamente una docena de comandos que son fáciles de copiar y pegar en la línea de comando, entonces, para la segunda sección de varias docenas de comandos, parece natural copiar todo el código en un archivo bat y ejecutarlo. Esto es un error, porque el proceso se detiene al menos dos veces.

La primera parada ocurre después de la línea:

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

La segunda es después de la cuarta línea desde el final, la instrucción de configuración QT larga:

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

Como me dijeron mis amigos, esto se debe al hecho de que durante la ejecución de estos comandos se lanzan otros archivos bat, en los que ya se ha registrado una salida directa del proceso. Como resultado, debe simplemente copiar y pegar los comandos, o dividir la instrucción en 3 archivos bat (pero en este caso, recuerde que los comandos deben continuar ejecutándose desde el mismo directorio en el que se detuvo el proceso).

Obtener su propio api_id también se describe en Github .

En última instancia, compilé un archivo exe de Telegram completamente funcional. En total, el ensamblaje dura aproximadamente tres horas (sin contar las descargas e instalaciones preliminares), tal vez esta vez depende de la potencia de la computadora.

Ayuda de Hall (y solución encontrada)


Y aquí finalmente aparece mi pedido a la sociedad habra. Como los lectores ya han adivinado, no sé qué y cómo cambiar. Me parece que encontré un lugar donde se muestra el mensaje, pero no estoy seguro, porque no conozco C ++. Sin mencionar que (quizás) sería correcto cambiar algo no en history_message, sino en algún lugar de history_item. "Algo en élfico, no puedo leer" Tal vez alguien aquí ya ha encontrado el código de Telegram o simplemente tiene una habilidad muy desarrollada y puede escribir la misma línea con el reemplazo de cualquier mensaje de un usuario bloqueado, y también decir dónde ponerlo este código






Supongo que el mecanismo de retirada del telegrama en sí no cambiará repentinamente. Entonces, al actualizar el cliente, simplemente descargaré la versión actualizada del github y agregaré esta línea nuevamente con un candado antes de compilar.

UPD: Como mencioné al principio del artículo, una versión funcional del código apareció en los comentarios . Lo traigo directamente al artículo.

La primera parte del código reemplaza el texto con otro mensaje. Esto es necesario porque este texto es visible entre comillas si otro usuario responde el bloqueado, o a la izquierda en la ventana de chat, donde se muestran los últimos mensajes en chats grupales.

En el archivo History_Message.cpp encontramos la función en el mismo lugar que en la captura de pantalla anterior:

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


Y dentro reemplazamos el texto original:

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


En avanzado:


	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 usa solo este código, los mensajes antiguos de los usuarios bloqueados serán visibles, pero los nuevos ya no lo serán.

Por lo tanto, la segunda parte de la solución mencionada en este comentario

agrega el siguiente código al archivo history_view_message.cpp:

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


UPD: en la nueva versión, el compilador jura en un retorno vacío, por lo que agregué la salida de QSize (0,0)
PeerData* pd = item->from();
if (pd->isUser() && pd->asUser()->isBlocked()) return QSize(0,0);


Inmediatamente después de declarar la variable del elemento en
QSize Message :: performCountOptimalSize ()
y
void Message :: draw (
Painter & p,
QRect clip,
TextSelection selection,
crl :: time ms) ,

esto le permitirá ver completamente los mensajes de usuarios bloqueados en el registro de chat.

Adición importante: si de repente los mensajes del usuario bloqueado siguen siendo visibles, solo necesita hacer clic en su perfil, la información que está bloqueada se actualizará y todos sus mensajes desaparecerán del registro de chat.

Para aquellos que lo deseen, agregó una aplicación compilada a Dropbox .

UPD: creó un "sitio" para distribuir sites.google.com/view/ignoram

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


All Articles