Thursday, September 19, 2024 11:59:44 PM
> settings

Customize


Authenticate

> servers_controller.rb
# frozen_string_literal: true

class ServersController < DashboardController
  before_action :redirect_if_player_mode
  before_action :find_server, only: %i[edit update destroy key]
  skip_before_action :load_communities, only: %i[create update destroy key]

  def index
  end

  def new
    @server = Server.new.attributes
    @setting = ServerSetting.new.attributes
    @mod = ServerMod.new.attributes.except("id", "server_id", "created_at", "updated_at", "deleted_at")
    @reward = ServerReward.new.attributes
    @server_names = current_community.servers.pluck(:server_id)
  end

  def edit
    @setting = @server.server_setting

    @mod = ServerMod.new.attributes.except("id", "server_id", "created_at", "updated_at", "deleted_at")
    @mods = @server.server_mods.map do |mod|
      mod.attributes.except("id", "server_id", "created_at", "updated_at", "deleted_at")
    end

    @reward = @server.server_rewards.default.attributes.except("id", "server_id", "created_at", "updated_at", "deleted_at")
    @server_names = current_community.servers.pluck(:server_id)
  end

  def create
    server_attributes, mod_attributes, reward_attributes, setting_attributes = sanitize_params

    # Create the actual server
    server = current_community.servers.create!(server_attributes)

    # Create mods for this server
    if mod_attributes.present?
      mod_attributes.each do |mod|
        server.server_mods.create!(mod)
      end
    end

    # Create the server reward for this server
    server.server_rewards.create!(reward_attributes)

    # Create the settings
    server.create_server_setting(setting_attributes)

    if server.persisted?
      flash[:success] = "Server #{server.server_id} has been created"
      redirect_to edit_community_server_path(current_community.public_id, server.public_id)
    else
      Rails.logger.error { "Failed to create server. Error: #{@server.errors.full_messages}" }
      redirect_to new_community_server_path(current_community.public_id), alert: "Failed to create server<br><span class='esm-text-color-red'>Please log out and log back in again</span><br>If this error persists, please join our Discord and let us know."
    end
  end

  def update
    server_attributes, mod_attributes, reward_attributes, setting_attributes = sanitize_params

    # Update the actual server
    @server.update!(server_attributes)

    # Update mods for this server
    if mod_attributes.present?
      # Delete all of the mods
      @server.server_mods.destroy_all

      # And recreate them
      mod_attributes.each do |mod|
        @server.server_mods.create!(mod)
      end
    end

    # Update the server reward for this server
    @server.server_rewards.default.update!(reward_attributes)

    # Create the settings
    @server.server_setting.update!(setting_attributes)

    if @server.persisted?
      ESM.update_server(@server.id)
      flash[:success] = "Server #{@server.server_id} has been updated"
      redirect_to edit_community_server_path(current_community.public_id, @server.public_id)
    else
      Rails.logger.error { "Failed to update server ID #{@server.id}. Error: #{@server.errors.full_messages.to_sentence}" }
      redirect_to edit_community_server_path(current_community.public_id, @server.public_id), alert: "Failed to update server<br><span class='esm-text-color-red'>Please log out and log back in again</span><br>If this error persists, please join our Discord and let us know."
    end
  end

  def key
    send_data(@server.server_key, filename: "esm.key")
  end

  def destroy
    if @server.destroy
      flash[:success] = "#{@server.server_id} has been deleted"
      redirect_to community_servers_path(current_community.public_id)
    else
      Rails.logger.error { "Failed to update server ID #{@server.id}. Error: #{@server.errors.full_messages.to_sentence}" }
      redirect_to edit_community_server_path(current_community.public_id, @server.public_id), alert: "Failed to delete server<br><span class='esm-text-color-red'>Please log out and log back in again</span><br>If this error persists, please join our Discord and let us know."
    end
  end

  private

  def find_server
    @server = current_community.servers.where(public_id: params[:id]).first
    return redirect_to community_servers_path(current_community.public_id) if @server.nil?
  end

  def server_params
    params.require(:server).permit(:server_id, :server_ip, :server_port, :server_mods, :server_visibility, server_setting: {}, server_reward: {})
  end

  def default_value_if_nil((key, value), hash)
    hash[key] = value || ""
  end

  def sanitize_params
    server_attributes = server_params.reject { |k, _v| k.in?(%w[server_mods server_setting server_reward]) }
    mod_attributes = JSON.parse(server_params[:server_mods])

    if mod_attributes.present?
      mod_attributes.each do |mod|
        mod.except!("_previous_name")
        mod["mod_required"] || false
      end
    end

    reward_attributes = server_params[:server_reward]
    setting_attributes = server_params[:server_setting]

    # Append the community ID to the server ID
    server_attributes[:server_id] = "#{current_community.community_id}_#{server_attributes[:server_id]}"

    # Make sure the value is what we want
    server_attributes[:server_visibility] =
      if server_attributes[:server_visibility] == "0"
        :private
      else
        :public
      end

    # Convert reward_items to a hash
    reward_attributes[:reward_items] = JSON.parse(reward_attributes[:reward_items])
    reward_attributes[:player_poptabs] ||= 0
    reward_attributes[:locker_poptabs] ||= 0
    reward_attributes[:respect] ||= 0

    # Reset extdb_path and logging_path to nil if they are ""
    setting_attributes[:extdb_path] = nil if setting_attributes[:extdb_path].blank?
    setting_attributes[:logging_path] = nil if setting_attributes[:logging_path].blank?

    # Set the server name to an empty string as that nil is not allowed
    server_attributes[:server_name] ||= ""

    # Return the separated attributes
    [server_attributes, mod_attributes, reward_attributes, setting_attributes]
  end
end
All opinions represented herein are my own
- © 2024 itsthedevman
- build 3c15a1b