El único problema será si no estás contento con los nombres de usuario que el script elija. Así que si no te importa que suceda algo como esto:
clan|nickname → clan_nickname
[clan]nickname → clan_nickname2
entonces probablemente estarás bien, y parece bastante improbable que tengas dos personas en el mismo clan con el mismo apodo pero con diferentes caracteres adicionales, así que creo que probablemente estarás bien.
Lamentablemente, terminamos creando nuestro propio script de migración. El script que estaba disponible en ese momento (finales de 2022) definitivamente ni siquiera estaba en un estado “terminado”. Faltaban fragmentos de código referenciados y otros no tenían ningún sentido.
Entre las partes que tuvimos que manejar, estaba el cambio de nombre de los nombres de usuario que no respetaban el estándar de Discourse. Teníamos más de 10.000 usuarios, así que simplemente asignamos el nombre de usuario al campo “user name” que no tiene tales restricciones y, cuando un nombre de usuario infringía alguna de las reglas, lo cambiamos a la cadena md5 del nombre de usuario. Luego, dejamos a los usuarios 1 mes para que cambiaran libremente su nombre de usuario, de modo que pudieran cambiarlo de nuevo a algo que se pareciera a su original.
Aquí hay un extracto del 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;
}
Utilizamos este archivo como referencia para determinar qué se consideraba una restricción. Es posible que haya cambiado mientras tanto, así que mantente atento.
No, nos alejamos del script, ya que era increíblemente lento al procesar un foro con más de 10 millones de respuestas.
Creamos todo desde cero en C#. Tardamos entre 4 y 5 horas en migrar todo excepto los avatares y crear redirecciones para que coincidieran con los diferentes formatos de URL. Una segunda pasada del script con un parámetro específico también actualizaría el avatar de cada usuario activo en los últimos 6 meses y añadiría todas las redirecciones necesarias escaneando las respuestas y buscando el formato de URL antiguo.
Eso nos llevó más o menos un par de días, pero era algo que podía ocurrir en segundo plano, ya que lo importante para nosotros era tener el foro en funcionamiento con todo el contenido en menos de un día.
Para tu información, los scripts existentes omiten el contenido existente, por lo que la importación final probablemente habría llevado menos de una hora, especialmente si le indicaras la fecha de los datos importados más recientemente. Sin embargo, la primera ejecución sería muy dolorosa.
Sí, sé que también se reanudó, pero parte del contenido antiguo estaba tan desordenado (el foro tuvo una migración a principios de los 2000) que el script fallaba la mayor parte del tiempo o se ralentizaba muy rápidamente.
¡Créeme, si hubiéramos podido evitar 3 meses de escritura y pruebas, lo habríamos hecho!