diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..319b42d8 Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 8d6a243f..dbe92e37 100644 --- a/.gitignore +++ b/.gitignore @@ -53,4 +53,4 @@ build-iPhoneSimulator/ .env # Ignore cassette files -/specs/cassettes/ +/specs/cassette \ No newline at end of file diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..1a5b6af1 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,38 @@ +require_relative "recipient" + +class Channel < Recipient + attr_reader :topic, :member_count + + def initialize(slack_id, name, topic, member_count) + super(slack_id, name) + @topic = topic + @member_count = member_count + end + + def self.list + raw_data = self.get("channel") + + unless raw_data.code == 200 + raise SlackApiError, "Improper request: #{raw_data.message}" + end + channel_list = [] + channels = raw_data["channels"] + + channels.each do |channel| + slack_id = channel["id"] + name = channel["name"] + topic = channel["topic"]["value"] + member_count = channel["members"].count + + new_channel = Channel.new(slack_id, name, topic, member_count) + channel_list << new_channel + end + return channel_list + end + + def details + return "#{name} #{topic} member count: #{member_count} slack id: #{slack_id}" + end +end + +# puts Channel.list diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..36d51cf6 --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,61 @@ +require "dotenv" +require "httparty" +Dotenv.load + +class Recipient + class SlackApiError < StandardError; end + + attr_accessor :slack_id, :name + + def initialize(slack_id, name) + @slack_id = slack_id + @name = name + end + + CHANNEL_URL = "https://slack.com/api/channels.list" + USER_URL = "https://slack.com/api/users.list" + POST_URL = "https://slack.com/api/chat.postMessage" + + def self.get(type) + params = { + "token" => ENV["SLACK_TOKEN"], + } + if type == "user" + url = USER_URL + elsif type == "channel" + url = CHANNEL_URL + end + + response = HTTParty.get(url, query: params) + return response + end + + def send_msg(message) + params = { + "token" => ENV["SLACK_TOKEN"], + "channel" => @slack_id, + "text" => message, + "as_user" => true, + } + + response = HTTParty.post( + POST_URL, + body: params, + headers: { "Content-Type" => "application/x-www-form-urlencoded" }, + ) + unless response.code == 200 && response.parsed_response["ok"] + raise SlackApiError, "Error: #{response.parsed_response["error"]}" + end + return response + end + + private + + def details + raise NotImplementedError + end + + def self.list + raise NotImplementedError + end +end diff --git a/lib/slack.rb b/lib/slack.rb index 960cf2f7..a09a3e40 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,11 +1,63 @@ #!/usr/bin/env ruby +require_relative "workspace" def main puts "Welcome to the Ada Slack CLI!" - # TODO project + workspace = Workspace.new + input = "" + + while input != "quit" + puts "Choose an option: + \n 1. List users + \n 2. List channels + \n 3. Select user + \n 4. Select channel + \n 5. Get details + \n 6. Send message + \n 7. Quit" + + input = gets.chomp.downcase + case input + when "list users" + puts workspace.show_details("users") + when "list channels" + puts workspace.show_details("channels") + when "select user" + print "Enter the user name or Slack ID: " + input_user = gets.chomp + workspace.select_user(input_user) + if workspace.selected == nil + puts "User not found" + end + when "select channel" + print "Enter the channel name or Slack ID: " + input_channel = gets.chomp + workspace.select_channel(input_channel) + if workspace.selected == nil + puts "Channel not found" + end + when "details" + if workspace.selected == nil + puts "Please select a user or channel." + else + puts workspace.show_details + end + when "send message" + if workspace.selected == nil + puts "Please select a user or channel." + else + print "Enter your message: " + text = gets.chomp + workspace.send_message(text) + end + when "quit" + else + puts "Please select a option from the menu." + end + end puts "Thank you for using the Ada Slack CLI" end -main if __FILE__ == $PROGRAM_NAME \ No newline at end of file +main if __FILE__ == $PROGRAM_NAME diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..183d21c4 --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,42 @@ +require "httparty" +require "pry" +require_relative "recipient" +require "dotenv" +Dotenv.load + +class User < Recipient + attr_reader :real_name, :name, :slack_id, :status_text, :status_imoji + + def initialize(slack_id, name, real_name, status_text, status_imoji) + super(slack_id, name) + @real_name = real_name + @slack_id = slack_id + @name = name + @status_text = status_text + @status_imoji = status_imoji + end + + def self.list + raw_data = self.get("user") + + unless raw_data.code == 200 + raise SlackApiError, "Improper request: #{raw_data.message}" + end + members_list = [] + members = raw_data["members"] + members.each do |member| + slack_id = member["id"] + name = member["name"] + real_name = member["real_name"] + new_member = User.new(slack_id, name, real_name) + members_list << new_member + end + return members_list + end + + def details + return "#{real_name}, slack user name: #{name}, slack_id: #{slack_id}" + end +end + +# puts User.list diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..bc01004a --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,52 @@ +require_relative "user" +require_relative "channel" + +class Workspace + attr_reader :users, :channels, :selected + + def initialize + @users = User.list + @channels = Channel.list + @selected = nil + end + + # modify this + def select_channel(user_input) + selected = channels.select do |channel| + channel.name == user_input || channel.slack_id == user_input + end + @selected = selected.first + end + + def select_user(user_input) + @selected = users.select do |user| + user.name == user_input || user.slack_id == user_input + end + @selected = selected.first + end + + # used to show details for selected user or channel + def show_details(selected) + return @selected.details + end + + # used to show details for all users or all channels + def print_details(recipients) + if recipients == "users" + return_array = [] + users.each do |user| + return_array << user.details + end + elsif recipients == "channels" + return_array = [] + channels.each do |channel| + return_array << channel.details + end + end + return return_array + end + + def send_message(text) + @selected.send_msg(text) + end +end diff --git a/specs/.DS_Store b/specs/.DS_Store new file mode 100644 index 00000000..5008ddfc Binary files /dev/null and b/specs/.DS_Store differ diff --git a/specs/cassettes/get_response.yml b/specs/cassettes/get_response.yml new file mode 100644 index 00000000..6ef6f423 --- /dev/null +++ b/specs/cassettes/get_response.yml @@ -0,0 +1,78 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/channels.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: + - '563' + Connection: + - keep-alive + Date: + - Wed, 20 Mar 2019 21:20:18 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - e5bef177-648f-4594-a4de-9971e8569520 + 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 + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels: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-haq2 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 64a11a52a1b20918fec274138dd1ba05.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - bII6Pc7kTQ_W_MhEpFBExxS41BxFqUsktuPZNtPYX5MMoLXAvBVS0Q== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CH0EFGWQ0","name":"everyone","is_channel":true,"created":1552952597,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"everyone","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UH2SDUECA","last_set":1552952597},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UH2SDUECA","last_set":1552952597},"previous_names":[],"num_members":2},{"id":"CH0EFH3CG","name":"slack-api-project","is_channel":true,"created":1552952598,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"slack-api-project","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2},{"id":"CH36U0J9K","name":"random","is_channel":true,"created":1552952597,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UH2SDUECA","last_set":1552952597},"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":"UH2SDUECA","last_set":1552952597},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 20 Mar 2019 21:20:18 GMT +recorded_with: VCR 4.0.0 diff --git a/specs/cassettes/list_of_users.yml b/specs/cassettes/list_of_users.yml new file mode 100644 index 00000000..b4d9d618 --- /dev/null +++ b/specs/cassettes/list_of_users.yml @@ -0,0 +1,77 @@ +--- +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: + - '900' + Connection: + - keep-alive + Date: + - Wed, 20 Mar 2019 21:15:34 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - d33cd83b-adf9-4c92-b064-a92ab98d5659 + 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 + 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-6ur8 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 7430a54821bbaeddfc77b56ba1b84eae.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - g65DUs2andF3ojA1MuSSlQzu-QQsDmlPJLnuSupD9vxkXOH2I_Ls0w== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TH2SDUE0J","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\/16510\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_192.png","image_512":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":"UH2SDUECA","team_id":"TH2SDUE0J","name":"grace.m.shea","deleted":false,"color":"9f69e7","real_name":"grace.m.shea","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"grace.m.shea","real_name_normalized":"grace.m.shea","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g7af0be2aaaf","image_24":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952598},{"id":"UH4A0RV4N","team_id":"TH2SDUE0J","name":"b.amani.s","deleted":false,"color":"4bbe2e","real_name":"Bita + Amani Shahrak","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Bita + Amani Shahrak","real_name_normalized":"Bita Amani Shahrak","display_name":"Bita + Amani Shahrak","display_name_normalized":"Bita Amani Shahrak","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb4955531fdb","image_24":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952825,"has_2fa":false}],"cache_ts":1553116534,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 20 Mar 2019 21:15:34 GMT +recorded_with: VCR 4.0.0 diff --git a/specs/cassettes/list_users.yml b/specs/cassettes/list_users.yml new file mode 100644 index 00000000..a3fa8c70 --- /dev/null +++ b/specs/cassettes/list_users.yml @@ -0,0 +1,77 @@ +--- +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: + - '900' + Connection: + - keep-alive + Date: + - Wed, 20 Mar 2019 22:55:30 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 7ae54ef8-e13d-4a99-aa84-893eae1aa66d + 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 + 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-2ok9 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 44f18fa5317ccaef6a4a5e65d43dd8c8.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - K06KwyF8RMP5AEjV1XNS8D3ikE3HdGnKvH9XgYlSPP5fKBZ2WRXu_g== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TH2SDUE0J","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\/16510\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_192.png","image_512":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":"UH2SDUECA","team_id":"TH2SDUE0J","name":"grace.m.shea","deleted":false,"color":"9f69e7","real_name":"grace.m.shea","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"grace.m.shea","real_name_normalized":"grace.m.shea","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g7af0be2aaaf","image_24":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952598},{"id":"UH4A0RV4N","team_id":"TH2SDUE0J","name":"b.amani.s","deleted":false,"color":"4bbe2e","real_name":"Bita + Amani Shahrak","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Bita + Amani Shahrak","real_name_normalized":"Bita Amani Shahrak","display_name":"Bita + Amani Shahrak","display_name_normalized":"Bita Amani Shahrak","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb4955531fdb","image_24":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952825,"has_2fa":false}],"cache_ts":1553122530,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 20 Mar 2019 22:55:30 GMT +recorded_with: VCR 4.0.0 diff --git a/specs/cassettes/slack-posts.yml b/specs/cassettes/slack-posts.yml new file mode 100644 index 00000000..ab8a5ee9 --- /dev/null +++ b/specs/cassettes/slack-posts.yml @@ -0,0 +1,283 @@ +--- +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: + - '890' + Connection: + - keep-alive + Date: + - Fri, 22 Mar 2019 14:05:21 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - fca04afb-fc27-4a6f-971c-e1d72e6aa488 + X-Oauth-Scopes: + - identify,read,post,client,apps,admin + 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 + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users: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-zl12 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 08f323eee70ddda7af34d5feb414ce27.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - Mf_OgI4ZzZX3Hz5-77lKhKioSFbLQSF6O5B1NyNp1eRtGhNlXH0nAA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"UH2SDUECA","team_id":"TH2SDUE0J","name":"grace.m.shea","deleted":false,"color":"9f69e7","real_name":"grace.m.shea","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"grace.m.shea","real_name_normalized":"grace.m.shea","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g7af0be2aaaf","email":"grace.m.shea@gmail.com","image_24":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952598,"has_2fa":false},{"id":"UH4A0RV4N","team_id":"TH2SDUE0J","name":"b.amani.s","deleted":false,"color":"4bbe2e","real_name":"Bita + Amani Shahrak","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Bita + Amani Shahrak","real_name_normalized":"Bita Amani Shahrak","display_name":"Bita + Amani Shahrak","display_name_normalized":"Bita Amani Shahrak","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb4955531fdb","email":"b.amani.s@gmail.com","image_24":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952825,"has_2fa":false},{"id":"USLACKBOT","team_id":"TH2SDUE0J","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\/16510\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_192.png","image_512":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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}],"cache_ts":1553263521}' + http_version: + recorded_at: Fri, 22 Mar 2019 14:05:21 GMT +- request: + method: get + uri: https://slack.com/api/channels.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: + - '537' + Connection: + - keep-alive + Date: + - Fri, 22 Mar 2019 14:05:22 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 2edd6f4a-a016-49dc-9eda-9eff9be15d73 + X-Oauth-Scopes: + - identify,read,post,client,apps,admin + 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 + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels: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-9niu + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6ba12aeff47e3e7677e084594bfce5e1.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - 8jR7P2VEH-PHCScDdMPJdoi0ApPZPgxosNIaXt-tpBpZxiKwo0F96Q== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CH0EFGWQ0","name":"everyone","is_channel":true,"created":1552952597,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"everyone","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UH2SDUECA","last_set":1552952597},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UH2SDUECA","last_set":1552952597},"previous_names":[],"num_members":2},{"id":"CH36U0J9K","name":"random","is_channel":true,"created":1552952597,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UH2SDUECA","last_set":1552952597},"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":"UH2SDUECA","last_set":1552952597},"previous_names":[],"num_members":2},{"id":"CH0EFH3CG","name":"slack-api-project","is_channel":true,"created":1552952598,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"slack-api-project","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}]}' + http_version: + recorded_at: Fri, 22 Mar 2019 14:05:22 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&channel=CH0EFGWQ0&text=should%20work&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, 22 Mar 2019 22:45:32 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 8020e455-0052-42dd-b4c9-dfa8474db6bf + X-Oauth-Scopes: + - identify,read,post,client,apps,admin + 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 + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user,client + 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-31hm + X-Cache: + - Miss from cloudfront + Via: + - 1.1 8ce0f76d2391b7bf264596884970edb3.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - ofiWgMAioI-P-ZvOu3giQG5eSlNveemG0huAtqug8jy2puvsJwgOLQ== + body: + encoding: UTF-8 + string: '{"ok":true,"channel":"CH0EFGWQ0","ts":"1553294732.000200","message":{"bot_id":"BH78ZSEUB","type":"message","text":"should + work","user":"UH2SDUECA","ts":"1553294732.000200"}}' + http_version: + recorded_at: Fri, 22 Mar 2019 22:45:32 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&channel=whatever&text=shouldn%27t%20work&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, 22 Mar 2019 22:54:29 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 8e41640a-afc9-4bb8-9b2a-1e7a64c77035 + X-Oauth-Scopes: + - identify,read,post,client,apps,admin + 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 + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user,client + 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-852m + X-Cache: + - Miss from cloudfront + Via: + - 1.1 e9dbb62af8eec6cb13379a137374c506.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - TJgLKvzvBn7sgT3ghRYpPbQntywNr0Gfj5nyM9wzTrvqrshFRJHoQA== + body: + encoding: UTF-8 + string: '{"ok":false,"error":"channel_not_found"}' + http_version: + recorded_at: Fri, 22 Mar 2019 22:54:29 GMT +recorded_with: VCR 4.0.0 diff --git a/specs/cassettes/slack_channel.yml b/specs/cassettes/slack_channel.yml new file mode 100644 index 00000000..54784908 --- /dev/null +++ b/specs/cassettes/slack_channel.yml @@ -0,0 +1,78 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/channels.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: + - '563' + Connection: + - keep-alive + Date: + - Wed, 20 Mar 2019 22:31:30 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 05d255a4-8129-4677-843a-9f39a77e4730 + 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 + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels: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-5zng + X-Cache: + - Miss from cloudfront + Via: + - 1.1 1850877f8309c8b6f987c10f734a7aef.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - likJm2U5S3-rw8y6f5dkbfxQgVAJslhH9LSDqVn6C7pBey23i26QFA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CH0EFGWQ0","name":"everyone","is_channel":true,"created":1552952597,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"everyone","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UH2SDUECA","last_set":1552952597},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UH2SDUECA","last_set":1552952597},"previous_names":[],"num_members":2},{"id":"CH0EFH3CG","name":"slack-api-project","is_channel":true,"created":1552952598,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"slack-api-project","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2},{"id":"CH36U0J9K","name":"random","is_channel":true,"created":1552952597,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UH2SDUECA","last_set":1552952597},"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":"UH2SDUECA","last_set":1552952597},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 20 Mar 2019 22:31:30 GMT +recorded_with: VCR 4.0.0 diff --git a/specs/cassettes/slack_user.yml b/specs/cassettes/slack_user.yml new file mode 100644 index 00000000..5d60fd38 --- /dev/null +++ b/specs/cassettes/slack_user.yml @@ -0,0 +1,77 @@ +--- +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: + - '890' + Connection: + - keep-alive + Date: + - Fri, 22 Mar 2019 13:48:24 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 79ab7d69-fc95-4e7c-8fd4-32aec4cddd96 + X-Oauth-Scopes: + - identify,read,post,client,apps,admin + 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 + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users: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-ewco + X-Cache: + - Miss from cloudfront + Via: + - 1.1 3a9dca02f1ba6ecd49fee9a3ca7fcb81.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - YHZdE8Jqb94Kp0vdGiwOs3bJU6d3T_n3MrTNzPb6LdXtQEkzOy7z2w== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"UH2SDUECA","team_id":"TH2SDUE0J","name":"grace.m.shea","deleted":false,"color":"9f69e7","real_name":"grace.m.shea","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"grace.m.shea","real_name_normalized":"grace.m.shea","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g7af0be2aaaf","email":"grace.m.shea@gmail.com","image_24":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952598,"has_2fa":false},{"id":"UH4A0RV4N","team_id":"TH2SDUE0J","name":"b.amani.s","deleted":false,"color":"4bbe2e","real_name":"Bita + Amani Shahrak","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Bita + Amani Shahrak","real_name_normalized":"Bita Amani Shahrak","display_name":"Bita + Amani Shahrak","display_name_normalized":"Bita Amani Shahrak","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb4955531fdb","email":"b.amani.s@gmail.com","image_24":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952825,"has_2fa":false},{"id":"USLACKBOT","team_id":"TH2SDUE0J","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\/16510\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_192.png","image_512":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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}],"cache_ts":1553262504}' + http_version: + recorded_at: Fri, 22 Mar 2019 13:48:24 GMT +recorded_with: VCR 4.0.0 diff --git a/specs/cassettes/slack_workspace.yml b/specs/cassettes/slack_workspace.yml new file mode 100644 index 00000000..5d088154 --- /dev/null +++ b/specs/cassettes/slack_workspace.yml @@ -0,0 +1,152 @@ +--- +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: + - '899' + Connection: + - keep-alive + Date: + - Wed, 20 Mar 2019 22:43:45 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - f158738e-5d42-4c38-bba9-1e4e319801b1 + 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 + 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-tiix + X-Cache: + - Miss from cloudfront + Via: + - 1.1 cb7132faa45d3b1ff4d65185f2d36d27.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - 10W-fWCS6gT3UHP0M2DMnI9jFji7-UOwX0Lul_ThT-jcJ2EL7-jmTA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TH2SDUE0J","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\/16510\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_192.png","image_512":"https:\/\/a.slack-edge.com\/16510\/img\/slackbot_512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":"UH2SDUECA","team_id":"TH2SDUE0J","name":"grace.m.shea","deleted":false,"color":"9f69e7","real_name":"grace.m.shea","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"grace.m.shea","real_name_normalized":"grace.m.shea","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g7af0be2aaaf","image_24":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/7af0be2aaaf3e67ca1c00d48d132101c.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0007-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952598,"has_2fa":false},{"id":"UH4A0RV4N","team_id":"TH2SDUE0J","name":"b.amani.s","deleted":false,"color":"4bbe2e","real_name":"Bita + Amani Shahrak","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Bita + Amani Shahrak","real_name_normalized":"Bita Amani Shahrak","display_name":"Bita + Amani Shahrak","display_name_normalized":"Bita Amani Shahrak","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb4955531fdb","image_24":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b4955531fdb9a07733e053153cf1b429.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F00b63%2Fimg%2Favatars%2Fava_0011-512.png","status_text_canonical":"","team":"TH2SDUE0J"},"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":1552952825,"has_2fa":false}],"cache_ts":1553121825,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 20 Mar 2019 22:43:45 GMT +- request: + method: get + uri: https://slack.com/api/channels.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: + - '563' + Connection: + - keep-alive + Date: + - Wed, 20 Mar 2019 22:43:45 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 91a852ad-065b-4624-94d6-0eaf05fc5edb + 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 + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels: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-5tv9 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 e9485f60105658dfd8d6d4dbc070260a.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - FPjrGd6TqlqaSrXphtR0H5lKh6u-Uyq9fs20_O_F5QwfgiglwUc7WQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CH0EFGWQ0","name":"everyone","is_channel":true,"created":1552952597,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"everyone","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UH2SDUECA","last_set":1552952597},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UH2SDUECA","last_set":1552952597},"previous_names":[],"num_members":2},{"id":"CH0EFH3CG","name":"slack-api-project","is_channel":true,"created":1552952598,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"slack-api-project","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2},{"id":"CH36U0J9K","name":"random","is_channel":true,"created":1552952597,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UH2SDUECA","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UH2SDUECA","UH4A0RV4N"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UH2SDUECA","last_set":1552952597},"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":"UH2SDUECA","last_set":1552952597},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 20 Mar 2019 22:43:45 GMT +recorded_with: VCR 4.0.0 diff --git a/specs/channel_spec.rb b/specs/channel_spec.rb new file mode 100644 index 00000000..159d4133 --- /dev/null +++ b/specs/channel_spec.rb @@ -0,0 +1,15 @@ +require_relative "test_helper" + +describe "Channel class" do + describe "self.list" do + it "can return all channels" do + VCR.use_cassette("slack_channel") do + response = Channel.list + channel = response.first + + expect(response).wont_be_nil + expect(response.first.name).must_equal channel.name + end + end + end +end diff --git a/specs/test_helper.rb b/specs/test_helper.rb index 81ccd06b..6fe8e46c 100644 --- a/specs/test_helper.rb +++ b/specs/test_helper.rb @@ -1,15 +1,30 @@ -require 'simplecov' +require "simplecov" SimpleCov.start -require 'minitest' -require 'minitest/autorun' -require 'minitest/reporters' -require 'minitest/skip_dsl' -require 'vcr' +require "minitest" +require "minitest/autorun" +require "minitest/reporters" +require "webmock/minitest" +require "minitest/skip_dsl" +require "vcr" + +require_relative "../lib/channel" +require_relative "../lib/user" +require_relative "../lib/recipient" +require_relative "../lib/slack" +require_relative "../lib/workspace" Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| config.cassette_library_dir = "specs/cassettes" config.hook_into :webmock -end \ No newline at end of file + 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 + } + + config.filter_sensitive_data("") do + ENV["SLACK_TOKEN"] + end +end diff --git a/specs/user_spec.rb b/specs/user_spec.rb new file mode 100644 index 00000000..6e57ac2b --- /dev/null +++ b/specs/user_spec.rb @@ -0,0 +1,15 @@ +require_relative "test_helper" + +describe "User class" do + describe "self.list" do + it "can return all users" do + VCR.use_cassette("slack_user") do + response = User.list + user = response.first + + expect(response).wont_be_nil + expect(response.first.name).must_equal user.name + end + end + end +end diff --git a/specs/workspace_spec.rb b/specs/workspace_spec.rb new file mode 100644 index 00000000..7d1e5a51 --- /dev/null +++ b/specs/workspace_spec.rb @@ -0,0 +1,104 @@ +require_relative "test_helper" + +describe "Workspace class" do + before do + VCR.use_cassette("slack_workspace") do + @workspace = Workspace.new + end + end + + it "creates a list of channels and users" do + VCR.use_cassette("slack_workspace") do + expect(@workspace.channels.first).must_be_kind_of Channel + expect(@workspace.users.first).must_be_kind_of User + end + end +end + +describe "instance methods" do + before do + VCR.use_cassette("slack_workspace") do + @workspace = Workspace.new + end + end + + it "returns text from print_details" do + VCR.use_cassette("slack_workspace") do + expect(@workspace.print_details("users")).must_be_kind_of Array + expect(@workspace.print_details("channels")).must_be_kind_of Array + end + end + + it "returns a user object from select_user" do + VCR.use_cassette("slack_workspace") do + expect(@workspace.select_user("grace.m.shea")).must_be_kind_of User + # expect(@workspace.select_user("123")).must_be_kind_of User + end + end + + it "returns text from print_details" do + VCR.use_cassette("slack_workspace") do + expect(@workspace.print_details("users")).must_be_kind_of Array + expect(@workspace.print_details("channels")).must_be_kind_of Array + end + end + + it "returns a channel object from select_channel" do + VCR.use_cassette("slack_workspace") do + expect(@workspace.select_channel("random")).must_be_kind_of Channel + # expect(@workspace.select_channel("456")).must_be_kind_of Channel + end + end + + it "returns channel details from show_details" do + VCR.use_cassette("slack_workspace") do + @workspace.select_channel("random") + expect(@workspace.show_details).must_be_kind_of String + + @workspace.select_channel("random") + expect(@workspace.show_details).must_be_kind_of String + end + end + + it "returns user details from show_details" do + VCR.use_cassette("slack_workspace") do + @workspace.select_user("grace.m.shea") + expect(@workspace.show_details).must_be_kind_of String + + @workspace.select_channel("random") + expect(@workspace.show_details).must_be_kind_of String + end + end +end + +describe "post message to slack" do + before do + VCR.use_cassette("slack_workspace") do + @workspace = Workspace.new + end + end + + it "creates sends a message to a recipient" do + VCR.use_cassette("slack-posts") do + @workspace.select_channel("everyone") + response = @workspace.send_message("should work") + expect(response["ok"]).must_equal true + end + end + + it "raises an error for invalid channel" do + VCR.use_cassette("slack-posts") do + @workspace.select_channel("everyone") + @workspace.selected.slack_id = "whatever" + expect { @workspace.send_message("shouldn't work") }.must_raise Recipient::SlackApiError + end + end + + it "raises an error for invalid user" do + VCR.use_cassette("slack-posts") do + @workspace.select_user("grace.m.shea") + @workspace.selected.slack_id = "whatever" + expect { @workspace.send_message("shouldn't work") }.must_raise Recipient::SlackApiError + end + end +end