zoom_slack 0.0.1 → 0.0.2
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 +4 -4
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +6 -1
- data/README.md +12 -0
- data/Rakefile +3 -0
- data/bin/zoom_slack +47 -2
- data/lib/zoom_slack/config.rb +35 -0
- data/lib/zoom_slack/process_detector/{factory.rb → base.rb} +6 -0
- data/lib/zoom_slack/process_detector/mac.rb +20 -6
- data/lib/zoom_slack/profile_updater.rb +4 -3
- data/lib/zoom_slack/syncer.rb +6 -5
- data/lib/zoom_slack/version.rb +1 -1
- data/lib/zoom_slack.rb +3 -1
- data/zoom_slack.gemspec +9 -1
- metadata +75 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c988264e9d02b36a62478a8770a6cb06bd9c25f7
|
4
|
+
data.tar.gz: de22aaf7767abdd2b2c5f71d15bfb52b410cd3cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9728a25b33faa268f901a7b0e862bc7dd8438eadc88ce7adda9b965d93968a477be90284c3e3ffbc36bcf14635c749f8d4cd903e33c3b758c6f66a37dbfdfd9e
|
7
|
+
data.tar.gz: cfd2725c38c3b28dc641fc48fd32500c26d75150af8121d4e6da642e2946d2b8f3fa605cbfe0c9411032261d5ee1161e1f70d915965eb526429767d38bc1dd8f
|
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
-
##
|
7
|
+
## Unreleased
|
8
|
+
### Added
|
9
|
+
- Fully configurable via `bin/zoom_slack`. Run `zoom_slack -h` to see all the options.
|
10
|
+
- Full test coverage.
|
11
|
+
|
12
|
+
## [0.0.1] - 2018-11-29
|
8
13
|
### Added
|
9
14
|
- Initial version, working on Mac.
|
data/README.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
+
[](https://badge.fury.io/rb/zoom_slack)
|
2
|
+
[](https://travis-ci.org/bwebster/zoom_slack)
|
3
|
+
|
1
4
|
# zoom_slack
|
2
5
|
|
6
|
+
**Note: this is alpha quality software, and still under active development!**
|
7
|
+
|
3
8
|
This gem provides an easy way to automatically set your Slack status any time you are in a Zoom meeting.
|
4
9
|
|
5
10
|
The current implementation will only work on Mac OS X, but other operating system implementations are welcome!
|
@@ -30,3 +35,10 @@ You can obtain an oauth token by creating a new app and installing it into your
|
|
30
35
|
1. Under the "Settings" sidebar, click "Install App", then click "Install App to Workspace"
|
31
36
|
1. Click "Authorize"
|
32
37
|
1. Copy you OAuth Access Token
|
38
|
+
|
39
|
+
## Todo
|
40
|
+
|
41
|
+
1. Tests!
|
42
|
+
1. Customizable text, emoji, and expiration
|
43
|
+
1. Documentation
|
44
|
+
1. Support for additional platforms
|
data/Rakefile
CHANGED
data/bin/zoom_slack
CHANGED
@@ -1,8 +1,53 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require "optparse"
|
4
5
|
require "zoom_slack"
|
5
6
|
|
6
|
-
|
7
|
+
config = ZoomSlack::Config.new
|
7
8
|
|
8
|
-
|
9
|
+
OptionParser.new do |opts|
|
10
|
+
opts.banner = "Usage: zoom_slack [options]"
|
11
|
+
|
12
|
+
opts.separator ""
|
13
|
+
opts.separator "Authentication options:"
|
14
|
+
|
15
|
+
opts.on("-t", "--token TOKEN",
|
16
|
+
"Slack token (defaults to $#{ZoomSlack::Config::TOKEN_DEFAULT_ENV})") do |v|
|
17
|
+
config.token = v
|
18
|
+
end
|
19
|
+
|
20
|
+
opts.separator ""
|
21
|
+
opts.separator "Profile status options:"
|
22
|
+
|
23
|
+
opts.on("--text TEXT",
|
24
|
+
"Status text (defaults to '#{ZoomSlack::Config::MEETING_TEXT_DEFAULT}')") do |v|
|
25
|
+
config.meeting_text = v
|
26
|
+
end
|
27
|
+
opts.on("--emoji EMOJI",
|
28
|
+
"Status emoji (defaults to '#{ZoomSlack::Config::MEETING_EMOJI_DEFAULT}')") do |v|
|
29
|
+
config.meeting_emoji = v
|
30
|
+
end
|
31
|
+
opts.on("--expires N",
|
32
|
+
"Status expires in N minutes (defaults to #{ZoomSlack::Config::MEETING_EXPIRES_IN_MIN_DEFAULT})") do |v|
|
33
|
+
config.meeting_expires_in_min = v
|
34
|
+
end
|
35
|
+
opts.on("--clear-text TEXT",
|
36
|
+
"Clear status text (defaults to '#{ZoomSlack::Config::CLEAR_TEXT_DEFAULT}')") do |v|
|
37
|
+
config.clear_text = v
|
38
|
+
end
|
39
|
+
opts.on("--clear-emoji EMOJI",
|
40
|
+
"Clear status emoji (defaults to '#{ZoomSlack::Config::CLEAR_EMOJI_DEFAULT}')") do |v|
|
41
|
+
config.clear_emoji = v
|
42
|
+
end
|
43
|
+
|
44
|
+
opts.separator ""
|
45
|
+
opts.separator "Common options:"
|
46
|
+
|
47
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
48
|
+
puts opts
|
49
|
+
exit
|
50
|
+
end
|
51
|
+
end.parse!
|
52
|
+
|
53
|
+
ZoomSlack::Syncer.new(config).sync
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ZoomSlack
|
4
|
+
class Config
|
5
|
+
TOKEN_DEFAULT_ENV = "SLACK_API_TOKEN"
|
6
|
+
MEETING_TEXT_DEFAULT = "In a meeting"
|
7
|
+
MEETING_EMOJI_DEFAULT = ":spiral_calendar_pad:"
|
8
|
+
MEETING_EXPIRES_IN_MIN_DEFAULT = 0
|
9
|
+
CLEAR_TEXT_DEFAULT = nil
|
10
|
+
CLEAR_EMOJI_DEFAULT = nil
|
11
|
+
|
12
|
+
attr_accessor :token,
|
13
|
+
:meeting_text, :meeting_emoji, :meeting_expires_in_min,
|
14
|
+
:clear_text, :clear_emoji
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
self.token = ENV[TOKEN_DEFAULT_ENV]
|
18
|
+
self.meeting_text = MEETING_TEXT_DEFAULT
|
19
|
+
self.meeting_emoji = MEETING_EMOJI_DEFAULT
|
20
|
+
self.meeting_expires_in_min = MEETING_EXPIRES_IN_MIN_DEFAULT
|
21
|
+
self.clear_text = CLEAR_TEXT_DEFAULT
|
22
|
+
self.clear_emoji = CLEAR_EMOJI_DEFAULT
|
23
|
+
end
|
24
|
+
|
25
|
+
def meeting_expires_in_min=(min)
|
26
|
+
@meeting_expires_in_min = Integer(min)
|
27
|
+
end
|
28
|
+
|
29
|
+
def meeting_expires_at
|
30
|
+
return nil if meeting_expires_in_min == 0
|
31
|
+
|
32
|
+
Time.now.to_i + (meeting_expires_in_min * 60)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,10 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "tmpdir"
|
4
|
+
require "open3"
|
4
5
|
|
5
6
|
module ZoomSlack
|
6
7
|
module ProcessDetector
|
7
|
-
class Mac
|
8
|
+
class Mac < Base
|
9
|
+
SCRIPT = "in_zoom_meeting.applescript"
|
10
|
+
COMPILED_SCRIPT = "in_zoom_meeting.scptd"
|
11
|
+
|
12
|
+
def initialize(open: Open3)
|
13
|
+
self.open = open
|
14
|
+
end
|
15
|
+
|
8
16
|
def running?
|
9
17
|
compile
|
10
18
|
process_running?
|
@@ -12,20 +20,26 @@ module ZoomSlack
|
|
12
20
|
|
13
21
|
private
|
14
22
|
|
23
|
+
attr_accessor :open
|
24
|
+
|
15
25
|
def compile
|
16
|
-
|
26
|
+
return if Dir.exist?(compiled_path)
|
27
|
+
|
28
|
+
out, _err, _st = open.capture3("osacompile", "-o", compiled_path, source_path)
|
29
|
+
out
|
17
30
|
end
|
18
31
|
|
19
32
|
def process_running?
|
20
|
-
|
33
|
+
out, _err, _st = open.capture3("osascript", compiled_path)
|
34
|
+
out.chomp == "true"
|
21
35
|
end
|
22
36
|
|
23
|
-
def
|
24
|
-
@bin_path ||= File.join(Dir.tmpdir,
|
37
|
+
def compiled_path
|
38
|
+
@bin_path ||= File.join(Dir.tmpdir, COMPILED_SCRIPT)
|
25
39
|
end
|
26
40
|
|
27
41
|
def source_path
|
28
|
-
@source_path ||= File.join(File.dirname(__FILE__), "source",
|
42
|
+
@source_path ||= File.join(File.dirname(__FILE__), "source", SCRIPT)
|
29
43
|
end
|
30
44
|
end
|
31
45
|
end
|
@@ -5,8 +5,9 @@ require "json"
|
|
5
5
|
|
6
6
|
module ZoomSlack
|
7
7
|
class ProfileUpdater
|
8
|
-
def initialize(token:)
|
8
|
+
def initialize(token:, stderr: STDERR)
|
9
9
|
self.token = token
|
10
|
+
self.stderr = stderr
|
10
11
|
end
|
11
12
|
|
12
13
|
def status(status)
|
@@ -15,7 +16,7 @@ module ZoomSlack
|
|
15
16
|
|
16
17
|
private
|
17
18
|
|
18
|
-
attr_accessor :token
|
19
|
+
attr_accessor :token, :stderr
|
19
20
|
|
20
21
|
def update_profile(status)
|
21
22
|
response = connection.post do |req|
|
@@ -32,7 +33,7 @@ module ZoomSlack
|
|
32
33
|
|
33
34
|
def human_readable_error(response)
|
34
35
|
json = JSON.parse(response.body)
|
35
|
-
|
36
|
+
stderr.print "Unable to update Slack profile. Did you pass in the right token?\n" unless json.fetch("ok")
|
36
37
|
end
|
37
38
|
|
38
39
|
def connection
|
data/lib/zoom_slack/syncer.rb
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
|
3
3
|
module ZoomSlack
|
4
4
|
class Syncer
|
5
|
-
def initialize(
|
6
|
-
profile_updater: ProfileUpdater.new(token: token),
|
5
|
+
def initialize(config,
|
6
|
+
profile_updater: ProfileUpdater.new(token: config.token),
|
7
7
|
process_detector: ProcessDetector.for_platform)
|
8
|
+
self.config = config
|
8
9
|
self.profile_updater = profile_updater
|
9
10
|
self.process_detector = process_detector
|
10
11
|
end
|
@@ -19,14 +20,14 @@ module ZoomSlack
|
|
19
20
|
|
20
21
|
private
|
21
22
|
|
22
|
-
attr_accessor :profile_updater, :process_detector
|
23
|
+
attr_accessor :config, :profile_updater, :process_detector
|
23
24
|
|
24
25
|
def in_meeting_status
|
25
|
-
Status.new(text:
|
26
|
+
Status.new(text: config.meeting_text, emoji: config.meeting_emoji, expires: config.meeting_expires_at)
|
26
27
|
end
|
27
28
|
|
28
29
|
def clear_status
|
29
|
-
Status.new
|
30
|
+
Status.new(text: config.clear_text, emoji: config.clear_emoji)
|
30
31
|
end
|
31
32
|
end
|
32
33
|
end
|
data/lib/zoom_slack/version.rb
CHANGED
data/lib/zoom_slack.rb
CHANGED
@@ -3,7 +3,9 @@
|
|
3
3
|
module ZoomSlack
|
4
4
|
end
|
5
5
|
|
6
|
-
require "zoom_slack/
|
6
|
+
require "zoom_slack/version"
|
7
|
+
require "zoom_slack/config"
|
8
|
+
require "zoom_slack/process_detector/base"
|
7
9
|
require "zoom_slack/process_detector/mac"
|
8
10
|
require "zoom_slack/profile_updater"
|
9
11
|
require "zoom_slack/status"
|
data/zoom_slack.gemspec
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
$:.unshift File.expand_path("../lib", __FILE__)
|
4
|
+
require "zoom_slack/version"
|
5
|
+
|
3
6
|
Gem::Specification.new do |s|
|
4
7
|
s.name = "zoom_slack"
|
5
|
-
s.version =
|
8
|
+
s.version = ZoomSlack::VERSION
|
6
9
|
s.date = "2018-11-29"
|
7
10
|
s.summary = "Zoom to Slack integration"
|
8
11
|
s.description = "Automatically update your Slack status when you're in a Zoom meeting."
|
@@ -20,4 +23,9 @@ Gem::Specification.new do |s|
|
|
20
23
|
|
21
24
|
s.add_development_dependency "bundler"
|
22
25
|
s.add_development_dependency "rake"
|
26
|
+
s.add_development_dependency "rspec"
|
27
|
+
s.add_development_dependency "webmock"
|
28
|
+
s.add_development_dependency "timecop"
|
29
|
+
s.add_development_dependency "climate_control"
|
30
|
+
s.add_development_dependency "gem-release"
|
23
31
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zoom_slack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Burke Webster
|
@@ -66,6 +66,76 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: webmock
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: timecop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: climate_control
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: gem-release
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
69
139
|
description: Automatically update your Slack status when you're in a Zoom meeting.
|
70
140
|
email: burke.webster@gmail.com
|
71
141
|
executables:
|
@@ -74,7 +144,9 @@ extensions: []
|
|
74
144
|
extra_rdoc_files: []
|
75
145
|
files:
|
76
146
|
- ".gitignore"
|
147
|
+
- ".rspec"
|
77
148
|
- ".ruby-version"
|
149
|
+
- ".travis.yml"
|
78
150
|
- CHANGELOG.md
|
79
151
|
- Gemfile
|
80
152
|
- LICENSE
|
@@ -82,7 +154,8 @@ files:
|
|
82
154
|
- Rakefile
|
83
155
|
- bin/zoom_slack
|
84
156
|
- lib/zoom_slack.rb
|
85
|
-
- lib/zoom_slack/
|
157
|
+
- lib/zoom_slack/config.rb
|
158
|
+
- lib/zoom_slack/process_detector/base.rb
|
86
159
|
- lib/zoom_slack/process_detector/mac.rb
|
87
160
|
- lib/zoom_slack/process_detector/source/in_zoom_meeting.applescript
|
88
161
|
- lib/zoom_slack/profile_updater.rb
|