Friday, September 20, 2024 2:42:54 AM
> settings

Customize


Authenticate

> server_initialization.rb
# frozen_string_literal: true

module ESM
  module Event
    class ServerInitialization
      attr_reader :data

      def initialize(tcp_client, model, message)
        @tcp_client = tcp_client
        @model = model
        @message = message
        @community = @model.community
        @discord_server = @community.discord_server
      end

      def run!
        # Updates the database with information from the server
        initialize_server

        # We need to let the DLL know some stuff (namely a lot of stuff)
        build_setting_data

        # Send message to server
        send_post_init
      end

      # Called when an admin updates some settings.
      def update
        # We need to let the DLL know some stuff (namely a lot of stuff)
        build_setting_data

        # Send message to server
        send_post_init
      end

      private

      def initialize_server
        update_server
        update_server_settings
        store_territory_data
        store_metadata
      end

      def update_server
        @model.update!(
          server_name: @message.data.server_name,
          server_start_time: Time.parse(@message.data.server_start_time).utc,
          server_version: Semantic::Version.new(@message.data.extension_version),
          disconnected_at: nil
        )
      end

      def update_server_settings
        @model.server_setting.update(
          territory_price_per_object: @message.data.price_per_object,
          territory_lifetime: @message.data.territory_lifetime
        )
      end

      def store_territory_data
        @model.territories.delete_all

        territories =
          @message.data.territory_data.to_a.map do |data|
            data = ESM::Arma::HashMap.from(data).to_istruct

            {
              server_id: @model.id,
              territory_level: data.level,
              territory_purchase_price: data.purchase_price,
              territory_radius: data.radius,
              territory_object_count: data.object_count
            }
          end

        ESM::Territory.import(territories)
      end

      def store_metadata
        @tcp_client.set_metadata(
          vg_enabled: @message.data.vg_enabled,
          vg_max_sizes: @message.data.vg_max_sizes.to_a
        )
      end

      def build_setting_data
        settings = @model.server_setting

        # Remove the database and v1 fields
        data = settings.attributes.without(
          *%w[
            id server_id created_at updated_at deleted_at
            server_restart_hour server_restart_min request_thread_type
            request_thread_tick logging_path
          ]
        ).symbolize_keys

        @data = data.merge(
          function_name: "ESMs_system_process_postInit",
          community_id: @community.community_id,
          extdb_path: settings.extdb_path || "",
          logging_channel_id: @community.logging_channel_id,
          server_id: @model.server_id,
          territory_admin_uids: build_territory_admins,
          taxes_territory_payment: settings.territory_payment_tax / 100,
          taxes_territory_upgrade: settings.territory_upgrade_tax / 100
        )
      end

      def build_territory_admins
        # Get all roles with administrator or that are set as territory admins
        roles = @discord_server.roles.select do |role|
          role.permissions.administrator || @community.territory_admin_ids.include?(role.id.to_s)
        end

        # Get all of the user's discord IDs who have these roles
        discord_ids =
          roles.map do |role|
            role.users.map { |user| user.id.to_s }
          end.flatten

        # Pluck all the steam UIDs we have, including the guild owners
        ESM::User.where(discord_id: discord_ids + [@discord_server.owner.id.to_s]).where.not(steam_uid: nil).pluck(:steam_uid)
      end

      def send_post_init
        message = ESM::Message.new
          .set_type(:post_init)
          .set_data(**@data)

        @tcp_client.send_message(message)

        info!(server_id: @model.server_id, uptime: @model.uptime)

        @model.community.log_event(
          :reconnect,
          I18n.t("server_connected", server: @model.server_id, uptime: @model.uptime)
        )
      end
    end
  end
end
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8