shutwork 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27c8118a2da9dde8199128291e41636ded1192012ec449bc723afc9df5101de7
4
- data.tar.gz: 9dce3362c8013fdd214ec2957cda9fdb5407c02bf7ff5cd77978478df03b2626
3
+ metadata.gz: 3ff7c92d1e6570df34fa40f2fbcb6e7296a98439ecc067b1bb0435a93998ea01
4
+ data.tar.gz: 4280596b8d939771b5d4d7b85f5dbff32a38d1a780e2d78b6ef819d766327e00
5
5
  SHA512:
6
- metadata.gz: 65d2c5f4622333fe47c50fdf1296c261e7298784fca38166aaa632dbe94427ea851b131da610bbc7f24c2cccd92370f62dc4cf65b3f1d7c9d18a24613f952a50
7
- data.tar.gz: 23e38ebca5b76c5472928c001e1b08e84763fe20b2ae50c6b522520eb4ab3646c14ae6e3ae2f35f88c00851e74ecf2d0d63e7434d5f2e0cee0c90d9b3fddc0ea
6
+ metadata.gz: eaa3804849dd7e30754697ba72a46c9465f1a7fc673c05dee40a3420937aba805a0c52586d56a73b5d58d17482c903eebf126c8a006db39d9631ea7387b9cb7d
7
+ data.tar.gz: 780e63d70d1b8d359260b8b2da437b1b8c15db4dc3fc296172e042768648800edb0ad31ecde2e315ac855762b58aa598df1487fb95ee17a9934eb98a5de79e21
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shutwork (0.1.0)
4
+ shutwork (0.2.0)
5
5
  faraday (>= 1.0.0, < 2.0)
6
6
  thor (>= 1.0.0, < 2.0)
7
7
 
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Shutwork
2
2
 
3
3
  [![Build Status](https://travis-ci.com/kayhide/shutwork.svg?branch=master)](https://travis-ci.com/kayhide/shutwork)
4
+ [![Gem Version](https://badge.fury.io/rb/shutwork.svg)](https://badge.fury.io/rb/shutwork)
4
5
 
5
6
  ## Installation
6
7
 
@@ -10,7 +11,69 @@ Install `shutwork` as:
10
11
 
11
12
  ## Usage
12
13
 
13
- TBD
14
+ ### About me
15
+
16
+ To get me:
17
+
18
+ $ shutwork me
19
+
20
+ For the first time, it will complain about the absense of token and tell you what to do.
21
+ Follow the displayed instruction and supply your token.
22
+
23
+ When token is prepared, `me` command will show your account id and your name.
24
+
25
+ $ shutwork me
26
+ 123456 Alice
27
+
28
+ ### List rooms and messages
29
+
30
+ To get rooms:
31
+
32
+ $ shutwork rooms
33
+ 12000000 A room
34
+ 29000000 Bob
35
+ 47000000 Another room
36
+ 188000000 Yet anoter room
37
+ ....
38
+
39
+ To get messages of a room:
40
+
41
+ $ shutwork rooms 12000000
42
+ ----------------
43
+ 2019-10-23 01:19:50 +0900 Alice
44
+ Hey, it is working!
45
+ ----------------
46
+ 2019-10-23 12:49:16 +0900 Bob
47
+ Wow, unbelievable!
48
+ ----------------
49
+ ....
50
+
51
+ ### List members and files
52
+
53
+ To list memebers at a room:
54
+
55
+ $ shutwork rooms 12000000 --members
56
+ 123456 Alice
57
+ 29000000 Bob
58
+ ...
59
+
60
+ To list files at a room:
61
+
62
+ $ shutwork rooms 12000000 --files
63
+ 2016-08-30 16:12:31 +0900 544KB help_me.jpg
64
+ 2016-09-02 12:26:26 +0900 229KB maybe_broken.jpg
65
+ 2016-10-15 19:59:53 +0900 1.0MB smoking_melting.jpg
66
+ 2016-11-23 21:52:26 +0900 253KB seriously_damaged.jpg
67
+ 2017-01-28 16:05:37 +0900 204KB rip.jpg
68
+ ...
69
+
70
+
71
+ ### Note
72
+
73
+ Because of the limitation of Chatwork API, messages cannot be retrieved more than 100 items.
74
+
75
+ It only collects the most recent 100 messages.
76
+
14
77
 
15
78
 
16
79
  ## Development
data/lib/shutwork/cli.rb CHANGED
@@ -31,11 +31,11 @@ module Shutwork
31
31
 
32
32
  case command
33
33
  when "me"
34
- Shutwork::Command::Me.new.run
34
+ Shutwork::Command::Me.new.run ARGV.clone
35
35
  when "rooms"
36
- Shutwork::Command::Rooms.new.run
36
+ Shutwork::Command::Rooms.new.run ARGV.clone
37
37
  when "token"
38
- Shutwork::Command::Token.new.run
38
+ Shutwork::Command::Token.new.run ARGV.clone
39
39
  when nil
40
40
  Shutwork::Command::Help.new.run
41
41
  else
@@ -56,6 +56,10 @@ module Shutwork
56
56
  $stderr.puts "3. Check if it works as:"
57
57
  $stderr.puts " shutwork me"
58
58
  $stderr.puts
59
+
60
+ rescue Errno::EPIPE
61
+ exit 0
62
+
59
63
  end
60
64
  end
61
65
  end
@@ -31,6 +31,18 @@ module Shutwork
31
31
  process @conn.get("rooms/#{room_id}/messages?force=1")
32
32
  end
33
33
 
34
+ def room_members room_id
35
+ process @conn.get("rooms/#{room_id}/members")
36
+ end
37
+
38
+ def room_files room_id
39
+ process @conn.get("rooms/#{room_id}/files")
40
+ end
41
+
42
+ def file room_id, file_id
43
+ process @conn.get("rooms/#{room_id}/files/#{file_id}?create_download_url=1")
44
+ end
45
+
34
46
  def process res
35
47
  if @verbose
36
48
  $stderr.puts res.headers.to_json
@@ -1,7 +1,9 @@
1
1
  require "forwardable"
2
-
2
+ require "open-uri"
3
3
  require "thor/shell/color"
4
4
 
5
+ require "shutwork/command/display"
6
+
5
7
  module Shutwork
6
8
  module Command
7
9
  class Base
@@ -9,9 +11,23 @@ module Shutwork
9
11
 
10
12
  def_delegators :@shell, :say, :say_status
11
13
 
14
+ include Display
15
+
12
16
  def initialize
13
17
  @shell = Thor::Shell::Color.new
14
18
  end
19
+
20
+ def download_file url, dst, at = nil
21
+ FileUtils.mkdir_p dst.dirname
22
+ open(url) do |i|
23
+ open(dst, 'wb') do |o|
24
+ o.write i.read
25
+ end
26
+ if at
27
+ File.utime at, at, dst
28
+ end
29
+ end
30
+ end
15
31
  end
16
32
  end
17
33
  end
@@ -0,0 +1,54 @@
1
+ module Shutwork
2
+ module Command
3
+ module Display
4
+ def display_account item
5
+ puts ("%10s %s" % [item["account_id"], item["name"]])
6
+ end
7
+
8
+ def display_room item
9
+ puts ("%10s %s" % [item["room_id"], item["name"]])
10
+ end
11
+
12
+ def display_message item
13
+ puts "----------------"
14
+ puts ("%s %s" % [
15
+ format_datetime(item["send_time"]),
16
+ item.dig("account", "name")
17
+ ])
18
+ puts item["body"]
19
+ end
20
+
21
+ def display_file item
22
+ puts ("%s %6s %s" % [
23
+ format_datetime(item["upload_time"]),
24
+ format_filesize(item["filesize"]),
25
+ item["filename"]]
26
+ )
27
+ end
28
+
29
+ def format_datetime x
30
+ Time.at(x).to_s
31
+ end
32
+
33
+ def format_filesize x
34
+ to_filesize_human x
35
+ end
36
+
37
+ def to_filesize_human x
38
+ x = %w(KB MB GB TB).inject([x.to_f, 'B']) do |acc, u|
39
+ v = acc.first / 1024
40
+ if v.round(2) < 0.90
41
+ acc
42
+ else
43
+ [v, u]
44
+ end
45
+ end
46
+ if x.first >= 10.0 || x.last == 'B'
47
+ "%.0f%s" % x
48
+ else
49
+ "%.1f%s" % x
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -10,11 +10,11 @@ Usage: shutwork COMMAND
10
10
  Available options:
11
11
  -h,--help Show this help text
12
12
  --version Show version
13
- -r,--raw Show result in raw format
14
13
 
15
14
  Available commands:
16
- me Me
17
- rooms Rooms
15
+ me Show me
16
+ rooms Show Rooms and messages
17
+ token Manage token
18
18
  EOS
19
19
  end
20
20
  end
@@ -8,16 +8,16 @@ require "shutwork/token"
8
8
  module Shutwork
9
9
  module Command
10
10
  class Me < Base
11
- def parse_args
11
+ def parse_args args
12
12
  opts = OptionParser.new
13
13
  opts.program_name = "shutwork #{self.class.name.split(/::/).last.downcase}"
14
14
  opts.on("-r", "--raw", "Show results in raw format") { @raw = true }
15
15
  opts.on("-v", "--verbose", "Verbose") { @verbose = true }
16
- opts.parse ARGV
16
+ opts.parse args
17
17
  end
18
18
 
19
- def run
20
- parse_args
19
+ def run args = []
20
+ parse_args args
21
21
  token = Shutwork::Token.read
22
22
  @client = Shutwork::Client.new token: token, verbose: @verbose
23
23
 
@@ -25,8 +25,7 @@ module Shutwork
25
25
  if @raw
26
26
  puts item
27
27
  else
28
- me = JSON.parse(item)
29
- puts ("%10s %s" % [me["account_id"], me["name"]])
28
+ display_account JSON.parse(item)
30
29
  end
31
30
  end
32
31
  end
@@ -8,21 +8,29 @@ require "shutwork/token"
8
8
  module Shutwork
9
9
  module Command
10
10
  class Rooms < Base
11
- def parse_args
11
+ def parse_args args
12
12
  opts = OptionParser.new
13
13
  opts.program_name = "shutwork #{self.class.name.split(/::/).last.downcase}"
14
14
  opts.on("-r", "--raw", "Show results in raw format") { @raw = true }
15
15
  opts.on("-v", "--verbose", "Verbose") { @verbose = true }
16
- opts.parse ARGV
16
+ opts.on("--members", "Fetch members instead of messages") { @target = :members }
17
+ opts.on("--files", "Fetch files instead of messages") { @target = :files }
18
+ opts.on("--download", "Download files") { @download = true }
19
+ opts.on("--download-dir DIR", "Set download dir (default: download)") { |dir| @download_dir = dir }
20
+ opts.parse args
17
21
  end
18
22
 
19
- def run
20
- @args = parse_args
23
+ def run args = []
24
+ @args = parse_args args
21
25
  token = Shutwork::Token.read
22
26
  @client = Shutwork::Client.new token: token, verbose: @verbose
23
27
 
24
28
  if @args.first
25
- show @args.first
29
+ if @download
30
+ download @args.first
31
+ else
32
+ show @args.first
33
+ end
26
34
  else
27
35
  list
28
36
  end
@@ -33,23 +41,44 @@ module Shutwork
33
41
  if @raw
34
42
  puts items
35
43
  else
36
- rooms = JSON.parse(items)
37
- rooms.each do |room|
38
- puts ("%10s %s" % [room["room_id"], room["name"]])
39
- end
44
+ JSON.parse(items).each(&method(:display_room))
40
45
  end
41
46
  end
42
47
 
43
48
  def show room_id
44
- items = @client.room_messages room_id
49
+ items =
50
+ case @target
51
+ when :members
52
+ @display = :display_account
53
+ @client.room_members room_id
54
+ when :files
55
+ @display = :display_file
56
+ @client.room_files room_id
57
+ else
58
+ @display = :display_message
59
+ @client.room_messages room_id
60
+ end
45
61
  if @raw
46
62
  puts items
47
63
  else
48
- messages = JSON.parse(items)
49
- messages.each do |message|
50
- puts "----------------"
51
- puts ("%s %s" % [Time.at(message["send_time"]), message.dig("account", "name")])
52
- puts message["body"]
64
+ JSON.parse(items).each(&method(@display))
65
+ end
66
+ end
67
+
68
+ def download room_id
69
+ dir = Pathname.new(@download_dir || "download").join(room_id.to_s)
70
+ items = @client.room_files room_id
71
+ files = JSON.parse(items)
72
+ files.each do |file|
73
+ dst = dir.join file["filename"]
74
+ if dst.exist?
75
+ say_status "exist", dst, :cyan
76
+ else
77
+ say_status "download", dst, :yellow
78
+ x = @client.file room_id, file["file_id"]
79
+ url = JSON.parse(x)["download_url"]
80
+ at = Time.at file["upload_time"]
81
+ download_file url, dst, at
53
82
  end
54
83
  end
55
84
  end
@@ -4,16 +4,16 @@ require "shutwork/token"
4
4
  module Shutwork
5
5
  module Command
6
6
  class Token < Base
7
- def parse_args
7
+ def parse_args args
8
8
  opts = OptionParser.new
9
- opts.program_name = "shutwork #{self.class.name.split(/::/).last.downcase}"
9
+ opts.program_name = "shutwork #{self.class.name.split(/::/).last.downcase} [TOKEN]"
10
10
  opts.on("--skip-verify", "Skips validity check") { @skip_verify = true }
11
11
  opts.on("-v", "--verbose", "Verbose") { @verbose = true }
12
- opts.parse ARGV
12
+ opts.parse args
13
13
  end
14
14
 
15
- def run
16
- @token = parse_args.first&.strip
15
+ def run args = []
16
+ @token = parse_args(args).first&.strip
17
17
 
18
18
  if @token
19
19
  unless @skip_verify
@@ -1,3 +1,3 @@
1
1
  module Shutwork
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shutwork
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hideaki Kawai
@@ -115,6 +115,7 @@ files:
115
115
  - lib/shutwork/cli.rb
116
116
  - lib/shutwork/client.rb
117
117
  - lib/shutwork/command/base.rb
118
+ - lib/shutwork/command/display.rb
118
119
  - lib/shutwork/command/help.rb
119
120
  - lib/shutwork/command/me.rb
120
121
  - lib/shutwork/command/rooms.rb