هذا هو أول برنامج نصي مخصص لي في Ruby على الإطلاق. بعد ما يقرب من 50 عامًا من البرمجة بأكثر من 20 لغة ولهجة، لم أحتاج أبدًا (أو أردت ) الكتابة بلغة Ruby، ولكن حسنًا، لقد أقنعتني … لطفًا كن لطيفًا.
هدفي هو تحديد حسابات المستخدمين التي لم يتم المصادقة عليها عبر روابط البريد الإلكتروني، وتعليق الحسابات حتى أتمكن من التحقق منها قبل حذفها. خلال الإعداد الأولي، كانت لدي إعدادات في مراحل مختلفة من التطوير. لم يتم إرسال رسائل البريد الإلكتروني للمصادقة الثنائية لبعض التسجيلات، وكان هناك الكثير من التسجيلات الوهمية التي أرغب الآن في تصفيتها.
الإصدار 0.0.1
rails c
# أولاً، تأكد من أن مستويات الثقة للمستخدمين تتوافق مع التعريفات الأحدث
User.all.find_each do |user|
Promotion.recalculate(user)
end
Group.ensure_consistency!
# التحضير للحلقة
logger = StaffActionLogger.new(User.where("id = 'admin'"))
# تاريخ مؤقت، سيتم إزالة المستخدمين قبل هذا التاريخ
suspend_till = DateTime.new(2028, 12, 31)
suspend_at = DateTime.now
reason = 'Inactive'
# تحديد الحسابات التي يحتمل أن تكون غير نشطة
User.where("views = 0 OR approved = FALSE OR last_seen_at IS NULL")
.where("id > 0")
.find_each do |user|
user.suspended_till = suspend_till
user.suspended_at = suspend_at
user.change_trust_level!(TrustLevel[0])
# حفظ المستخدم، وتسجيل الإجراء، و... القيام بما يتم لهذا المشغل
user.save!
logger.log_user_suspend(user, reason)
DiscourseEvent.trigger(:user_suspended, user: user)
# تجنب إساءة استخدام خادم البريد
sleep(10)
end
من خلال تشغيل الحدث، أود إرسال رسائل بريد إلكتروني للمستخدمين - سيكون هناك الكثير من الارتدادات، وقد يكون هناك عدد قليل من الأشخاص الذين يعودون للمصادقة. بعد أسبوع، سأختار جميع الحسابات التي لا تزال معلقة وأحذفها.
حسنًا، عندما أنظر إلى ذلك، أعتقد أنه يجب عليّ إسكات حساب بدلاً من تعليقه. إذا تم تعليق الحساب، فلا يمكن للمستخدم تسجيل الدخول للمطالبة بالحساب.
إليك مراجعة…
الإصدار 0.0.2
silence_reason = 'غير نشط'
User.where("views = 0 OR approved = FALSE OR last_seen_at IS NULL")
.where("id > 0") # تجنب المستخدمين النظام
.find_each do |user|
user.silence(reason: silence_reason)
user.change_trust_level!(TrustLevel[0])
user.save!
logger.log_user_silence(user, silence_reason)
DiscourseEvent.trigger(:user_silenced, user: user)
sleep(5)
end
نعم، سأقوم بعمل نسخة احتياطية قبل القيام بأي من هذا.
نعم، أعرف أن بعض مستويات الثقة الحالية سيتم تبديلها وسأحتاج إلى إصلاحها.
بالإضافة إلى ذلك، أو بدلاً من الإسكات، هل يجب عليّ تعيين Approved=false أو Active=false؟ أعتقد أن هذا سيجبر المستخدم على النقر فوق رابط البريد الإلكتروني بدلاً من القيام بتسجيل الدخول يدويًا، مما يخدم الغرض من التحقق من صحة عنوان البريد الإلكتروني.
[تعديل]
لدي أيضًا “تنقية المستخدمين غير النشطين فترة السماح بالأيام” مضبوطة على 7.
هل يعيد الإسكات أو التعليق تعيين هذا؟ إذا كان الأمر كذلك، إذا لم يستجب الأشخاص لإجراء حساب خلال 7 أيام، فلن أمانع في تنقيتهم.
أخيرًا (نعم، حقًا) لدي أيضًا “تنظيف المستخدمين غير النشطين بعد أيام” مضبوطة على 365. يمكنني خفضها إلى 60 بينما لا يزال المنتدى مفتوحًا والسماح للحسابات الحالية بالاختفاء من القائمة. ثم زيادتها مرة أخرى إلى 365. هل هذا نهج معقول لتقليم الحسابات الآلية في بيئة جديدة؟
هناك سجلات مستخدمين بدون last_seen_at، تم إنشاؤها قبل أشهر، approved=False، active=False، ولا يتم مسحها.
هناك سجلات مستخدمين مع last_seen_at > 7 أيام (عمرها أشهر) و 0 مشاهدة، ولا يتم مسحها.
مهما كانت المعايير المستخدمة مع علامة فترة السماح هذه، فهي لا تحدد هذه السجلات.
هل يمكن لأحد نشر الاستعلام الدقيق المستخدم هناك حتى أفهم ما هي العوامل الأخرى المتضمنة؟
لا، بالنظر إلى قاعدة البيانات مباشرة، هناك سجلات مستخدمين تتناسب مع كل معيار ولكن ليس كلها. يبدو أن جدول المستخدمين في قاعدة البيانات غير متناسق. هناك سجلات ذات topics_entered أو posts_read_count غير صفرية، ولكن views=0. هناك سجلات ذات topics_entered=0 و posts_read_count=0، ولكن views غير صفرية.
النقطة الرئيسية التي يجب تذكرها هي أنه أثناء تطوير هذا الموقع، لم تكن الإعدادات مثالية وكان البشر والروبوتات يسجلون. يبدو أن عبارة “أو” تلتقط كل هؤلاء. الآن بعد أن أصبح الموقع مستقرًا مع إعدادات (آمل) معقولة، لا أتوقع أن تؤدي التسجيلات الجديدة إلى نفس الحالات الشاذة.
أنوي تشغيل البرنامج النصي عدة مرات بمعايير مختلفة. سأستعلم عن السجلات أولاً، خارج البيئة، ثم أقوم بتشغيل برنامج الصمت لاستهداف السجلات التي أريدها حقًا فقط. في غضون أسبوعين، سأقوم بتشغيل نهائي، وسأحدد فقط السجلات الصامتة (سيتم إزالة العلامة لأي شخص عاد بالفعل)، وسأقوم بمسحها جميعًا:
سؤالي العام هو ما إذا كان البرنامج النصي v0.0.2، مع نهجه في الاختيار والتسجيل والصمت، صحيحًا لنظام Discourse. لا أعرف ما إذا كان هناك شيء آخر يجب القيام به في حلقة كهذه. لم أنشئ وأشغل برنامجًا نصيًا خاصًا بي من قبل، لذا هذا طلب للتحقق مني من أخطاء المبتدئين الغبية.