diff --git a/script/import_scripts/mybbru.rb b/script/import_scripts/mybbru.rb new file mode 100755 index 0000000000..5857d7b55c --- /dev/null +++ b/script/import_scripts/mybbru.rb @@ -0,0 +1,115 @@ +# frozen_string_literal: true + +require "csv" +require File.expand_path(File.dirname(__FILE__) + "/base.rb") + +# Import script for forums created via mybb.ru service (or anything else that uses this simple JSON format), +# using export format produced by https://github.com/AlexP11223/MybbRuUserscripts +# Set ENV variables, e.g. "export JSON_TOPICS_FILE=my_path/threads.json", or set/use the paths in the constants below +# If your forum has non-English usernames, don't forget to enable Unicode usernames in /admin/site_settings + +class ImportScripts::MybbRu < ImportScripts::Base + + JSON_TOPICS_FILE_PATH ||= ENV['JSON_TOPICS_FILE'] || 'mybbru_export/threads.json' + JSON_USERS_FILE_PATH ||= ENV['JSON_USERS_FILE'] || 'mybbru_export/users.json' + + def initialize + super + + @imported_topics = load_json(JSON_TOPICS_FILE_PATH) + @imported_users = load_json(JSON_USERS_FILE_PATH) + end + + def execute + puts "", "Importing from JSON file..." + + import_users + import_categories + import_discussions + + puts "", "Done" + end + + def load_json(path) + JSON.parse(File.read(path)) + end + + def clean_username(name) + name.gsub(/ /, '') + end + + def import_users + puts '', "Importing users" + + create_users(@imported_users) do |u| + { + id: u['id'], + username: clean_username(u['name']), + email: u['email'], + created_at: Time.now + } + end + end + + def import_categories + puts "", "importing categories..." + + categories = @imported_topics.map { |t| t['category'] }.uniq + + create_categories(categories) do |c| + { + id: c['id'], + name: c['name'] + } + end + end + + def import_discussions + puts "", "Importing discussions" + + @imported_topics.each do |t| + first_post = t['posts'][0] + + create_posts(t['posts']) do |p| + result = { + id: p['id'], + user_id: user_id_from_imported_user_id(p['author']['id']), + raw: fix_post_content(p["source"]), + created_at: Time.at(p['createdAt']), + cook_method: Post.cook_methods[:regular] + } + + if p['id'] == first_post['id'] + result[:category] = category_id_from_imported_category_id(t['category']['id']) + result[:title] = t['title'] + else + parent = topic_lookup_from_imported_post_id(first_post['id']) + if parent + result[:topic_id] = parent[:topic_id] + else + puts "Parent post #{first_post['id']} doesn't exist. Skipping #{p["id"]}: #{t["title"][0..40]}" + break + end + end + + result + end + end + end + + def fix_post_content(text) + text + .gsub(/\[code\]/, "\n[code]\n") + .gsub(/\[\/code\]/, "\n[/code]\n") + .gsub(/\[video\]/, "") + .gsub(/\[\/video\]/, "") + .gsub(/\[quote.*?\]/, "\n" + '\0' + "\n") + .gsub(/\[\/quote\]/, "\n[/quote]\n") + .gsub(/\[spoiler.*?\]/, "\n" + '\0' + "\n").gsub(/\[spoiler/, '[details') + .gsub(/\[\/spoiler\]/, "\n[/details]\n") + end +end + +if __FILE__ == $0 + ImportScripts::MybbRu.new.perform +end