require 'net/http'
require 'uri'
require 'yaml'
class Defensio
class << self
attr_accessor :host, :port, :api_version, :standard_headers, :service_type
end
attr_accessor :proxy_port, :proxy_host
attr_reader :last_response
self.service_type = :blog
self.host = 'api.defensio.com'
self.api_version = '1.1'
self.standard_headers = {
'User-Agent' => 'Mephisto Comment Defensio using Viking (Rails Plugin) v0.5',
'Content-Type' => 'application/x-www-form-urlencoded'
}
# Create a new instance of the Akismet class
#
# :api_key
# Your Akismet API key
# :blog
# The blog associated with your api key
# :proxy_port
# :proxy_host
def initialize(options)
@options = options
@verify_options = false
end
# Returns true if the API key has been verified, false otherwise
def verified?
(@verify_options ||= call_defensio('validate-key'))[:status] == 'success'
end
def check_article(options = {})
return false if @options[:api_key].nil? || @options[:blog].nil?
call_defensio 'announce-article', options
end
def check_comment(options = {})
return false if @options[:api_key].nil? || @options[:blog].nil?
if options[:article_date].respond_to?(:strftime)
options[:article_date] = options[:article_date].strftime("%Y/%m/%d")
end
call_defensio 'audit-comment', options
end
def mark_as_spam(options = {})
return false if @options[:api_key].nil? || @options[:blog].nil?
call_defensio 'report-false-negatives', options
end
def mark_as_ham(options = {})
return false if @options[:api_key].nil? || @options[:blog].nil?
call_defensio 'report-false-positives', options
end
def stats
return false if @options[:api_key].nil? || @options[:blog].nil?
call_defensio 'get-stats'
end
protected
def api_url(action)
URI.escape("/#{self.class.service_type}/#{self.class.api_version}/#{action}/#{@options[:api_key]}.yaml")
end
def call_defensio(action, params = {})
url = api_url(action)
data = params.inject({'owner-url' => @options[:blog] || @options[:owner_url]}) do |memo, (key, value)|
memo[key.to_s.dasherize] = value
memo
end.to_query
http = Net::HTTP.new(self.class.host, self.class.port, @options[:proxy_host], @options[:proxy_port])
resp = http.post(url, data, self.class.standard_headers)
begin
data = YAML.load(resp.body)
rescue ArgumentError => e
data = nil
end
(data.respond_to?(:key?) && data.key?('defensio-result')) ? data['defensio-result'].symbolize_keys : {:data => resp.body, :status => 'fail'}
end
end