shutwork 0.1.0 → 0.2.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.
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