slacks 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/slacks/connection.rb +56 -68
- data/lib/slacks/version.rb +1 -1
- data/slacks.gemspec +2 -2
- metadata +15 -16
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 3042bf152b61c2caa8a3b4fe792b49822d46915712a8573f6bcafc86132ae2b8
         | 
| 4 | 
            +
              data.tar.gz: 116df1499c672f6d72c23894c4b9abe0133cbe855766175488384509845c5ec0
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c1f5d964031547e6d9160d465a4b894f76aa7bbe3174c98dc7bb36964c52eddbb5a5d527c9bcfbd67f7aad93b5fe0869acc8ea0faa07fa97217f129bd537ad27
         | 
| 7 | 
            +
              data.tar.gz: 03b84265b6fe59c1d2858fc12a8274fdb1301575b142f224ea6dd8d6f811c81b94dd9cab6918548e4c7249b57dd695b39bead9a5d0173af964edd334689b2a26
         | 
    
        data/lib/slacks/connection.rb
    CHANGED
    
    | @@ -24,10 +24,8 @@ module Slacks | |
| 24 24 | 
             
                  @user_ids_dm_ids = {}
         | 
| 25 25 | 
             
                  @users_by_id = {}
         | 
| 26 26 | 
             
                  @user_id_by_name = {}
         | 
| 27 | 
            -
                  @ | 
| 28 | 
            -
                  @ | 
| 29 | 
            -
                  @channels_by_id = {}
         | 
| 30 | 
            -
                  @channel_id_by_name = {}
         | 
| 27 | 
            +
                  @conversations_by_id = {}
         | 
| 28 | 
            +
                  @conversation_ids_by_name = {}
         | 
| 31 29 | 
             
                end
         | 
| 32 30 |  | 
| 33 31 |  | 
| @@ -42,7 +40,7 @@ module Slacks | |
| 42 40 | 
             
                    link_names: 1} # find and link channel names and user names
         | 
| 43 41 | 
             
                  params.merge!(attachments: MultiJson.dump(attachments)) if attachments.any?
         | 
| 44 42 | 
             
                  params.merge!(options.select { |key, _| SEND_MESSAGE_PARAMS.member?(key) })
         | 
| 45 | 
            -
                  api("chat.postMessage", params)
         | 
| 43 | 
            +
                  api("chat.postMessage", **params)
         | 
| 46 44 | 
             
                end
         | 
| 47 45 | 
             
                alias :say :send_message
         | 
| 48 46 |  | 
| @@ -50,7 +48,7 @@ module Slacks | |
| 50 48 | 
             
                  params = {
         | 
| 51 49 | 
             
                    channel: to_channel_id(channel),
         | 
| 52 50 | 
             
                    timestamp: ts }
         | 
| 53 | 
            -
                  api("reactions.get", params)
         | 
| 51 | 
            +
                  api("reactions.get", **params)
         | 
| 54 52 | 
             
                end
         | 
| 55 53 |  | 
| 56 54 | 
             
                def update_message(ts, message, options={})
         | 
| @@ -65,15 +63,15 @@ module Slacks | |
| 65 63 | 
             
                  params.merge!(attachments: MultiJson.dump(attachments)) if attachments.any?
         | 
| 66 64 | 
             
                  params.merge!(options.select { |key, _| [:username, :as_user, :parse, :link_names,
         | 
| 67 65 | 
             
                    :unfurl_links, :unfurl_media, :icon_url, :icon_emoji].member?(key) })
         | 
| 68 | 
            -
                  api("chat.update", params)
         | 
| 66 | 
            +
                  api("chat.update", **params)
         | 
| 69 67 | 
             
                end
         | 
| 70 68 |  | 
| 71 69 | 
             
                def add_reaction(emojis, message)
         | 
| 72 70 | 
             
                  Array(emojis).each do |emoji|
         | 
| 73 | 
            -
                    api("reactions.add", | 
| 71 | 
            +
                    api("reactions.add",
         | 
| 74 72 | 
             
                      name: emoji.gsub(/^:|:$/, ""),
         | 
| 75 73 | 
             
                      channel: message.channel.id,
         | 
| 76 | 
            -
                      timestamp: message.timestamp | 
| 74 | 
            +
                      timestamp: message.timestamp)
         | 
| 77 75 | 
             
                  end
         | 
| 78 76 | 
             
                end
         | 
| 79 77 |  | 
| @@ -116,21 +114,16 @@ module Slacks | |
| 116 114 | 
             
                      # one, we'll skill it.
         | 
| 117 115 | 
             
                      next
         | 
| 118 116 |  | 
| 119 | 
            -
                    when EVENT_GROUP_JOINED
         | 
| 120 | 
            -
                       | 
| 121 | 
            -
                      @ | 
| 122 | 
            -
                      @ | 
| 117 | 
            +
                    when EVENT_GROUP_JOINED, EVENT_CHANNEL_CREATED
         | 
| 118 | 
            +
                      conversation = data["channel"]
         | 
| 119 | 
            +
                      @conversations_by_id[conversation["id"]] = conversation
         | 
| 120 | 
            +
                      @conversation_ids_by_name[conversation["name"]] = conversation["id"]
         | 
| 123 121 |  | 
| 124 122 | 
             
                    when EVENT_USER_JOINED
         | 
| 125 123 | 
             
                      user = data["user"]
         | 
| 126 124 | 
             
                      @users_by_id[user["id"]] = user
         | 
| 127 125 | 
             
                      @user_id_by_name[user["name"]] = user["id"]
         | 
| 128 126 |  | 
| 129 | 
            -
                    when EVENT_CHANNEL_CREATED
         | 
| 130 | 
            -
                      channel = data["channel"]
         | 
| 131 | 
            -
                      @channels_by_id[channel["id"]] = channel
         | 
| 132 | 
            -
                      @channel_id_by_name[channel["name"]] = channel["id"]
         | 
| 133 | 
            -
             | 
| 134 127 | 
             
                    when EVENT_MESSAGE
         | 
| 135 128 | 
             
                      # Don't respond to things that this bot said
         | 
| 136 129 | 
             
                      next if data["user"] == bot.id
         | 
| @@ -157,10 +150,9 @@ module Slacks | |
| 157 150 |  | 
| 158 151 |  | 
| 159 152 | 
             
                def channels
         | 
| 160 | 
            -
                  channels = user_id_by_name.keys +  | 
| 153 | 
            +
                  channels = user_id_by_name.keys + conversation_ids_by_name.keys
         | 
| 161 154 | 
             
                  if channels.empty?
         | 
| 162 | 
            -
                     | 
| 163 | 
            -
                    fetch_groups!
         | 
| 155 | 
            +
                    fetch_conversations!
         | 
| 164 156 | 
             
                    fetch_users!
         | 
| 165 157 | 
             
                  end
         | 
| 166 158 | 
             
                  channels
         | 
| @@ -183,13 +175,9 @@ module Slacks | |
| 183 175 | 
             
                      "id" => id,
         | 
| 184 176 | 
             
                      "is_im" => true,
         | 
| 185 177 | 
             
                      "name" => user.username }
         | 
| 186 | 
            -
                  when /^G/
         | 
| 187 | 
            -
                    Slacks::Channel.new(self, groups_by_id.fetch(id) do
         | 
| 188 | 
            -
                      raise ArgumentError, "Unable to find a group with the ID #{id.inspect}"
         | 
| 189 | 
            -
                    end)
         | 
| 190 178 | 
             
                  else
         | 
| 191 | 
            -
                    Slacks::Channel.new(self,  | 
| 192 | 
            -
                      raise ArgumentError, "Unable to find a  | 
| 179 | 
            +
                    Slacks::Channel.new(self, conversations_by_id.fetch(id) do
         | 
| 180 | 
            +
                      raise ArgumentError, "Unable to find a conversation with the ID #{id.inspect}"
         | 
| 193 181 | 
             
                    end)
         | 
| 194 182 | 
             
                  end
         | 
| 195 183 | 
             
                end
         | 
| @@ -224,10 +212,8 @@ module Slacks | |
| 224 212 | 
             
                attr_reader :user_ids_dm_ids,
         | 
| 225 213 | 
             
                            :users_by_id,
         | 
| 226 214 | 
             
                            :user_id_by_name,
         | 
| 227 | 
            -
                            : | 
| 228 | 
            -
                            : | 
| 229 | 
            -
                            :channels_by_id,
         | 
| 230 | 
            -
                            :channel_id_by_name,
         | 
| 215 | 
            +
                            :conversations_by_id,
         | 
| 216 | 
            +
                            :conversation_ids_by_name,
         | 
| 231 217 | 
             
                            :websocket_url,
         | 
| 232 218 | 
             
                            :websocket
         | 
| 233 219 |  | 
| @@ -238,14 +224,8 @@ module Slacks | |
| 238 224 | 
             
                  @bot = BotUser.new(response.fetch("self"))
         | 
| 239 225 | 
             
                  @team = Team.new(response.fetch("team"))
         | 
| 240 226 |  | 
| 241 | 
            -
                  @ | 
| 242 | 
            -
                  @ | 
| 243 | 
            -
             | 
| 244 | 
            -
                  @users_by_id = Hash[response.fetch("users").map { |attrs| [attrs.fetch("id"), attrs] }]
         | 
| 245 | 
            -
                  @user_id_by_name = Hash[response.fetch("users").map { |attrs| ["@#{attrs.fetch("name")}", attrs.fetch("id")] }]
         | 
| 246 | 
            -
             | 
| 247 | 
            -
                  @groups_by_id = Hash[response.fetch("groups").map { |attrs| [attrs.fetch("id"), attrs] }]
         | 
| 248 | 
            -
                  @group_id_by_name = Hash[response.fetch("groups").map { |attrs| [attrs.fetch("name"), attrs.fetch("id")] }]
         | 
| 227 | 
            +
                  @conversations_by_id = Hash[response.fetch("channels").map { |attrs| [ attrs.fetch("id"), attrs ] }]
         | 
| 228 | 
            +
                  @conversation_ids_by_name = Hash[response.fetch("channels").map { |attrs| [ attrs["name"], attrs["id"] ] }]
         | 
| 249 229 | 
             
                end
         | 
| 250 230 |  | 
| 251 231 |  | 
| @@ -254,13 +234,9 @@ module Slacks | |
| 254 234 | 
             
                  return name.id if name.is_a?(Slacks::Channel)
         | 
| 255 235 | 
             
                  return name if name =~ /^[DGC]/ # this already looks like a channel id
         | 
| 256 236 | 
             
                  return get_dm_for_username(name) if name.start_with?("@")
         | 
| 257 | 
            -
                  return to_group_id(name) unless name.start_with?("#")
         | 
| 258 237 |  | 
| 259 | 
            -
                   | 
| 260 | 
            -
             | 
| 261 | 
            -
             | 
| 262 | 
            -
                def to_group_id(name)
         | 
| 263 | 
            -
                  group_id_by_name[name] || fetch_groups![name] || missing_group!(name)
         | 
| 238 | 
            +
                  name = name.gsub(/^#/, "") # Leading hashes are no longer a thing in the conversations API
         | 
| 239 | 
            +
                  conversation_ids_by_name[name] || fetch_conversations![name] || missing_conversation!(name)
         | 
| 264 240 | 
             
                end
         | 
| 265 241 |  | 
| 266 242 | 
             
                def to_user_id(name)
         | 
| @@ -273,39 +249,29 @@ module Slacks | |
| 273 249 |  | 
| 274 250 | 
             
                def get_dm_for_user_id(user_id)
         | 
| 275 251 | 
             
                  user_ids_dm_ids[user_id] ||= begin
         | 
| 276 | 
            -
                    response = api(" | 
| 252 | 
            +
                    response = api("conversations.open", user: user_id)
         | 
| 277 253 | 
             
                    response["channel"]["id"]
         | 
| 278 254 | 
             
                  end
         | 
| 279 255 | 
             
                end
         | 
| 280 256 |  | 
| 281 257 |  | 
| 282 | 
            -
             | 
| 283 | 
            -
             | 
| 284 | 
            -
                   | 
| 285 | 
            -
                  @ | 
| 286 | 
            -
                  @ | 
| 287 | 
            -
                end
         | 
| 288 | 
            -
             | 
| 289 | 
            -
                def fetch_groups!
         | 
| 290 | 
            -
                  response = api("groups.list")
         | 
| 291 | 
            -
                  @groups_by_id = response["groups"].index_by { |attrs| attrs["id"] }
         | 
| 292 | 
            -
                  @group_id_by_name = Hash[response["groups"].map { |attrs| [attrs["name"], attrs["id"]] }]
         | 
| 258 | 
            +
                def fetch_conversations!
         | 
| 259 | 
            +
                  conversations, ims = api("conversations.list")["channels"].partition { |attrs| attrs["is_channel"] || attrs["is_group"] }
         | 
| 260 | 
            +
                  user_ids_dm_ids.merge! Hash[ims.map { |attrs| attrs.values_at("user", "id") }]
         | 
| 261 | 
            +
                  @conversations_by_id = Hash[conversations.map { |attrs| [ attrs.fetch("id"), attrs ] }]
         | 
| 262 | 
            +
                  @conversation_ids_by_name = Hash[conversations.map { |attrs| [ attrs["name"], attrs["id"] ] }]
         | 
| 293 263 | 
             
                end
         | 
| 294 264 |  | 
| 295 265 | 
             
                def fetch_users!
         | 
| 296 266 | 
             
                  response = api("users.list")
         | 
| 297 | 
            -
                  @users_by_id = response["members"]. | 
| 267 | 
            +
                  @users_by_id = response["members"].each_with_object({}) { |attrs, hash| hash[attrs["id"]] = attrs }
         | 
| 298 268 | 
             
                  @user_id_by_name = Hash[response["members"].map { |attrs| ["@#{attrs["name"]}", attrs["id"]] }]
         | 
| 299 269 | 
             
                end
         | 
| 300 270 |  | 
| 301 271 |  | 
| 302 272 |  | 
| 303 | 
            -
                def  | 
| 304 | 
            -
                  raise ArgumentError, "Couldn't find a  | 
| 305 | 
            -
                end
         | 
| 306 | 
            -
             | 
| 307 | 
            -
                def missing_group!(name)
         | 
| 308 | 
            -
                  raise ArgumentError, "Couldn't find a private group named #{name}"
         | 
| 273 | 
            +
                def missing_conversation!(name)
         | 
| 274 | 
            +
                  raise ArgumentError, "Couldn't find a conversation named #{name}"
         | 
| 309 275 | 
             
                end
         | 
| 310 276 |  | 
| 311 277 | 
             
                def missing_user!(name)
         | 
| @@ -317,8 +283,7 @@ module Slacks | |
| 317 283 | 
             
                def get_user_id_for_dm(dm)
         | 
| 318 284 | 
             
                  user_id = user_ids_dm_ids.key(dm)
         | 
| 319 285 | 
             
                  unless user_id
         | 
| 320 | 
            -
                     | 
| 321 | 
            -
                    user_ids_dm_ids.merge! Hash[response["ims"].map { |attrs| attrs.values_at("user", "id") }]
         | 
| 286 | 
            +
                    fetch_conversations!
         | 
| 322 287 | 
             
                    user_id = user_ids_dm_ids.key(dm)
         | 
| 323 288 | 
             
                  end
         | 
| 324 289 | 
             
                  raise ArgumentError, "Unable to find a user for the direct message ID #{dm.inspect}" unless user_id
         | 
| @@ -327,8 +292,29 @@ module Slacks | |
| 327 292 |  | 
| 328 293 |  | 
| 329 294 |  | 
| 330 | 
            -
                def api(command, params | 
| 331 | 
            -
                   | 
| 295 | 
            +
                def api(command, page_limit: MAX_PAGES, **params)
         | 
| 296 | 
            +
                  params_with_token = params.merge(token: token)
         | 
| 297 | 
            +
                  response = api_post command, params_with_token
         | 
| 298 | 
            +
                  fetched_pages = 1
         | 
| 299 | 
            +
                  cursor = response.dig("response_metadata", "next_cursor")
         | 
| 300 | 
            +
                  while cursor && !cursor.empty? && fetched_pages < page_limit do
         | 
| 301 | 
            +
                    api_post(command, params_with_token.merge(cursor: cursor)).each do |key, value|
         | 
| 302 | 
            +
                      if value.is_a?(Array)
         | 
| 303 | 
            +
                        response[key].concat value
         | 
| 304 | 
            +
                      elsif value.is_a?(Hash)
         | 
| 305 | 
            +
                        response[key].merge! value
         | 
| 306 | 
            +
                      else
         | 
| 307 | 
            +
                        response[key] = value
         | 
| 308 | 
            +
                      end
         | 
| 309 | 
            +
                    end
         | 
| 310 | 
            +
                    fetched_pages += 1
         | 
| 311 | 
            +
                    cursor = response.dig("response_metadata", "next_cursor")
         | 
| 312 | 
            +
                  end
         | 
| 313 | 
            +
                  response
         | 
| 314 | 
            +
                end
         | 
| 315 | 
            +
             | 
| 316 | 
            +
                def api_post(command, params)
         | 
| 317 | 
            +
                  response = http.post(command, params)
         | 
| 332 318 | 
             
                  response = MultiJson.load(response.body)
         | 
| 333 319 | 
             
                  unless response["ok"]
         | 
| 334 320 | 
             
                    response["error"].split(/,\s*/).each do |error_code|
         | 
| @@ -364,5 +350,7 @@ module Slacks | |
| 364 350 | 
             
                  reply_broadcast
         | 
| 365 351 | 
             
                }.freeze
         | 
| 366 352 |  | 
| 353 | 
            +
                MAX_PAGES = 9001
         | 
| 354 | 
            +
             | 
| 367 355 | 
             
              end
         | 
| 368 356 | 
             
            end
         | 
    
        data/lib/slacks/version.rb
    CHANGED
    
    
    
        data/slacks.gemspec
    CHANGED
    
    | @@ -25,8 +25,8 @@ Gem::Specification.new do |spec| | |
| 25 25 | 
             
              spec.add_dependency "faraday-raise-errors"
         | 
| 26 26 | 
             
              spec.add_dependency "concurrent-ruby"
         | 
| 27 27 |  | 
| 28 | 
            -
              spec.add_development_dependency "bundler" | 
| 29 | 
            -
              spec.add_development_dependency "rake" | 
| 28 | 
            +
              spec.add_development_dependency "bundler"
         | 
| 29 | 
            +
              spec.add_development_dependency "rake"
         | 
| 30 30 | 
             
              spec.add_development_dependency "minitest", "~> 5.0"
         | 
| 31 31 | 
             
              spec.add_development_dependency "pry"
         | 
| 32 32 | 
             
              spec.add_development_dependency "minitest-reporters"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: slacks
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.6.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Bob Lail
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-02-25 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: websocket-driver
         | 
| @@ -84,30 +84,30 @@ dependencies: | |
| 84 84 | 
             
              name: bundler
         | 
| 85 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 86 | 
             
                requirements:
         | 
| 87 | 
            -
                - - " | 
| 87 | 
            +
                - - ">="
         | 
| 88 88 | 
             
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            -
                    version: ' | 
| 89 | 
            +
                    version: '0'
         | 
| 90 90 | 
             
              type: :development
         | 
| 91 91 | 
             
              prerelease: false
         | 
| 92 92 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 93 | 
             
                requirements:
         | 
| 94 | 
            -
                - - " | 
| 94 | 
            +
                - - ">="
         | 
| 95 95 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            -
                    version: ' | 
| 96 | 
            +
                    version: '0'
         | 
| 97 97 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 98 | 
             
              name: rake
         | 
| 99 99 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 100 | 
             
                requirements:
         | 
| 101 | 
            -
                - - " | 
| 101 | 
            +
                - - ">="
         | 
| 102 102 | 
             
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            -
                    version: ' | 
| 103 | 
            +
                    version: '0'
         | 
| 104 104 | 
             
              type: :development
         | 
| 105 105 | 
             
              prerelease: false
         | 
| 106 106 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 107 | 
             
                requirements:
         | 
| 108 | 
            -
                - - " | 
| 108 | 
            +
                - - ">="
         | 
| 109 109 | 
             
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            -
                    version: ' | 
| 110 | 
            +
                    version: '0'
         | 
| 111 111 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 112 112 | 
             
              name: minitest
         | 
| 113 113 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -164,7 +164,7 @@ dependencies: | |
| 164 164 | 
             
                - - ">="
         | 
| 165 165 | 
             
                  - !ruby/object:Gem::Version
         | 
| 166 166 | 
             
                    version: '0'
         | 
| 167 | 
            -
            description: | 
| 167 | 
            +
            description:
         | 
| 168 168 | 
             
            email:
         | 
| 169 169 | 
             
            - bob.lailfamily@gmail.com
         | 
| 170 170 | 
             
            executables: []
         | 
| @@ -196,7 +196,7 @@ homepage: https://github.com/houston/slacks | |
| 196 196 | 
             
            licenses:
         | 
| 197 197 | 
             
            - MIT
         | 
| 198 198 | 
             
            metadata: {}
         | 
| 199 | 
            -
            post_install_message: | 
| 199 | 
            +
            post_install_message:
         | 
| 200 200 | 
             
            rdoc_options: []
         | 
| 201 201 | 
             
            require_paths:
         | 
| 202 202 | 
             
            - lib
         | 
| @@ -211,9 +211,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 211 211 | 
             
                - !ruby/object:Gem::Version
         | 
| 212 212 | 
             
                  version: '0'
         | 
| 213 213 | 
             
            requirements: []
         | 
| 214 | 
            -
             | 
| 215 | 
            -
             | 
| 216 | 
            -
            signing_key: 
         | 
| 214 | 
            +
            rubygems_version: 3.1.2
         | 
| 215 | 
            +
            signing_key:
         | 
| 217 216 | 
             
            specification_version: 4
         | 
| 218 217 | 
             
            summary: A library for communicating via Slack
         | 
| 219 218 | 
             
            test_files: []
         |