From 0ff76b2abc7349eee1e155a0096f10d49178131d Mon Sep 17 00:00:00 2001 From: Kristy Hisaw Date: Tue, 10 Sep 2019 12:32:28 -0700 Subject: [PATCH 01/20] successfully pulled conversation list --- lib/slack.rb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index 960cf2f7..c878235c 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,10 +1,23 @@ #!/usr/bin/env ruby +require 'dotenv' +require 'httparty' +require 'awesome_print' + +Dotenv.load + +URL = "https://slack.com/api/conversations.list" +KEY = ENV['SLACK_API_TOKEN'] def main + + query_param = { + token: KEY + } puts "Welcome to the Ada Slack CLI!" - + # TODO project - + response = HTTParty.get(URL, query: query_param) + puts response puts "Thank you for using the Ada Slack CLI" end From aed7d806493a859806caacb9c29cf3018cecffc2 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Tue, 10 Sep 2019 13:45:01 -0700 Subject: [PATCH 02/20] Created class files --- lib/channel.rb | 1 + lib/recipient.rb | 0 lib/user.rb | 1 + lib/workspace.rb | 2 ++ test/test_helper.rb | 13 +++++++++++++ 5 files changed, 17 insertions(+) create mode 100644 lib/channel.rb create mode 100644 lib/recipient.rb create mode 100644 lib/user.rb create mode 100644 lib/workspace.rb diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..52fc2b10 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1 @@ +require_relative 'recipient' \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..e69de29b diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..52fc2b10 --- /dev/null +++ b/lib/user.rb @@ -0,0 +1 @@ +require_relative 'recipient' \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..52cf1e5d --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,2 @@ +require_relative 'user' +require_relative 'channel' \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 90aeb408..b2782159 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,9 +9,22 @@ require 'minitest/skip_dsl' require 'vcr' +require_relative '../lib/recipient' +require_relative '../lib/user' +require_relative '../lib/channel' +require_relative '../lib/workspace' + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| config.cassette_library_dir = "test/cassettes" config.hook_into :webmock + config.default_cassette_options = { + :record => :new_episodes, # record new data when we don't have it yet + :match_requests_on => [:method, :uri, :body], # The http method, URI and body of a request all need to match + } + # Don't leave our token lying around in a cassette file. + config.filter_sensitive_data("") do + ENV["SLACK_API_TOKEN"] + end end From bb6ee2ecd0d5fe8cb6854294cdbee423c25fe629 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Tue, 10 Sep 2019 14:10:03 -0700 Subject: [PATCH 03/20] Added shell methods and instance variables --- lib/channel.rb | 23 ++++++++++++++++++++++- lib/recipient.rb | 29 +++++++++++++++++++++++++++++ lib/slackapierror.rb | 5 +++++ lib/user.rb | 25 ++++++++++++++++++++++++- lib/workspace.rb | 30 +++++++++++++++++++++++++++++- 5 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 lib/slackapierror.rb diff --git a/lib/channel.rb b/lib/channel.rb index 52fc2b10..a4ea87fb 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -1 +1,22 @@ -require_relative 'recipient' \ No newline at end of file +require_relative 'recipient' + +class Channel < Recipient + attr_reader :topic, :member_count + + def initialize(slack_id, name) + super (slack_id, name) + @topic = nil + @member_count = nil + end + + + private + def details + + end + + def self.list + + end + +end \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb index e69de29b..51c834f7 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -0,0 +1,29 @@ +require 'httparty' + +class Recipient + + attr_reader :slack_id, :name + + def initialize(slack_id, name) + @slack_id = slack_id + @name = name + end + + def send_message(message) + + end + + def self.get(url, params) + response = HTTParty.get(url, query: params) + end + + private + def details + + end + + def self.list + + end + +end \ No newline at end of file diff --git a/lib/slackapierror.rb b/lib/slackapierror.rb new file mode 100644 index 00000000..8b76d389 --- /dev/null +++ b/lib/slackapierror.rb @@ -0,0 +1,5 @@ +class SlackApiError < Exception + + + +end \ No newline at end of file diff --git a/lib/user.rb b/lib/user.rb index 52fc2b10..af91d581 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -1 +1,24 @@ -require_relative 'recipient' \ No newline at end of file +require_relative 'recipient' + +class User < Recipient + attr_reader :real_name, :status_text, :status_emoji + + def initialize(slack_id, name) + + super (slack_id, name) + @real_name = nil + @status_text = nil + @status_emoji = nil + end + + + private + def details + + end + + def self.list + + end + +end \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb index 52cf1e5d..00810399 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -1,2 +1,30 @@ require_relative 'user' -require_relative 'channel' \ No newline at end of file +require_relative 'channel' + +class Workspace + + attr_reader :users, :channels, :selected + + def initialize + @users = Users.get(url, params) # to-do + @channels = Channels.get(url, params) # to-do + @selected = nil + + end + + def select_channel + + end + + def select_user + + end + + def show_details + + end + + def send_message + + end +end \ No newline at end of file From a5e85a45bb40cf33fa71ab8a880b51919620691e Mon Sep 17 00:00:00 2001 From: Kristy Hisaw Date: Tue, 10 Sep 2019 15:22:59 -0700 Subject: [PATCH 04/20] added users.get method, did not test --- lib/recipient.rb | 1 + lib/slack.rb | 9 +++++---- lib/user.rb | 33 +++++++++++++++++++++++++++++---- lib/workspace.rb | 4 ++-- test/user_test.rb | 10 ++++++++++ 5 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 test/user_test.rb diff --git a/lib/recipient.rb b/lib/recipient.rb index 51c834f7..39887987 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -14,6 +14,7 @@ def send_message(message) end def self.get(url, params) + response = HTTParty.get(url, query: params) end diff --git a/lib/slack.rb b/lib/slack.rb index c878235c..a03cc62a 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -2,11 +2,11 @@ require 'dotenv' require 'httparty' require 'awesome_print' +require_relative 'workspace' Dotenv.load -URL = "https://slack.com/api/conversations.list" -KEY = ENV['SLACK_API_TOKEN'] + def main @@ -15,10 +15,11 @@ def main } puts "Welcome to the Ada Slack CLI!" - # TODO project + response = HTTParty.get(URL, query: query_param) - puts response + puts "Thank you for using the Ada Slack CLI" + return response end main if __FILE__ == $PROGRAM_NAME \ No newline at end of file diff --git a/lib/user.rb b/lib/user.rb index af91d581..10109e44 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -3,14 +3,39 @@ class User < Recipient attr_reader :real_name, :status_text, :status_emoji - def initialize(slack_id, name) + def initialize(slack_id, name, real_name, status_text, status_emoji) super (slack_id, name) - @real_name = nil - @status_text = nil - @status_emoji = nil + @real_name = real_name + @status_text = status_text + @status_emoji = status_emoji + + end + def self.get + URL = "https://slack.com/api/users.list" + KEY = ENV['SLACK_API_TOKEN'] + query_param = { + key = KEY + } + response = HTTParty.get(URL, query: query_param ) + + users = [] + response["members"].each do |member| + + name = member["name"] + slack_id = member["id"], + real_name = member["real_name"], + status_text = member["status_text"], + status_emoji = member["status_emoji"] + + users << self.new(slack_id, name, real_name, status_text, status_emoji) + + end + return users + + end private def details diff --git a/lib/workspace.rb b/lib/workspace.rb index 00810399..2e2b8fa2 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -6,8 +6,8 @@ class Workspace attr_reader :users, :channels, :selected def initialize - @users = Users.get(url, params) # to-do - @channels = Channels.get(url, params) # to-do + @users = Users.get # to-do + @channels = Channels.get # to-do @selected = nil end diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..415951de --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,10 @@ +require 'test_helper' + +describe "User" do + describe "" + + + + + +end \ No newline at end of file From 4ed4a118ffa2b173051c24c3ea8e9810a61396f1 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Tue, 10 Sep 2019 16:00:19 -0700 Subject: [PATCH 05/20] Added test for user self.get method and passed --- lib/channel.rb | 2 +- lib/recipient.rb | 3 + lib/user.rb | 15 ++-- test/cassettes/load_users.yml | 140 ++++++++++++++++++++++++++++++++++ test/user_test.rb | 37 ++++++++- 5 files changed, 185 insertions(+), 12 deletions(-) create mode 100644 test/cassettes/load_users.yml diff --git a/lib/channel.rb b/lib/channel.rb index a4ea87fb..46e7a0e3 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -4,7 +4,7 @@ class Channel < Recipient attr_reader :topic, :member_count def initialize(slack_id, name) - super (slack_id, name) + super(slack_id, name) @topic = nil @member_count = nil end diff --git a/lib/recipient.rb b/lib/recipient.rb index 39887987..73849e29 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -1,4 +1,7 @@ require 'httparty' +require 'dotenv' + +Dotenv.load class Recipient diff --git a/lib/user.rb b/lib/user.rb index 10109e44..1a35ec7a 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -1,11 +1,14 @@ +require 'httparty' require_relative 'recipient' class User < Recipient attr_reader :real_name, :status_text, :status_emoji + URL = "https://slack.com/api/users.list" + KEY = ENV['SLACK_API_TOKEN'] def initialize(slack_id, name, real_name, status_text, status_emoji) - super (slack_id, name) + super(slack_id, name) @real_name = real_name @status_text = status_text @status_emoji = status_emoji @@ -14,10 +17,8 @@ def initialize(slack_id, name, real_name, status_text, status_emoji) end def self.get - URL = "https://slack.com/api/users.list" - KEY = ENV['SLACK_API_TOKEN'] query_param = { - key = KEY + token: KEY } response = HTTParty.get(URL, query: query_param ) @@ -25,9 +26,9 @@ def self.get response["members"].each do |member| name = member["name"] - slack_id = member["id"], - real_name = member["real_name"], - status_text = member["status_text"], + slack_id = member["id"] + real_name = member["real_name"] + status_text = member["status_text"] status_emoji = member["status_emoji"] users << self.new(slack_id, name, real_name, status_text, status_emoji) diff --git a/test/cassettes/load_users.yml b/test/cassettes/load_users.yml new file mode 100644 index 00000000..beb7f167 --- /dev/null +++ b/test/cassettes/load_users.yml @@ -0,0 +1,140 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '53' + Connection: + - keep-alive + Date: + - Tue, 10 Sep 2019 22:40:44 GMT + Server: + - Apache + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + X-Slack-Req-Id: + - 8b9026a5-5537-4d55-a247-b8e1f07feeea + X-Xss-Protection: + - '0' + X-Content-Type-Options: + - nosniff + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-6ukn + X-Cache: + - Miss from cloudfront + Via: + - 1.1 b48dedcc55e63f14261aa92cf2d61522.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - bKf5EzeLCeOmGMbJv56x-7XdCR7vcq_RNy7HVT5NmTUNt2qWD_TNLg== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"not_authed"}' + http_version: + recorded_at: Tue, 10 Sep 2019 22:40:44 GMT +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '890' + Connection: + - keep-alive + Date: + - Tue, 10 Sep 2019 22:48:26 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 3e418da3-3b30-49bc-b6c6-7f71dae70318 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-1zz5 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 e9f9d4725d6328edca783d6dff756da8.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - PQ03_ZElu0k8IL5h8lRexqmCYNK-1M5Nw4da8K0zK35xnxegJYLnkA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMZSSV3BK","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UMUR2C1QB","team_id":"TMZSSV3BK","name":"kemp.bri","deleted":false,"color":"4bbe2e","real_name":"Brianna","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Brianna","real_name_normalized":"Brianna","display_name":"Brianna","display_name_normalized":"Brianna","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g8b19f49d1fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071208,"has_2fa":false},{"id":"UN5R1N5A8","team_id":"TMZSSV3BK","name":"kristy.hisaw","deleted":false,"color":"9f69e7","real_name":"kristy.hisaw","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"kristy.hisaw","real_name_normalized":"kristy.hisaw","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g50943abd90a","image_24":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071144}],"cache_ts":1568155706,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Tue, 10 Sep 2019 22:48:26 GMT +recorded_with: VCR 5.0.0 diff --git a/test/user_test.rb b/test/user_test.rb index 415951de..c64036ab 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -1,10 +1,39 @@ -require 'test_helper' +require_relative 'test_helper' describe "User" do - describe "" - - + describe "intialize" do + it "creates a new instance of user" do + VCR.use_cassette("load_users") do + users = User.get + + expect(users[0]).must_be_kind_of User + expect(users).must_be_kind_of Array + end + end + end + describe "self.get" do + it "has correct user data" do + VCR.use_cassette("load_users") do + users = User.get + + expect(users[0].name).must_equal "slackbot" + expect(users[0].real_name).must_equal "Slackbot" + expect(users[0].status_text).must_be_nil + expect(users[0].status_emoji).must_be_nil + expect(users[0].slack_id).must_equal "USLACKBOT" + end + end + + it "has the correct number of users" do + VCR.use_cassette("load_users") do + users = User.get + + expect(users.length).must_equal 3 + + end + end + end end \ No newline at end of file From b9b39b639fe03980950b94468013e17663b37fbe Mon Sep 17 00:00:00 2001 From: Kristy Hisaw Date: Tue, 10 Sep 2019 16:14:04 -0700 Subject: [PATCH 06/20] added channels self.get skeleton --- lib/channel.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/channel.rb b/lib/channel.rb index 46e7a0e3..976969dc 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -3,12 +3,37 @@ class Channel < Recipient attr_reader :topic, :member_count + URL = "https://slack.com/api/conversations.list" + KEY = ENV['SLACK_API_TOKEN'] + def initialize(slack_id, name) super(slack_id, name) @topic = nil @member_count = nil end + def self.get + query_param = { + token: KEY + } + response = HTTParty.get(URL, query: query_param ) + + return response + # channels = [] + # response["members"].each do |member| + + # name = member["name"] + # slack_id = member["id"] + # real_name = member["real_name"] + # status_text = member["status_text"] + # status_emoji = member["status_emoji"] + + # channels << self.new(slack_id, name, real_name, status_text, status_emoji) + + # end + # return channels + + end private def details From 720959e85e9192db8903fca9e6c699abe8d67c15 Mon Sep 17 00:00:00 2001 From: Kristy Hisaw Date: Tue, 10 Sep 2019 16:36:42 -0700 Subject: [PATCH 07/20] created channels self.get method and passed tests --- lib/channel.rb | 34 +++++++------- test/cassettes/load_channels.yml | 80 ++++++++++++++++++++++++++++++++ test/cassettes/load_users.yml | 77 ++++++++++++++++++++++++++++++ test/channel_test.rb | 38 +++++++++++++++ 4 files changed, 212 insertions(+), 17 deletions(-) create mode 100644 test/cassettes/load_channels.yml create mode 100644 test/channel_test.rb diff --git a/lib/channel.rb b/lib/channel.rb index 976969dc..eb427ec9 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -1,3 +1,4 @@ +require 'httparty' require_relative 'recipient' class Channel < Recipient @@ -6,32 +7,31 @@ class Channel < Recipient URL = "https://slack.com/api/conversations.list" KEY = ENV['SLACK_API_TOKEN'] - def initialize(slack_id, name) + def initialize(slack_id, name, topic, member_count) super(slack_id, name) - @topic = nil - @member_count = nil + @topic = topic + @member_count = member_count end def self.get query_param = { token: KEY } - response = HTTParty.get(URL, query: query_param ) + response = HTTParty.get(URL, query: query_param) - return response - # channels = [] - # response["members"].each do |member| + channels = [] + response["channels"].each do |channel| + + name = channel["name"] + slack_id = channel["id"] + topic = channel["topic"]["value"] + member_count = channel["num_members"] + + channels << self.new(slack_id, name, topic, member_count) + + end - # name = member["name"] - # slack_id = member["id"] - # real_name = member["real_name"] - # status_text = member["status_text"] - # status_emoji = member["status_emoji"] - - # channels << self.new(slack_id, name, real_name, status_text, status_emoji) - - # end - # return channels + return channels end diff --git a/test/cassettes/load_channels.yml b/test/cassettes/load_channels.yml new file mode 100644 index 00000000..fa7e315f --- /dev/null +++ b/test/cassettes/load_channels.yml @@ -0,0 +1,80 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '608' + Connection: + - keep-alive + Date: + - Tue, 10 Sep 2019 23:22:45 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - f23f1705-15a9-464d-ab7d-0975f9564cd5 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-u2yx + X-Cache: + - Miss from cloudfront + Via: + - 1.1 0cf6c59c77f0fff670ae085179adc459.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - VR2k3htlgktE1qRl4uv4MCH_ziMWLE93vNWjNS-lSnI4iWFCALFrgA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTFYSFTL","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN69H4HK7","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Tue, 10 Sep 2019 23:22:45 GMT +recorded_with: VCR 5.0.0 diff --git a/test/cassettes/load_users.yml b/test/cassettes/load_users.yml index beb7f167..2c01b429 100644 --- a/test/cassettes/load_users.yml +++ b/test/cassettes/load_users.yml @@ -137,4 +137,81 @@ http_interactions: Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"kristy.hisaw","real_name_normalized":"kristy.hisaw","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g50943abd90a","image_24":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071144}],"cache_ts":1568155706,"response_metadata":{"next_cursor":""}}' http_version: recorded_at: Tue, 10 Sep 2019 22:48:26 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '608' + Connection: + - keep-alive + Date: + - Tue, 10 Sep 2019 23:18:35 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 93d66039-dcad-4e9e-97d4-afbcf1f31c04 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-vfyi + X-Cache: + - Miss from cloudfront + Via: + - 1.1 d16c3f15bd14953a9d4109eaaa991de2.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - Gb1NgoUxWrYjh3vRvjlRG6yd0KkvAGE8tH25UmkrIYKltWdD0JiWAQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTFYSFTL","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN69H4HK7","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Tue, 10 Sep 2019 23:18:35 GMT recorded_with: VCR 5.0.0 diff --git a/test/channel_test.rb b/test/channel_test.rb new file mode 100644 index 00000000..3b90f8e9 --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,38 @@ +require_relative 'test_helper' + +describe "Channel" do + describe "intialize" do + it "creates a new instance of channel" do + VCR.use_cassette("load_channels") do + channels = Channel.get + + expect(channels[0]).must_be_kind_of Channel + expect(channels).must_be_kind_of Array + end + end + end + + describe "self.get" do + it "has correct channel data" do + VCR.use_cassette("load_channels") do + channels = Channel.get + + expect(channels[0].name).must_equal "general" + expect(channels[0].topic).must_equal "Company-wide announcements and work-based matters" + expect(channels[0].member_count).must_equal 2 + expect(channels[0].slack_id).must_equal "CMTFYSFTL" + end + end + + it "has the correct number of channels" do + VCR.use_cassette("load_channels") do + channels = Channel.get + + expect(channels.length).must_equal 3 + + end + end + end + + +end \ No newline at end of file From c0b590c61843d25ae452268e2abc2b4381fb559a Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 11 Sep 2019 14:02:45 -0700 Subject: [PATCH 08/20] Users self.list method implemented --- lib/channel.rb | 3 +-- lib/recipient.rb | 5 ++--- lib/slack.rb | 23 ++++++++++++++++++----- lib/user.rb | 12 +++++++++--- lib/workspace.rb | 4 ++-- 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/lib/channel.rb b/lib/channel.rb index eb427ec9..d759643e 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -35,13 +35,12 @@ def self.get end - private def details end def self.list - + return @name end end \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb index 73849e29..785a6c16 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -16,18 +16,17 @@ def send_message(message) end - def self.get(url, params) + def self.get(url, params: {token: KEY}) response = HTTParty.get(url, query: params) end - private def details end def self.list - + return @name end end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index a03cc62a..2398369a 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -10,16 +10,29 @@ def main - query_param = { - token: KEY - } puts "Welcome to the Ada Slack CLI!" + workspace = Workspace.new + puts "There are #{workspace.channels.length} channels" + puts "There are #{workspace.users.length} users" + + puts "What would you like to do? These are your option: _____" + input = gets.chomp + until input == "quit" do + + if input == "list channels" + workspace.channels.each do |channel| + puts channel.name + end + elsif input == "list users" + puts User.list + end + + input = gets.chomp + end - response = HTTParty.get(URL, query: query_param) puts "Thank you for using the Ada Slack CLI" - return response end main if __FILE__ == $PROGRAM_NAME \ No newline at end of file diff --git a/lib/user.rb b/lib/user.rb index 1a35ec7a..6c346dbc 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -1,5 +1,7 @@ require 'httparty' -require_relative 'recipient' +require_relative 'channel' +require_relative 'user' +require_relative 'workspace' class User < Recipient attr_reader :real_name, :status_text, :status_emoji @@ -38,13 +40,17 @@ def self.get end - private def details end def self.list - + users = self.get + user_info = "" + users.each_with_index do |user, index| + user_info += "User #{index + 1}'s name is #{user.name}, real name is #{user.real_name}, and slack id is #{user.slack_id}.\n" + end + return user_info end end \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb index 2e2b8fa2..d65912d6 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -6,8 +6,8 @@ class Workspace attr_reader :users, :channels, :selected def initialize - @users = Users.get # to-do - @channels = Channels.get # to-do + @users = User.get + @channels = Channel.get @selected = nil end From aa1386b9989a58f1bbb7dc2d76176c38b87bb373 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 11 Sep 2019 14:06:06 -0700 Subject: [PATCH 09/20] Initial set up for User self.list method set up --- test/user_test.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/user_test.rb b/test/user_test.rb index c64036ab..930cb9e9 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -35,5 +35,15 @@ end end + describe "self.list" do + it "prints correct info for user" do + VCR.use_cassette("load_users") do + users = User.list + + expect(users).must_equal "User 1's name is slackbot, real name is Slackbot, and slack id is USLACKBOT.\nUser 2's name is kemp.bri, real name is Brianna, and slack id is UMUR2C1QB.\nUser 3's name is kristy.hisaw, real name is kristy.hisaw, and slack id is UN5R1N5A8." + end + end + + end end \ No newline at end of file From c5a3369f5686206ed8765798a212afc1d831a508 Mon Sep 17 00:00:00 2001 From: Kristy Hisaw Date: Wed, 11 Sep 2019 14:45:18 -0700 Subject: [PATCH 10/20] fixed users self.get and channel self.get to table print and passed tests --- lib/channel.rb | 2 +- lib/slack.rb | 7 +++---- lib/user.rb | 11 ++--------- test/channel_test.rb | 12 ++++++++++++ test/user_test.rb | 5 ++++- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/channel.rb b/lib/channel.rb index d759643e..b0910192 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -40,7 +40,7 @@ def details end def self.list - return @name + tp self.get, :name, :slack_id, :topic, :member_count end end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 2398369a..60ec3ba7 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -3,6 +3,7 @@ require 'httparty' require 'awesome_print' require_relative 'workspace' +require 'table_print' Dotenv.load @@ -21,11 +22,9 @@ def main until input == "quit" do if input == "list channels" - workspace.channels.each do |channel| - puts channel.name - end + tp Channel.list elsif input == "list users" - puts User.list + tp User.list end input = gets.chomp diff --git a/lib/user.rb b/lib/user.rb index 6c346dbc..020f4fdb 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -1,7 +1,5 @@ require 'httparty' -require_relative 'channel' -require_relative 'user' -require_relative 'workspace' +require_relative 'recipient' class User < Recipient attr_reader :real_name, :status_text, :status_emoji @@ -45,12 +43,7 @@ def details end def self.list - users = self.get - user_info = "" - users.each_with_index do |user, index| - user_info += "User #{index + 1}'s name is #{user.name}, real name is #{user.real_name}, and slack id is #{user.slack_id}.\n" - end - return user_info + tp self.get, :name, :real_name, :slack_id end end \ No newline at end of file diff --git a/test/channel_test.rb b/test/channel_test.rb index 3b90f8e9..c661f7e7 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -34,5 +34,17 @@ end end + describe "self.list" do + it "prints correct info for channels in a table" do + VCR.use_cassette("load_users") do + channels = Channel.list + + expect(channels).must_be_kind_of TablePrint::Returnable + + end + end + + end + end \ No newline at end of file diff --git a/test/user_test.rb b/test/user_test.rb index 930cb9e9..9884199c 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -1,4 +1,6 @@ require_relative 'test_helper' +require 'pry' +require 'table_print' describe "User" do describe "intialize" do @@ -40,7 +42,8 @@ VCR.use_cassette("load_users") do users = User.list - expect(users).must_equal "User 1's name is slackbot, real name is Slackbot, and slack id is USLACKBOT.\nUser 2's name is kemp.bri, real name is Brianna, and slack id is UMUR2C1QB.\nUser 3's name is kristy.hisaw, real name is kristy.hisaw, and slack id is UN5R1N5A8." + expect(users).must_be_kind_of TablePrint::Returnable + end end From fa001f151aa45f7ea5e5cdbf7ce7bfa8fbe13249 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 11 Sep 2019 15:11:18 -0700 Subject: [PATCH 11/20] Selected user and chennel methods implemented, test implemented and passed --- lib/workspace.rb | 22 +++- test/cassettes/create_workspace.yml | 154 ++++++++++++++++++++++++++++ test/workspace_test.rb | 82 +++++++++++++++ 3 files changed, 254 insertions(+), 4 deletions(-) create mode 100644 test/cassettes/create_workspace.yml create mode 100644 test/workspace_test.rb diff --git a/lib/workspace.rb b/lib/workspace.rb index d65912d6..187f5908 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -12,12 +12,26 @@ def initialize end - def select_channel - + def select_channel(name_or_id) + channel = channels.find {|channel| channel.slack_id == name_or_id} + if channel == nil + channel = channels.find {|channel| channel.name == name_or_id} + end + if channel == nil + raise ArgumentError.new("Channel does not exist") + end + @selected = channel end - def select_user - + def select_user(name_or_id) + user = users.find {|user| user.slack_id == name_or_id} + if user == nil + user = users.find {|user| user.name == name_or_id} + end + if user == nil + raise ArgumentError.new("User does not exist") + end + @selected = user end def show_details diff --git a/test/cassettes/create_workspace.yml b/test/cassettes/create_workspace.yml new file mode 100644 index 00000000..e45746c8 --- /dev/null +++ b/test/cassettes/create_workspace.yml @@ -0,0 +1,154 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '889' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 22:02:11 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 9b6d2cb2-b8b3-4fa9-a2ae-7fedd00c5633 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-ta4v + X-Cache: + - Miss from cloudfront + Via: + - 1.1 fa751ee53e2bf18781ae98b293ff9375.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - MvwXC9hEyRcyimLuhjOkdevvrzDsxQjViwpV62fZlDBFpY7NVGCwRg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMZSSV3BK","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UMUR2C1QB","team_id":"TMZSSV3BK","name":"kemp.bri","deleted":false,"color":"4bbe2e","real_name":"Brianna","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Brianna","real_name_normalized":"Brianna","display_name":"Brianna","display_name_normalized":"Brianna","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g8b19f49d1fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071208,"has_2fa":false},{"id":"UN5R1N5A8","team_id":"TMZSSV3BK","name":"kristy.hisaw","deleted":false,"color":"9f69e7","real_name":"kristy.hisaw","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"kristy.hisaw","real_name_normalized":"kristy.hisaw","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g50943abd90a","image_24":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071144}],"cache_ts":1568239331,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 22:02:11 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '608' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 22:02:11 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - f77808be-dd77-470d-8c26-c4f2e12f244b + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-abbx + X-Cache: + - Miss from cloudfront + Via: + - 1.1 3403c96e1b1db500ff6526f1a7bc6813.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - V4OgtqWJEL7rZ-KQllIJfuu_B-1BaojmLzFd0htV8YqKKLwIuT5GSw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTFYSFTL","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN69H4HK7","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 22:02:11 GMT +recorded_with: VCR 5.0.0 diff --git a/test/workspace_test.rb b/test/workspace_test.rb new file mode 100644 index 00000000..e8904c17 --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,82 @@ +require_relative 'test_helper' +require 'pry' + +describe "Workspace" do + describe "intialize" do + it "creates a new instance of workspace" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + + expect(workspace).must_be_kind_of Workspace + end + end + + it "contains an array of all users" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + + expect(workspace.users).must_be_kind_of Array + expect(workspace.users.length).must_equal 3 + expect(workspace.users[0]).must_be_kind_of User + end + end + + it "contains an array of all channels" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + + expect(workspace.channels).must_be_kind_of Array + expect(workspace.channels.length).must_equal 3 + expect(workspace.channels[0]).must_be_kind_of Channel + end + end + end + + describe "select users" do + it "selects the correct user" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_user("kemp.bri") + + expect(workspace.selected).must_be_kind_of User + expect(workspace.selected.name).must_equal "kemp.bri" + expect(workspace.selected.slack_id).must_equal "UMUR2C1QB" + end + end + + it "selects the correct user" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_user("UMUR2C1QB") + + expect(workspace.selected).must_be_kind_of User + expect(workspace.selected.name).must_equal "kemp.bri" + expect(workspace.selected.slack_id).must_equal "UMUR2C1QB" + end + end + end + + describe "select channel" do + it "selects the correct channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_channel("general") + + expect(workspace.selected).must_be_kind_of Channel + expect(workspace.selected.name).must_equal "general" + expect(workspace.selected.slack_id).must_equal "CMTFYSFTL" + end + end + + it "selects the correct channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_channel("CMTFYSFTL") + + expect(workspace.selected).must_be_kind_of Channel + expect(workspace.selected.name).must_equal "general" + expect(workspace.selected.slack_id).must_equal "CMTFYSFTL" + end + end + end +end From f42179222d70337bb164cc6fe2686d5ec53cf587 Mon Sep 17 00:00:00 2001 From: Kristy Hisaw Date: Thu, 12 Sep 2019 14:28:49 -0700 Subject: [PATCH 12/20] moved API call to recipient class and passed tests --- lib/channel.rb | 15 ++- lib/recipient.rb | 17 +++- lib/slack.rb | 6 +- lib/user.rb | 14 ++- lib/workspace.rb | 2 +- test/cassettes/create_workspace.yml | 151 ++++++++++++++++++++++++++++ test/cassettes/load_channels.yml | 74 ++++++++++++++ test/channel_test.rb | 14 ++- test/user_test.rb | 14 +++ 9 files changed, 282 insertions(+), 25 deletions(-) diff --git a/lib/channel.rb b/lib/channel.rb index b0910192..ceba810d 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -1,12 +1,10 @@ require 'httparty' require_relative 'recipient' +require 'table_print' class Channel < Recipient attr_reader :topic, :member_count - URL = "https://slack.com/api/conversations.list" - KEY = ENV['SLACK_API_TOKEN'] - def initialize(slack_id, name, topic, member_count) super(slack_id, name) @topic = topic @@ -14,11 +12,7 @@ def initialize(slack_id, name, topic, member_count) end def self.get - query_param = { - token: KEY - } - response = HTTParty.get(URL, query: query_param) - + response = super.find { |response| response["channels"] } channels = [] response["channels"].each do |channel| @@ -36,7 +30,10 @@ def self.get end def details - + return "Channel name: #{name} + Slack_ID: #{slack_id} + Topic: #{topic} + Member Count: #{member_count}" end def self.list diff --git a/lib/recipient.rb b/lib/recipient.rb index 785a6c16..766a3880 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -7,6 +7,10 @@ class Recipient attr_reader :slack_id, :name + BASE_URL = "https://slack.com/api/" + KEY = ENV['SLACK_API_TOKEN'] + + def initialize(slack_id, name) @slack_id = slack_id @name = name @@ -16,9 +20,14 @@ def send_message(message) end - def self.get(url, params: {token: KEY}) - - response = HTTParty.get(url, query: params) + def self.get + query_param = { + token: KEY + } + users = HTTParty.get(BASE_URL + "users.list", query: query_param) + channels = HTTParty.get(BASE_URL + "conversations.list", query: query_param) + response = [users, channels] + return response end def details @@ -26,7 +35,7 @@ def details end def self.list - return @name + end end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 60ec3ba7..0e3a43f8 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -22,9 +22,11 @@ def main until input == "quit" do if input == "list channels" - tp Channel.list + Channel.list elsif input == "list users" - tp User.list + User.list + elsif input == "select user" + end input = gets.chomp diff --git a/lib/user.rb b/lib/user.rb index 020f4fdb..dd92a6ff 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -3,8 +3,6 @@ class User < Recipient attr_reader :real_name, :status_text, :status_emoji - URL = "https://slack.com/api/users.list" - KEY = ENV['SLACK_API_TOKEN'] def initialize(slack_id, name, real_name, status_text, status_emoji) @@ -17,11 +15,7 @@ def initialize(slack_id, name, real_name, status_text, status_emoji) end def self.get - query_param = { - token: KEY - } - response = HTTParty.get(URL, query: query_param ) - + response = super.find { |response| response["members"] } users = [] response["members"].each do |member| @@ -39,7 +33,11 @@ def self.get end def details - + return "User name: #{name} + Slack_ID: #{slack_id} + Real Name: #{real_name} + Status Text: #{status_text} + Status Emoji: #{status_emoji}" end def self.list diff --git a/lib/workspace.rb b/lib/workspace.rb index 187f5908..7e0c10cb 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -35,7 +35,7 @@ def select_user(name_or_id) end def show_details - + @selected.details end def send_message diff --git a/test/cassettes/create_workspace.yml b/test/cassettes/create_workspace.yml index e45746c8..10ed7bdb 100644 --- a/test/cassettes/create_workspace.yml +++ b/test/cassettes/create_workspace.yml @@ -151,4 +151,155 @@ http_interactions: you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' http_version: recorded_at: Wed, 11 Sep 2019 22:02:11 GMT +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '888' + Connection: + - keep-alive + Date: + - Thu, 12 Sep 2019 21:07:29 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - ea3d6ccf-7202-4573-9368-1a526d863412 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-dqjh + X-Cache: + - Miss from cloudfront + Via: + - 1.1 bbc0c6d660c6b9bfbf22053687e12fba.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - l8pT1QRMCTmZSpmRMTc11Nf2zVP8kPKAgA53nk-7IO2YUXJmC1hECg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMZSSV3BK","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UMUR2C1QB","team_id":"TMZSSV3BK","name":"kemp.bri","deleted":false,"color":"4bbe2e","real_name":"Brianna","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Brianna","real_name_normalized":"Brianna","display_name":"Brianna","display_name_normalized":"Brianna","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g8b19f49d1fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071208,"has_2fa":false},{"id":"UN5R1N5A8","team_id":"TMZSSV3BK","name":"kristy.hisaw","deleted":false,"color":"9f69e7","real_name":"kristy.hisaw","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"kristy.hisaw","real_name_normalized":"kristy.hisaw","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g50943abd90a","image_24":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071144,"has_2fa":false}],"cache_ts":1568322449,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Thu, 12 Sep 2019 21:07:28 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '608' + Connection: + - keep-alive + Date: + - Thu, 12 Sep 2019 21:07:29 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - abfc74fc-867a-417d-af47-c783e8a38106 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-wycu + X-Cache: + - Miss from cloudfront + Via: + - 1.1 fa751ee53e2bf18781ae98b293ff9375.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - 6leL7b0KgmFTinpQd14sqdver6uqaHZYwJ9eA2UIoYqxNc_15gAQwQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTFYSFTL","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN69H4HK7","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Thu, 12 Sep 2019 21:07:28 GMT recorded_with: VCR 5.0.0 diff --git a/test/cassettes/load_channels.yml b/test/cassettes/load_channels.yml index fa7e315f..df575aa7 100644 --- a/test/cassettes/load_channels.yml +++ b/test/cassettes/load_channels.yml @@ -77,4 +77,78 @@ http_interactions: you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' http_version: recorded_at: Tue, 10 Sep 2019 23:22:45 GMT +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '888' + Connection: + - keep-alive + Date: + - Thu, 12 Sep 2019 21:07:40 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - fdb20891-52f3-4460-9443-5f21f35146b5 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-te4j + X-Cache: + - Miss from cloudfront + Via: + - 1.1 4c4ed81695980f3c6829b9fd229bd0f8.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - C4Aa3UM_ClhdA0WSNirLjelzaqnjzEGfoV3jQugumP_6lmDxKkLaxw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMZSSV3BK","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UMUR2C1QB","team_id":"TMZSSV3BK","name":"kemp.bri","deleted":false,"color":"4bbe2e","real_name":"Brianna","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Brianna","real_name_normalized":"Brianna","display_name":"Brianna","display_name_normalized":"Brianna","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g8b19f49d1fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071208,"has_2fa":false},{"id":"UN5R1N5A8","team_id":"TMZSSV3BK","name":"kristy.hisaw","deleted":false,"color":"9f69e7","real_name":"kristy.hisaw","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"kristy.hisaw","real_name_normalized":"kristy.hisaw","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g50943abd90a","image_24":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071144,"has_2fa":false}],"cache_ts":1568322460,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Thu, 12 Sep 2019 21:07:39 GMT recorded_with: VCR 5.0.0 diff --git a/test/channel_test.rb b/test/channel_test.rb index c661f7e7..dd6dcb60 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -43,7 +43,19 @@ end end - + end + + describe "details" do + it "prints correct details for a channel" do + VCR.use_cassette("load_users") do + channels = Channel.get + result = channels[0].details + + expect(result).must_be_kind_of String + expect(result.length).must_equal 126 + + end + end end diff --git a/test/user_test.rb b/test/user_test.rb index 9884199c..54070130 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -49,4 +49,18 @@ end + describe "details" do + it "prints correct details for user" do + VCR.use_cassette("load_users") do + users = User.get + result = users[0].details + + expect(result).must_be_kind_of String + expect(result.length).must_equal 104 + + end + end + + end + end \ No newline at end of file From 8b98e352129489543d3d71a581cc1d8b04eb558d Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Thu, 12 Sep 2019 14:58:07 -0700 Subject: [PATCH 13/20] Implemented wave 2 methods and tests, driver code still needed --- lib/slack.rb | 4 +-- lib/workspace.rb | 7 ++++-- test/workspace_test.rb | 55 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index 0e3a43f8..724afe30 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -17,7 +17,7 @@ def main puts "There are #{workspace.channels.length} channels" puts "There are #{workspace.users.length} users" - puts "What would you like to do? These are your option: _____" + puts "What would you like to do? These are your option: _____" input = gets.chomp until input == "quit" do @@ -28,7 +28,7 @@ def main elsif input == "select user" end - + puts "What would you like to do? These are your option: _____" input = gets.chomp end diff --git a/lib/workspace.rb b/lib/workspace.rb index 7e0c10cb..a5bfd9c1 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -18,7 +18,7 @@ def select_channel(name_or_id) channel = channels.find {|channel| channel.name == name_or_id} end if channel == nil - raise ArgumentError.new("Channel does not exist") + return "Channel does not exist" end @selected = channel end @@ -29,12 +29,15 @@ def select_user(name_or_id) user = users.find {|user| user.name == name_or_id} end if user == nil - raise ArgumentError.new("User does not exist") + return "User does not exist" end @selected = user end def show_details + if @selected == nil + return "Please select a user or channel." + end @selected.details end diff --git a/test/workspace_test.rb b/test/workspace_test.rb index e8904c17..3793f658 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -54,6 +54,16 @@ expect(workspace.selected.slack_id).must_equal "UMUR2C1QB" end end + + it "returns message if user is not found" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + result = workspace.select_user("aerstdhsg") + + expect(result).must_be_kind_of String + expect(result.length).must_equal 19 + end + end end describe "select channel" do @@ -78,5 +88,50 @@ expect(workspace.selected.slack_id).must_equal "CMTFYSFTL" end end + + it "returns message if channel is not found" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + result = workspace.select_channel("hgfdghf") + + expect(result).must_be_kind_of String + expect(result.length).must_equal 22 + end + end + end + + describe "show details" do + it "shows details for selected user" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_user("kemp.bri") + details = workspace.show_details + + expect(details).must_be_kind_of String + expect(details.length).must_equal 103 + end + end + + it "shows details for selected channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_channel("general") + details = workspace.show_details + + expect(details).must_be_kind_of String + expect(details.length).must_equal 126 + end + end + + it "returns message for non-selected user/channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_channel("sshtirl") + details = workspace.show_details + + expect(details).must_be_kind_of String + expect(details.length).must_equal 32 + end + end end end From 5c43690efa07776fb9649847462d70d5ab398efd Mon Sep 17 00:00:00 2001 From: Kristy Hisaw Date: Thu, 12 Sep 2019 15:34:30 -0700 Subject: [PATCH 14/20] implemented send message method, still working on it --- lib/recipient.rb | 17 ++++++++++++++++- lib/workspace.rb | 12 ++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index 766a3880..d8600e25 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -16,7 +16,22 @@ def initialize(slack_id, name) @name = name end - def send_message(message) + def send_message(message, channel) + response = HTTParty.post( + BASE_URL + "chat.postMessage", + body: { + token: KEY, + text: message, + channel: channel + }, + headers: { 'Content-Type' => 'application/x-www-form-urlencoded'} + ) + puts response['error'] + if response['ok'] == true + return true + else + return false + end end diff --git a/lib/workspace.rb b/lib/workspace.rb index 7e0c10cb..d0b1a272 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -39,6 +39,14 @@ def show_details end def send_message - + channel = @selected.slack_id + message = gets.chomp + @selected.send_message(message, channel) end -end \ No newline at end of file +end + +workspace = Workspace.new +workspace.select_channel('general') +if workspace.send_message == false + puts "error" +end From b743d43d390efcd3d24f65e2bd75c129841a8948 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Thu, 12 Sep 2019 15:50:10 -0700 Subject: [PATCH 15/20] Send message method implemented --- lib/recipient.rb | 22 ++++++++++++++++++++-- lib/workspace.rb | 10 ++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index 766a3880..b80fa637 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -16,8 +16,26 @@ def initialize(slack_id, name) @name = name end - def send_message(message) - + def send_message(message, channel) + response = HTTParty.post( + BASE_URL + "chat.postMessage", + body: { + token: KEY, + text: message, + channel: channel + as_user: true + }, + headers: { 'Content-Type' => 'application/x-www-form-urlencoded' } + ) + if response["ok"] == true + return true + puts response["ok"] + puts response["error"] + else + puts response["ok"] + puts response["error"] + return false + end end def self.get diff --git a/lib/workspace.rb b/lib/workspace.rb index a5bfd9c1..cb767efc 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -42,6 +42,12 @@ def show_details end def send_message - + channel = @selected.slack_id + message = gets.chomp + @selected.send_message(message, channel) end -end \ No newline at end of file +end + +workspace = Workspace.new +workspace.select_channel('general') +workspace.send_message \ No newline at end of file From adff0b0d46ac601eca30f0feb995315cea5202cf Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Thu, 12 Sep 2019 16:04:26 -0700 Subject: [PATCH 16/20] Updating for merge conflicts --- lib/recipient.rb | 7 ++----- lib/workspace.rb | 4 +++- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index b80fa637..d2823c7c 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -27,13 +27,10 @@ def send_message(message, channel) }, headers: { 'Content-Type' => 'application/x-www-form-urlencoded' } ) + puts response["error"] if response["ok"] == true return true - puts response["ok"] - puts response["error"] - else - puts response["ok"] - puts response["error"] + else return false end end diff --git a/lib/workspace.rb b/lib/workspace.rb index cb767efc..6d902d97 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -50,4 +50,6 @@ def send_message workspace = Workspace.new workspace.select_channel('general') -workspace.send_message \ No newline at end of file +if workspace.send_message == falase + puts "error" +end \ No newline at end of file From 898095b2607d803338bbc3ccb9b9fe5083e0239f Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Fri, 13 Sep 2019 11:14:28 -0700 Subject: [PATCH 17/20] Worked on driver code in slack.rb --- lib/recipient.rb | 1 - lib/slack.rb | 31 +++++++++++++++++-------------- lib/workspace.rb | 6 ------ 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index d2823c7c..7867d860 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -23,7 +23,6 @@ def send_message(message, channel) token: KEY, text: message, channel: channel - as_user: true }, headers: { 'Content-Type' => 'application/x-www-form-urlencoded' } ) diff --git a/lib/slack.rb b/lib/slack.rb index 724afe30..c1fc97c3 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -7,8 +7,6 @@ Dotenv.load - - def main puts "Welcome to the Ada Slack CLI!" @@ -17,22 +15,27 @@ def main puts "There are #{workspace.channels.length} channels" puts "There are #{workspace.users.length} users" - puts "What would you like to do? These are your option: _____" - input = gets.chomp - until input == "quit" do - - if input == "list channels" - Channel.list - elsif input == "list users" - User.list - elsif input == "select user" + while true + puts "What would you like to do? Your options are: List channels, List user" + case gets.chomp + when "quit" + break + when "list channels" + Channel.list + when "list users" + User.list + when "select channel" + print "What channel would you like to select: " + input = gets.chomp + puts workspace.select_channel(input) + when "select user" + print "What user would you like to select: " + input = gets.chomp + puts workspace.select_user(input) end - puts "What would you like to do? These are your option: _____" - input = gets.chomp end - puts "Thank you for using the Ada Slack CLI" end diff --git a/lib/workspace.rb b/lib/workspace.rb index 6d902d97..ffafabb9 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -46,10 +46,4 @@ def send_message message = gets.chomp @selected.send_message(message, channel) end -end - -workspace = Workspace.new -workspace.select_channel('general') -if workspace.send_message == falase - puts "error" end \ No newline at end of file From 83192752d7ae3719f1dc8123058232bf88bb6677 Mon Sep 17 00:00:00 2001 From: Kristy Hisaw Date: Fri, 13 Sep 2019 11:44:56 -0700 Subject: [PATCH 18/20] updated some driver code and changed permissions to allow authored messages --- lib/recipient.rb | 4 ++-- lib/slack.rb | 14 ++++++++++++-- lib/workspace.rb | 5 +++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index fd34dd0f..2019a332 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -23,11 +23,11 @@ def send_message(message, channel) body: { token: KEY, text: message, - channel: channel + channel: channel, + as_user: true }, headers: { 'Content-Type' => 'application/x-www-form-urlencoded' } ) - puts response["error"] if response["ok"] == true return true else diff --git a/lib/slack.rb b/lib/slack.rb index c1fc97c3..6867d16d 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -26,13 +26,23 @@ def main when "list users" User.list when "select channel" + Channel.list print "What channel would you like to select: " input = gets.chomp - puts workspace.select_channel(input) + workspace.select_channel(input) when "select user" + User.list print "What user would you like to select: " input = gets.chomp - puts workspace.select_user(input) + workspace.select_user(input) + when "show details" + workspace.show_details + when 'send message' + if workspace.send_message == false + puts "your message did not send" + else + puts "Your message was successfully sent" + end end end diff --git a/lib/workspace.rb b/lib/workspace.rb index ffafabb9..a19185b5 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -42,7 +42,12 @@ def show_details end def send_message + if @selected == nil + puts "You must select a user or channel first" + return false + end channel = @selected.slack_id + puts "Please type your message here:" message = gets.chomp @selected.send_message(message, channel) end From 2ca4595d343861313b672453a379ebe37b83a5c0 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Fri, 13 Sep 2019 12:49:34 -0700 Subject: [PATCH 19/20] Wave 3 methods implemented, driver code for all methods implmeneted and tests passing --- lib/recipient.rb | 18 ++- lib/slack.rb | 15 ++- lib/workspace.rb | 20 ++- test/cassettes/api_request.yml | 70 ++++++++++ test/cassettes/create_workspace.yml | 202 ++++++++++++++++++++++++++++ test/recipient_test.rb | 14 ++ test/workspace_test.rb | 33 ++++- 7 files changed, 356 insertions(+), 16 deletions(-) create mode 100644 test/cassettes/api_request.yml create mode 100644 test/recipient_test.rb diff --git a/lib/recipient.rb b/lib/recipient.rb index 2019a332..ae11b149 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -3,6 +3,8 @@ Dotenv.load +class SlackAPIError < StandardError; end + class Recipient attr_reader :slack_id, :name @@ -30,12 +32,11 @@ def send_message(message, channel) ) if response["ok"] == true return true - else - return false end - + return false if SlackAPIError end + def self.get query_param = { token: KEY @@ -43,15 +44,20 @@ def self.get users = HTTParty.get(BASE_URL + "users.list", query: query_param) channels = HTTParty.get(BASE_URL + "conversations.list", query: query_param) response = [users, channels] - return response + + if response[0]["ok"] == true + return response + else + raise SlackAPIError + end end def details - + raise NotImplementedError end def self.list - + raise NotImplementedError end end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 6867d16d..a21d6ea0 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -16,8 +16,17 @@ def main puts "There are #{workspace.users.length} users" while true - puts "What would you like to do? Your options are: List channels, List user" - case gets.chomp + options = ["list channels", "list users", "select channel", "select user", "show details", "send message", "quit"] + puts "\nWhat would you like to do? Your options are: \n list channels\n list users\n select channel\n select user\n show details\n send message\n quit" + + + selection = gets.chomp + until options.include?(selection.downcase) + puts "I'm sorry, please choose an option or quit" + selection = gets.chomp + end + + case selection when "quit" break @@ -36,7 +45,7 @@ def main input = gets.chomp workspace.select_user(input) when "show details" - workspace.show_details + puts workspace.show_details when 'send message' if workspace.send_message == false puts "your message did not send" diff --git a/lib/workspace.rb b/lib/workspace.rb index a19185b5..95ae43e8 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -3,7 +3,8 @@ class Workspace - attr_reader :users, :channels, :selected + attr_reader :users, :channels + attr_accessor :selected def initialize @users = User.get @@ -38,17 +39,24 @@ def show_details if @selected == nil return "Please select a user or channel." end - @selected.details + return @selected.details end - def send_message + def send_message(message: nil) if @selected == nil puts "You must select a user or channel first" return false end channel = @selected.slack_id - puts "Please type your message here:" - message = gets.chomp - @selected.send_message(message, channel) + if message == nil + puts "Please type your message here:" + message = gets.chomp + end + @selected.send_message(message, channel) + # if result == SlackAPIError + # return false + # elsif result == true + # reutrn true + # end end end \ No newline at end of file diff --git a/test/cassettes/api_request.yml b/test/cassettes/api_request.yml new file mode 100644 index 00000000..f3944c00 --- /dev/null +++ b/test/cassettes/api_request.yml @@ -0,0 +1,70 @@ +--- +http_interactions: +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Hi&channel=dsdfsd&as_user=true + headers: + Content-Type: + - application/x-www-form-urlencoded + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:34:23 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - fa9b2eef-891b-47b7-bd44-f87c1ad34dc4 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:user,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-z42f + X-Cache: + - Miss from cloudfront + Via: + - 1.1 3cd7af07832481c336aa1c93c9b4a6fe.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - Jh9x1dfGlnAvv959aPw0HsgtQyiU3KnhqTHr7IGrOmdsFcbwQQbxSQ== + body: + encoding: UTF-8 + string: '{"ok":false,"error":"channel_not_found"}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:34:24 GMT +recorded_with: VCR 5.0.0 diff --git a/test/cassettes/create_workspace.yml b/test/cassettes/create_workspace.yml index 10ed7bdb..4ec41860 100644 --- a/test/cassettes/create_workspace.yml +++ b/test/cassettes/create_workspace.yml @@ -302,4 +302,206 @@ http_interactions: you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' http_version: recorded_at: Thu, 12 Sep 2019 21:07:28 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=%1Bgdfsdgf&channel=UMUR2C1QB&as_user=true + headers: + Content-Type: + - application/x-www-form-urlencoded + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:11:52 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 9bc57ba7-47f0-4f01-8076-65f07966ed4e + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:user,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-v0x2 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6faf668782fbb3c2aa466f6fccc76047.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - HIM5niU06g0w9Bt7QxG9GhSNd6VrX_0YvXY0JP7OUsgYr7wfact7qw== + body: + encoding: UTF-8 + string: '{"ok":true,"channel":"DN5R20QHJ","ts":"1568401912.000200","message":{"bot_id":"BN9NP8FL6","type":"message","text":"gdfsdgf","user":"UMUR2C1QB","ts":"1568401912.000200","team":"TMZSSV3BK"}}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:11:52 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Test%20message&channel=UMUR2C1QB&as_user=true + headers: + Content-Type: + - application/x-www-form-urlencoded + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:13:29 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 3e9df283-5b11-450c-bd0e-d852432eadb7 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:user,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-61a2 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 1399f6d923ba00ad00816f6a9e531b7c.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - uTZoxD993t5h_BxfutOw4--U9j66_VBCb-cXQyWAflY-SSzMyhComQ== + body: + encoding: UTF-8 + string: '{"ok":true,"channel":"DN5R20QHJ","ts":"1568402009.000300","message":{"bot_id":"BN9NP8FL6","type":"message","text":"Test + message","user":"UMUR2C1QB","ts":"1568402009.000300","team":"TMZSSV3BK"}}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:13:29 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Test%20message&channel=id&as_user=true + headers: + Content-Type: + - application/x-www-form-urlencoded + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:44:35 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 24ef583e-9010-46f7-8f52-3dbd5d41d57d + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:user,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-d7ix + X-Cache: + - Miss from cloudfront + Via: + - 1.1 be082a2326b7d49643607b097f1e7181.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - GKZF0sLd8sTL3sLuUK4vrXisRCwMIHjodAkBAfMuza0Op3WWyMvW0A== + body: + encoding: UTF-8 + string: '{"ok":false,"error":"channel_not_found"}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:44:35 GMT recorded_with: VCR 5.0.0 diff --git a/test/recipient_test.rb b/test/recipient_test.rb new file mode 100644 index 00000000..bd13b2f3 --- /dev/null +++ b/test/recipient_test.rb @@ -0,0 +1,14 @@ +require_relative 'test_helper' + +describe "Recipient" do + describe "send message" do + it "raises API error for bad request" do + VCR.use_cassette("api_request") do + recipient = Recipient.new("id", "name") + expect(recipient.send_message("Hi","dsdfsd")).must_equal false + + end + end + end + +end \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 3793f658..10d0394d 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -1,5 +1,4 @@ require_relative 'test_helper' -require 'pry' describe "Workspace" do describe "intialize" do @@ -134,4 +133,36 @@ end end end + + describe "send message" do + it "sends message to selected user/channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_user("kemp.bri") + message = workspace.send_message(message: "Test message") + + expect(message).must_equal true + end + end + + it "returns message if user/channel are not selected" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + message = workspace.send_message(message: "Test message") + + expect(message).must_equal false + end + end + + it "returns false if an API error is raises" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + recipient = Recipient.new("id", "name") + workspace.selected = recipient + message = workspace.send_message(message: "Test message") + + expect(message).must_equal false + end + end + end end From 95407edc5055e0f06cb8c3f1f57b83cfb0259930 Mon Sep 17 00:00:00 2001 From: Kristy Hisaw Date: Fri, 13 Sep 2019 14:27:29 -0700 Subject: [PATCH 20/20] added more messages to slack cli --- lib/slack.rb | 4 ++-- lib/workspace.rb | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index a21d6ea0..0406391c 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -38,12 +38,12 @@ def main Channel.list print "What channel would you like to select: " input = gets.chomp - workspace.select_channel(input) + puts workspace.select_channel(input) when "select user" User.list print "What user would you like to select: " input = gets.chomp - workspace.select_user(input) + puts workspace.select_user(input) when "show details" puts workspace.show_details when 'send message' diff --git a/lib/workspace.rb b/lib/workspace.rb index 95ae43e8..bbe1b4b6 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -22,6 +22,7 @@ def select_channel(name_or_id) return "Channel does not exist" end @selected = channel + return "The channel was selected" end def select_user(name_or_id) @@ -33,6 +34,7 @@ def select_user(name_or_id) return "User does not exist" end @selected = user + return "The user was selected" end def show_details @@ -53,10 +55,6 @@ def send_message(message: nil) message = gets.chomp end @selected.send_message(message, channel) - # if result == SlackAPIError - # return false - # elsif result == true - # reutrn true - # end + end end \ No newline at end of file