يرجى تقييم سكريبت Ruby قصير لتعليق المستخدمين غير النشطين

هذا هو أول برنامج نصي مخصص لي في Ruby على الإطلاق. :slight_smile: بعد ما يقرب من 50 عامًا من البرمجة بأكثر من 20 لغة ولهجة، لم أحتاج أبدًا (أو أردت :face_with_open_eyes_and_hand_over_mouth:) الكتابة بلغة Ruby، ولكن حسنًا، لقد أقنعتني … لطفًا كن لطيفًا. :pray:

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

الإصدار 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

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

أسئلة:

  1. بشكل عام، هل سيحقق هذا ما هو مقصود؟
  2. هل هناك نهج أفضل؟
  3. هل التسجيل زائد عن الحاجة مع تشغيل الحدث؟
  4. هل يمكننا القيام بذلك باستخدام JavaScript؟
  5. هل يجب أن أنشر هذا في فئة أخرى؟
  6. أي نصائح أخرى؟

شكرا لكم!!

إعجاب واحد (1)

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

إليك مراجعة…

الإصدار 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. هل هذا نهج معقول لتقليم الحسابات الآلية في بيئة جديدة؟

إعجاب واحد (1)

لماذا لا يكفي ذلك لحل مشكلتك؟

ألا ينبغي أن تكون هذه AND بدلاً من OR؟

يفرض Discourse هذه التحققات للتحقق من صحة العناوين، لذا لست متأكدًا تمامًا من المشكلة التي تحلها. تقول هذا

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

ولن يرسل Discourse رسائل بريد إلكتروني إلى العناوين غير الموثقة، لذلك لا أعتقد أن هذا سيرسل أي رسائل بريد إلكتروني.

أنا دائمًا أقوم بهذه الأشياء على عدد قليل من الحسابات ولكن يدويًا لمعرفة ما سيحدث.

إعجابَين (2)

شكراً لاهتمامك، @pfaffman!

هناك سجلات مستخدمين بدون 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 غير صفرية.

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

أنوي تشغيل البرنامج النصي عدة مرات بمعايير مختلفة. سأستعلم عن السجلات أولاً، خارج البيئة، ثم أقوم بتشغيل برنامج الصمت لاستهداف السجلات التي أريدها حقًا فقط. في غضون أسبوعين، سأقوم بتشغيل نهائي، وسأحدد فقط السجلات الصامتة (سيتم إزالة العلامة لأي شخص عاد بالفعل)، وسأقوم بمسحها جميعًا:

UserDestroyer.new(admin_user).destroy(user, reassign_to: archive_user)

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

شكرا!!

إعجاب واحد (1)