Como implementar ignorar usuários bloqueados em grupos de telegrama?

imagem alt

UPD: obrigado por ajudar Tkachoveste artigo ainda passou de uma solicitação de ajuda para uma instrução de trabalho. Nos comentários, ele forneceu um código de trabalho para criar um ignorar no cliente de desktop Telegram. Para o caso, colocarei uma explicação no final do artigo. Além disso, o artigo continua da mesma forma em que foi escrito.

* * *

Gostaria de pedir ajuda à comunidade, porque esgotei completamente todas as minhas possibilidades.

Pode-se fazer uma pergunta sobre o serviço de perguntas e respostas (também conhecido como Toaster) - apenas eu já fiz isso e não saiu muito disso.

No entanto, apenas fazer uma pergunta sob o disfarce de um artigo não me parece muito correto. Portanto, tentarei adicionar o plano de fundo de todo o processo ao texto e informar quais etapas já foram executadas.

Se você tiver sorte, alguém nos comentários dirá a solução. E aqueles que encontrarem este artigo nos mecanismos de pesquisa também poderão resolver esse problema.

Problema e Antecedentes


Como todos os usuários do Telegram estão cientes, nas conversas em grupo deste messenger, não há função de ignorar usuário. Você pode bloquear um usuário que é desagradável para você, mas isso apenas o proíbe de lhe escrever mensagens privadas. No bate-papo em grupo - e agora as conversas em grupo parecem acomodar até 10 mil usuários - você simplesmente precisa ver tudo o que os outros membros do grupo jogaram fora.

No "Black Mirror" havia até uma série sobre isso.


Continue assistindo! Continue assistindo! Continue assistindo!

Se tentarmos encontrar uma solução para esse problema na Internet, encontraremos uma história típica de guerra de uma grande corporação e de um pequeno grupo de pessoas descontentes. Os estágios desta guerra são claramente visíveis no Github.

Aqui está a primeira solicitação para esse recurso a partir de 2015.Você pode encontrar links para os seguintes tópicos neste tópico. As pessoas solicitavam constantemente esse recurso nos anos seguintes, mas cada chamada acabou sendo encerrada com uma resposta bastante estúpida: "Este não é um problema do cliente, mas um problema de API".

Não está claro para o programador que os dados são mostrados ao usuário usando o cliente. E mesmo que a API envie todas as mensagens do servidor - não há problema em ocultar algumas delas no lado do cliente.

Mas há cinco anos, todos os anos, e às vezes várias vezes por ano, as pessoas chegam ao Github com um pedido para introduzir o ignorar em grupos - e cada vez que são recusadas e o tópico é fechado. Mais de seis meses atrás, aparentemente cansados ​​dos requisitos constantes, os desenvolvedores postaram uma desculpa não vinculativa : eles dizem que sim, sim, faremos tudo, algum dia no futuro distante.


Eu te ouvi! Eu só falei até estar pronto para responder, digamos, eu entendo sua posição. Vamos lá, ligue, não se perca!

Existe exatamente um benefício dessa desculpa - agora os administradores do tdesktop no Github consultam esta mensagem para todas as reclamações. Diga - olhe, eles sabem tudo, farão tudo, desculpe, o ramo está fechado. Nos últimos seis meses, muitas mudanças demoradas ocorreram no telegrama, por exemplo, adesivos animados e formulários de ondulação BONITOS para pesquisas foram adicionados às conversas. Mas não ignorar chegou nem perto. Eu acho que não aparecerá em um ano.

Ao mesmo tempo, a situação parece um pouco sinistra - existe a sensação de que é proibido introduzir essa função com instruções especiais para garfos oficiais. O telegrama possui pelo menos uma dúzia de garfos conhecidos (como o Unigram) e uma centena de garfos pouco conhecidos, mas nenhum deles possui esse recurso. Escrevi em apoio aos garfos mais populares, mas não recebi resposta.

Ao mesmo tempo, gerenciar com usuários bloqueados podem ser mensagens do lado do cliente . Isso é confirmado pela existência do Telegreat . Este é um fork do Telegram, no qual a opção de ignorar usuários bloqueados foi declarada.

Infelizmente, esse ignorar não é real. Tudo o que a opção “Ignorar usuários bloqueados” faz é colorir o texto das mensagens dos usuários bloqueados em cinza. Fotos, vídeos, músicas ou adesivos de usuários bloqueados ainda estão visíveis; Além disso, a cor cinza em tópicos escuros é perfeitamente legível.

As pessoas costumam conversar com o desenvolvedor, onde eu fiquei um tempo, e pedir para fazer um "verdadeiro ignorar". Anteriormente, ele simplesmente recusava; nos últimos seis meses, ele abandonou completamente seu projeto, porque "não tem tempo". Bem, isso é comum em projetos de código aberto gratuitos.

Menciono este projeto por dois motivos.

  • Primeiro, ele é anunciado precisamente como um "cliente com uma função de ignorar" e é recomendado por pessoas que leem apenas a descrição, sem saber como esse "ignorar" é realmente implementado lá. Como mencionado acima, esta função não funciona.
  • Em segundo lugar, é uma confirmação viva de que no cliente Telegram é possível determinar a mensagem de um usuário bloqueado e alterá-la. Isso é, de fato, possível ignorar no lado do cliente.

No entanto, ninguém faz isso.

O melhor de tudo é que meus sentimentos são transmitidos em um comentário sobre um tópico semelhante no Reddit há quatro anos:
Estou chocado que você não pode fazer isso.

A sério?

Se eu simplesmente não quiser ler nada que alguns usuários escrevam, eu devo fazê-lo ... é como, um dos recursos básicos de todos os protocolos de comunicação SEMPRE!

Você poderia fazer isso nos anos 90 com e-mails e grupos de notícias!

Além disso, sempre que falamos sobre os motivos da ausência de um jogador, as mesmas coisas são repetidas:
- Você não verá todas as mensagens e, por isso, não entenderá o que está acontecendo no chat.
- Você duplicará as mensagens.
- A funcionalidade do sistema de "respostas" será violada

e, novamente, uso uma citação apenas para mostrar a você - estes não são meus pensamentos pessoais, esta é a nossa posição comum, pessoas que desejam introduzir esta função:
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.
Aqui está apenas um exemplo de vida em relação à duplicação - eu assisto a várias conversas por telegrama e durante o dia vários usuários sempre lançam a mesma notícia / captura de tela engraçada / novo meme popular no chat. Apesar do fato de que antes deles já era. Apesar de não haver como ignorar, eles ainda não leem o histórico de bate-papo e duplicam as mensagens. Sobre como as pessoas não sabem como usar a pesquisa nos fóruns e repetem repetidamente as mesmas perguntas - eu nem vou mencionar, a maioria dos leitores provavelmente já se deparou com isso. Novamente, sem qualquer ignorância, esse problema já existe. E ignorá-la não vai agravar.

Então, por que essa função realmente não existe?

Bem, a tese da conspiração diz que o principal objetivo do Telegram é coletar dados pessoais e gráficos de interação do usuário. Nesse sentido, cada grupo de telegramas permite que você conserte um grupo pequeno típico, que o usuário possa suportar pelo menos e que pode suportar. Caso contrário, ele é expulso do grupo ou sai. A introdução de ignorar violará a pureza do experimento.

A versão de marketing é um pouco mais fácil.

Quando Khaled Mardam Bay criou o mIRC em 1995, ele escreveu um programa para as pessoas. Quero dizer, para pessoas independentes que sabem o que querem, elas escolhem o que acham certo e são responsáveis ​​pelas consequências de suas ações. Por um lado, isso causou problemas, por exemplo, com vulnerabilidades com script - você executa uma linha com comandos e é isso, você é hackeado. Por outro lado, era um mensageiro usado por adultos e pessoas responsáveis. E eles sabiam como existir em um bate-papo com ignorar, onde algumas das mensagens simplesmente não são visíveis.

Quando, em 2013, Pasha Durov fez o Telegram, ele fez o programa "para donas de casa". Para um usuário em massa burro que precisa de um bom tutor. Portanto, todo esse registro por número de telefone, enviando mensagens para todos na lista telefônica, bandeiras e proibições de todos os lados. Afinal, eles “pressionam alguma coisa e tudo desaparece!”. E então eles escreverão reclamações em apoio! Daí essas desculpas estúpidas - "porque se você ignorar, não verá as mensagens de outras pessoas". Quando você faz um produto em massa - você é forçado a limitar qualquer funcionalidade. O produto para o tolo deve ter proteção contra o tolo.

Aí vem o argumento da coroa, que sempre é apresentado no final: "Não goste - não use assim". Não vou explicar o que há de errado com ele, essa é uma questão ética do formato "por que as pessoas não devem ser comidas" - quem pede a ele não faz sentido explicar.

Mas, no caso do Telegram, esse argumento é ligeiramente modificado: "Eu não gosto - faça como quiser, é de código aberto" .

Tentativa de resolver


Cansado de muitos anos de pesquisa, decidi realmente tentar mudar alguma coisa sozinho. Pareceu-me uma boa idéia fazer minha própria assembléia do telegrama. Não no sentido de uma assembléia pública, com um site e posicionamento na loja de aplicativos, mas simplesmente compilando o aplicativo e utilizando-o você mesmo.

Nesse sentido, eu não me incomodaria com nenhum possível "freio" ao ocultar mensagens ou "o problema de perder o contexto na conversa" ou o problema "como administrar o bate-papo se você não vir algumas das mensagens". Tudo isso não me interessou.

Pareceu-me óbvio que apenas adicionar uma linha como esta:
if message.author.isBlocked == true então message.value = 'A mensagem do usuário bloqueado'
Desculpe pelo pseudo-código, mas parece-me que ele transmite a ideia corretamente. Eu só queria pegar qualquer mensagem logo no início, quando ela vem apenas do servidor, e substituí-la por uma linha sobre bloqueio. Assim, o problema seria resolvido com imagens / adesivos / gifs - eles também seriam substituídos por essa mensagem e não seriam visíveis. E mesmo que alguém respondesse ou citasse uma mensagem, ela ainda seria substituída.

Mas por onde começar?

Depois de perguntar aos amigos dos programadores, descobri que existem duas maneiras. O primeiro é usar o cliente Telegram nativo e o segundo é usar um cliente de terceiros gravado usando a biblioteca TDLib mais recente. Eu fui ao serviço de perguntas mencionado no começo do artigo e fiz uma pergunta. Como você pode ver, a linha de entrevistados não está alinhada. O único fio levou ao mensageiro Kotatogram.

Conversei com o criador deste messenger e ele me deu duas dicas úteis.
Primeiro, ele disse que as mensagens no cliente nativo são exibidas da maneira usual e não são geradas (no entanto, suspeitei disso usando o exemplo do Telegreat) - portanto, você pode usar o cliente nativo como fonte.
Em segundo lugar, ele disse onde procurar a saída da mensagem em si - no bloco history_message.

Infelizmente, ele, como o criador do Telegreat, também não teve tempo livre para adicionar independentemente a função ignorar, que é para o cliente dele, que é para mim.

Como eu procedi a seguir? As instruções de montagem existem no Github, mas não refletem todas as etapas do trabalho. Vou descrevê-los aqui, caso alguém venha ao artigo que não esteja particularmente familiarizado com programação, mas que queira fazer com que o mesmo cliente ignore por si mesmo:

  1. Eu decidi fazer tudo em uma máquina virtual. Para fazer isso, instalei o Oracle VM Virtual Box para mim e baixei a máquina virtual oficial com o Windows 10 e o Visual Studio 2019 pré-instalados no site oficial da Microsoft
  2. Visual Studio. , C++, Visual Studio Installer . Modify C++, . QT .
  3. Git c git-scm.com
  4. . !

Existem 2 seções de equipes. E se a primeira seção contém cerca de uma dúzia de comandos que são fáceis de copiar e colar na linha de comando, na segunda seção de várias dezenas de comandos, parece natural copiar todo o código em um arquivo bat e executá-lo. Isso é um erro, porque o processo para pelo menos duas vezes.

A primeira parada ocorre após a linha:

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

A segunda é após a quarta linha do final, a longa instrução de configuração QT:

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

Como meus amigos me disseram, isso se deve ao fato de que durante a execução desses comandos outros arquivos bat são lançados, nos quais uma saída direta do processo já está registrada. Como resultado, você precisa simplesmente copiar e colar os comandos ou dividir a instrução em 3 arquivos bat (mas nesse caso, lembre-se de que os comandos devem continuar sendo executados no mesmo diretório em que o processo parou!).

Obter seu próprio api_id também é descrito no Github .

Por fim, compilei um arquivo exe do Telegram totalmente funcional. No total, a montagem leva cerca de três horas (sem contar os downloads e instalações preliminares), talvez esse tempo dependa da potência do computador.

Ajuda do Hall (e solução encontrada)


E aqui finalmente meu pedido à harasociety aparece. Como os leitores já imaginaram, não sei o que e como mudar. Parece-me que encontrei um local onde a mensagem é exibida, mas não tenho certeza, porque não conheço C ++. Sem mencionar que (talvez) seria correto alterar algo que não esteja na mensagem history_, mas em algum lugar no item history_. "Alguma coisa élfica, não sei ler" Talvez alguém aqui já tenha encontrado o código do Telegram ou apenas tenha uma habilidade muito desenvolvida e possa escrever a mesma linha com a substituição de qualquer mensagem de um usuário bloqueado e também dizer onde colocá-lo esse código.






Suponho que o mecanismo de retirada do telegrama não mude repentinamente. Portanto, ao atualizar o cliente, baixarei a versão atualizada do github e adicionarei esta linha novamente com um bloqueio antes de compilar.

UPD: Como mencionei no início do artigo, uma versão de trabalho do código apareceu nos comentários . Trago-o diretamente para o artigo.

A primeira parte do código substitui o texto por outra mensagem. Isso é necessário porque esse texto é visível entre aspas se outro usuário responder ao bloqueado ou à esquerda na janela de bate-papo, onde são exibidas as últimas mensagens nos bate-papos em grupo.

No arquivo History_Message.cpp, encontramos a função no mesmo local da captura de tela acima:

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


E por dentro, substituímos o texto original:

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


No avançado:


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


Se você usar apenas esse código, as mensagens antigas dos usuários bloqueados serão visíveis, mas as novas não serão mais.

Portanto, a segunda parte da solução mencionada neste comentário

adiciona o seguinte código ao arquivo history_view_message.cpp:

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


UPD: na nova versão, o compilador jura com um retorno vazio, então adicionei a saída de QSize (0,0)
PeerData* pd = item->from();
if (pd->isUser() && pd->asUser()->isBlocked()) return QSize(0,0);


Imediatamente após declarar a variável do item nas
funções QSize Message :: performCountOptimalSize ()
e
void Message :: draw (
Painter & p,
clipe
QRect, seleção
TextSelection , crl :: time ms) ,

isso impedirá completamente as mensagens de usuários bloqueados no log de bate-papo.

Uma adição importante: se de repente as mensagens do usuário bloqueado ainda estiverem visíveis - você só precisa clicar no perfil dele, as informações bloqueadas serão atualizadas e todas as mensagens desaparecerão do registro de bate-papo.

Para aqueles que desejam, ele adicionou um aplicativo compilado ao Dropbox .

UPD: criou um "site" para distribuição de sites.google.com/view/ignoram

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


All Articles