# frozen_string_literal: true
module ESM
module Command
class Base
module Permissions
def community_permissions?
# Caching so if community_permissions returns `nil`, it doesn't hit the database for every call to this method
@community_permission_predicate ||= !community_permissions.nil?
end
def cooldown_time
if community_permissions?
# [2, "seconds"] -> 2 seconds
# Calls .seconds, .days, .months, etc
community_permissions.cooldown_quantity.send(community_permissions.cooldown_type)
else
cooldown_time = attributes.cooldown_time
cooldown_time.default? ? cooldown_time.default : 2.seconds
end
end
def command_enabled?
if community_permissions?
community_permissions.enabled?
else
enabled = attributes.enabled
enabled.default? ? enabled.default : true
end
end
def notify_when_command_disabled?
if community_permissions?
community_permissions.notify_when_disabled?
else
true
end
end
def command_allowlist_enabled?
if community_permissions?
community_permissions.allowlist_enabled?
else
allowlist_enabled = attributes.allowlist_enabled
allowlist_enabled.default? ? allowlist_enabled.default : false
end
end
def command_allowed?
return true if !command_allowlist_enabled?
community = target_community || current_community
return false if community.nil?
server = ESM.discord_bot.server(community.guild_id.to_i)
return false if server.nil?
guild_member = current_user.on(server)
return false if guild_member.nil?
allowlisted_role_ids =
if community_permissions?
community_permissions.allowlisted_role_ids
else
attributes.allowlisted_role_ids.default || []
end
return true if guild_member.permission?(:administrator)
return false if allowlisted_role_ids.empty?
allowlisted_role_ids.any? { |role_id| guild_member.role?(role_id.to_i) }
end
# Is the command allowed in this text channel?
def command_allowed_in_channel?
return true if current_channel.nil? || current_channel.pm?
return true if current_community&.player_mode_enabled?
return community_permissions.allowed_in_text_channels? if community_permissions?
allowed_define = attributes.allowed_in_text_channels
return allowed_define.default if allowed_define.default?
true
end
end
end
end
end