Skip to content

Instantly share code, notes, and snippets.

@tekei
Created September 28, 2012 08:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tekei/3798571 to your computer and use it in GitHub Desktop.
Save tekei/3798571 to your computer and use it in GitHub Desktop.
QQ English (http://www.qqeng.com) のレッスン予約をToodledoに登録する
# -*- coding: utf-8 -*-
require 'mail'
require 'active_support/core_ext'
require 'date'
require 'toodledo'
gmail_account = 'xxxxxxxxx'
gmail_password = 'xxxxxxxx'
# 下記toodledo_accountは、下記ページの「Unique ID」
# http://www.toodledo.com/account_edit.php
toodledo_account = 'xxxxxxxxx'
toodledo_password = 'xxxxxxxxxxxxxxxxx'
#--------------------------------------
@toodledo = Toodledo::Session.new(toodledo_account, toodledo_password)
@toodledo.connect
@todo_title = "英会話 : QQ English"
@current_commit = {}
@toodledo.get_tasks({:title => @todo_title}).each { |t|
@current_commit[t.duedate] = t.server_id
}
def add_task(reserve_date, note)
return if (@current_commit.include?(reserve_date) || (reserve_date < Time.now))
p = {priority: Toodledo::Priority::HIGH}
p[:duedate] = reserve_date.strftime Toodledo::Session::DATE_FORMAT
p[:duetime] = reserve_date.strftime Toodledo::Session::TIME_FORMAT
p[:note] = note
id = @toodledo.add_task(@todo_title, p)
@current_commit[reserve_date] = id
end
def del_task(reserve_date)
return if (!(@current_commit.include?(reserve_date)) || (reserve_date < Time.now))
@toodledo.delete_task @current_commit[reserve_date]
@current_commit.delete reserve_date
end
# see http://stackoverflow.com/questions/5529912
def sync_enum *enums
enums.map!(&:to_enum)
Enumerator.new do |yielder|
loop do
yielder.yield(enums.map(&:next))
end
end
end
def analyze_mail(body)
reserve_date = body.scan(/日付: ([\d\/]+)/).flatten
reserve_time = body.scan(/時間: ([\d:]+)/).flatten
teacher = body.scan(/教師: [\w ]+/).flatten
course = body.scan(/コース: .+/).flatten
result = []
sync_enum(reserve_date, reserve_time, teacher, course).each { |d, tm, ta, c|
result << {
:reserve => DateTime.strptime("#{d} #{tm}", "%Y/%m/%d %H:%M"),
:note => "#{ta}\n#{c}"
}
}
return result
end
Mail.defaults do
retriever_method :imap,
:address => "imap.gmail.com",
:port => 993,
:user_name => mail_account,
:password => mail_password,
:enable_ssl => true
end
keys = %w(UNDELETED FROM info@qqeng.com)
Mail.find(:mailbox => 'INBOX', :keys => keys, :what => :last, :order=> :asc, :count => 100) { |email|
body = email.body.decoded.encode("utf-8", email.charset)
if email.subject =~ /予約受付/
analyze_mail(body).each { |r|
puts "予約 - #{r[:reserve]}"
add_task(r[:reserve] - 15.minutes, r[:note])
}
elsif email.subject =~ /キャンセル受付/
analyze_mail(body).each { |r|
puts "キャンセル - #{r[:reserve]}"
del_task(r[:reserve] - 15.minutes)
}
end
}
@toodledo.disconnect
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment