Importei um fórum de 20 anos para o Discourse.
Ele possui muitas contas não utilizadas ou spam e mensagens de spam.
Gostaria de fazer uma limpeza.
Configurei todos os meus usuários para o nível de confiança 0.
Tentei descobrir quantos usuários nunca publicaram nenhuma mensagem com esta consulta do Data Explorer:
SELECT COUNT (DISTINCT user_id) from posts
O resultado foi 28530.
Tentei descobrir quantos usuários tenho no total:
SELECT COUNT (DISTINCT id) FROM users
O resultado foi 180000 (as estatísticas do vBulletin confirmaram que tínhamos de fato 180000 contas).
Disparei o trabalho Sidekiq CleanUpInactiveUsers.
Apenas algumas centenas de usuários foram removidos. Analisei um desses perfis não utilizados e não vi nenhuma atividade: nenhuma postagem, nenhum tópico… No entanto, o Discobot enviou uma mensagem para eles depois que importei todos os usuários do vBulletin. Isso aconteceu há 5 dias.
Então, nas configurações do Discourse, defini limpar usuários inativos após dias para 1.
Disparei novamente o trabalho Sidekiq CleanUpInactiveUsers.
Perdi cerca de 1000 usuários.
Ainda tenho 178000 usuários e sei que a maioria deles são perfis vazios e não utilizados, sem nenhuma mensagem.
Alguma ideia do porquê eles não estão sendo removidos pelo CleanUpInactiveUsers?
Além disso, como há muitas contas e mensagens de spam, é possível acionar a detecção de spam em usuários e mensagens existentes e limpar tudo isso também?
Honestamente, não sei. Não sei o que o Discourse usa para detectar e prevenir spam.
Além disso, acredito que um número considerável dos meus spammers postou mensagens nos perfis de usuários públicos, um recurso que não existe no Discourse.
Essas mensagens foram importadas no Discourse como tópicos “normais”, sem categoria e sem título, o que facilitou sua identificação.:
Não quero excluir todas essas mensagens sem título, já que a maioria é inofensiva e pode conter informações que alguns usuários gostariam de recuperar.
O que eu gostaria de fazer é excluir os usuários que postaram apenas tópicos sem título e remover também os tópicos desses usuários.
Seria possível fazer isso de forma relativamente fácil com comandos do Rails?
Pode ser que exija um pouco de experimentação, mas sim. Algo assim pode funcionar como ponto de partida:
User.find_each do |user|
untitled_topic_count = user.topics.where(title: "").count
titled_topic_count = user.topics.where.not(title: "").count
if untitled_topic_count > 0 && titled_topic_count == 0
# excluir os tópicos e/ou o usuário
end
end