20240524
This commit is contained in:
		
							
								
								
									
										209
									
								
								gossamer_forums.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								gossamer_forums.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,209 @@
 | 
			
		||||
require 'mysql2'
 | 
			
		||||
require File.expand_path("../../../config/environment", __FILE__)
 | 
			
		||||
require_relative 'base'
 | 
			
		||||
 | 
			
		||||
class GossamerForumsImporter < ImportScripts::Base
 | 
			
		||||
  def initialize
 | 
			
		||||
    super
 | 
			
		||||
    @mysql_client = Mysql2::Client.new(
 | 
			
		||||
      host: "slowtwitch.northend.network",
 | 
			
		||||
      username: "admin",
 | 
			
		||||
      password: "yxnh93Ybbz2Nm8#mp28zCVv",
 | 
			
		||||
      database: "slowtwitch"
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Execute a query on the MySQL database
 | 
			
		||||
  def execute_query(query)
 | 
			
		||||
    @mysql_client.query(query, as: :hash)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Import users from gforum_User table
 | 
			
		||||
  def import_users
 | 
			
		||||
    puts "Importing users..."
 | 
			
		||||
    users = []
 | 
			
		||||
 | 
			
		||||
    execute_query("SELECT * FROM gforum_User").each do |row|
 | 
			
		||||
      # Map Gossamer Forum user data to Discourse user data
 | 
			
		||||
      users << {
 | 
			
		||||
        id: row['user_id'],
 | 
			
		||||
        username: row['user_username'],
 | 
			
		||||
        email: row['user_email'],
 | 
			
		||||
        created_at: Time.at(row['user_registered']),
 | 
			
		||||
        updated_at: Time.at(row['user_last_seen']),
 | 
			
		||||
        name: row['user_real_name'],
 | 
			
		||||
        title: row['user_title'],
 | 
			
		||||
        bio_raw: row['user_about'],
 | 
			
		||||
        website: row['user_homepage'],
 | 
			
		||||
        location: row['user_location']
 | 
			
		||||
      }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Create users in Discourse with the required block
 | 
			
		||||
    create_users(users) do |user|
 | 
			
		||||
      user
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Update user passwords and import user files
 | 
			
		||||
    users.each do |user|
 | 
			
		||||
      discourse_user = User.find_by(username: user[:username])
 | 
			
		||||
      execute_query("SELECT * FROM gforum_User WHERE user_id = #{user[:id]}").each do |row|
 | 
			
		||||
        discourse_user.update_columns(encrypted_password: row['user_password'], password_salt: nil)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      import_user_files(discourse_user)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Import user files and append to user's bio
 | 
			
		||||
  def import_user_files(user)
 | 
			
		||||
    puts "Importing files for user #{user.username}..."
 | 
			
		||||
    execute_query("SELECT * FROM gforum_User_Files WHERE ForeignColName = 'user_id' AND ForeignColKey = #{user.id}").each do |file|
 | 
			
		||||
      # Construct file URL
 | 
			
		||||
      file_url = "https://forum.slowtwitch.com/images/users/images/#{file['ID'] % 10}/#{file['ID']}-#{file['File_Name']}"
 | 
			
		||||
      # Append image link to user's bio
 | 
			
		||||
      user.bio_raw += "\n\n![#{file['File_Name']}](#{file_url})"
 | 
			
		||||
      user.save!
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Import categories from gforum_Category table
 | 
			
		||||
  def import_categories
 | 
			
		||||
    puts "Importing categories..."
 | 
			
		||||
    execute_query("SELECT * FROM gforum_Category").each do |row|
 | 
			
		||||
      create_category(
 | 
			
		||||
        id: row['category_id'],
 | 
			
		||||
        name: row['name'],
 | 
			
		||||
        description: row['description'],
 | 
			
		||||
        created_at: Time.at(row['created_at']),
 | 
			
		||||
        updated_at: Time.at(row['updated_at'])
 | 
			
		||||
      )
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Import topics and posts from gforum_Post table
 | 
			
		||||
  def import_topics_and_posts
 | 
			
		||||
    puts "Importing topics and posts..."
 | 
			
		||||
    execute_query("SELECT * FROM gforum_Post ORDER BY post_root_id, post_time").each do |row|
 | 
			
		||||
      if row['post_id'] == row['post_root_id']
 | 
			
		||||
        # This is the root post, create a new topic
 | 
			
		||||
        topic = create_topic(
 | 
			
		||||
          id: row['post_id'],
 | 
			
		||||
          title: row['post_subject'],
 | 
			
		||||
          user_id: row['user_id_fk'],
 | 
			
		||||
          created_at: Time.at(row['post_time']),
 | 
			
		||||
          updated_at: Time.at(row['post_latest_reply']),
 | 
			
		||||
          category_id: row['forum_id_fk']
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        # Create the first post in the topic
 | 
			
		||||
        create_post(
 | 
			
		||||
          id: row['post_id'],
 | 
			
		||||
          topic_id: row['post_id'],
 | 
			
		||||
          user_id: row['user_id_fk'],
 | 
			
		||||
          raw: import_post_attachments(row['post_message'], row['post_id']),
 | 
			
		||||
          created_at: Time.at(row['post_time']),
 | 
			
		||||
          updated_at: Time.at(row['post_latest_reply'])
 | 
			
		||||
        )
 | 
			
		||||
      else
 | 
			
		||||
        # This is a reply post, add to the existing topic
 | 
			
		||||
        create_post(
 | 
			
		||||
          id: row['post_id'],
 | 
			
		||||
          topic_id: row['post_root_id'],
 | 
			
		||||
          user_id: row['user_id_fk'],
 | 
			
		||||
          raw: import_post_attachments(row['post_message'], row['post_id']),
 | 
			
		||||
          created_at: Time.at(row['post_time']),
 | 
			
		||||
          updated_at: Time.at(row['post_latest_reply']),
 | 
			
		||||
          reply_to_post_number: row['post_father_id']
 | 
			
		||||
        )
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Import post attachments from gforum_PostAttachment table
 | 
			
		||||
  def import_post_attachments(post_message, post_id)
 | 
			
		||||
    # Query for attachments related to the post
 | 
			
		||||
    attachments = execute_query("SELECT * FROM gforum_PostAttachment WHERE post_id_fk = #{post_id}")
 | 
			
		||||
    attachments.each do |attachment|
 | 
			
		||||
      # Append attachment link to the post message
 | 
			
		||||
      post_message += "\n\n![#{attachment['postatt_filename']}](https://forum.slowtwitch.com/forum/?do=post_attachment;postatt_id=#{attachment['postatt_filename']})"
 | 
			
		||||
    end
 | 
			
		||||
    post_message
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Import personal messages (both inbox and sent messages)
 | 
			
		||||
  def import_personal_messages
 | 
			
		||||
    puts "Importing personal messages..."
 | 
			
		||||
    import_inbox_messages
 | 
			
		||||
    import_sent_messages
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Import inbox messages from gforum_Message table
 | 
			
		||||
  def import_inbox_messages
 | 
			
		||||
    puts "Importing inbox messages..."
 | 
			
		||||
    execute_query("SELECT * FROM gforum_Message").each do |row|
 | 
			
		||||
      # Create a private message topic in Discourse
 | 
			
		||||
      topic = create_topic(
 | 
			
		||||
        title: row['msg_subject'],
 | 
			
		||||
        user_id: row['from_user_id_fk'],
 | 
			
		||||
        archetype: Archetype.private_message,
 | 
			
		||||
        created_at: Time.at(row['msg_time']),
 | 
			
		||||
        updated_at: Time.at(row['msg_time'])
 | 
			
		||||
      )
 | 
			
		||||
 | 
			
		||||
      # Create the message as a post in the private topic
 | 
			
		||||
      create_post(
 | 
			
		||||
        topic_id: topic.id,
 | 
			
		||||
        user_id: row['from_user_id_fk'],
 | 
			
		||||
        raw: row['msg_body'],
 | 
			
		||||
        created_at: Time.at(row['msg_time']),
 | 
			
		||||
        updated_at: Time.at(row['msg_time'])
 | 
			
		||||
      )
 | 
			
		||||
 | 
			
		||||
      # Add recipient user to the private message topic
 | 
			
		||||
      topic.add_user_by_id(row['to_user_id_fk'])
 | 
			
		||||
      topic.save!
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Import sent messages from gforum_SentMessage table
 | 
			
		||||
  def import_sent_messages
 | 
			
		||||
    puts "Importing sent messages..."
 | 
			
		||||
    execute_query("SELECT * FROM gforum_SentMessage").each do |row|
 | 
			
		||||
      # Create a private message topic in Discourse
 | 
			
		||||
      topic = create_topic(
 | 
			
		||||
        title: row['msg_subject'],
 | 
			
		||||
        user_id: row['from_user_id_fk'],
 | 
			
		||||
        archetype: Archetype.private_message,
 | 
			
		||||
        created_at: Time.at(row['msg_time']),
 | 
			
		||||
        updated_at: Time.at(row['msg_time'])
 | 
			
		||||
      )
 | 
			
		||||
 | 
			
		||||
      # Create the message as a post in the private topic
 | 
			
		||||
      create_post(
 | 
			
		||||
        topic_id: topic.id,
 | 
			
		||||
        user_id: row['from_user_id_fk'],
 | 
			
		||||
        raw: row['msg_body'],
 | 
			
		||||
        created_at: Time.at(row['msg_time']),
 | 
			
		||||
        updated_at: Time.at(row['msg_time'])
 | 
			
		||||
      )
 | 
			
		||||
 | 
			
		||||
      # Add recipient user to the private message topic
 | 
			
		||||
      topic.add_user_by_id(row['to_user_id_fk'])
 | 
			
		||||
      topic.save!
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Perform the full import process
 | 
			
		||||
  def perform_import
 | 
			
		||||
    import_users
 | 
			
		||||
    import_categories
 | 
			
		||||
    import_topics_and_posts
 | 
			
		||||
    import_personal_messages
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
# Create an instance of the importer and start the import process
 | 
			
		||||
importer = GossamerForumsImporter.new
 | 
			
		||||
importer.perform_import
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user