Ponto de exclamação e caracteres especiais em nomes de usuário

O único problema será se você ficar insatisfeito com os nomes de usuário que o script escolher. Portanto, se você não se importar que algo assim aconteça:

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

então você provavelmente ficará bem, e parece bastante improvável que você tenha duas pessoas no mesmo clã com o mesmo apelido, mas com caracteres extras diferentes, então acho que você provavelmente ficará bem.

Infelizmente, acabamos tendo que criar nosso próprio script de migração. O script que estava disponível na época (final de 2022) definitivamente nem estava em um estado “concluído”. Peças de código referenciadas estavam faltando e outras não faziam sentido algum.

Entre as partes que tivemos que lidar, estava a renomeação de nomes de usuário que não respeitavam o padrão do Discourse. Tínhamos mais de 10 mil usuários, então simplesmente atribuímos o nome de usuário ao campo “user name”, que não tem tais restrições e, quando um nome de usuário infringia alguma das regras, o alterávamos para a string md5 do nome de usuário. Em seguida, demos aos usuários 1 mês para alterar livremente seus nomes de usuário, para que pudessem alterá-lo de volta para algo que se assemelhasse ao original.

Aqui está um trecho do código:

    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;
    }

Usamos este arquivo como referência para determinar o que deveria ser considerado uma restrição. Pode ter sido alterado nesse ínterim, então fique atento.

2 curtidas

Você o baseou em um script de importação existente? Se tivesse, ele chamaria discourse/lib/user_name_suggester.rb at main · discourse/discourse · GitHub e simplesmente funcionaria.

Não, saímos do script, pois ele era incrivelmente lento no processamento de um fórum com mais de 10 milhões de respostas.

Criamos tudo do zero em C#. Levou cerca de 4-5 horas para migrar tudo, exceto os avatares, e criar redirecionamentos para corresponder aos diferentes formatos de URL. Uma segunda passagem do script com um parâmetro específico também atualizaria o avatar de cada usuário ativo nos últimos 6 meses e adicionaria todos os redirecionamentos necessários, escaneando as respostas e procurando pelo formato de URL antigo.

Isso levou mais ou menos alguns dias, mas era algo que poderia acontecer em segundo plano, pois o importante para nós era ter o fórum funcionando com todo o conteúdo em menos de um dia.

1 curtida

Bom trabalho! Isso é muito legal.

Para sua informação, os scripts existentes ignoram o conteúdo existente, então a importação final provavelmente levaria menos de uma hora, especialmente se você informasse a data dos dados importados mais recentemente. A primeira execução seria muito dolorosa, no entanto.

Sim, sei que também foi retomado, mas alguns conteúdos antigos estavam tão bagunçados (o fórum teve uma migração no início dos anos 2000) que o script falhava na maioria das vezes ou ficava muito lento rapidamente.

Acredite em mim, se pudéssemos ter evitado 3 meses de escrita e testes, teríamos feito! :smiley:

2 curtidas