Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
4822d6e
Initial commit - Adding .env, token and test_help.
denisseai Mar 13, 2020
56c5504
Setup slack.rb and Workspace
denisseai Mar 13, 2020
5c71765
Adding empty starter files to lib folder
denisseai Mar 13, 2020
3c06333
Design activity without comments for lib files
denisseai Mar 13, 2020
ea8f205
Setting relationship between recipient- usr n chnl
denisseai Mar 14, 2020
6e2c5c8
Adding some pseudo (notes)
denisseai Mar 14, 2020
18bf25b
Adding all relevant test files
denisseai Mar 14, 2020
51a7bc3
Listing options for user in slack.rb
denisseai Mar 14, 2020
4651545
User tests
denisseai Mar 14, 2020
e66beeb
User test pass
denisseai Mar 14, 2020
1ea6673
Added Channel tests
denisseai Mar 15, 2020
b102387
Fixed channel test
denisseai Mar 15, 2020
bb0fb93
Added channel list_all method
denisseai Mar 15, 2020
6e850ba
Cleaned Channel, User and their tests
denisseai Mar 15, 2020
968d827
User select options added
denisseai Mar 15, 2020
52a2663
Added Channel to method
denisseai Mar 15, 2020
f52fa27
Deleted completed todo comments
denisseai Mar 15, 2020
5a4c663
Added tests for recipient
denisseai Mar 15, 2020
79e63d8
endpoints
denisseai Mar 15, 2020
e904ae3
Added wave 2 selection options for user
denisseai Mar 15, 2020
6f141ce
Fix infinite loop in slack.rb
denisseai Mar 15, 2020
89d815b
Select user and channel working
denisseai Mar 15, 2020
a8e3d55
Added body to send message
denisseai Mar 15, 2020
569d3e4
channel by name can send messages
denisseai Mar 16, 2020
571e1ac
fix spacing
denisseai Mar 16, 2020
58a7aab
Added some comments
denisseai Mar 16, 2020
4193ef8
Added error message if message not sent
denisseai Mar 16, 2020
f5ec58e
forgot this file
denisseai Mar 16, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions lib/channel.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require_relative "recipient"

CHANNEL_URL = "https://slack.com/api/channels.list"

class Channel < Recipient
attr_reader :topic, :num_members

def initialize(topic:, num_members:, slack_id:, name:)
super(slack_id: slack_id, name: name)
@topic = topic
@num_members = num_members
end

def details
tp self, "slack_id", "name", "topic", "member_count"
end

# Get all channel and their data
def self.list_all
response = self.get(CHANNEL_URL)
channels = []
response["channels"].each do |channel|
channels << Channel.new(
topic: channel['topic']['value'],
num_members: channel['num_members'],
slack_id: channel['id'],
name: channel['name']
)
end
return channels
end
end
45 changes: 45 additions & 0 deletions lib/recipient.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
require "httparty"
require "dotenv"

RECIPIENT_URL = "https://slack.com/api/chat.postMessage"

class Recipient
attr_reader :slack_id, :name

def initialize(slack_id:, name:)
@slack_id = slack_id
@name = name
end

# Send message to recipient
def send_message(message)
response = HTTParty.post("#{RECIPIENT_URL}?token=#{ENV['SLACK_TOKEN']}", {
body: {
text: message,
channel: slack_id
}
})
if response.code != 200 || response["ok"] == false
raise SlackAPIError, "We encountered a problem -#{response["error"]}"
else
puts "Your message was sent!"
end
return response
end

def self.get(url)
response = HTTParty.get(url, query: {token: ENV['SLACK_TOKEN']})
raise SlackAPIError, "We encountered a problem: #{response["error"]}" if response.code != 200 || response["ok"] == false
return response
end

def details
raise NotImplementedError, "Template method"
end
def self.list_all
raise NotImplementedError, "Template method"
end
end

class SlackAPIError < Exception
end
1 change: 1 addition & 0 deletions lib/slack-cli
Submodule slack-cli added at 18bf25
96 changes: 91 additions & 5 deletions lib/slack.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,98 @@
#!/usr/bin/env ruby
require "dotenv"
require "table_print"

require_relative "recipient"
require_relative "user"
require_relative "channel"
require_relative "workspace"

Dotenv.load

VALID_COMMANDS = ['list users', 'list channels', 'select user', 'select channel',
'details', 'send message', 'quit']

VALID_SEARCH = ['name', 'id']

def user_prompt
puts "\nSelect from the following options: \n* List Users \n* List Channels \n* Select User \
\n* Select Channel \n** Details \n** Send Message \n* Quit"
return gets.chomp.downcase
end

def input_validation
input = gets.chomp.downcase
until VALID_COMMANDS.include? input
puts "I didn't understand your gibberish."
puts "Please enter a valid option"
user_prompt
input = gets.chomp.downcase
end
return input
end

# Prompt option for user to continue with name or id
def prompt_recipient
puts "Do you want to continue using -name- or -id- ?"
key = gets.chomp.downcase

until VALID_SEARCH.include? key
puts "Invalid command- Please input name or id to continue."
key = gets.chomp.downcase
end

puts "Please enter #{key} to continue"
input = gets.chomp

key == 'name' ? {name: input} : {slack_id: input}
end

def main
puts "Welcome to the Ada Slack CLI!"
workspace = Workspace.new
puts "\nWelcome to Ada's Slack CLI"
# Display how many users and channels are available
puts "Slack Workspace currently has: \n#{workspace.users.count} Users \n#{workspace.channels.count} Channels"

# TODO project
# Get user input from available options
loop do
user_input = user_prompt
case user_input
when "list users"
tp workspace.users, "slack_id", "name", "real_name"

puts "Thank you for using the Ada Slack CLI"
end
when "list channels"
tp workspace.channels, "name", "topic", "num_members", "slack_id"

when "select user"
user_selected = prompt_recipient
workspace.select_user(user_selected)
workspace.selected ? workspace.show_selected : puts("User not found")

when "select channel"
channel_selected = prompt_recipient
workspace.select_channel(channel_selected)
workspace.selected ? workspace.show_selected : puts("Channel not found")

when "details"
workspace.show_selected

when "send message"
begin
workspace.send_message
rescue Recipient::SlackApiError => error
puts "Unable to send message #{error.message}"
end

when "quit"
puts "Okay you want to quit. Goodbye"
break

else
puts "\nI didn't understand your gibberish."
puts "Please enter a valid option"
user_prompt
end
end
puts "Thank you for using Ada's Slack CLI"
end

main if __FILE__ == $PROGRAM_NAME
34 changes: 34 additions & 0 deletions lib/user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
require_relative "recipient"

USER_URL = "https://slack.com/api/users.list"

class User < Recipient
attr_reader :real_name, :status_text, :status_emoji

def initialize(real_name:, status_text:, status_emoji:, slack_id:, name:)
super(slack_id: slack_id, name: name)
@real_name = real_name
@status_text = status_text
@status_emoji = status_emoji
end

def details
tp self, "slack_id", "name", "real_name"
end

# Get all users and their data
def self.list_all
response = User.get(USER_URL)
users = []
response['members'].each do |user|
users << self.new(
real_name: user['profile']['real_name'],
status_text: user['profile']['status_text'],
status_emoji: user['profile']['status_emoji'],
slack_id: user['id'],
name: user['name']
)
end
return users
end
end
42 changes: 42 additions & 0 deletions lib/workspace.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
require_relative 'user'
require_relative 'channel'

class Workspace
attr_reader :users, :channels, :selected

def initialize
@users = User.list_all
@channels = Channel.list_all
@selected = nil
end

def find_recipient(list_all:, name: nil, slack_id: nil)
raise ArgumentError unless name || slack_id
return list_all.find do |recipient|
name ? recipient.name == name : recipient.slack_id == slack_id
end
end

def select_user (name: nil, slack_id: nil)
@selected = find_recipient list_all: users, name: name, slack_id: slack_id
end

def select_channel (name: nil, slack_id: nil)
@selected = find_recipient list_all: channels, name: name, slack_id: slack_id
end

def show_selected
puts selected ? selected.details : "To view the details of a user or channel please make that selection."
end

def send_message
if selected
puts "\nType your message for #{selected.name} and press Enter to send."
message = gets.chomp
raise Recipient::SlackAPIError if message.empty?
selected.send_message(message)
else
puts "\nNo recipient selected"
end
end
end
Loading