休眠ユーザーを停止する短いRubyスクリプトを評価してください

これは私の初めてのカスタム Ruby スクリプトです。:slight_smile: 20以上の言語と方言でコーディングしてきたほぼ50年間、Ruby で書く必要性(または願望 :face_with_open_eyes_and_hand_over_mouth:)を感じたことはありませんでしたが、わかりました…優しくしてください。:pray:

私の目標は、メールリンクで認証されていないユーザーアカウントを特定し、削除前に確認できるようにアカウントを一時停止することです。初期設定中に、さまざまな開発段階の設定がありました。2FA メールが一部の登録で送信されず、現在フィルタリングしたい大量の不正な登録がありました。

バージョン 0.0.1

rails c

# まず、ユーザーのTLが最新の定義に準拠していることを確認します
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週間後に、まだ一時停止されているすべてのアカウントを選択して削除します。

質問:

  1. 一般的に、これは意図したとおりに機能しますか?
  2. より良いアプローチはありますか?
  3. イベントトリガーでログ記録は冗長ですか?
  4. JavaScript でこれを行うことはできますか?
  5. 他のカテゴリに投稿すべきですか?
  6. 他に何かアドバイスはありますか?

ありがとうございます!!

「いいね!」 1

Hmm、それを見ると、一時停止するのではなく、アカウントをサイレンスすべきだと思います。アカウントが一時停止されると、ユーザーはアカウントを請求するためにログインできなくなります。

以下に改訂版を示します…

バージョン 0.0.2
silence_reason = 'Inactive'
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

はい、これを行う前にバックアップを実行します。
はい、既存のTLの一部がシャッフルされ、修正する必要があることを知っています。

サイレンスまたは一時停止の代わりに、Approved=false または Active=false を設定すべきでしょうか?これにより、ユーザーは手動でログインするのではなく、メールリンクをクリックする必要があり、メールアドレスを検証するという目的を果たせると思います。

これらはすべて、最近のスレッドに関連しています: notes-on-silencing-or-deleting-users

[編集]
また、「未承認ユーザーの猶予期間(日数)」は7に設定されています。
サイレンスまたは一時停止はこれをリセットしますか?もしそうなら、アカウントアクションに7日以内に応答しない人は、パージしても問題ありません。

最後に(本当に)、また「非アクティブなユーザーのクリーンアップ(日数)」を365に設定しています。フォーラムがまだ開設されている間は60に下げて、既存のアカウントをリストから削除させることができます。その後、365に戻します。これは、新しい環境での自動アカウント削除のアプローチとして合理的でしょうか?

「いいね!」 1

なぜそれがあなたの問題を解決するには十分ではないのですか?

それらはORではなくANDであるべきではありませんか?

Discourseはアドレスを検証するためにそれらを強制するので、あなたがどのような問題を解決しようとしているのかはっきりしません。あなたはこう言いました。

ログインしたかったのにできなかったユーザーを見つける可能性は非常に低いと思われますが、あなたのセットアップについて私より知っていることがあるかもしれません。

そして、Discourseは検証されていないアドレスにメールを送信しないので、これはメールを送信しないと思います。

私はいつもこれらのことをいくつかの口座で行いますが、何が起こるかを見るために手作業で行います。

「いいね!」 2

ご興味をお持ちいただきありがとうございます、@pfaffman

数ヶ月前に作成され、approved=False、active=False で、last_seen_at がないユーザーレコードがありますが、削除されていません。
last_seen_at が 7 日以上(数ヶ月前)で、ビューが 0 のユーザーレコードがありますが、削除されていません。

その猶予期間フラグで使用されている基準が何であれ、これらのレコードは選択されていません。
使用されている正確なクエリを投稿していただけますか?そうすれば、他にどのような要因が関わっているのか理解できます。

いいえ、データベースを直接見ると、各基準に一致するユーザーレコードがありますが、すべてに一致するものはありません。ユーザーテーブルはデータベース内で一貫性がないようです。トピック入力数や投稿閲覧数 がゼロでないレコードがありますが、ビューは 0 です。トピック入力数=0 および投稿閲覧数=0 のレコードがありますが、ビューはゼロではありません。

覚えておくべき重要な点は、このサイトが開発されていたとき、設定は最適ではなく、人間とボットが登録していました。「OR」句は、これらすべてを取得するようです。サイトが(うまくいけば)健全な設定で安定した今、新しい登録が同じ異常を引き起こすとは予想していません。

さまざまな基準でスクリプトを何度も実行する予定です。最初にレコードをクエリし、環境外で、次にサイレンススクリプトを実行して、本当に必要なレコードのみを対象とします。数週間後に最終実行を行い、サイレンスされたレコード(実際に戻ってきた人は誰でもフラグが削除されます)のみを選択し、すべて削除します。

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

私の全体的な質問は、v0.0.2 スクリプトが、選択、ログ記録、およびサイレンスのアプローチで、Discourse システムに適しているかどうかということです。このようなループで他に何か行うべきことがあるかどうかはわかりません。自分でスクリプトを作成して実行したことはないので、これは初心者的なミスがないか確認するためのリクエストです。

よろしくお願いします!

「いいね!」 1