#!/usr/bin/env ruby NAME = 'foo' # if your domain is foo.backpackit.com EMAIL = 'Name ' # recipient KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # backpack API key SSL = true # set to true or false # actionmailer settings MAILER_SETTINGS = { :address => "smtp.gmail.com", :port => "587", :domain => "localhost.localdomain", :authentication => :plain, :user_name => "your username", :password => "your password" } # Shouldn't have to touch below this line, but feel free. require 'rubygems' require 'redcloth' #require 'xmlsimple' # included with action_controller require 'yaml' require 'net/https' require 'action_mailer' require 'tlsmail' Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE) ActionMailer::Base.smtp_settings = MAILER_SETTINGS # just to get auto_link. Must be a better way. require 'action_controller' include ActionView::Helpers::TextHelper include ActionView::Helpers::TagHelper class Backpack attr_accessor :username, :token, :current_page_id def initialize(username, token, use_ssl = false) @username, @token = username, token connect(use_ssl) end def connect(use_ssl = false) @connection = Net::HTTP.new("#{@username}.backpackit.com", use_ssl ? 443 : 80) @connection.use_ssl = use_ssl @connection.verify_mode = OpenSSL::SSL::VERIFY_NONE if use_ssl end def page_id=(id) self.current_page_id = id end def request(path, parameters = {}, second_try = false) parameters = { "token" => @token }.merge(parameters) response = @connection.post("/ws/#{path}", parameters.to_yaml, "X-POST_DATA_FORMAT" => "yaml") if response.code == "200" result = XmlSimple.xml_in(response.body) result.delete "success" result.empty? ? true : result elsif response.code == "302" && !second_try connect(true) request(path, parameters, true) else raise "Error occured (#{response.code}): #{response.body}" end end # Pages ---- def list_pages request "pages/all" end def show_page(page_id = current_page_id) request "page/#{page_id}" end end class Mailer < ActionMailer::Base def summary(html) recipients EMAIL subject "Your backpack tasks" from "tammersaleh@tammersaleh.com" part :content_type => "text/html", :body => html end end out = ["h1. Your Backpack Tasks"] backpack = Backpack.new(NAME, KEY, SSL) pages = backpack.list_pages['pages'].first['page'] pages = pages.select {|p| p['title'] =~ /^@/ } pages.each do |page_hash| page_id = page_hash["id"] page_title = page_hash["title"] page_url = (SSL ? 'https://' : 'http://') + "#{NAME}.backpackit.com/page/#{page_id}" out << "" out << "h2. \"#{page_title}\":#{page_url}" out << "" page = backpack.show_page(page_id)['page'] lists = page.first['lists'].first['list'] rescue [] lists = lists.select {|l| l['name'] == 'Tasks'} lists.each do |list| items = list['items'].first['item'] rescue [] items = items.select {|i| i['completed'] == 'false' } items = items.map {|i| i['content']} items.each do |i| out << "* #{auto_link(i)}" end end end Mailer.deliver_summary(RedCloth.new(out.join("\n")).to_html)