Wednesday, July 15, 2026 4:57:23 AM
> reward.rb
# frozen_string_literal: true

module ESM
  module Command
    module Server
      class Reward < ApplicationCommand
        #################################
        #
        # Arguments (required first, then order matters)
        #

        # See Argument::TEMPLATES[:server_id]
        argument :server_id, display_name: :on

        #
        # Configuration
        #

        change_attribute :cooldown_time, default: 1.second

        command_type :player

        #################################

        def on_execute
          # Check for pending requests
          check_for_pending_request!

          # Check to see if the server has any rewards for the user before even sending the request
          check_for_reward_items!

          # Add the request
          add_request(
            to: current_user,
            description: I18n.t(
              "commands.reward_v1.request_description",
              user: current_user.mention,
              server: target_server.server_id
            )
          )

          # Remind them to check their PMs
          embed = ESM::Embed.build(
            :success,
            description: I18n.t("commands.request.check_pm", user: current_user.mention)
          )

          reply(embed)
        end

        def on_request_accepted
          reward = target_server.server_reward

          response = call_sqf_function!(
            "ESMs_command_reward",
            items: reward.reward_items,
            locker: reward.locker_poptabs,
            money: reward.player_poptabs,
            respect: reward.respect
          )

          embed = embed_from_message!(response)
          reply(embed)
        end

        private

        def check_for_reward_items!
          reward = target_server.server_reward

          return if reward.reward_items.present? ||
            reward.locker_poptabs.positive? ||
            reward.player_poptabs.positive? ||
            reward.respect.positive?

          raise_error!(:no_reward_items, user: current_user.mention)
        end

        module V1
          def on_response
            # Array<Array<item, quantity>>
            receipt = @response.receipt.to_h

            embed = ESM::Embed.build(
              :success,
              description: I18n.t(
                "commands.reward_v1.receipt",
                user: current_user.mention,
                items: receipt.join_map { |item, quantity| "- #{quantity}x #{item}\n" }
              )
            )

            reply(embed)
          end

          def on_request_accepted
            deliver!(command_name: "reward", function_name: "rewardPlayer", target_uid: current_user.steam_uid)
          end
        end
      end
    end
  end
end
All opinions represented herein are my own
- © 2024 - 2026 itsthedevman
- build 43aa0d7