slk 0.1.0 → 0.2.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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -1
  3. data/README.md +5 -5
  4. data/bin/slk +3 -3
  5. data/lib/{slack_cli → slk}/api/activity.rb +10 -11
  6. data/lib/{slack_cli → slk}/api/bots.rb +5 -4
  7. data/lib/slk/api/client.rb +51 -0
  8. data/lib/{slack_cli → slk}/api/conversations.rb +14 -13
  9. data/lib/slk/api/dnd.rb +41 -0
  10. data/lib/{slack_cli → slk}/api/emoji.rb +4 -3
  11. data/lib/{slack_cli → slk}/api/threads.rb +13 -12
  12. data/lib/{slack_cli → slk}/api/usergroups.rb +2 -1
  13. data/lib/slk/api/users.rb +105 -0
  14. data/lib/slk/cli.rb +157 -0
  15. data/lib/slk/commands/activity.rb +152 -0
  16. data/lib/{slack_cli → slk}/commands/base.rb +67 -41
  17. data/lib/slk/commands/cache.rb +141 -0
  18. data/lib/slk/commands/catchup.rb +411 -0
  19. data/lib/slk/commands/config.rb +114 -0
  20. data/lib/slk/commands/dnd.rb +172 -0
  21. data/lib/slk/commands/emoji.rb +352 -0
  22. data/lib/slk/commands/help.rb +97 -0
  23. data/lib/slk/commands/messages.rb +299 -0
  24. data/lib/slk/commands/presence.rb +109 -0
  25. data/lib/slk/commands/preset.rb +231 -0
  26. data/lib/slk/commands/status.rb +223 -0
  27. data/lib/slk/commands/thread.rb +72 -0
  28. data/lib/slk/commands/unread.rb +305 -0
  29. data/lib/slk/commands/workspaces.rb +168 -0
  30. data/lib/slk/formatters/activity_formatter.rb +148 -0
  31. data/lib/slk/formatters/attachment_formatter.rb +65 -0
  32. data/lib/slk/formatters/block_formatter.rb +57 -0
  33. data/lib/{slack_cli → slk}/formatters/duration_formatter.rb +6 -5
  34. data/lib/slk/formatters/emoji_replacer.rb +141 -0
  35. data/lib/slk/formatters/json_message_formatter.rb +95 -0
  36. data/lib/slk/formatters/mention_replacer.rb +158 -0
  37. data/lib/slk/formatters/message_formatter.rb +174 -0
  38. data/lib/{slack_cli → slk}/formatters/output.rb +7 -6
  39. data/lib/slk/formatters/reaction_formatter.rb +87 -0
  40. data/lib/{slack_cli → slk}/models/channel.rb +12 -10
  41. data/lib/slk/models/duration.rb +94 -0
  42. data/lib/slk/models/message.rb +242 -0
  43. data/lib/slk/models/preset.rb +78 -0
  44. data/lib/{slack_cli → slk}/models/reaction.rb +6 -6
  45. data/lib/{slack_cli → slk}/models/status.rb +6 -6
  46. data/lib/slk/models/user.rb +55 -0
  47. data/lib/slk/models/workspace.rb +54 -0
  48. data/lib/{slack_cli → slk}/runner.rb +22 -19
  49. data/lib/slk/services/activity_enricher.rb +124 -0
  50. data/lib/slk/services/api_client.rb +145 -0
  51. data/lib/{slack_cli → slk}/services/cache_store.rb +20 -17
  52. data/lib/{slack_cli → slk}/services/configuration.rb +9 -8
  53. data/lib/slk/services/emoji_downloader.rb +103 -0
  54. data/lib/slk/services/emoji_searcher.rb +72 -0
  55. data/lib/{slack_cli → slk}/services/encryption.rb +11 -14
  56. data/lib/slk/services/gemoji_sync.rb +97 -0
  57. data/lib/{slack_cli → slk}/services/preset_store.rb +34 -33
  58. data/lib/slk/services/reaction_enricher.rb +82 -0
  59. data/lib/slk/services/setup_wizard.rb +131 -0
  60. data/lib/slk/services/target_resolver.rb +108 -0
  61. data/lib/{slack_cli → slk}/services/token_store.rb +11 -10
  62. data/lib/slk/services/unread_marker.rb +101 -0
  63. data/lib/{slack_cli → slk}/support/error_logger.rb +2 -1
  64. data/lib/{slack_cli → slk}/support/help_formatter.rb +36 -44
  65. data/lib/{slack_cli → slk}/support/inline_images.rb +28 -19
  66. data/lib/slk/support/interactive_prompt.rb +29 -0
  67. data/lib/{slack_cli → slk}/support/slack_url_parser.rb +15 -17
  68. data/lib/slk/support/text_wrapper.rb +57 -0
  69. data/lib/slk/support/user_resolver.rb +141 -0
  70. data/lib/{slack_cli → slk}/support/xdg_paths.rb +6 -5
  71. data/lib/slk/version.rb +5 -0
  72. data/lib/slk.rb +112 -0
  73. metadata +80 -59
  74. data/lib/slack_cli/api/client.rb +0 -49
  75. data/lib/slack_cli/api/dnd.rb +0 -40
  76. data/lib/slack_cli/api/users.rb +0 -101
  77. data/lib/slack_cli/cli.rb +0 -118
  78. data/lib/slack_cli/commands/activity.rb +0 -292
  79. data/lib/slack_cli/commands/cache.rb +0 -116
  80. data/lib/slack_cli/commands/catchup.rb +0 -484
  81. data/lib/slack_cli/commands/config.rb +0 -159
  82. data/lib/slack_cli/commands/dnd.rb +0 -143
  83. data/lib/slack_cli/commands/emoji.rb +0 -412
  84. data/lib/slack_cli/commands/help.rb +0 -76
  85. data/lib/slack_cli/commands/messages.rb +0 -317
  86. data/lib/slack_cli/commands/presence.rb +0 -107
  87. data/lib/slack_cli/commands/preset.rb +0 -239
  88. data/lib/slack_cli/commands/status.rb +0 -194
  89. data/lib/slack_cli/commands/thread.rb +0 -62
  90. data/lib/slack_cli/commands/unread.rb +0 -312
  91. data/lib/slack_cli/commands/workspaces.rb +0 -151
  92. data/lib/slack_cli/formatters/emoji_replacer.rb +0 -143
  93. data/lib/slack_cli/formatters/mention_replacer.rb +0 -154
  94. data/lib/slack_cli/formatters/message_formatter.rb +0 -429
  95. data/lib/slack_cli/models/duration.rb +0 -85
  96. data/lib/slack_cli/models/message.rb +0 -217
  97. data/lib/slack_cli/models/preset.rb +0 -73
  98. data/lib/slack_cli/models/user.rb +0 -56
  99. data/lib/slack_cli/models/workspace.rb +0 -52
  100. data/lib/slack_cli/services/api_client.rb +0 -149
  101. data/lib/slack_cli/services/reaction_enricher.rb +0 -87
  102. data/lib/slack_cli/support/user_resolver.rb +0 -114
  103. data/lib/slack_cli/version.rb +0 -5
  104. data/lib/slack_cli.rb +0 -91
@@ -1,114 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SlackCli
4
- module Support
5
- # Shared logic for resolving user and channel names from Slack data.
6
- # Include this module in commands that need to look up user/channel names.
7
- #
8
- # == Required Interface
9
- # Including classes must provide these methods:
10
- # - runner: Returns the Runner instance for API access
11
- # - cache_store: Returns the CacheStore for name lookups
12
- # - debug(message): Logs debug messages (can be a no-op)
13
- module UserResolver
14
- # Resolves a DM channel ID to the user's display name
15
- # @param workspace [Models::Workspace] The workspace to look up in
16
- # @param channel_id [String] The DM channel ID (starts with D)
17
- # @param conversations [Api::Conversations] API client for conversation info
18
- # @return [String] User name or channel ID if not found
19
- def resolve_dm_user_name(workspace, channel_id, conversations)
20
- info = conversations.info(channel: channel_id)
21
- return channel_id unless info["ok"] && info["channel"]
22
-
23
- user_id = info["channel"]["user"]
24
- return channel_id unless user_id
25
-
26
- # Try cache first
27
- cached = cache_store.get_user(workspace.name, user_id)
28
- return cached if cached
29
-
30
- # Try users API lookup
31
- begin
32
- users_api = runner.users_api(workspace.name)
33
- user_info = users_api.info(user_id)
34
- if user_info["ok"] && user_info["user"]
35
- profile = user_info["user"]["profile"] || {}
36
- name = profile["display_name"]
37
- name = profile["real_name"] if name.to_s.empty?
38
- name = user_info["user"]["name"] if name.to_s.empty?
39
- if name && !name.empty?
40
- cache_store.set_user(workspace.name, user_id, name, persist: true)
41
- return name
42
- end
43
- end
44
- rescue ApiError => e
45
- debug("User lookup failed for #{user_id}: #{e.message}")
46
- end
47
-
48
- user_id
49
- rescue ApiError => e
50
- debug("DM info lookup failed for #{channel_id}: #{e.message}")
51
- channel_id
52
- end
53
-
54
- # Resolves a channel ID to a formatted label (@username or #channel)
55
- # @param workspace [Models::Workspace] The workspace to look up in
56
- # @param channel_id [String] The channel ID
57
- # @return [String] Formatted label like "@username" or "#channel"
58
- def resolve_conversation_label(workspace, channel_id)
59
- # DM channels start with D
60
- if channel_id.start_with?("D")
61
- conversations = runner.conversations_api(workspace.name)
62
- user_name = resolve_dm_user_name(workspace, channel_id, conversations)
63
- return "@#{user_name}"
64
- end
65
-
66
- # Try cache first
67
- cached_name = cache_store.get_channel_name(workspace.name, channel_id)
68
- return "##{cached_name}" if cached_name
69
-
70
- # Try API lookup
71
- begin
72
- conversations = runner.conversations_api(workspace.name)
73
- response = conversations.info(channel: channel_id)
74
- if response["ok"] && response["channel"]
75
- name = response["channel"]["name"]
76
- if name
77
- cache_store.set_channel(workspace.name, name, channel_id)
78
- return "##{name}"
79
- end
80
- end
81
- rescue ApiError => e
82
- debug("Channel info lookup failed for #{channel_id}: #{e.message}")
83
- end
84
-
85
- "##{channel_id}"
86
- end
87
-
88
- # Extracts the user name from a message hash
89
- # @param msg [Hash] The message data from API
90
- # @param workspace [Models::Workspace] The workspace context
91
- # @return [String] User name, user_id as fallback, or "unknown" if neither found
92
- def extract_user_from_message(msg, workspace)
93
- # Try user_profile embedded in message
94
- if msg["user_profile"]
95
- name = msg["user_profile"]["display_name"]
96
- name = msg["user_profile"]["real_name"] if name.to_s.empty?
97
- return name unless name.to_s.empty?
98
- end
99
-
100
- # Try username field
101
- return msg["username"] unless msg["username"].to_s.empty?
102
-
103
- # Try cache
104
- user_id = msg["user"] || msg["bot_id"]
105
- if user_id
106
- cached = cache_store.get_user(workspace.name, user_id)
107
- return cached if cached
108
- end
109
-
110
- user_id || "unknown"
111
- end
112
- end
113
- end
114
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SlackCli
4
- VERSION = "0.1.0"
5
- end
data/lib/slack_cli.rb DELETED
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "net/http"
4
- require "uri"
5
- require "json"
6
- require "fileutils"
7
- require "optparse"
8
- require "time"
9
- require "io/console"
10
-
11
- module SlackCli
12
- class Error < StandardError; end
13
- class ApiError < Error; end
14
- class ConfigError < Error; end
15
- class EncryptionError < Error; end
16
- class TokenStoreError < Error; end
17
- class WorkspaceNotFoundError < ConfigError; end
18
- class PresetNotFoundError < ConfigError; end
19
-
20
- autoload :VERSION, "slack_cli/version"
21
- autoload :CLI, "slack_cli/cli"
22
- autoload :Runner, "slack_cli/runner"
23
-
24
- module Models
25
- autoload :Duration, "slack_cli/models/duration"
26
- autoload :Workspace, "slack_cli/models/workspace"
27
- autoload :Status, "slack_cli/models/status"
28
- autoload :Message, "slack_cli/models/message"
29
- autoload :Reaction, "slack_cli/models/reaction"
30
- autoload :User, "slack_cli/models/user"
31
- autoload :Channel, "slack_cli/models/channel"
32
- autoload :Preset, "slack_cli/models/preset"
33
- end
34
-
35
- module Services
36
- autoload :ApiClient, "slack_cli/services/api_client"
37
- autoload :Configuration, "slack_cli/services/configuration"
38
- autoload :TokenStore, "slack_cli/services/token_store"
39
- autoload :CacheStore, "slack_cli/services/cache_store"
40
- autoload :PresetStore, "slack_cli/services/preset_store"
41
- autoload :Encryption, "slack_cli/services/encryption"
42
- autoload :ReactionEnricher, "slack_cli/services/reaction_enricher"
43
- end
44
-
45
- module Formatters
46
- autoload :Output, "slack_cli/formatters/output"
47
- autoload :DurationFormatter, "slack_cli/formatters/duration_formatter"
48
- autoload :MentionReplacer, "slack_cli/formatters/mention_replacer"
49
- autoload :EmojiReplacer, "slack_cli/formatters/emoji_replacer"
50
- autoload :MessageFormatter, "slack_cli/formatters/message_formatter"
51
- end
52
-
53
- module Commands
54
- autoload :Base, "slack_cli/commands/base"
55
- autoload :Status, "slack_cli/commands/status"
56
- autoload :Presence, "slack_cli/commands/presence"
57
- autoload :Dnd, "slack_cli/commands/dnd"
58
- autoload :Messages, "slack_cli/commands/messages"
59
- autoload :Thread, "slack_cli/commands/thread"
60
- autoload :Unread, "slack_cli/commands/unread"
61
- autoload :Catchup, "slack_cli/commands/catchup"
62
- autoload :Activity, "slack_cli/commands/activity"
63
- autoload :Preset, "slack_cli/commands/preset"
64
- autoload :Workspaces, "slack_cli/commands/workspaces"
65
- autoload :Cache, "slack_cli/commands/cache"
66
- autoload :Emoji, "slack_cli/commands/emoji"
67
- autoload :Config, "slack_cli/commands/config"
68
- autoload :Help, "slack_cli/commands/help"
69
- end
70
-
71
- module Api
72
- autoload :Users, "slack_cli/api/users"
73
- autoload :Conversations, "slack_cli/api/conversations"
74
- autoload :Dnd, "slack_cli/api/dnd"
75
- autoload :Emoji, "slack_cli/api/emoji"
76
- autoload :Client, "slack_cli/api/client"
77
- autoload :Bots, "slack_cli/api/bots"
78
- autoload :Threads, "slack_cli/api/threads"
79
- autoload :Usergroups, "slack_cli/api/usergroups"
80
- autoload :Activity, "slack_cli/api/activity"
81
- end
82
-
83
- module Support
84
- autoload :XdgPaths, "slack_cli/support/xdg_paths"
85
- autoload :SlackUrlParser, "slack_cli/support/slack_url_parser"
86
- autoload :InlineImages, "slack_cli/support/inline_images"
87
- autoload :HelpFormatter, "slack_cli/support/help_formatter"
88
- autoload :ErrorLogger, "slack_cli/support/error_logger"
89
- autoload :UserResolver, "slack_cli/support/user_resolver"
90
- end
91
- end