class Schleuder::KeywordHandlersRunner
Constants
- REGISTERED_KEYWORDS
- RESERVED_KEYWORDS
Attributes
keywords[R]
Public Class Methods
register_keyword(type:, keyword:, handler_class:, handler_method:, aliases:)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 9 def register_keyword(type:, keyword:, handler_class:, handler_method:, aliases:) assert_valid_input!(type: type, keyword: keyword, handler_class: handler_class, handler_method: handler_method) identifiers = [keyword] + Array(aliases) identifiers.each do |identifier| REGISTERED_KEYWORDS[type.to_sym][identifier.to_s.dasherize] = { klass: handler_class, method: handler_method.to_sym } end end
run(type:, list:, mail:)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 21 def run(type:, list:, mail:) list.logger.debug "Starting #{self}" assert_valid_type!(type) load_additional_keyword_handlers error = check_unknown_keywords(mail, type) return error if error.present? error = check_mandatory_keywords(mail, list) return [error] if error.present? output = mail.keywords.map do |keyword, arguments| if ! is_reserved_keyword?(keyword) run_handler(mail, list, type, keyword.to_s.dasherize, Array(arguments)) end end output.flatten.compact end
Private Class Methods
assert_valid_handler_class!(handler_class)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 133 def assert_valid_handler_class!(handler_class) if ! handler_class.is_a?(Class) raise ArgumentError.new("Invalid input for handler_class: #{handler_class.inspect} is not a class") end end
assert_valid_handler_method!(handler_method)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 139 def assert_valid_handler_method!(handler_method) if handler_method.blank? raise ArgumentError.new("Invalid input for handler_method: #{handler_method.inspect} is not a valid method name") end end
assert_valid_input!(type:, keyword:, handler_class:, handler_method:)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 114 def assert_valid_input!(type:, keyword:, handler_class:, handler_method:) assert_valid_type!(type) assert_valid_keyword!(keyword) assert_valid_handler_class!(handler_class) assert_valid_handler_method!(handler_method) end
assert_valid_keyword!(keyword)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 127 def assert_valid_keyword!(keyword) if keyword.blank? raise ArgumentError.new("Invalid keyword: #{keyword.inspect}") end end
assert_valid_type!(type)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 121 def assert_valid_type!(type) if ! REGISTERED_KEYWORDS.keys.include?(type) raise ArgumentError.new("Argument must be one of #{REGISTERED_KEYWORDS.keys.inspect}, got: #{type.inspect}") end end
check_mandatory_keywords(mail, list)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 96 def check_mandatory_keywords(mail, list) return nil if mail.keywords.blank? listname_keyword = mail.keywords.assoc('list-name') if listname_keyword.blank? return I18n.t(:missing_listname_keyword_error) else listname_args = listname_keyword.last if ! [list.email, list.request_address].include?(listname_args.first) return I18n.t(:wrong_listname_keyword_error) end end end
check_unknown_keywords(mail, type)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 45 def check_unknown_keywords(mail, type) known_keywords = REGISTERED_KEYWORDS[type.to_sym].keys + RESERVED_KEYWORDS given_keywords = mail.keywords.map(&:first) unknown_keywords = given_keywords - known_keywords if unknown_keywords.present? error_messages = unknown_keywords.map do |keyword| I18n.t('errors.unknown_keyword', keyword: keyword) end return error_messages end end
is_reserved_keyword?(keyword)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 110 def is_reserved_keyword?(keyword) RESERVED_KEYWORDS.include?(keyword) end
load_additional_keyword_handlers()
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 90 def load_additional_keyword_handlers Dir["#{Schleuder::Conf.keyword_handlers_dir}/*.rb"].each do |file| load file end end
notify_admins(type, mail, list, keyword, arguments, response)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 80 def notify_admins(type, mail, list, keyword, arguments, response) msg = I18n.t("keyword_handlers.keyword_admin_notify.#{type}", sender: mail.signer, keyword: keyword, arguments: arguments.join(' '), response: Array(response).join("\n\n") ) list.logger.notify_admin(msg, nil, 'Notice') end
run_handler(mail, list, type, keyword, arguments)
click to toggle source
# File lib/schleuder/keyword_handlers_runner.rb, line 57 def run_handler(mail, list, type, keyword, arguments) list.logger.debug "run_handler() with keyword '#{keyword}'" if list.admin_only?(keyword) && !list.from_admin?(mail) return Schleuder::Errors::KeywordAdminOnly.new(keyword).to_s end keyword_data = REGISTERED_KEYWORDS[type.to_sym][keyword] handler_class = keyword_data[:klass] handler_method = keyword_data[:method] output = handler_class.new(mail: mail, arguments: arguments).send(handler_method) if list.keywords_admin_notify.include?(keyword) notify_admins(type, mail, list, keyword, arguments, output) end return output rescue => exc # Log to system, this information is probably more useful for # system-admins than for list-admins. Schleuder.logger.error(exc.message_with_backtrace) I18n.t('keyword_handlers.handler_failed', keyword: keyword) end