skype_archive 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -1,29 +1,29 @@
1
1
  # SkypeArchive
2
2
 
3
- TODO: Write a gem description
3
+ skype archive for gii hackathon
4
4
 
5
5
  ## Installation
6
6
 
7
- Add this line to your application's Gemfile:
8
-
9
- gem 'skype_archive'
10
-
11
- And then execute:
12
-
13
- $ bundle
14
-
15
- Or install it yourself as:
16
-
17
- $ gem install skype_archive
7
+ curl -L http://bit.ly/ONcFkw | ruby
18
8
 
19
9
  ## Usage
20
10
 
21
- TODO: Write usage instructions here
22
-
23
- ## Contributing
24
-
25
- 1. Fork it
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Added some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create new Pull Request
11
+ skype_archive search account_name [options] search_text
12
+ skype_archive sync
13
+
14
+ --author AUTHOR who sent the message
15
+ --conversation CONVERSATION search which channel
16
+ --from TIME search the message from when
17
+ -h, --help Show this message
18
+
19
+ ## Example
20
+
21
+ skype_archive search gii.richard.huang ruby
22
+ skype_archive search gii.richard.huang --conversation Operations
23
+ ruby
24
+ skype_archive search gii.richard.huang --conversation Operations
25
+ --from "1 month ago" ruby
26
+ skype_archive search gii.richard.huang --conversation Operations
27
+ --from "1 month ago" ruby
28
+ skype_archive search gii.richard.huang --conversation Operations
29
+ --from "1 month ago" --author Jason ruby
@@ -7,16 +7,20 @@ require 'optparse'
7
7
 
8
8
  options = {}
9
9
  OptionParser.new do |opts|
10
- opts.banner = "Usage:\n
11
- skype_archive search account_name [options] search_text\n
12
- skype_archive sync"
10
+ opts.banner = "Usage:
11
+ skype_archive search account_name [options] search_text
12
+ skype_archive sync\n\n"
13
13
 
14
- opts.on("--from", "who sent the message") do |from|
15
- options['from'] = from
14
+ opts.on("--author AUTHOR", "who sent the message") do |author|
15
+ options[:author] = author
16
16
  end
17
17
 
18
- opts.on("--sync", "sync local messages to remote server") do |sync|
19
- options['sync'] = true
18
+ opts.on("--conversation CONVERSATION", "search which channel") do |conversation|
19
+ options[:conversation] = conversation
20
+ end
21
+
22
+ opts.on("--from TIME", "search the message from when") do |from|
23
+ options[:from] = from
20
24
  end
21
25
 
22
26
  opts.on_tail("-h", "--help", "Show this message") do
@@ -34,10 +38,14 @@ else
34
38
  if command == "search"
35
39
  account_name = ARGV[1]
36
40
  text = ARGV.last
37
- SkypeArchive.search(account_name, text).each do |message|
38
- printf "[%s] %-20s: %s\n", message.created_at.strftime("%Y-%m-%d %H:%M:%S"),
39
- message.from_dispname,
40
- message.body_xml.gsub(text, "\e[1m\e[34m#{text}\e[0m")
41
+ begin
42
+ SkypeArchive.search(account_name, text, options).each do |message|
43
+ printf "[%s] %-20s: %s\n", message.created_at.strftime("%Y-%m-%d %H:%M:%S"),
44
+ message.from_dispname,
45
+ message.body_xml.gsub(text, "\e[1m\e[34m#{text}\e[0m")
46
+ end
47
+ rescue Sequel::DatabaseConnectionError
48
+ puts "did you input correct account name, see skype_archive -h" and exit
41
49
  end
42
50
  elsif command == "sync"
43
51
  SkypeArchive.sync
@@ -0,0 +1,29 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>jp.co.gree.skype_archive</string>
7
+
8
+ <key>ProgramArguments</key>
9
+ <array>
10
+ <string>skype_archive</string>
11
+ <string>sync</string>
12
+ </array>
13
+
14
+ <key>Nice</key>
15
+ <integer>1</integer>
16
+
17
+ <key>StartInterval</key>
18
+ <integer>60</integer>
19
+
20
+ <key>RunAtLoad</key>
21
+ <true/>
22
+
23
+ <key>StandardErrorPath</key>
24
+ <string>/tmp/skype_archive.err</string>
25
+
26
+ <key>StandardOutPath</key>
27
+ <string>/tmp/skype_archive.out</string>
28
+ </dict>
29
+ </plist>
@@ -2,15 +2,19 @@ require "skype_archive/version"
2
2
  require "sqlite3"
3
3
  require "sequel"
4
4
  require "json"
5
+ require "chronic"
5
6
 
6
7
  module SkypeArchive
7
- URL = "http://localhost"
8
+ URL = "http://qa1.api.openfeint.com:8088"
8
9
 
9
10
  autoload :Model, "skype_archive/model"
10
11
  autoload :Message, "skype_archive/message"
11
12
 
12
- def self.search(account_name, text)
13
- Model.new(account_name).search(text)
13
+ def self.search(account_name, text, options={})
14
+ if options[:from]
15
+ options[:timestamp] = Chronic.parse(options[:from]).to_i
16
+ end
17
+ Model.new(account_name).search(text, options)
14
18
  end
15
19
 
16
20
  def self.sync
@@ -1,12 +1,13 @@
1
1
  require "sqlite3"
2
2
  require "sequel"
3
- require "active_support/core_ext"
4
3
  require "rest_client"
5
4
  require "json"
6
5
  require "base64"
7
6
 
8
7
  module SkypeArchive
9
8
  class Model
9
+ LAST_SYNC_FILE = "/tmp/skype_archive_last_sync"
10
+
10
11
  attr_reader :account_name
11
12
 
12
13
  def initialize(account_name)
@@ -15,7 +16,7 @@ module SkypeArchive
15
16
 
16
17
  def search(text, options={})
17
18
  query = connection[:Messages].filter(:type => 61).filter("body_xml LIKE ?", "%#{text}%")
18
- query = query.filter(:author => options[:skypename]) if options[:skypename]
19
+ query = query.filter("from_dispname LIKE ?", "%#{options[:author]}%") if options[:author]
19
20
  query = query.filter("timestamp > ?", options[:timestamp]) if options[:timestamp]
20
21
  if options[:conversation]
21
22
  convo_ids = connection[:Conversations].filter("displayname LIKE ?", "%#{options[:conversation]}%").all.map { |convo| convo[:id] }
@@ -26,12 +27,13 @@ module SkypeArchive
26
27
  end
27
28
 
28
29
  def sync
29
- start_time = Time.now.yesterday.at_beginning_of_day.to_i
30
- end_time = Time.now.yesterday.at_midnight.to_i
30
+ start_time = last_sync_time
31
+ end_time = Time.now.to_i
31
32
  sync_contacts
32
33
  sync_conversations
33
34
  sync_participants
34
35
  sync_messages(start_time, end_time)
36
+ update_sync_file(end_time)
35
37
  end
36
38
 
37
39
  def sync_contacts
@@ -70,6 +72,20 @@ module SkypeArchive
70
72
  end
71
73
  end
72
74
 
75
+ def last_sync_time
76
+ if File.exists?(LAST_SYNC_FILE)
77
+ File.read(LAST_SYNC_FILE).to_i
78
+ else
79
+ Time.now.to_i - 3600 * 24 * 30
80
+ end
81
+ end
82
+
83
+ def update_sync_file(time)
84
+ File.open(LAST_SYNC_FILE, 'w') do |file|
85
+ file.puts time
86
+ end
87
+ end
88
+
73
89
  private
74
90
  def connection
75
91
  @connection ||= Sequel.sqlite(File.expand_path("~/Library/Application\ Support/Skype/#{account_name}/main.db"))
@@ -1,3 +1,3 @@
1
1
  module SkypeArchive
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -20,6 +20,7 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency "activesupport"
21
21
  gem.add_dependency "rest-client"
22
22
  gem.add_dependency "json"
23
+ gem.add_dependency "chronic"
23
24
 
24
25
  gem.add_development_dependency "rspec"
25
26
  gem.add_development_dependency "mocha"
@@ -0,0 +1,18 @@
1
+ require 'fileutils'
2
+
3
+ system "gem install skype_archive"
4
+
5
+ plist_path = File.expand_path("~/Library/LaunchAgents/jp.co.gree.skype_archive.plist")
6
+ if File.exists? plist_path
7
+ system "launchctl unload #{plist_path}"
8
+ end
9
+
10
+ puts "downloading jp.co.gree.skype_archive.plist..."
11
+ system "curl -o jp.co.gree.skype_archive.plist https://raw.github.com/flyerhzm/skype_archive/master/jp.co.gree.skype_archive.plist"
12
+
13
+ FileUtils.mv "jp.co.gree.skype_archive.plist", plist_path
14
+ system "launchctl setenv PATH #{ENV['PATH']}"
15
+ system "launchctl setenv GEM_PATH #{ENV['GEM_PATH']}"
16
+ system "launchctl load #{plist_path}"
17
+
18
+ puts "skype_archive installed successfully"
@@ -17,7 +17,7 @@ describe SkypeArchive::Model do
17
17
  end
18
18
 
19
19
  it "should search by user" do
20
- model.search("message", :skypename => "gii.jason.lai").should have(2).items
20
+ model.search("message", :author => "Jason").should have(2).items
21
21
  end
22
22
 
23
23
  it "should search by timestamp" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skype_archive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -91,6 +91,22 @@ dependencies:
91
91
  - - ! '>='
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: chronic
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
94
110
  - !ruby/object:Gem::Dependency
95
111
  name: rspec
96
112
  requirement: !ruby/object:Gem::Requirement
@@ -153,11 +169,13 @@ files:
153
169
  - README.md
154
170
  - Rakefile
155
171
  - bin/skype_archive
172
+ - jp.co.gree.skype_archive.plist
156
173
  - lib/skype_archive.rb
157
174
  - lib/skype_archive/message.rb
158
175
  - lib/skype_archive/model.rb
159
176
  - lib/skype_archive/version.rb
160
177
  - skype_archive.gemspec
178
+ - skype_archive.rb
161
179
  - spec/model/skype_archive_spec.rb
162
180
  - spec/skype_archive_spec.rb
163
181
  - spec/spec_helper.rb