ユーザー名における感嘆符と特殊文字

唯一の問題は、スクリプトが選択するユーザー名に不満がある場合だけです。たとえば、次のようなことが起こっても気にしないのであれば:

  • clan|nickname → clan_nickname
  • [clan]nickname → clan_nickname2

問題ないでしょう。同じクランに同じニックネームで異なる追加文字を持つ人が2人いる可能性は非常に低いと思われるので、大丈夫だと思います。

残念ながら、移行スクリプト全体を自作することになりました。当時(2022年末)利用可能だったスクリプトは、明らかに「完成」状態ではありませんでした。参照されているコードの一部が欠けていたり、他の部分は全く意味をなさなかったりしました。

私たちが対処しなければならなかった部分の1つは、Discourseの標準に準拠していないユーザー名の変更でした。ユーザーは1万人以上いたため、単純にユーザー名を「user name」フィールドに割り当てました。このフィールドにはそのような制限がないため、ユーザー名がルールに違反した場合は、ユーザー名をmd5文字列に変更しました。その後、ユーザーには1か月間、自由にユーザー名を変更できるようにしました。これにより、元の名前に近いものに変更できるようになりました。

以下はコードの一部です。

    public static string ParseName(string text)
    {
        var reservedName = new string[] { "user", "system", "moderators" };
        var result = NormalizeText(text);

        // If reserved change it
        if (reservedName.Contains(result, StringComparer.OrdinalIgnoreCase))
            result = text.ToLower().ToMD5();

        // Invalid alphanumeric
        else if (!Regex.IsMatch(result, @ "^[a-zA-Z0-9_.-]*$"))
            result = text.ToLower().ToMD5();

        // Invalid repeated
        else if (Regex.IsMatch(result, @ "[-_.]{2,}"))
            result = text.ToLower().ToMD5();

        // Invalid trailing char
        else if (Regex.IsMatch(result, @ "/[\p{L}\p{N}]+$/"))
            result = text.ToLower().ToMD5();

        // Confusing extensions
        else if (Regex.IsMatch(result, @ "/\.(js|json|css|htm|html|xml|jpg|jpeg|png|gif|bmp|ico|tif|tiff|woff)$/i"))
            result = text.ToLower().ToMD5();

        // Starting and ending dots
        else if (result.StartsWith(".") || result.EndsWith("."))
            result = text.ToLower().ToMD5();

        // No more than 60 character
        result = result.Truncate(60);

        return result;
    }

このファイルを参考に、どのような制限があるかを判断しました。その後変更されている可能性があるので、注意してください。

「いいね!」 2

既存のインポートスクリプトをベースにしたのですか?もしそうしていれば、discourse/lib/user_name_suggester.rb at main · discourse/discourse · GitHub を呼び出すだけで済みました。

いいえ、1000万件以上の返信があるフォーラムの処理が非常に遅かったため、スクリプトの使用をやめました。

すべてC#でゼロから作成しました。アバターを除き、すべてを移行して、異なるURL形式に一致するようにリダイレクトを追加するのに約4〜5時間かかりました。特定のパラメータを使用したスクリプトの2回目の実行では、過去6か月のアクティブユーザーごとにアバターを更新し、返信をスキャンして古いURL形式を探すことで、すべて必要なリダイレクトを追加しました。

これには大体数日かかりましたが、フォーラムを1日未満で稼働させ、すべてのコンテンツを利用できるようにすることが重要だったため、バックグラウンドで実行できるものでした。

「いいね!」 1

素晴らしい仕事です!とてもクールですね。

ちなみに、既存のスクリプトは既存のコンテンツをスキップするため、特に最後にインポートされたデータのインポート日を伝えていれば、最終的なインポートは1時間もかからなかったでしょう。最初の実行は非常に大変ですが。

ええ、再開したことは知っていますが、古いコンテンツがひどく破損していた(フォーラムは2000年代初頭に移行しました)ため、スクリプトはほとんどの場合失敗するか、すぐに非常に遅くなっていました。

信じてください、3ヶ月の執筆とテストを避けることができたなら、そうしたでしょう!:smiley:

「いいね!」 2