Punto esclamativo e caratteri speciali nei nomi utente

L’unico problema sarà se non sei soddisfatto dei nomi utente che lo script sceglie. Quindi, se non ti interessa che succeda qualcosa del genere:

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

allora probabilmente andrà bene, e sembra piuttosto improbabile che tu abbia due persone nello stesso clan con lo stesso nickname ma con caratteri extra diversi, quindi penso che probabilmente andrà bene.

Purtroppo, abbiamo dovuto creare da soli il nostro intero script di migrazione. Lo script disponibile all’epoca (fine 2022) non era assolutamente nemmeno in uno stato “finito”. Mancavano pezzi di codice referenziati e altri non avevano alcun senso.

Tra le parti che abbiamo dovuto gestire, c’era la ridenominazione degli username che non rispettavano lo standard di Discourse. Avevamo oltre 10.000 utenti, quindi abbiamo semplicemente assegnato lo username al campo “user name” che non ha tali restrizioni e quando uno username violava una delle regole, lo abbiamo cambiato nella stringa md5 dello username. Poi abbiamo lasciato agli utenti 1 mese per cambiare liberamente il loro username in modo che potessero cambiarlo di nuovo in qualcosa che assomigliasse al loro originale.

Ecco un estratto del codice:

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

Abbiamo utilizzato questo file come riferimento per determinare cosa fosse da considerare una restrizione. Potrebbe essere cambiato nel frattempo, quindi tieni d’occhio.

2 Mi Piace

Lo hai basato su uno script di importazione esistente? Se lo avessi fatto, avrebbe chiamato discourse/lib/user_name_suggester.rb at main · discourse/discourse · GitHub e avrebbe funzionato.

No, abbiamo abbandonato lo script perché era incredibilmente lento nell’elaborare un forum con oltre 10 milioni di risposte.

Abbiamo creato tutto da zero in C#. Ci sono volute circa 4-5 ore per migrare tutto tranne gli avatar e creare i reindirizzamenti per corrispondere ai diversi formati di URL. Un secondo passaggio dello script con un parametro specifico avrebbe anche aggiornato l’avatar per ogni utente attivo negli ultimi 6 mesi e aggiunto tutti i reindirizzamenti necessari scansionando le risposte e cercando il vecchio formato di URL.

Ci sono voluti più o meno un paio di giorni, ma era qualcosa che poteva avvenire in background poiché la cosa importante per noi era avere il forum attivo e funzionante con tutti i contenuti in meno di un giorno.

1 Mi Piace

Bel lavoro! È molto bello.

A titolo informativo, gli script esistenti saltano i contenuti esistenti, quindi l’importazione finale probabilmente avrebbe richiesto meno di un’ora, specialmente se si indicava la data dei dati importati più di recente. La prima esecuzione sarebbe stata molto dolorosa, però.

Sì, so che è ripreso anche, ma alcuni vecchi contenuti erano così incasinati (il forum ha avuto una migrazione all’inizio degli anni 2000) che lo script falliva la maggior parte delle volte o rallentava molto rapidamente.

Credimi, se avessimo potuto evitare 3 mesi di scrittura e test, lo avremmo fatto! :smiley:

2 Mi Piace