Friday, September 20, 2024 4:30:34 AM
> settings

Customize


Authenticate

> servers.rb
# frozen_string_literal: true

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

        # See Argument::TEMPLATES[:community_id]
        argument :community_id, display_name: :for

        #
        # Configuration
        #

        command_type :player

        does_not_require :registration

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

        def on_execute
          servers = ESM::Server.where(community_id: target_community.id, server_visibility: :public)
            .sort_by { |s| s.server_name.downcase }
            .sort { |s| s.connected? ? 0 : 1 }

          check_for_no_servers!(servers)

          servers.each do |server|
            reply(build_server_embed(server))
          end
        end

        private

        def check_for_no_servers!(servers)
          return if servers.present?

          raise_error!(:no_servers, community_id: arguments.community_id)
        end

        def build_server_embed(server)
          ESM::Embed.build do |e|
            e.title = server.server_name.presence || ""
            e.color = server.connected? ? :green : :red

            # Server_id, ip, port
            add_server_connection_info(e, server)

            if server.connected?
              e.add_field(name: I18n.t("commands.server.online_for"), value: "```#{server.uptime}```")
              e.add_field(name: I18n.t("commands.server.restart_in"), value: "```#{server.time_left_before_restart}```")
            else
              e.description =
                if server.disconnected_at.nil?
                  I18n.t("commands.servers.offline")
                else
                  I18n.t("commands.servers.offline_for", time: server.time_since_last_connection)
                end
            end
          end
        end

        def add_server_connection_info(e, server)
          e.add_field(name: I18n.t(:server_id), value: "```#{server.server_id}```", inline: true)
          e.add_field(name: I18n.t(:ip), value: "```#{server.server_ip}```", inline: true)
          e.add_field(name: I18n.t(:port), value: "```#{server.server_port}```", inline: true)
        end
      end
    end
  end
end
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8