# 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