如何在电报组中实现忽略被阻止的用户?

图片替代

UPD:感谢帮助 特卡霍夫本文仍然从寻求帮助变成了有效的指导。在评论中,他给出了一个工作代码,用于在Telegram桌面客户端中创建忽略。为了以防万一,我将在文章末尾进行说明。此外,本文以与撰写时相同的形式继续。

* * *

我想向社区寻求帮助,因为我已经完全用尽了所有自己的可能性。

有人可以问一个关于Q&A服务(又名前烤面包机)的问题-只有我已经做过,但并没有取得什么成果。

不过,在我看来,仅以文章为借口提出问题不是很正确。因此,我将尝试在文本中添加整个过程的背景,并告诉您已经采取了哪些步骤。

如果您很幸运,评论中的人会告诉您解决方案。然后,那些在搜索引擎中找到此文章的人也将能够解决此问题。

问题与背景


正如所有Telegram用户都清楚知道的那样,在此Messenger的群聊中,没有用户忽略功能。您可以阻止对您不满意的用户,但这只是禁止该用户向您发送私人消息。在群聊中-现在群聊似乎可以容纳1万名用户-您只需要查看群中其他成员抛弃的所有内容。

在《黑镜》中,甚至有一系列的故事。


一直在看!一直在看!一直在看!

如果我们尝试在Internet上找到解决该问题的方法,我们将遇到一个典型的战争故事:一个大公司和一小撮心怀不满的人。这场战争的各个阶段在Github上清晰可见。

这是2015年以来首次要求使用此功能。您可以在此线程中找到指向以下主题的链接,在接下来的几年中,人们不断要求使用此功能,但是事实证明每个调用都以一个很愚蠢的答案“这不是客户端问题,而是API问题”而关闭。

对于程序员来说,甚至不清楚的是,数据是在客户端的帮助下显示给用户的。即使API从服务器向您发送了所有消息,将其中的某些消息隐藏在客户端也没有问题。

但是五年来,每年,有时是每年几次,人们来到Github,要求成群地引入无视-每次他们被拒绝并关闭话题时。六个多月前,开发人员发布了一个没有约束力的借口显然是对不断增长的需求感到厌倦:他们说,是的,是的,我们将在遥远的将来的一天做所有事情。


我听到你了!我只是说了一下,直到我准备回答你,也就是说,我了解你的位置。来吧,打电话,不要迷路!

这种借口确实有一个好处-现在,Github上的tdesktop管理员可针对所有投诉参考此消息。说-看,他们什么都知道,他们会做的一切,对不起,分支已关闭。在过去的六个月中,电报中发生了许多耗时的更改,例如,在聊天中添加了动画贴纸和民意调查的漂亮挥手表格。但是没有人忽略甚至接近。我认为它不会在一年内出现。

同时,情况看起来甚至有些险恶-感觉禁止在带有任何特殊说明的正式分叉中引入此功能。 Telegram至少有十二个著名的fork(例如Unigram)和一百个鲜为人知的fork,但是它们都不具有此功能。我写这篇文章是为了支持最受欢迎的分叉,但没有得到回应。

同时,管理与被阻止的用户的客户端的消息可以Telegreat的存在证实了这一点。这是Telegram的一个分支,在其中声明了忽略被阻止用户的选项。

ignore,这种忽略不是真实的。 “忽略被阻止的用户”选项的全部作用是将被阻止的用户的消息文本显示为灰色。来自被阻止用户的图片,视频,音乐或贴纸仍然可见;此外,深色主题上的灰色是完全可读的。

人们经常来找我聊天的开发人员聊天,并要求做出“真正的无视”。以前,他只是拒绝;在过去的六个月中,他完全放弃了自己的项目,因为他“没有时间”。好吧,这对于免费的开源项目来说是很平常的事情。

我提到这个项目有两个原因。

  • 首先,它被精确地广告宣传为“具有忽略功能的客户端”,并且仅阅读说明的人就建议这样做,但不知道这种“忽略”实际上是如何实现的。如上所述,此功能不起作用。
  • 其次,这是一个活生生的确认,即可以在Telegram客户端中确定被阻止用户的消息并进行更改。也就是说,实际上,在客户端进行忽略是可能的。

但是,没有人这样做。

最棒的是,我的感想在四年前关于Reddit的类似主题的评论中得以表达:
我很震惊,你做不到。

认真吗

如果我只是不想读某些用户写的东西,那我应该能够做到……就像,这是每个通信协议的非常基本的功能之一!

您可以在90年代通过电子邮件和新闻组来做到这一点!

而且,无论我们在哪里谈论缺少玩家的原因,
都会重复相同的事情:-您将看不到所有消息,因此,您将不了解聊天中正在发生的事情。
-您将复制邮件。
-``答案''系统的功能将被违反。

再次,我使用引号只是为了向您展示-这些不是我的个人想法,这是我们的共同立场,希望引入此功能的人:
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.
这只是一个关于复制的生活示例-我坐在几次电报聊天中,白天有几个用户总是在聊天中抛出相同的新闻/有趣的屏幕截图/新鲜的流行模因。尽管事实上在他们之前。尽管有不容忽视的事实,但他们仍然只是不阅读聊天记录和重复消息。关于人们如何不知道如何在论坛上使用搜索,以及如何反复重复相同的问题-我什至不提,大多数读者可能都遇到过这种情况。同样,毫无疑问,这个问题已经存在。并且无视她不会加剧。

那么,为什么没有这个功能真的不存在吗?

好吧,阴谋论认为电报的主要目标是收集个人数据和用户交互图。从这个意义上讲,每个电报组都允许您固定一个典型的小组,用户至少可以承受,也可以承受。否则,要么将他赶出团队,要么离开自己。忽略的引入将违反实验的纯度。

营销版本要容易一些。

当Khaled Mardam Bay在1995年创建mIRC时,他为人们编写了一个程序。我的意思是,对于知道自己想要什么的独立人士,他们会选择自己认为正确的事情,并对自己的行为后果负责。一方面,这导致了例如脚本漏洞的问题-您使用命令运行一行,仅此而已,您就被黑了。另一方面,它是成年人和负责人使用的信使。他们知道如何在忽略状态下聊天,其中有些消息根本不可见。

2013年,帕夏·杜罗夫(Pasha Durov)制作电报时,他将该程序制作为“家庭主妇”。对于需要良好监护人的笨拙大众用户。因此,所有这些都通过电话号码进行注册,向电话簿中的每个人发送消息,并从各个方面标记和禁止。毕竟,他们“按下某物,一切都消失了!”。然后他们会写投诉来支持!因此,这种愚蠢的借口-“因为如果您打开“忽略”,那么您将看不到其他人的信息。”批量生产产品时-您必须限制所有功能。傻瓜产品必须对傻瓜有保护措施。

这是王冠的论点,总是在最后给出:“不喜欢它-不要那样使用。” 我不会解释他怎么了,这是一个道德问题,其格式为“为什么不应该吃人”-谁问他是没有意义的解释。

但是在Telegram的情况下,此参数稍作修改:“我不喜欢它-随心所欲,它是开源的

尝试解决


厌倦了多年的搜索,我决定真正尝试自己改变一些东西。对我来说,组装自己的电报似乎是个好主意。在网站和应用程序商店中没有位置的情况下,这不是公共集会的意思,而只是自己编译应用程序并自己使用它。

从这个意义上说,我不会被隐藏消息的任何可能的“刹车”,“在对话中失去上下文的问题”或“如果您看不到某些消息时如何管理聊天”的问题所困扰。这一切使我不感兴趣。

在我看来,仅添加这样的一行似乎很明显:
如果message.author.isBlocked == true,则message.value ='来自被阻止用户的消息'
对不起,伪代码,但在我看来,它正确地传达了这个想法。我只是想在早期阶段捕获任何仅来自服务器的消息,然后将其替换为阻塞行。因此,该问题将通过图片/贴纸/ gifs解决-它们也将被此类消息替换,并且它们将不可见。即使有人回复或引用了一条消息,它仍然会被替换。

但是从哪里开始呢?

向程序员的朋友询问后,我发现有两种方法。第一种是使用本机Telegram客户端,第二种是使用使用较新的TDLib库编写的第三方客户端。我去了本文开头提到的问题服务处,在那里问了一个问题。如您所见,未排列受访者。唯一的线索导致了Kotatogram Messenger。

我与该Messenger的创建者进行了交谈,他给了我两个有用的提示。
首先,他说本地客户端中的消息以通常的方式显示,并且不会生成(但是,我在Telegreat示例中对此表示怀疑)-因此,您可以使用本地客户端作为源。
其次,他在history_message块中告诉要在哪里查找消息输出本身。

不幸的是,他像Telegreat的创建者一样,也没有空闲时间来独立地添加对他的客户来说对我有用的忽略功能。

接下来我该如何进行?汇编说明存在于Github上,但并不反映工作的所有阶段。我将在这里描述它们,以防万一有其他人对编程不是特别熟悉,但又想让同一个客户自己忽略:

  1. 我决定在虚拟机中做所有事情。为此,我为自己安装了Oracle VM Virtual Box,并从Microsoft官方网站下载了预装有Windows 10和Visual Studio 2019的官方虚拟机
  2. Visual Studio. , C++, Visual Studio Installer . Modify C++, . QT .
  3. Git c git-scm.com
  4. . !

团队分为2个部分。如果第一部分包含大约十二个易于复制和粘贴到命令行的命令,那么对于几十个命令的第二部分,将所有代码复制到bat文件并运行它似乎是很自然的。这是一个错误,因为该过程至少停止了两次。

第一站发生在该行之后:

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

第二个是从末尾开始的第四行之后的长QT配置指令:

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

正如我的朋友们告诉我的,这是由于在执行这些命令期间启动了其他bat文件,在该文件中已经注册了直接退出进程的事实。因此,您只需要简单地复制和粘贴命令,或将指令拆分为3个bat文件(但在这种情况下,请记住,应从停止进程的同一目录继续执行命令!)。Github上也介绍了

如何获取自己的api_id 最终,我编译了一个可以正常工作的Telegram exe文件。整个组装过程大约需要3个小时(不包括初步下载和安装时间),这可能取决于计算机的性能。



大厅帮助(找到解决方案)


终于在这里出现了我对地方社会的要求。正如读者已经猜到的,我不知道该如何以及如何进行更改。在我看来,我找到了显示消息的地方,但是我不确定,因为我不知道C ++。更不用说(也许)更改不是在history_message中而是在history_item中的某个地方是正确的。“精灵语里的东西,我看不懂”, 也许这里的某人已经遇到了电报代码,或者具有很强的技能,可以写出与替换被阻止用户的任何消息相同的内容,并说出将其放在哪里此代码。






我想电报的提款机制本身不会突然改变。因此,在更新客户端时,我将仅从github下载更新的版本,并在编译前再次使用锁定将其添加。

UPD:正如我在本文开头提到的那样,该代码的有效版本出现注释中我直接将其带到文章中。

代码的第一部分将文本替换为另一条消息。这是必要的,因为 如果另一个用户回答被阻止的用户,则该文本将显示在引号中,或者在聊天窗口的左侧(在该窗口中显示群聊中的最新消息)。

在文件History_Message.cpp中,我们在上面的屏幕快照中找到了该函数:

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


在内部,我们替换原始文本:

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


在高级:


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


如果仅使用此代码,将显示被阻止用户的旧消息,但不再显示新消息。

因此,注释中提到的解决方案的第二部分

将以下代码添加到history_view_message.cpp文件中:

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


UPD:在新版本中,编译器宣誓要返回空值,因此我添加了QSize(0,0)的输出
PeerData* pd = item->from();
if (pd->isUser() && pd->asUser()->isBlocked()) return QSize(0,0);



QSize Message :: performCountOptimalSize()

void Message :: draw(
Painter&p,
QRect剪辑,
TextSelection选择,
crl :: time ms)函数中声明item变量后

将立即完全防止消息被聊天日志中的被阻止用户阻止。

重要说明:如果突然仍然可以看到被阻止用户的消息-您只需单击他的个人资料,被阻止用户的信息就会更新,并且他的所有消息将从聊天日志中消失。

对于那些希望的人,他向Dropbox添加了一个已编译的应用程序。

UPD:创建了一个用于分发sites.google.com/view/ignoram的“网站”

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


All Articles