ruboty-slack_events 0.2.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d8044e2af28b28bfb9b43de3fd70cf2bd98136a47e16be26ce97f8cc94d01d9
4
- data.tar.gz: 364780ecafa68c98e4b7e7e34a6b15e974a21eb1e8ed4c86ae5447a88f57e30c
3
+ metadata.gz: cdf0c6b6732081933efdc52213d1a9388e1e0ef809e6057da1adb68ef4032d54
4
+ data.tar.gz: 4d23791111c4f38d0811d17ea0adac7a52da52096423155a8baec62d4ce00e66
5
5
  SHA512:
6
- metadata.gz: 8c58744c0accd0247d52ae38c38374baf6584b8a357924db43bcf51e03d14610431314cc4db256f40a6aa225aad96f1f9487292f8a7503a7d2880ae1fe8f4aac
7
- data.tar.gz: fb2137b623fbadb5da6ee60a73f4c0e5f5c190c2be252b4a66c7e20e57c1b2f4bd7db20108b828254e650238420c1feb00b6db611dc152f49e87659dee01cc2a
6
+ metadata.gz: dffe1198d352f9d065f3aff234f78f3f13dfb0627afe4d2120d5e087f4302b32f7ad56aca4af0e3f1f32250bde4f0e0659567d2d0793343f1175be198a773b7e
7
+ data.tar.gz: 0bbaf0b61b5a585cf4989ff014be85a5acc12fbcc1839d2dbc37683503531f6a02edf5ccf47cfdc327731ec722c4d2a77e08b2a4ba8212b5c851f835dbd2ba20
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/CHANGELOG.md CHANGED
@@ -1,4 +1,12 @@
1
1
  ## Unreleased
2
+ ## 0.3.1 - 2025-04-07
3
+
4
+ - Let UserResolver#user_info_by_id return nil on user_not_found error (https://github.com/tomoasleep/ruboty-slack_events/pull/2)
5
+
6
+ ## 0.3.0 - 2025-04-04
7
+
8
+ - Rewrite text filter to parse links and unescape HTML entities
9
+
2
10
  ## 0.2.0 - 2025-04-03
3
11
 
4
12
  - Support reply on threads
data/Rakefile CHANGED
@@ -3,9 +3,11 @@
3
3
  require "bundler/gem_tasks"
4
4
  require "rubocop/rake_task"
5
5
  require "bump/tasks"
6
+ require "rspec/core/rake_task"
6
7
 
7
8
  Bump.changelog = true
8
9
 
9
10
  RuboCop::RakeTask.new
11
+ RSpec::Core::RakeTask.new(:spec)
10
12
 
11
- task default: :rubocop
13
+ task default: %i[rubocop spec]
@@ -62,12 +62,12 @@ module Ruboty
62
62
  @resolvers ||= ::Ruboty::SlackEvents::Resolvers.new(slack_client:)
63
63
  end
64
64
 
65
- def slackify #: ::Ruboty::SlackEvents::Mention::Slackify
66
- @slackify ||= ::Ruboty::SlackEvents::Mention::Slackify.new(resolvers:)
65
+ def slackify #: ::Ruboty::SlackEvents::Filter::Slackify
66
+ @slackify ||= ::Ruboty::SlackEvents::Filter::Slackify.new(resolvers:)
67
67
  end
68
68
 
69
- def rubotify #: ::Ruboty::SlackEvents::Mention::Rubotify
70
- @rubotify ||= ::Ruboty::SlackEvents::Mention::Rubotify.new(resolvers:)
69
+ def rubotify #: ::Ruboty::SlackEvents::Filter::Rubotify
70
+ @rubotify ||= ::Ruboty::SlackEvents::Filter::Rubotify.new(resolvers:)
71
71
  end
72
72
 
73
73
  def ignore_bot_message?
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cgi"
4
+
5
+ module Ruboty
6
+ module SlackEvents
7
+ module Filter
8
+ # Convert Slack text format to Ruboty format
9
+ # For more details of Slack text format, see: https://api.slack.com/reference/surfaces/formatting
10
+ class Rubotify
11
+ attr_reader :resolvers #: Resolvers
12
+
13
+ # @rbs resolvers: Resolvers
14
+ def initialize(resolvers:)
15
+ @resolvers = resolvers
16
+ end
17
+
18
+ # @rbs text: String
19
+ def call(text) #: String
20
+ text
21
+ .then { replace_user_mentions(_1) }
22
+ .then { replace_link(_1) }
23
+ .then { unescape(_1) }
24
+ end
25
+
26
+ private
27
+
28
+ # @rbs text: String
29
+ def replace_user_mentions(text) #: String
30
+ text.gsub(/<@(?<user_id>\w+)>/) do |user_mention|
31
+ user_id = Regexp.last_match[:user_id]
32
+
33
+ user_info = resolvers.user_resolver.user_info_by_id(user_id)
34
+
35
+ next user_mention unless user_info
36
+
37
+ "@#{user_info.name}"
38
+ end
39
+ end
40
+
41
+ # @rbs text: String
42
+ def replace_link(text) #: String
43
+ text.gsub(/<(?<url>[^\>|]+)(?:\|(?<text>[^\>]+))?>/) do |link|
44
+ url = Regexp.last_match[:url]
45
+ text = Regexp.last_match[:text]
46
+
47
+ begin
48
+ next link unless URI.parse(url).scheme
49
+ rescue URI::InvalidURIError, URI::InvalidComponentError
50
+ next link
51
+ end
52
+
53
+ text || url
54
+ end
55
+ end
56
+
57
+ # Unescape HTML entities in the text.
58
+ # See: https://api.slack.com/reference/surfaces/formatting#escaping
59
+ # @rbs text: String
60
+ def unescape(text) #: String
61
+ CGI.unescapeHTML(text)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -2,7 +2,8 @@
2
2
 
3
3
  module Ruboty
4
4
  module SlackEvents
5
- module Mention
5
+ module Filter
6
+ # Convert Ruboty text format to Slack text format
6
7
  class Slackify
7
8
  attr_reader :resolvers #: Resolvers
8
9
 
@@ -34,6 +34,9 @@ module Ruboty
34
34
  Logger.debug { "Slack API: users.info(#{user_id})" }
35
35
  res = slack_client.users_info(user: user_id)
36
36
  res.user
37
+ rescue Slack::Web::Api::Errors::UserNotFound => e
38
+ Logger.debug { "Slack API Error: users.info(#{user_id}) => #{e.message}" }
39
+ nil
37
40
  end
38
41
  end
39
42
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ruboty
4
4
  module SlackEvents
5
- VERSION = "0.2.0"
5
+ VERSION = "0.3.1"
6
6
  end
7
7
  end
@@ -9,8 +9,8 @@ end
9
9
  require_relative "slack_events/version"
10
10
 
11
11
  require_relative "slack_events/api/socket_client"
12
- require_relative "slack_events/mention/slackify"
13
- require_relative "slack_events/mention/rubotify"
12
+ require_relative "slack_events/filter/slackify"
13
+ require_relative "slack_events/filter/rubotify"
14
14
  require_relative "slack_events/resolvers"
15
15
  require_relative "slack_events/logger"
16
16
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruboty-slack_events
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomoya Chiba
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-04-03 00:00:00.000000000 Z
10
+ date: 2025-04-07 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: async-websocket
@@ -58,6 +58,7 @@ executables: []
58
58
  extensions: []
59
59
  extra_rdoc_files: []
60
60
  files:
61
+ - ".rspec"
61
62
  - ".rubocop.yml"
62
63
  - CHANGELOG.md
63
64
  - CODE_OF_CONDUCT.md
@@ -69,9 +70,9 @@ files:
69
70
  - lib/ruboty/slack_events.rb
70
71
  - lib/ruboty/slack_events/api/socket_client.rb
71
72
  - lib/ruboty/slack_events/app_info.rb
73
+ - lib/ruboty/slack_events/filter/rubotify.rb
74
+ - lib/ruboty/slack_events/filter/slackify.rb
72
75
  - lib/ruboty/slack_events/logger.rb
73
- - lib/ruboty/slack_events/mention/rubotify.rb
74
- - lib/ruboty/slack_events/mention/slackify.rb
75
76
  - lib/ruboty/slack_events/resolvers.rb
76
77
  - lib/ruboty/slack_events/resolvers/user_resolver.rb
77
78
  - lib/ruboty/slack_events/version.rb
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Ruboty
4
- module SlackEvents
5
- module Mention
6
- class Rubotify
7
- attr_reader :resolvers #: Resolvers
8
-
9
- # @rbs resolvers: Resolvers
10
- def initialize(resolvers:)
11
- @resolvers = resolvers
12
- end
13
-
14
- # @rbs text: String
15
- def call(text) #: String
16
- replace_user_mentions(text)
17
- end
18
-
19
- # @rbs text: String
20
- def replace_user_mentions(text) #: String
21
- text.gsub(/<@(?<user_id>\w+)>/) do |user_mention|
22
- user_id = Regexp.last_match[:user_id]
23
-
24
- user_info = resolvers.user_resolver.user_info_by_id(user_id)
25
-
26
- next user_mention unless user_info
27
-
28
- "@#{user_info.name}"
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end