كيفية تنفيذ تجاهل المستخدمين المحظورين في مجموعات Telegram؟

بديل الصورة

UPD: بفضل المساعدة تكاشوفلا تزال هذه المقالة تتحول من طلب للمساعدة إلى تعليمات عمل. في التعليقات ، أعطى رمز عمل لإنشاء تجاهل في عميل Telegram لسطح المكتب. فقط تحسبًا ، سأضع شرحًا في نهاية المقالة. علاوة على ذلك ، تستمر المقالة بنفس الشكل الذي كُتبت به.

* * *

أود أن أطلب المساعدة من المجتمع ، لأنني استنفدت كل إمكانياتي الخاصة.

يمكن للمرء أن يطرح سؤالاً حول خدمة Q&A (المعروفة سابقاً بـ Toaster) - فقط فعلت هذا بالفعل ، ولم يخرج منه الكثير.

ومع ذلك ، فإن مجرد طرح سؤال تحت ستار مقال يبدو لي غير صحيح تمامًا. لذلك ، سأحاول إضافة خلفية العملية بأكملها إلى النص وأخبر عن الخطوات التي تم اتخاذها بالفعل.

إذا كنت محظوظًا ، فسيخبرك شخص ما في التعليقات بالحل. ومن ثم سيتمكن أولئك الذين يجدون هذه المقالة في محركات البحث من حل هذه المشكلة.

المشكلة والخلفية


كما يعلم جميع مستخدمي Telegram تمامًا ، لا توجد وظيفة تجاهل المستخدم في الدردشات الجماعية لهذا المراسلة. يمكنك حظر مستخدم غير سار لك ، لكن هذا يمنعه فقط من كتابة رسائل خاصة لك. في دردشة مجموعة - والآن دردشات المجموعة يبدو أن تستوعب ما يصل إلى 10 ألف مستخدم - يمكنك ببساطة أن ترى كل شيء أن أعضاء آخرين في المجموعة قد خلعت.

في "المرآة السوداء" كان هناك حتى سلسلة عن ذلك.


واصل المشاهدة! واصل المشاهدة! واصل المشاهدة!

إذا حاولنا إيجاد حل لهذه المشكلة على الإنترنت ، فسوف نواجه قصة حرب نموذجية لشركة كبيرة ومجموعة صغيرة من الناس الساخطين. مراحل هذه الحرب مرئية بوضوح في جيثب.

فيما يلي أول طلب لهذه الميزة من عام 2015.يمكنك العثور على روابط للمواضيع التالية في سلسلة المحادثات هذه ، حيث يطلب الأشخاص باستمرار هذه الميزة في السنوات التالية ، ولكن اتضح أنه تم إغلاق كل مكالمة بإجابة غبية نوعًا ما "هذه ليست مشكلة عميل ، ولكنها مشكلة واجهة برمجة تطبيقات".

ليس من الواضح حتى للمبرمج أن البيانات تظهر للمستخدم بمساعدة العميل. وحتى إذا كانت واجهة برمجة التطبيقات ترسل لك جميع الرسائل من الخادم - فلا توجد مشكلة في إخفاء بعضها في جانب العميل.

ولكن لمدة خمس سنوات الآن ، كل عام ، وأحيانًا عدة مرات في السنة ، يصل الناس إلى Github لطلب تقديم تجاهل في مجموعات - وفي كل مرة يتم رفضهم وإغلاق الموضوع. قبل أكثر من ستة أشهر ، بعد أن تعبوا من المتطلبات المستمرة ، نشر المطورون عذرًا غير ملزم : يقولون ، نعم ، نعم ، سنفعل كل شيء ، يومًا ما في المستقبل البعيد.


لقد سمعتك! لقد عبرت عنها للتو حتى أكون مستعدًا للإجابة عليك ، دعنا نقول ، أنا أفهم موقفك. هيا ، اتصل ، لا تضيع!

هناك فائدة واحدة بالضبط من هذا العذر - الآن يشير مسؤولو tdesktop على Github إلى هذه الرسالة لجميع الشكاوى. قل - انظر ، يعرفون كل شيء ، سيفعلون كل شيء ، أنا آسف ، الفرع مغلق. على مدى الأشهر الستة الماضية ، حدثت الكثير من التغييرات التي تستغرق وقتًا طويلًا في البرقية ، على سبيل المثال ، تمت إضافة ملصقات متحركة وأشكال تلويح جميلة للاستطلاعات إلى الدردشات. ولكن لم يقترب أي تجاهل حتى. أعتقد أنها لن تظهر في غضون عام.

في الوقت نفسه ، يبدو الوضع حتى شريرًا قليلاً - هناك شعور بأنه ممنوع من إدخال هذه الوظيفة مع أي تعليمات خاصة للشوك الرسمية. تحتوي Telegram على ما لا يقل عن اثني عشر شوكًا معروفًا (مثل Unigram) ومائة شوك غير معروف ، ولكن لا يمتلك أي منها هذه الميزة. كتبت دعما للشوك الأكثر شعبية ، ولكن لم أتلق أي رد.

في نفس الوقت إدارة مع المستخدمين المحظورين يمكن أن تكون الرسائل من جانب العميل . هذا ما يؤكده وجود Telegreat . هذا شوكة من Telegram ، حيث تم الإعلان عن خيار تجاهل المستخدمين المحظورين.

للأسف ، هذا التجاهل ليس حقيقيًا. كل ما يفعله الخيار "تجاهل المستخدمين المحظورين" هو تلوين نص رسائل المستخدمين المحظورين باللون الرمادي. لا تزال الصور أو مقاطع الفيديو أو الموسيقى أو الملصقات من المستخدمين المحظورين مرئية ؛ بالإضافة إلى ذلك ، فإن اللون الرمادي في المواضيع الداكنة يمكن قراءته بشكل مثالي.

يأتي الناس بانتظام إلى الدردشة مع المطور ، حيث جلست لفترة من الوقت ، ويطلبون "تجاهل حقيقي". في السابق ، رفض ببساطة ؛ في الأشهر الستة الماضية ، تخلى عن مشروعه بالكامل ، لأنه "ليس لديه وقت". حسنًا ، هذا أمر شائع لمشاريع مفتوحة المصدر مجانية.

أذكر هذا المشروع لسببين.

  • أولاً ، يتم الإعلان عنها بدقة على أنها "عميل بوظيفة تجاهل" وينصح بها الأشخاص الذين يقرؤون الوصف فقط ، ولا يعرفون كيف يتم تنفيذ هذا "تجاهل" بالفعل هناك. كما ذكر أعلاه ، لا تعمل هذه الوظيفة.
  • ثانيًا ، إنه تأكيد حي على أنه من الممكن في عميل Telegram تحديد رسالة مستخدم محظور وتغييرها. هذا ، في الواقع ، من الممكن تجاهل العميل.

ومع ذلك ، لا أحد يفعل ذلك.

أفضل ما في الأمر ، أن مشاعري تنقل في تعليق على موضوع مماثل على Reddit قبل أربع سنوات:
لقد صدمت لا يمكنك فعل ذلك.

بجدية؟

إذا كنت لا أرغب في قراءة أي شيء يكتبه بعض المستخدمين ، فيجب أن أتمكن من القيام بذلك ... الأمر يشبه ، إحدى الميزات الأساسية جدًا لكل بروتوكولات اتصال على الإطلاق!

يمكنك القيام بذلك في التسعينيات من خلال رسائل البريد الإلكتروني ومجموعات الأخبار!

علاوة على ذلك ، حيثما نتحدث عن أسباب عدم وجود لاعب ، تتكرر نفس الأشياء:
- لن ترى جميع الرسائل ، وبسبب ذلك لن تفهم ما يحدث في الدردشة.
- سوف تقوم بتكرار الرسائل.
- سيتم انتهاك وظيفة نظام "الإجابات"

، ومرة ​​أخرى ، أستخدم اقتباسًا ، فقط لأعرض لك - هذه ليست أفكاري الشخصية ، هذا هو موقفنا المشترك ، الأشخاص الذين يريدون تقديم هذه الوظيفة:
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.
هنا مجرد مثال على الحياة فيما يتعلق بالازدواجية - أجلس في العديد من الدردشات البرقية وخلال النهار يرمي العديد من المستخدمين دائمًا نفس الأخبار / لقطة شاشة مضحكة / ميمي شائع جديد في الدردشة. على الرغم من حقيقة أنه كان من قبلهم. على الرغم من حقيقة أنه لا يوجد تجاهل ، إلا أنهم لا يزالون لا يقرأون سجل الدردشة والرسائل المكررة. حول كيف لا يعرف الناس كيفية استخدام البحث في المنتديات ، ويكررون نفس الأسئلة مرارًا وتكرارًا - لن أذكر ذلك حتى ، ربما صادف معظم القراء هذا. مرة أخرى ، دون أي جهل ، هذه المشكلة موجودة بالفعل. وتجاهلها لن يتفاقم.

فلماذا لا توجد هذه الوظيفة حقا؟

حسنًا ، تقول أطروحة المؤامرة أن الهدف الرئيسي من Telegram هو جمع البيانات الشخصية والرسوم البيانية لتفاعل المستخدم. بهذا المعنى ، تسمح لك كل مجموعة برقية بإصلاح مجموعة صغيرة نموذجية ، يمكن للمستخدم على الأقل تحملها ، والتي يمكن أن تصمد أمامها. خلاف ذلك ، إما أن يتم طرده من المجموعة ، أو أنه يترك نفسه. إدخال التجاهل سينتهك نقاء التجربة.

النسخة التسويقية أسهل قليلاً.

عندما أنشأ خالد مردم باي mIRC في عام 1995 ، كتب برنامجًا للناس. أعني ، بالنسبة للأشخاص المستقلين الذين يعرفون ما يريدون ، فإنهم يختارون ما يعتقدون أنه صحيح وهم مسؤولون عن عواقب أفعالهم. من ناحية ، تسبب هذا في مشاكل ، على سبيل المثال ، مع نقاط الضعف النصية - تقوم بتشغيل سطر مع الأوامر وهذا كل شيء ، يتم اختراقك. من ناحية أخرى ، كان رسولًا يستخدمه الكبار والمسؤولون. وكانوا يعرفون كيف يتواجدون في محادثة مع تجاهل ، حيث تكون بعض الرسائل ببساطة غير مرئية.

عندما صنع باشا دوروف عام 2013 برنامج Telegram ، صنع برنامج "لربات البيوت". لمستخدم كتلة غبية يحتاج إلى وصي جيد. وبالتالي ، كل هذا التسجيل عن طريق رقم الهاتف ، وإرسال الرسائل إلى الجميع في دليل الهاتف ، والأعلام والمحظورات من جميع الجهات. بعد كل شيء ، "يضغطون على شيء ويختفي كل شيء!". وبعد ذلك سوف يكتبون الشكاوى دعما! ومن هنا مثل هذه الأعذار الغبية - "لأنه إذا قمت بتشغيل تجاهل ، فلن ترى رسائل الآخرين". عندما تقوم بعمل منتج ضخم - فإنك مجبر على الحد من أي وظيفة. يجب أن يحمي منتج الأحمق من الأحمق.

هنا تأتي حجة التاج ، التي تُعطى دائمًا في النهاية: "لا تعجبك - لا تستخدمها هكذا". لن أشرح ما هو الخطأ معه ، هذا سؤال أخلاقي لشكل "لماذا لا يجب أن يؤكل الناس" - من يسأله لا معنى له ليشرح.

ولكن في حالة Telegram ، تم تعديل هذه الحجة قليلاً: "أنا لا أحبها - افعلها كما تشاء ، إنها مفتوحة المصدر . "

محاولة حلها


تعبت من سنوات عديدة من البحث ، قررت أن أحاول حقا تغيير شيء بمفردي. لقد بدت لي فكرة جيدة أن أقوم بتجميع خاص بي للبرقية. ليس بمعنى التجمع العام ، مع موقع ويب وموضع في متجر التطبيقات ، ولكن ببساطة تجميع التطبيق لنفسك واستخدامه بنفسك.

بهذا المعنى ، لن أزعجني بأي "فرامل" محتملة من إخفاء الرسائل ، أو "مشكلة فقدان السياق في المحادثة" ، أو مشكلة "كيف يمكنني إدارة الدردشة إذا لم تشاهد بعض الرسائل". كل هذا لم يهمني.

بدا لي واضحًا أن مجرد إضافة خط مثل هذا:
if message.author.isBlocked == true ثم message.value = "الرسالة من المستخدم المحظور"
آسف على الرمز الزائف ، ولكن يبدو لي أنه ينقل الفكرة بشكل صحيح. أردت فقط التقاط أي رسالة في المرحلة المبكرة جدًا ، عندما تأتي فقط من الخادم ، واستبدلها بخط حول الحظر. وبالتالي ، سيتم حل المشكلة بالصور / الملصقات / gifs - سيتم استبدالها أيضًا بهذه الرسالة ولن تكون مرئية. وحتى إذا رد شخص ما على رسالة ما أو اقتبس منها ، فسيظل يتم استبدالها.

ولكن من أين تبدأ؟

بعد سؤال أصدقاء المبرمجين ، اكتشفت أن هناك طريقتين. الأول هو استخدام عميل Telegram الأصلي ، والثاني هو استخدام عميل خارجي مكتوب باستخدام مكتبة TDLib الأحدث. ذهبت إلى خدمة الأسئلة المذكورة في بداية المقال وسألت سؤالاً هناك. كما ترون ، لا يصطف خط المستجيبين. أدى الخيط الوحيد إلى Kotatogram messenger.

تحدثت مع منشئ هذا الرسول وأعطاني نصيحتين مفيدتين.
أولاً ، قال إن الرسائل في العميل الأصلي يتم عرضها بالطريقة المعتادة ، ولا يتم إنشاؤها (ومع ذلك ، أشك في ذلك مع مثال Telegreat) - لذلك ، يمكنك استخدام العميل الأصلي كمصدر.
ثانيًا ، أخبر أين يبحث عن إخراج الرسالة نفسها - في كتلة history_message.

لسوء الحظ ، لم يكن لديه ، مثل منشئ Telegreat ، وقت فراغ لإضافة وظيفة التجاهل بشكل مستقل ، وهو موكله بالنسبة لي.

كيف أكمل الخطوة التالية؟ توجد تعليمات التجميع في Github ، ولكنها لا تعكس جميع مراحل العمل. سأصفها هنا ، في حال جاء شخص آخر إلى المقالة ليس على دراية خاصة بالبرمجة ، ولكنه يريد أن يتجاهل العميل نفسه لنفسه:

  1. قررت أن أفعل كل شيء في جهاز افتراضي. للقيام بذلك ، قمت بتثبيت Oracle VM Virtual Box لنفسي وقمت بتنزيل أجهزتهم الافتراضية الرسمية مع Windows 10 و Visual Studio 2019 المثبت مسبقًا من موقع Microsoft الرسمي
  2. Visual Studio. , C++, Visual Studio Installer . Modify C++, . QT .
  3. Git c git-scm.com
  4. . !

هناك قسمان من الفرق. وإذا كان القسم الأول يحتوي على عشرات الأوامر التي يسهل نسخها ولصقها في سطر الأوامر ، فعندئذٍ بالنسبة للقسم الثاني من عدة عشرات من الأوامر ، يبدو من الطبيعي نسخ جميع التعليمات البرمجية في ملف الخفافيش وتشغيلها. هذا خطأ ، لأن العملية تتوقف مرتين على الأقل.

المحطة الأولى تحدث بعد الخط:

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

والثاني هو بعد السطر الرابع من النهاية ، تعليمات تكوين QT الطويلة:

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

كما أخبرني أصدقائي ، هذا يرجع إلى حقيقة أنه أثناء تنفيذ هذه الأوامر يتم إطلاق ملفات الخفافيش الأخرى ، حيث يتم تسجيل خروج مباشر من العملية بالفعل. ونتيجة لذلك ، تحتاج إما إلى نسخ الأوامر ولصقها ببساطة ، أو تقسيم التعليمات إلى 3 ملفات خفاش (ولكن في هذه الحالة ، تذكر أنه يجب الاستمرار في تنفيذ الأوامر من نفس الدليل الذي توقفت فيه العملية!).

يتم وصف الحصول على api_id الخاص بك أيضًا على Github .

في النهاية ، جمعت ملف Telegram exe يعمل بشكل كامل. في المجموع ، تستغرق عملية التجميع حوالي ثلاث ساعات (دون احتساب التنزيلات والتثبيتات الأولية) ، ربما تعتمد هذه المرة على قوة الكمبيوتر.

مساعدة القاعة (والحل موجود)


وهنا أخيراً يظهر طلبي إلى المجتمع. كما خمّن القراء بالفعل ، لا أعرف ماذا وكيف أغير. يبدو لي أنني وجدت مكانًا يتم عرض الرسالة فيه ، لكنني لست متأكدًا ، لأنني لا أعرف C ++. ناهيك عن أنه (ربما) سيكون من الصحيح تغيير شيء ليس في history_message ، ولكن في مكان ما في history_item. "شيء ما في Elvish ، لا يمكنني القراءة" ربما صادف شخص ما بالفعل رمز Telegram أو لديه مهارة متطورة للغاية ويمكنه كتابة نفس السطر مع استبدال أي رسالة من مستخدم محظور ، وأيضًا تحديد مكان وضعه هذا الرمز.






أفترض أن آلية سحب البرقية نفسها لن تتغير فجأة. لذلك عند تحديث العميل ، سأقوم فقط بتنزيل الإصدار المحدث من github وإضافة هذا السطر مرة أخرى بقفل قبل الترجمة.

محدث: كما ذكرت في بداية المقال ، ظهرت نسخة عمل من التعليمات البرمجية في التعليقات . أحمله مباشرة إلى المقالة.

يستبدل الجزء الأول من الرمز النص برسالة أخرى. هذا ضروري لأن يكون هذا النص مرئيًا في علامات الاقتباس إذا أجاب مستخدم آخر على الشخص المحظور ، أو على اليسار في نافذة الدردشة ، حيث يتم عرض أحدث الرسائل في الدردشات الجماعية.

في ملف 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 clip ،
TextSelection select ،
crl :: time ms) ،

سيتيح لك هذا رؤية الرسائل بالكامل من المستخدمين المحظورين في سجل الدردشة.

إضافة مهمة: إذا كانت رسائل المستخدم المحظور لا تزال مرئية فجأة - ما عليك سوى النقر على ملفه الشخصي ، سيتم تحديث المعلومات التي تم حظرها ، وستختفي جميع رسائله من سجل الدردشة.

بالنسبة لأولئك الذين يرغبون ، أضاف تطبيقًا مترجمًا إلى Dropbox .

UPD: إنشاء "موقع" لتوزيع sites.google.com/view/ignoram

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


All Articles