lib/chronicle/imessage/imessage_extractor.rb in chronicle-imessage-0.1.0 vs lib/chronicle/imessage/imessage_extractor.rb in chronicle-imessage-0.2.0
- old
+ new
@@ -8,18 +8,15 @@
register_connector do |r|
r.provider = 'imessage'
r.description = 'a local imessage database'
end
- DEFAULT_OPTIONS = {
- db: File.join(Dir.home, 'Library', 'Messages', 'chat.db'),
- load_attachments: false,
- load_since: Time.now - 5000000
- }.freeze
+ setting :db, default: File.join(Dir.home, 'Library', 'Messages', 'chat.db'), required: true
+ setting :load_attachments, default: false
+ setting :only_attachments, default: false
- def initialize(options = {})
- super(DEFAULT_OPTIONS.merge(options))
+ def prepare
prepare_data
end
def extract
@messages.each do |message|
@@ -36,37 +33,43 @@
end
private
def prepare_data
- @db = SQLite3::Database.new(@options[:db], results_as_hash: true)
- @messages = load_messages(
- load_since: @options[:load_since],
- load_until: @options[:load_until],
- limit: @options[:limit]
- )
+ @db = SQLite3::Database.new(@config.db, results_as_hash: true)
+ @messages = load_messages
@contacts = LocalContacts.new.contacts
@chats = load_chats
- if @options[:load_attachments]
+ if @config.load_attachments
@attachments = load_attachments(@messages.map{|m| m['message_id']})
end
end
- def load_messages(load_since: nil, load_until: nil, limit: nil)
- load_since_ios = unix_to_ios_timestamp(load_since.to_i) * 1000000000 if load_since
- load_until_ios = unix_to_ios_timestamp(load_until.to_i) * 1000000000 if load_until
+ def load_messages
+ conditions = []
+ if @config.until
+ load_until_ios = unix_to_ios_timestamp(@config.until.to_i) * 1000000000
+ conditions << "date < #{load_until_ios}"
+ end
+
+ if @config.since
+ load_since_ios = unix_to_ios_timestamp(@config.since.to_i) * 1000000000
+ conditions << "date > #{load_since_ios}"
+ end
+
+ if @config.only_attachments
+ conditions << "cache_has_attachments = true"
+ end
+
sql = "SELECT * from message as m
LEFT OUTER JOIN handle as h ON m.handle_id=h.ROWID
INNER JOIN chat_message_join as cm ON m.ROWID = cm.message_id"
- conditions = []
- conditions << "date < #{load_until_ios}" if load_until
- conditions << "date > #{load_since_ios}" if load_since
sql += " WHERE #{conditions.join(" AND ")}" if conditions.any?
sql += " ORDER BY date DESC"
- sql += " LIMIT #{limit}" if limit
+ sql += " LIMIT #{@config.limit}" if @config.limit
messages = @db.execute(sql)
end
# In ios message schema, a message belongs to a chat (basically, a thread).