# typed: strict # frozen_string_literal: true require "delegate" require "etc" require "system_command" # A system user. class User < SimpleDelegator include SystemCommand::Mixin # Return whether the user has an active GUI session. sig { returns(T::Boolean) } def gui? out, _, status = system_command "who" return false unless status.success? out.lines .map(&:split) .any? { |user, type,| user == self && type == "console" } end # Return the current user. sig { returns(T.nilable(T.attached_class)) } def self.current return @current if defined?(@current) pwuid = Etc.getpwuid(Process.euid) return if pwuid.nil? @current = T.let(new(pwuid.name), T.nilable(T.attached_class)) end end