ruboty-slack_events 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d8044e2af28b28bfb9b43de3fd70cf2bd98136a47e16be26ce97f8cc94d01d9
4
- data.tar.gz: 364780ecafa68c98e4b7e7e34a6b15e974a21eb1e8ed4c86ae5447a88f57e30c
3
+ metadata.gz: c779a46edaf630035527d72df0e40a57eb8104421f8151eeb8c3623202ce8537
4
+ data.tar.gz: bcbf6cb2c83dc15cea1c270404820dd6f9bdefa570de19478425c77265915626
5
5
  SHA512:
6
- metadata.gz: 8c58744c0accd0247d52ae38c38374baf6584b8a357924db43bcf51e03d14610431314cc4db256f40a6aa225aad96f1f9487292f8a7503a7d2880ae1fe8f4aac
7
- data.tar.gz: fb2137b623fbadb5da6ee60a73f4c0e5f5c190c2be252b4a66c7e20e57c1b2f4bd7db20108b828254e650238420c1feb00b6db611dc152f49e87659dee01cc2a
6
+ metadata.gz: c3c5e4fd09c22b7c52adcdcc556494d83cf559d88f548c71e2f050c939e004b8d3b793be1f81dbe03e95ce327aab65009d57001a1c2d9b48be7a8c0fa20dfdb1
7
+ data.tar.gz: 0f4192b9d52fb4c49ef47cdd7986ea50b86b5af077dfc392a4d62062867b5884094ea79b222e093dd7947bff122838c37b88e7a6146e63fce54fb8b813ba89b2
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
1
  ## Unreleased
2
+ ## 0.3.0 - 2025-04-04
3
+
4
+ - Rewrite text filter to parse links and unescape HTML entities
5
+
2
6
  ## 0.2.0 - 2025-04-03
3
7
 
4
8
  - 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
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ruboty
4
4
  module SlackEvents
5
- VERSION = "0.2.0"
5
+ VERSION = "0.3.0"
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.0
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-04 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