116 lines
3.0 KiB
Ruby
Executable File
116 lines
3.0 KiB
Ruby
Executable File
# 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
|