From 5dbc6e0f909e2c4ea98b5646118a19dedf5428d4 Mon Sep 17 00:00:00 2001 From: cookie-s Date: Sun, 26 Jun 2022 00:29:43 -0400 Subject: [PATCH 1/2] rm slack-api; add slack-ruby-client, async-websocket --- Gemfile | 4 +++- Gemfile.lock | 51 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/Gemfile b/Gemfile index 60f1144..675ac9d 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,5 @@ source 'https://rubygems.org' -gem 'slack-api' gem 'sinatra' gem 'puma' gem 'rubyzip' @@ -11,3 +10,6 @@ gem 'nokogiri' group :development do gem 'thin' end + +gem "slack-ruby-client" +gem "async-websocket", '~> 0.8.0' # dependency of slack-ruby-client RTM diff --git a/Gemfile.lock b/Gemfile.lock index 3ab0c81..1d4cb18 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,15 @@ GEM remote: https://rubygems.org/ specs: + async (1.30.3) + console (~> 1.10) + nio4r (~> 2.3) + timers (~> 4.1) + async-io (1.33.0) + async + async-websocket (0.8.0) + async-io + websocket-driver (~> 0.7.0) aws-eventstream (1.2.0) aws-partitions (1.578.0) aws-sdk (3.1.0) @@ -1228,22 +1237,28 @@ GEM aws-sigv4 (1.4.0) aws-eventstream (~> 1, >= 1.0.2) bson (4.14.1) + console (1.15.3) + fiber-local daemons (1.4.1) eventmachine (1.2.7) - faraday (0.17.5) - multipart-post (>= 1.2, < 3) - faraday_middleware (0.10.1) - faraday (>= 0.7.4, < 1.0) - faye-websocket (0.10.9) - eventmachine (>= 0.12.0) - websocket-driver (>= 0.5.1) + faraday (2.3.0) + faraday-net_http (~> 2.0) + ruby2_keywords (>= 0.0.4) + faraday-mashify (0.1.0) + faraday (~> 2.0) + hashie + faraday-multipart (1.0.4) + multipart-post (~> 2) + faraday-net_http (2.0.3) + fiber-local (1.0.0) + gli (2.21.0) + hashie (5.0.0) jmespath (1.6.1) json (2.6.1) mini_portile2 (2.8.0) mongo (2.17.1) bson (>= 4.8.2, < 5.0.0) - multi_json (1.15.0) - multipart-post (2.1.1) + multipart-post (2.2.3) mustermann (1.1.1) ruby2_keywords (~> 0.0.1) nio4r (2.5.8) @@ -1263,16 +1278,19 @@ GEM rack (~> 2.2) rack-protection (= 2.2.0) tilt (~> 2.0) - slack-api (1.6.1) - faraday (~> 0.11) - faraday_middleware (~> 0.10.0) - faye-websocket (~> 0.10.6) - multi_json (~> 1.0, >= 1.0.3) + slack-ruby-client (1.1.0) + faraday (>= 2.0) + faraday-mashify + faraday-multipart + gli + hashie + websocket-driver thin (1.8.1) daemons (~> 1.0, >= 1.0.9) eventmachine (~> 1.0, >= 1.0.4) rack (>= 1, < 3) tilt (2.0.10) + timers (4.3.3) websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -1281,6 +1299,7 @@ PLATFORMS ruby DEPENDENCIES + async-websocket (~> 0.8.0) aws-sdk json mongo @@ -1288,8 +1307,8 @@ DEPENDENCIES puma rubyzip sinatra - slack-api + slack-ruby-client thin BUNDLED WITH - 2.2.20 + 2.3.16 From b6bba8f7f4cd0d7060d386a8619ce5c32dd075ee Mon Sep 17 00:00:00 2001 From: cookie-s Date: Sun, 26 Jun 2022 00:30:08 -0400 Subject: [PATCH 2/2] use slack-ruby-client --- bin/init.rb | 4 --- lib/db.rb | 9 ++---- lib/slack.rb | 7 ++++- lib/slack_logger.rb | 68 +++++++++++---------------------------------- viewer/viewer.rb | 3 +- 5 files changed, 26 insertions(+), 65 deletions(-) diff --git a/bin/init.rb b/bin/init.rb index 7182e69..62703dc 100644 --- a/bin/init.rb +++ b/bin/init.rb @@ -12,10 +12,6 @@ 'secret_access_key' => nil, }, 'default_channel' => 'general', - 'logger' => { - 'enable_private_channel' => true, - 'enable_direct_message' => true - }, 'database' => { 'uri' => 'mongo:27017', 'database' => 'slack_logger' diff --git a/lib/db.rb b/lib/db.rb index d31ff96..6e411e8 100644 --- a/lib/db.rb +++ b/lib/db.rb @@ -25,15 +25,10 @@ def replace_channels(channels) end end +# Ims +# for backward compatibility. should be removed. Ims = db['ims'] Ims.indexes.create_one({ :id => 1 }, :unique => true) -def replace_ims(ims) - unless ims.nil? - ids = ims.map{ |im| im['id'] } - Ims.find(id: { '$in' => ids }).delete_many - Ims.insert_many(ims) - end -end Emojis = db['emojis'] Emojis.indexes.create_one({ :name => 1 }, :unique => true) diff --git a/lib/slack.rb b/lib/slack.rb index 7793d33..79f118b 100644 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,8 +1,13 @@ require 'yaml' -require 'slack' +require 'slack-ruby-client' config = YAML.load_file('./config.yml') Slack.configure do |c| c.token = config['slack']['token'] end + +Slack::RealTime::Client.configure do |c| + c.start_method = :rtm_connect + c.store_class = Slack::RealTime::Stores::Starter +end diff --git a/lib/slack_logger.rb b/lib/slack_logger.rb index 12f3666..5622553 100644 --- a/lib/slack_logger.rb +++ b/lib/slack_logger.rb @@ -3,10 +3,14 @@ require './lib/db' config = YAML.load_file('./config.yml') -ENABLE_PRIVATE_CHANNEL = config['logger']['enable_private_channel'] -ENABLE_DIRECT_MESSAGE = config['logger']['enable_direct_message'] class SlackLogger + attr_reader :client + + def initialize + @client = Slack::Web::Client.new + end + def is_private_channel(channel_name) channel_name[0] == 'G' end @@ -16,37 +20,27 @@ def is_direct_message(channel_name) end def update_users - users = Slack.users_list['members'] + users = client.users_list['members'] replace_users(users) end def update_channels - channels = Slack.channels_list['channels'] + channels = client.conversations_list({type: 'public_channel'})['channels'] replace_channels(channels) end - def update_groups - groups = Slack.groups_list['groups'] - replace_channels(groups) - end - - def update_ims - ims = Slack.im_list['ims'] - replace_ims(ims) - end - def update_emojis - emojis = Slack.emoji_list['emoji'] + emojis = client.emoji_list['emoji'] rescue nil replace_emojis(emojis) end # log history messages def fetch_history(target, channel) - messages = Slack.send( + messages = client.send( target, channel: channel, count: 1000, - )['messages'] + )['messages'] rescue nil unless messages.nil? messages.each do |m| @@ -58,13 +52,13 @@ def fetch_history(target, channel) # realtime events def log_realtime - realtime = Slack.realtime + realtime = Slack::RealTime::Client.new realtime.on :message do |m| - if !ENABLE_PRIVATE_CHANNEL and is_private_channel(m['channel']) + if is_private_channel(m['channel']) next end - if !ENABLE_DIRECT_MESSAGE and is_direct_message(m['channel']) + if is_direct_message(m['channel']) next end @@ -97,32 +91,13 @@ def log_realtime update_emojis end - if ENABLE_PRIVATE_CHANNEL - realtime.on :group_joined do |c| - puts "group has joined" - update_groups - end - - realtime.on :group_rename do |c| - puts "group has renamed" - update_groups - end - end - - if ENABLE_DIRECT_MESSAGE - realtime.on :im_created do |c| - puts "direct message has created" - update_ims - end - end - # if connection closed, restart the realtime logger realtime.on :close do puts "websocket disconnected" log_realtime end - realtime.start + realtime.start! end def start @@ -134,26 +109,15 @@ def start update_emojis update_users update_channels - update_groups if ENABLE_PRIVATE_CHANNEL - update_ims if ENABLE_DIRECT_MESSAGE Channels.find.each do |c| puts "loading messages from #{c[:name]}" if c[:is_channel] - fetch_history(:channels_history, c[:id]) - elsif c[:is_group] && ENABLE_PRIVATE_CHANNEL - fetch_history(:groups_history, c[:id]) + fetch_history(:conversations_history, c[:id]) end sleep(1) end - if ENABLE_DIRECT_MESSAGE - Ims.find.each do |i| - fetch_history(:im_history, i[:id]) - sleep(1) - end - end - # realtime event is joined and dont exit current thread realtime_thread.join ensure diff --git a/viewer/viewer.rb b/viewer/viewer.rb index 674cf96..192c275 100644 --- a/viewer/viewer.rb +++ b/viewer/viewer.rb @@ -245,7 +245,8 @@ def search(params) get '/team.json' do content_type :json # TODO: cache in redis or mongodb or in memory? - Slack.team_info['team'].to_json + client = Slack::Web::Client.new + client.team_info['team'].to_json end post '/import_backup' do