slack-smart-bot 1.14.1 → 1.15.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 (176) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +237 -48
  3. data/img/chat_gpt.png +0 -0
  4. data/img/chat_gpt_session.png +0 -0
  5. data/img/chat_gpt_share.png +0 -0
  6. data/img/command_add_sc.png +0 -0
  7. data/img/command_bot_help_echo.png +0 -0
  8. data/img/command_loop.png +0 -0
  9. data/img/command_my_timeoff.png +0 -0
  10. data/img/command_recap.png +0 -0
  11. data/img/command_repl1.png +0 -0
  12. data/img/command_repl2.png +0 -0
  13. data/img/command_ruby.png +0 -0
  14. data/img/command_run_repl.png +0 -0
  15. data/img/command_see_announcements.png +0 -0
  16. data/img/command_see_statuses.png +0 -0
  17. data/img/command_see_team.png +0 -0
  18. data/img/command_summarize.png +0 -0
  19. data/img/commands_inline.png +0 -0
  20. data/img/commands_on_demand.png +0 -0
  21. data/img/commands_on_external_call.png +0 -0
  22. data/img/image_editing.png +0 -0
  23. data/img/image_generation.png +0 -0
  24. data/img/image_variations.png +0 -0
  25. data/img/openai-300.png +0 -0
  26. data/img/openai.png +0 -0
  27. data/img/slack-300.png +0 -0
  28. data/img/slack.png +0 -0
  29. data/img/smart-bot-150.png +0 -0
  30. data/img/smart-bot-profile-pic-2.png +0 -0
  31. data/img/smart-bot-profile-pic.png +0 -0
  32. data/img/smart-bot.png +0 -0
  33. data/img/whisper.png +0 -0
  34. data/lib/slack/smart-bot/ai/open_ai/connect.rb +165 -43
  35. data/lib/slack/smart-bot/ai/open_ai/models.rb +61 -9
  36. data/lib/slack/smart-bot/ai/open_ai/send_gpt_chat.rb +67 -11
  37. data/lib/slack/smart-bot/ai/open_ai/send_image_edit.rb +4 -3
  38. data/lib/slack/smart-bot/ai/open_ai/send_image_generation.rb +4 -4
  39. data/lib/slack/smart-bot/ai/open_ai/send_image_variation.rb +4 -3
  40. data/lib/slack/smart-bot/ai/open_ai/whisper_transcribe.rb +4 -3
  41. data/lib/slack/smart-bot/comm/ask.rb +20 -8
  42. data/lib/slack/smart-bot/comm/dont_understand.rb +2 -2
  43. data/lib/slack/smart-bot/comm/event_hello.rb +30 -1
  44. data/lib/slack/smart-bot/comm/get_channel_members.rb +2 -1
  45. data/lib/slack/smart-bot/comm/get_presence.rb +1 -0
  46. data/lib/slack/smart-bot/comm/get_smartbot_team_info.rb +10 -0
  47. data/lib/slack/smart-bot/comm/get_user_info.rb +45 -6
  48. data/lib/slack/smart-bot/comm/get_users.rb +8 -1
  49. data/lib/slack/smart-bot/comm/respond.rb +225 -196
  50. data/lib/slack/smart-bot/comm/send_msg_channel.rb +2 -2
  51. data/lib/slack/smart-bot/comm/send_msg_user.rb +10 -9
  52. data/lib/slack/smart-bot/comm/unreact.rb +2 -2
  53. data/lib/slack/smart-bot/comm.rb +1 -0
  54. data/lib/slack/smart-bot/commands/general/add_admin.rb +16 -6
  55. data/lib/slack/smart-bot/commands/general/add_announcement.rb +3 -3
  56. data/lib/slack/smart-bot/commands/general/add_vacation.rb +28 -12
  57. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat.rb +272 -23
  58. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_add_collaborator.rb +42 -0
  59. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_copy_session.rb +89 -0
  60. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_delete_session.rb +45 -0
  61. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_get_prompts.rb +41 -0
  62. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_list_sessions.rb +81 -0
  63. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_share_session.rb +52 -0
  64. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_use_model.rb +52 -0
  65. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_edit_image.rb +14 -11
  66. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_generate_image.rb +15 -11
  67. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_models.rb +29 -17
  68. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_variations_image.rb +16 -13
  69. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_whisper.rb +13 -7
  70. data/lib/slack/smart-bot/commands/general/allow_access.rb +8 -4
  71. data/lib/slack/smart-bot/commands/general/bot_help.rb +24 -9
  72. data/lib/slack/smart-bot/commands/general/bye_bot.rb +9 -5
  73. data/lib/slack/smart-bot/commands/general/delete_announcement.rb +2 -1
  74. data/lib/slack/smart-bot/commands/general/delete_share.rb +2 -1
  75. data/lib/slack/smart-bot/commands/general/deny_access.rb +1 -1
  76. data/lib/slack/smart-bot/commands/general/get_smartbot_readme.rb +15 -0
  77. data/lib/slack/smart-bot/commands/general/hi_bot.rb +10 -4
  78. data/lib/slack/smart-bot/commands/general/personal_settings.rb +26 -8
  79. data/lib/slack/smart-bot/commands/general/poster.rb +26 -2
  80. data/lib/slack/smart-bot/commands/general/public_holidays.rb +14 -24
  81. data/lib/slack/smart-bot/commands/general/recap.rb +399 -0
  82. data/lib/slack/smart-bot/commands/general/remove_admin.rb +19 -9
  83. data/lib/slack/smart-bot/commands/general/remove_vacation.rb +23 -6
  84. data/lib/slack/smart-bot/commands/general/see_access.rb +2 -1
  85. data/lib/slack/smart-bot/commands/general/see_admins.rb +8 -4
  86. data/lib/slack/smart-bot/commands/general/see_announcements.rb +5 -5
  87. data/lib/slack/smart-bot/commands/general/see_favorite_commands.rb +4 -4
  88. data/lib/slack/smart-bot/commands/general/see_shares.rb +1 -1
  89. data/lib/slack/smart-bot/commands/general/see_vacations.rb +34 -17
  90. data/lib/slack/smart-bot/commands/general/set_public_holidays.rb +4 -2
  91. data/lib/slack/smart-bot/commands/general/share_messages.rb +3 -3
  92. data/lib/slack/smart-bot/commands/general/summarize.rb +191 -0
  93. data/lib/slack/smart-bot/commands/general/teams/add_team.rb +4 -8
  94. data/lib/slack/smart-bot/commands/general/teams/delete_team.rb +3 -3
  95. data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team.rb +34 -29
  96. data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team_comment.rb +1 -1
  97. data/lib/slack/smart-bot/commands/general/teams/memos/delete_memo_team.rb +6 -4
  98. data/lib/slack/smart-bot/commands/general/teams/memos/see_memo_team.rb +26 -15
  99. data/lib/slack/smart-bot/commands/general/teams/memos/see_memos_team.rb +33 -24
  100. data/lib/slack/smart-bot/commands/general/teams/memos/set_memo_status.rb +4 -4
  101. data/lib/slack/smart-bot/commands/general/teams/ping_team.rb +10 -8
  102. data/lib/slack/smart-bot/commands/general/teams/see_teams.rb +73 -61
  103. data/lib/slack/smart-bot/commands/general/teams/see_vacations_team.rb +28 -13
  104. data/lib/slack/smart-bot/commands/general/teams/update_team.rb +9 -9
  105. data/lib/slack/smart-bot/commands/general_bot_commands.rb +1153 -835
  106. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +19 -17
  107. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +12 -9
  108. data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +2 -0
  109. data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +1 -0
  110. data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +5 -3
  111. data/lib/slack/smart-bot/commands/on_bot/admin_master/delete_message.rb +2 -3
  112. data/lib/slack/smart-bot/commands/on_bot/admin_master/get_bot_logs.rb +2 -3
  113. data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +2 -3
  114. data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +7 -6
  115. data/lib/slack/smart-bot/commands/on_bot/admin_master/update_message.rb +2 -3
  116. data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +1 -1
  117. data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +21 -20
  118. data/lib/slack/smart-bot/commands/on_bot/general/bot_stats.rb +40 -7
  119. data/lib/slack/smart-bot/commands/on_bot/general/bot_status.rb +6 -2
  120. data/lib/slack/smart-bot/commands/on_bot/general/stop_using_rules.rb +7 -6
  121. data/lib/slack/smart-bot/commands/on_bot/general/suggest_command.rb +5 -4
  122. data/lib/slack/smart-bot/commands/on_bot/general/use_rules.rb +4 -3
  123. data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +4 -4
  124. data/lib/slack/smart-bot/commands/on_bot/kill_repl.rb +1 -1
  125. data/lib/slack/smart-bot/commands/on_bot/repl.rb +110 -53
  126. data/lib/slack/smart-bot/commands/on_bot/repl_client.rb +35 -29
  127. data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +5 -5
  128. data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +1 -2
  129. data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +5 -4
  130. data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +22 -11
  131. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +12 -7
  132. data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +2 -2
  133. data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +1 -1
  134. data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +5 -5
  135. data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +5 -5
  136. data/lib/slack/smart-bot/commands/on_master/create_bot.rb +3 -3
  137. data/lib/slack/smart-bot/commands.rb +10 -0
  138. data/lib/slack/smart-bot/config.rb +126 -0
  139. data/lib/slack/smart-bot/listen.rb +12 -11
  140. data/lib/slack/smart-bot/process.rb +62 -55
  141. data/lib/slack/smart-bot/process_first.rb +106 -65
  142. data/lib/slack/smart-bot/treat_message.rb +79 -47
  143. data/lib/slack/smart-bot/utils/answer.rb +11 -3
  144. data/lib/slack/smart-bot/utils/answer_delete.rb +11 -3
  145. data/lib/slack/smart-bot/utils/check_vacations.rb +21 -3
  146. data/lib/slack/smart-bot/utils/create_routine_thread.rb +13 -13
  147. data/lib/slack/smart-bot/utils/display_calendar.rb +42 -8
  148. data/lib/slack/smart-bot/utils/encryption/decrypt.rb +16 -9
  149. data/lib/slack/smart-bot/utils/encryption/encrypt.rb +14 -11
  150. data/lib/slack/smart-bot/utils/find_user.rb +71 -0
  151. data/lib/slack/smart-bot/utils/get_access_channels.rb +22 -3
  152. data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +3 -4
  153. data/lib/slack/smart-bot/utils/get_command_ids.rb +5 -5
  154. data/lib/slack/smart-bot/utils/get_countries_candelarific.rb +18 -0
  155. data/lib/slack/smart-bot/utils/get_help.rb +21 -19
  156. data/lib/slack/smart-bot/utils/get_openai_sessions.rb +47 -0
  157. data/lib/slack/smart-bot/utils/get_personal_settings.rb +29 -3
  158. data/lib/slack/smart-bot/utils/get_rules_imported.rb +27 -6
  159. data/lib/slack/smart-bot/utils/get_shares.rb +1 -1
  160. data/lib/slack/smart-bot/utils/get_team_members.rb +4 -4
  161. data/lib/slack/smart-bot/utils/get_vacations.rb +15 -7
  162. data/lib/slack/smart-bot/utils/has_access.rb +10 -4
  163. data/lib/slack/smart-bot/utils/is_admin.rb +25 -17
  164. data/lib/slack/smart-bot/utils/local_time.rb +29 -0
  165. data/lib/slack/smart-bot/utils/save_stats.rb +5 -3
  166. data/lib/slack/smart-bot/utils/update_access_channels.rb +19 -3
  167. data/lib/slack/smart-bot/utils/update_openai_sessions.rb +42 -0
  168. data/lib/slack/smart-bot/utils/update_personal_settings.rb +11 -3
  169. data/lib/slack/smart-bot/utils/update_rules_imported.rb +18 -3
  170. data/lib/slack/smart-bot/utils/update_vacations.rb +5 -2
  171. data/lib/slack/smart-bot/utils/upgrade_to_use_team_ids.rb +276 -0
  172. data/lib/slack/smart-bot/utils.rb +6 -1
  173. data/lib/slack-smart-bot.rb +182 -76
  174. data/lib/slack-smart-bot_general_commands.rb +10 -9
  175. data/whats_new.txt +30 -13
  176. metadata +152 -18
@@ -0,0 +1,41 @@
1
+ class SlackSmartBot
2
+ module Commands
3
+ module General
4
+ module AI
5
+ module OpenAI
6
+ def open_ai_chat_get_prompts(session_name)
7
+ save_stats(__method__)
8
+
9
+ user = Thread.current[:user].dup
10
+ team_id_user = Thread.current[:team_id_user]
11
+
12
+ @active_chat_gpt_sessions[team_id_user] ||= {}
13
+
14
+ get_openai_sessions(session_name)
15
+
16
+ if @open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name)
17
+ prompts = @ai_gpt[team_id_user][session_name].join("\n")
18
+ prompts.gsub!(/^Me>\s*/, "\nMe> ")
19
+ prompts.gsub!(/^chatGPT>\s*/, "\nchatGPT> ")
20
+ if prompts.length > 3000
21
+ respond "*ChatGPT*: Session *#{session_name}*."
22
+ send_file(Thread.current[:dest], "ChatGPT prompts for #{session_name}", "prompts.txt", "prompts", "text/plain", "text", content: prompts)
23
+ elsif prompts.empty?
24
+ respond "*ChatGPT*: Session *#{session_name}* has no prompts."
25
+ else
26
+ respond "*ChatGPT*: Session *#{session_name}*."
27
+ if prompts.include?("`")
28
+ respond prompts
29
+ else
30
+ respond "```#{prompts}```"
31
+ end
32
+ end
33
+ else
34
+ respond "*ChatGPT*: You don't have a session with that name.\nCall `chatGPT list sessions` to see your saved sessions."
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,81 @@
1
+ class SlackSmartBot
2
+ module Commands
3
+ module General
4
+ module AI
5
+ module OpenAI
6
+ def open_ai_chat_list_sessions(type, tag: '') #type can be :own or :public or :shared
7
+ save_stats(__method__)
8
+
9
+ user = Thread.current[:user].dup
10
+ team_id = user.team_id
11
+ team_id_user = Thread.current[:team_id_user]
12
+
13
+ channel = Thread.current[:dest]
14
+
15
+ get_openai_sessions()
16
+ check_users = []
17
+ if type == :own
18
+ check_users << team_id_user
19
+ else
20
+ check_users = @open_ai.keys
21
+ end
22
+
23
+ list_sessions = []
24
+ check_users.each do |team_user_name|
25
+ if @open_ai.key?(team_user_name) and @open_ai[team_user_name].key?(:chat_gpt) and
26
+ @open_ai[team_user_name][:chat_gpt].key?(:sessions) and
27
+ @open_ai[team_user_name][:chat_gpt][:sessions].size > 0
28
+
29
+ sessions = @open_ai[team_user_name][:chat_gpt][:sessions].keys.sort
30
+ sessions.delete("")
31
+ sessions.each do |session_name|
32
+ session = @open_ai[team_user_name][:chat_gpt][:sessions][session_name]
33
+ if (type == :own and session[:user_creator] == user.name) or
34
+ (type == :public and session.key?(:public) and session[:public]) or
35
+ (type == :shared and session.key?(:shared) and session[:shared].include?(channel))
36
+
37
+ if tag == '' or (session.key?(:tag) and tag == session[:tag].to_s)
38
+ if !session.key?(:team_creator) or session[:team_creator] == ''
39
+ session[:team_creator] = config.team_id
40
+ end
41
+ list_sessions << "*`#{session_name}`*: "
42
+ list_sessions[-1]<<"_#{session[:description]}_ " if session.key?(:description) and session[:description].to_s.strip != ''
43
+ list_sessions[-1]<<"*(public)* " if session.key?(:public) and session[:public] and type != :public
44
+ list_sessions[-1]<<"(shared on <##{session.shared.join(">, <#")}>) " if session.key?(:shared) and session[:shared].size > 0 and type != :shared
45
+ list_sessions[-1]<<"\n *#{session.num_prompts}* prompts. "
46
+ list_sessions[-1]<<" tag: >*#{session.tag}*. " if session.key?(:tag) and session[:tag].to_s != '' and tag == ''
47
+ list_sessions[-1]<<"shared by: *#{session.user_creator}*. " if type != :own
48
+ list_sessions[-1]<<"original creator: *#{session.copy_of_user}*. " if session.key?(:copy_of_user) and session[:copy_of_user] != '' and session[:copy_of_user] != session[:user_creator]
49
+ list_sessions[-1]<<"model: #{session.model}. " if session.key?(:model) and session[:model] != ''
50
+ list_sessions[-1]<<"copies: #{session.users_copying.size}. " if session.key?(:users_copying) and session[:users_copying].size > 0
51
+ list_sessions[-1]<<"users: #{session.users_copying.uniq.size}. " if session.key?(:users_copying) and session[:users_copying].size > 0
52
+ list_sessions[-1]<<"collaborators: *#{session.collaborators.join(", ").gsub("#{team_id}_","")}*. " unless !session.key?(:collaborators) or session.collaborators.empty?
53
+ list_sessions[-1]<<"last prompt: #{session.last_activity.gsub("-", "/")[0..15]}. " if type == :own
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ if list_sessions.size > 0
60
+ list_sessions[-1] << "\n\n:information_source: To start using a session: `chatgpt use USER_SHARED SESSION_NAME`" if type != :own
61
+ if type == :own
62
+ respond "*ChatGPT*: Your#{" >*#{tag}*" if tag!=''} sessions:\n\n#{list_sessions.join("\n\n")}"
63
+ elsif type == :public
64
+ respond "*ChatGPT*: Public#{" >*#{tag}*" if tag!=''} sessions:\n\n#{list_sessions.join("\n\n")}"
65
+ elsif type == :shared
66
+ respond "*ChatGPT*: Shared#{" >*#{tag}*" if tag!=''} sessions on <##{channel}>:\n\n#{list_sessions.join("\n\n")}"
67
+ end
68
+ else
69
+ if type == :own
70
+ respond "*ChatGPT*: You don't have any#{" >*#{tag}*" if tag!=''} sessions."
71
+ else
72
+ respond "*ChatGPT*: There are no#{" >*#{tag}*" if tag!=''} #{type} sessions."
73
+ end
74
+ end
75
+
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,52 @@
1
+ class SlackSmartBot
2
+ module Commands
3
+ module General
4
+ module AI
5
+ module OpenAI
6
+ def open_ai_chat_share_session(type, session_name, channel_id)
7
+ save_stats(__method__)
8
+
9
+ user = Thread.current[:user].dup
10
+ team_id_user = Thread.current[:team_id_user]
11
+
12
+ @open_ai[team_id_user] ||= {}
13
+ @open_ai[team_id_user][:chat_gpt] ||= {}
14
+ @open_ai[team_id_user][:chat_gpt][:sessions] ||= {}
15
+ if @open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name)
16
+ if type == :share
17
+ if channel_id == ""
18
+ @open_ai[team_id_user][:chat_gpt][:sessions][session_name].public = true
19
+ else
20
+ @open_ai[team_id_user][:chat_gpt][:sessions][session_name].shared ||= []
21
+ @open_ai[team_id_user][:chat_gpt][:sessions][session_name].shared << channel_id
22
+ end
23
+ elsif type == :stop
24
+ if channel_id == ""
25
+ @open_ai[team_id_user][:chat_gpt][:sessions][session_name].public = false
26
+ else
27
+ @open_ai[team_id_user][:chat_gpt][:sessions][session_name].shared.delete(channel_id)
28
+ end
29
+ end
30
+ update_openai_sessions()
31
+ if type == :share
32
+ if channel_id == ""
33
+ respond "*ChatGPT*: Session *#{session_name}* is now public."
34
+ else
35
+ respond "*ChatGPT*: Session *#{session_name}* is now shared on <##{channel_id}>."
36
+ end
37
+ elsif type == :stop
38
+ if channel_id == ""
39
+ respond "*ChatGPT*: Session *#{session_name}* is no longer public."
40
+ else
41
+ respond "*ChatGPT*: Session *#{session_name}* is no longer shared on <##{channel_id}>."
42
+ end
43
+ end
44
+ else
45
+ respond "*ChatGPT*: You don't have a session with that name.\nCall `chatGPT list sessions` to see your saved sessions."
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ class SlackSmartBot
2
+ module Commands
3
+ module General
4
+ module AI
5
+ module OpenAI
6
+ def open_ai_chat_use_model(model, dont_save_stats: false)
7
+ save_stats(__method__) unless dont_save_stats
8
+ open_ai_models('', just_models: true) if @open_ai_models.empty?
9
+ model_selected = @open_ai_models.select{|m| m==model}
10
+ model_selected = @open_ai_models.select{|m| m.include?(model)} if model_selected.empty?
11
+ if model_selected.size == 1
12
+ model = model_selected[0]
13
+ user = Thread.current[:user].dup
14
+ team_id_user = Thread.current[:team_id_user]
15
+
16
+ user_name = user.name
17
+ if @chat_gpt_collaborating.key?(team_id_user) and @chat_gpt_collaborating[team_id_user].key?(Thread.current[:thread_ts])
18
+ user_creator = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:user_creator]
19
+ team_creator = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:team_creator]
20
+ team_id_user_creator = team_creator + "_" + user_creator
21
+ session_name = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:session_name]
22
+ else
23
+ user_creator = user.name
24
+ team_creator = user.team_id
25
+ team_id_user_creator = team_creator + "_" + user_creator
26
+
27
+ @active_chat_gpt_sessions[team_id_user_creator] ||= {}
28
+ if @active_chat_gpt_sessions[team_id_user_creator].key?(Thread.current[:thread_ts])
29
+ session_name = @active_chat_gpt_sessions[team_id_user_creator][Thread.current[:thread_ts]]
30
+ elsif @active_chat_gpt_sessions[team_id_user_creator].key?(Thread.current[:dest])
31
+ session_name = @active_chat_gpt_sessions[team_id_user_creator][Thread.current[:dest]]
32
+ else
33
+ session_name = ''
34
+ end
35
+ end
36
+ if @open_ai.key?(team_id_user_creator) and @open_ai[team_id_user_creator].key?(:chat_gpt) and @open_ai[team_id_user_creator][:chat_gpt].key?(:sessions) and
37
+ @open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name)
38
+ @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:model] = model
39
+ respond "Model for this session is now #{model}" unless dont_save_stats
40
+ update_openai_sessions(session_name, team_id: team_creator, user_name: user_creator) unless session_name == ''
41
+ end
42
+ elsif model_selected.size > 1
43
+ respond "There are more than one model with that name. Please be more specific: #{model_selected.join(', ')}"
44
+ else
45
+ respond "There is no model with that name."
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -6,23 +6,26 @@ class SlackSmartBot
6
6
  def open_ai_edit_image(message, files)
7
7
  save_stats(__method__)
8
8
  get_personal_settings()
9
- @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings)
9
+ @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, service: :dall_e)
10
10
  respond message_connect if message_connect
11
- user = Thread.current[:user]
12
- if !@ai_open_ai[user.name].nil? and !@ai_open_ai[user.name][:client].nil?
11
+ user = Thread.current[:user].dup
12
+ team_id = user.team_id
13
+ team_id_user = Thread.current[:team_id_user]
14
+
15
+ if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:dall_e][:client].nil?
13
16
  @ai_open_ai_image ||= {}
14
- @ai_open_ai_image[user.name] ||= []
17
+ @ai_open_ai_image[team_id_user] ||= []
15
18
  react :art
16
19
  begin
17
- @ai_open_ai_image[user.name] = [] if !files.nil? and files.size == 1
20
+ @ai_open_ai_image[team_id_user] = [] if !files.nil? and files.size == 1
18
21
  if files.nil? or files.size != 1
19
22
  respond "*OpenAI*: Sorry, I need an image to edit. Please upload an image and try again."
20
23
  else
21
24
  require "nice_http"
22
- image = "#{config.path}/tmp/#{user.name}_#{@ai_open_ai_image[user.name].object_id}.png"
25
+ image = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png"
23
26
  http = NiceHttp.new(host: "https://files.slack.com", headers: { "Authorization" => "Bearer #{config.token}" })
24
27
  res = http.get(files[0].url_private_download, save_data: image)
25
- success, res = SlackSmartBot::AI::OpenAI.send_image_edit(@ai_open_ai[user.name].client, image, message, size: @ai_open_ai[user.name][:image_size])
28
+ success, res = SlackSmartBot::AI::OpenAI.send_image_edit(@ai_open_ai[team_id_user][:dall_e].client, image, message, size: @ai_open_ai[team_id_user][:dall_e][:image_size])
26
29
 
27
30
  if success
28
31
  urls = res
@@ -30,19 +33,19 @@ class SlackSmartBot
30
33
  if urls.nil? or urls.empty?
31
34
  respond "*OpenAI*: Sorry, I'm having some problems. OpenAI was not able to generate an image."
32
35
  else
33
- if @ai_open_ai_image[user.name].empty?
36
+ if @ai_open_ai_image[team_id_user].empty?
34
37
  session_name = "Edit"
35
38
  else
36
- session_name = @ai_open_ai_image[user.name].first[0..29]
39
+ session_name = @ai_open_ai_image[team_id_user].first[0..29]
37
40
  end
38
- messagersp = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[user.name].object_id})"
41
+ messagersp = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[team_id_user].object_id})"
39
42
  message = "Edit"
40
43
  require "uri"
41
44
  urls.each do |url|
42
45
  uri = URI.parse(url)
43
46
  require "nice_http"
44
47
  http = NiceHttp.new(host: "https://#{uri.host}")
45
- file_path_name = "#{config.path}/tmp/#{user.name}_#{@ai_open_ai_image[user.name].object_id}.png"
48
+ file_path_name = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png"
46
49
  res = http.get(uri.path + "?#{uri.query}", save_data: file_path_name)
47
50
  send_file(Thread.current[:dest], messagersp, file_path_name, message, "image/png", "png")
48
51
  http.close unless http.nil?
@@ -6,30 +6,34 @@ class SlackSmartBot
6
6
  def open_ai_generate_image(message, delete_history = false, repeat: false)
7
7
  save_stats(__method__)
8
8
  get_personal_settings()
9
- @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, reconnect: delete_history)
9
+ @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, reconnect: delete_history, service: :dall_e)
10
10
  respond message_connect if message_connect
11
- user = Thread.current[:user]
12
- if !@ai_open_ai[user.name].nil? and !@ai_open_ai[user.name][:client].nil?
11
+ user = Thread.current[:user].dup
12
+ team_id = user.team_id
13
+ team_id_user = Thread.current[:team_id_user]
14
+
15
+ if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:dall_e][:client].nil?
13
16
  @ai_open_ai_image ||= {}
14
- @ai_open_ai_image[user.name] ||= []
17
+ @ai_open_ai_image[team_id_user] ||= []
15
18
  react :art
16
19
  begin
17
- @ai_open_ai_image[user.name] = [] if delete_history
20
+ @ai_open_ai_image[team_id_user] = [] if delete_history
18
21
  if delete_history and message == ""
19
22
  respond "*OpenAI*: Let's start a new image generation. Use `?i PROMPT` to generate an image."
20
- elsif repeat and @ai_open_ai_image[user.name].empty? and message == ""
23
+ elsif repeat and @ai_open_ai_image[team_id_user].empty? and message == ""
21
24
  respond "*OpenAI*: Sorry, I need to generate an image first. Use `?i PROMPT` to generate an image."
22
25
  else
23
- @ai_open_ai_image[user.name] << message unless repeat
24
- success, res = SlackSmartBot::AI::OpenAI.send_image_generation(@ai_open_ai[user.name][:client], @ai_open_ai_image[user.name].join("\n"), @ai_open_ai[user.name][:image_size])
26
+ @ai_open_ai_image[team_id_user] << message unless repeat
27
+ success, res = SlackSmartBot::AI::OpenAI.send_image_generation(@ai_open_ai[team_id_user][:dall_e][:client], @ai_open_ai_image[team_id_user].join("\n"), @ai_open_ai[team_id_user][:dall_e][:image_size])
25
28
  if success
26
29
  urls = res
27
30
  urls = [urls] if urls.is_a?(String)
31
+ urls.delete({})
28
32
  if urls.nil? or urls.empty?
29
33
  respond "*OpenAI*: Sorry, I'm having some problems. OpenAI was not able to generate an image."
30
34
  else
31
- session_name = @ai_open_ai_image[user.name].first[0..29]
32
- messagersp = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[user.name].object_id})"
35
+ session_name = @ai_open_ai_image[team_id_user].first[0..29]
36
+ messagersp = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[team_id_user].object_id})"
33
37
  message = "Repeat" if repeat
34
38
  require "uri"
35
39
  urls.each do |url|
@@ -37,7 +41,7 @@ class SlackSmartBot
37
41
  require "nice_http"
38
42
  http = NiceHttp.new(host: "https://#{uri.host}")
39
43
  Dir.mkdir("#{config.path}/tmp") unless Dir.exist?("#{config.path}/tmp")
40
- file_path_name = "#{config.path}/tmp/#{user.name}_#{@ai_open_ai_image[user.name].object_id}.png"
44
+ file_path_name = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png"
41
45
  res = http.get(uri.path + "?#{uri.query}", save_data: file_path_name)
42
46
  if config.simulate
43
47
  respond "file: #{file_path_name}, #{messagersp}, #{message}, image/png, png"
@@ -3,31 +3,43 @@ class SlackSmartBot
3
3
  module General
4
4
  module AI
5
5
  module OpenAI
6
- def open_ai_models(model='')
7
- save_stats(__method__)
6
+ def open_ai_models(model='', just_models: false)
7
+ save_stats(__method__) unless just_models
8
8
  get_personal_settings()
9
- @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings)
9
+ @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, service: :models)
10
10
  respond message_connect if message_connect
11
- user = Thread.current[:user]
12
- if !@ai_open_ai[user.name].nil? and !@ai_open_ai[user.name][:client].nil?
13
- react :running
11
+ user = Thread.current[:user].dup
12
+ team_id = user.team_id
13
+ team_id_user = Thread.current[:team_id_user]
14
+ if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:models][:client].nil?
15
+ react :running unless just_models
14
16
  begin
15
- res = SlackSmartBot::AI::OpenAI.models(@ai_open_ai[user.name][:client], model)
16
- if model == ''
17
- message = ["*OpenAI*"]
18
- message << "If you want to use a model, you can use on a DM with the SmartBot the command"
19
- message << "`set personal settings ai.open_ai.gpt_model MODEL_NAME`"
20
- message << "`set personal settings ai.open_ai.whisper_model MODEL_NAME`"
21
- message << "Here are the models available for use:"
22
- message << "```#{res.strip}```"
23
- respond message.join("\n")
17
+ res = SlackSmartBot::AI::OpenAI.models(@ai_open_ai[team_id_user][:models][:client], @ai_open_ai[team_id_user][:models], model)
18
+ if model == '' or model == 'chatgpt'
19
+ unless just_models
20
+ message = ["*OpenAI*"]
21
+ message << "To start a chatGPT session using a specific model: `^chatgpt SESSION_NAME MODEL_NAME`"
22
+ message << "For example: `^chatgpt data_analysis gpt-35-turbo-0301`"
23
+ message << "If you want to use a model by default, you can use on a DM with the SmartBot the command"
24
+ message << "`set personal settings ai.open_ai.chat_gpt.model MODEL_NAME`"
25
+ message << "`set personal settings ai.open_ai.whisper.model MODEL_NAME`" if model == ''
26
+ message << "Here are the #{"#{model} " if model!=''}models available for use:"
27
+ message << "```#{res.strip}```"
28
+ respond message.join("\n")
29
+ end
30
+ @open_ai_models = res.split("\n") if model == ''
24
31
  else
25
- respond "*OpenAI* Info about #{model} model:\n```#{res.strip}```"
32
+ if just_models
33
+ return res
34
+ else
35
+ respond "*OpenAI* Info about #{model} model:\n```#{res.strip}```"
36
+ end
26
37
  end
27
38
  rescue => exception
39
+ @logger.warn "Error in open_ai_models: #{exception}"
28
40
  respond "*OpenAI*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later."
29
41
  end
30
- unreact :running
42
+ unreact :running unless just_models
31
43
  end
32
44
  end
33
45
  end
@@ -6,31 +6,34 @@ class SlackSmartBot
6
6
  def open_ai_variations_image(message, variations, files)
7
7
  save_stats(__method__)
8
8
  get_personal_settings()
9
- @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings)
9
+ @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, service: :dall_e)
10
10
  respond message_connect if message_connect
11
- user = Thread.current[:user]
12
- if !@ai_open_ai[user.name].nil? and !@ai_open_ai[user.name][:client].nil?
11
+ user = Thread.current[:user].dup
12
+ team_id = user.team_id
13
+ team_id_user = Thread.current[:team_id_user]
14
+
15
+ if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:dall_e][:client].nil?
13
16
  if variations > 9
14
17
  respond "*OpenAI*: I'm sorry, I can only generate up to 9 variations at a time. Please try again."
15
18
  else
16
19
  variations = 1 if variations == 0
17
20
  @ai_open_ai_image ||= {}
18
- @ai_open_ai_image[user.name] ||= []
21
+ @ai_open_ai_image[team_id_user] ||= []
19
22
  react :art
20
23
  begin
21
- @ai_open_ai_image[user.name] = [] if !files.nil? and files.size == 1
24
+ @ai_open_ai_image[team_id_user] = [] if !files.nil? and files.size == 1
22
25
 
23
- if (!File.exist?("#{config.path}/tmp/#{user.name}_#{@ai_open_ai_image[user.name].object_id}.png") and (files.nil? or files.size != 1))
26
+ if (!File.exist?("#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png") and (files.nil? or files.size != 1))
24
27
  respond "*OpenAI*: Sorry, I need to generate an image first. Use `?i PROMPT` to generate an image or upload an image to generate variations."
25
28
  else
26
- image = "#{config.path}/tmp/#{user.name}_#{@ai_open_ai_image[user.name].object_id}.png"
29
+ image = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png"
27
30
  if !files.nil? and files.size == 1
28
31
  require "nice_http"
29
32
  http = NiceHttp.new(host: "https://files.slack.com", headers: { "Authorization" => "Bearer #{config.token}" })
30
33
  res = http.get(files[0].url_private_download, save_data: image)
31
- success, res = SlackSmartBot::AI::OpenAI.send_image_variation(@ai_open_ai[user.name].client, image, variations, size: @ai_open_ai[user.name][:image_size])
34
+ success, res = SlackSmartBot::AI::OpenAI.send_image_variation(@ai_open_ai[team_id_user][:dall_e].client, image, variations, size: @ai_open_ai[team_id_user][:dall_e][:image_size])
32
35
  else
33
- success, res = SlackSmartBot::AI::OpenAI.send_image_variation(@ai_open_ai[user.name].client, image, variations, size: @ai_open_ai[user.name][:image_size])
36
+ success, res = SlackSmartBot::AI::OpenAI.send_image_variation(@ai_open_ai[team_id_user][:dall_e].client, image, variations, size: @ai_open_ai[team_id_user][:dall_e][:image_size])
34
37
  end
35
38
  if success
36
39
  urls = res
@@ -38,18 +41,18 @@ class SlackSmartBot
38
41
  if urls.nil? or urls.empty?
39
42
  respond "*OpenAI*: Sorry, I'm having some problems. OpenAI was not able to generate an image."
40
43
  else
41
- if @ai_open_ai_image[user.name].empty?
44
+ if @ai_open_ai_image[team_id_user].empty?
42
45
  session_name = "Temporary Variation"
43
46
  else
44
- session_name = @ai_open_ai_image[user.name].first[0..29]
47
+ session_name = @ai_open_ai_image[team_id_user].first[0..29]
45
48
  end
46
- messagersp = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[user.name].object_id})"
49
+ messagersp = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[team_id_user].object_id})"
47
50
  require "uri"
48
51
  urls.each do |url|
49
52
  uri = URI.parse(url)
50
53
  require "nice_http"
51
54
  http = NiceHttp.new(host: "https://#{uri.host}")
52
- file_path_name = "#{config.path}/tmp/#{user.name}_#{@ai_open_ai_image[user.name].object_id}.png"
55
+ file_path_name = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png"
53
56
  res = http.get(uri.path + "?#{uri.query}", save_data: file_path_name)
54
57
  message = "Variation #{urls.index(url)+1} of #{urls.size}"
55
58
  if config.simulate
@@ -6,23 +6,29 @@ class SlackSmartBot
6
6
  def open_ai_whisper(message, files)
7
7
  save_stats(__method__)
8
8
  get_personal_settings()
9
- @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings)
9
+ @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, service: :whisper)
10
10
  respond message_connect if message_connect
11
- user = Thread.current[:user]
12
- if !@ai_open_ai[user.name].nil? and !@ai_open_ai[user.name][:client].nil?
13
- react :speech_balloon
11
+ user = Thread.current[:user].dup
12
+ team_id = user.team_id
13
+ team_id_user = Thread.current[:team_id_user]
14
+
15
+ if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:whisper][:client].nil?
16
+ react :speech_balloon
14
17
  begin
15
18
  if files.nil? or files.size != 1
16
19
  respond "*OpenAI Whisper*: Sorry, I need an audio file to transcribe. Please upload an audio file and try again."
17
20
  else
18
21
  require "nice_http"
19
- audio = "#{config.path}/tmp/#{user.name}_audio.wav"
22
+ audio = "#{config.path}/tmp/#{team_id_user}_audio.wav"
20
23
  http = NiceHttp.new(host: "https://files.slack.com", headers: { "Authorization" => "Bearer #{config.token}" })
24
+ #todo: in case using a channel with external people from other organizations files are treated differently. We need to take in consideration that
25
+ #https://api.slack.com/types/file#slack_connect_files
26
+ #This is for all files in all commands
21
27
  res = http.get(files[0].url_private_download, save_data: audio)
22
- success, res = SlackSmartBot::AI::OpenAI.whisper_transcribe(@ai_open_ai[user.name][:client], @ai_open_ai[user.name].whisper_model, audio)
28
+ success, res = SlackSmartBot::AI::OpenAI.whisper_transcribe(@ai_open_ai[team_id_user][:whisper][:client], @ai_open_ai[team_id_user].whisper.model, audio)
23
29
  if success
24
30
  if message.to_s != ''
25
- success, res = SlackSmartBot::AI::OpenAI.send_gpt_chat(@ai_open_ai[user.name][:client], @ai_open_ai[user.name].gpt_model, "#{message}:\n#{res}")
31
+ success, res = SlackSmartBot::AI::OpenAI.send_gpt_chat(@ai_open_ai[team_id_user][:whisper][:client], @ai_open_ai[team_id_user].chat_gpt.model, "#{message}:\n#{res}", @ai_open_ai[team_id_user].chat_gpt)
26
32
  type_whisper = message
27
33
  else
28
34
  type_whisper = "Transcribe"
@@ -4,7 +4,7 @@ class SlackSmartBot
4
4
  not_allowed = ["hi_bot", "bye_bot", "allow_access", "deny_access", "get_bot_logs", "add_routine", "pause_bot", "pause_routine", "remove_routine", "run_routine", "start_bot",
5
5
  "start_routine", "delete_message", "update_message", "send_message", "kill_bot_on_channel", "exit_bot", "notify_message", "publish_announcements", "set_general_message",
6
6
  "set_maintenance", "bot_help", "bot_rules"]
7
- if !is_admin?(user.name)
7
+ if !is_admin?(user)
8
8
  respond "Only admins of this channel can use this command. Take a look who is an admin of this channel by calling `see admins`"
9
9
  elsif Thread.current[:dest][0] == "D"
10
10
  respond "This command cannot be called from a DM"
@@ -43,11 +43,13 @@ class SlackSmartBot
43
43
  @access_channels[channel][command_id] = []
44
44
  end
45
45
  access_users_names = []
46
+ access_team_id_users_names = []
46
47
  access_users.each do |us|
47
- user_info = @users.select { |u| u.id == us or (u.key?(:enterprise_user) and u.enterprise_user.id == us) }[-1]
48
+ user_info = find_user(us)
48
49
  access_users_names << user_info.name unless user_info.nil?
50
+ access_team_id_users_names << "#{user_info.team_id}_#{user_info.name}" unless user_info.nil?
49
51
  end
50
- @access_channels[channel][command_id] += access_users_names
52
+ @access_channels[channel][command_id] += access_team_id_users_names
51
53
  @access_channels[channel][command_id].flatten!
52
54
  @access_channels[channel][command_id].uniq!
53
55
  @access_channels[channel][command_id].delete(nil)
@@ -56,7 +58,9 @@ class SlackSmartBot
56
58
  if !@access_channels[channel].key?(command_id)
57
59
  respond "All users will have access to this command on this channel."
58
60
  else
59
- respond "These users will have access to this command on this channel: <@#{@access_channels[channel][command_id].join(">, <@")}>"
61
+ # get the names of the users. The value of the hash is the team_id_user_name
62
+ names = @access_channels[channel][command_id].map { |u| u.split("_")[1..-1].join("_") }
63
+ respond "These users will have access to this command on this channel: <@#{names.join(">, <@")}>"
60
64
  end
61
65
  end
62
66
  else
@@ -1,11 +1,10 @@
1
1
  class SlackSmartBot
2
2
 
3
- def bot_help(user, from, dest, dchannel, specific, help_command, rules_file, savestats: true, strict: false)
3
+ def bot_help(user, from, dest, dchannel, specific, help_command, rules_file, savestats: true, strict: false, send_to_file: false)
4
4
  save_stats(__method__) if savestats
5
5
  output = []
6
6
  if has_access?(__method__, user)
7
7
  help_found = false
8
-
9
8
  message = ""
10
9
  if help_command.to_s != ''
11
10
  help_command = '' if help_command.to_s.match?(/^\s*expanded\s*$/i) or help_command.to_s.match?(/^\s*extended\s*$/i)
@@ -16,7 +15,12 @@ class SlackSmartBot
16
15
  message_not_expanded = "If you want to see the *expanded* version of *`bot help`* or *`bot rules`*, please call *`bot help expanded`* or *`bot rules expanded`*\n"
17
16
  message_not_expanded += "Also to get specific *expanded* help for a specific command or rule call *`bot help COMMAND`*\n"
18
17
  end
19
- help_message = get_help(rules_file, dest, from, specific, expanded)
18
+ expanded = true if Thread.current[:prompt].to_s != ''
19
+ if send_to_file
20
+ expanded = true
21
+ message_not_expanded = ''
22
+ end
23
+ help_message = get_help(rules_file, dest, user, specific, expanded)
20
24
  commands = []
21
25
  commands_search = []
22
26
  if help_command.to_s != ""
@@ -39,7 +43,7 @@ class SlackSmartBot
39
43
  help_command.to_s.split(' ') do |hc|
40
44
  unless hc.match?(/^\s*\z/)
41
45
  if !h.match?(/#{hc}/i)
42
- all_found = false
46
+ all_found = false
43
47
  end
44
48
  end
45
49
  end
@@ -110,14 +114,25 @@ class SlackSmartBot
110
114
  output << message_not_expanded
111
115
  end
112
116
  end
113
- if output.join("\n").lines.count > 50 and dest[0]!='D'
117
+ if output.join("\n").lines.count > 50 and dest[0]!='D' and !send_to_file
114
118
  dest = :on_thread
115
119
  output.unshift('Since there are many lines returned the results are returned on a thread by default.')
116
120
  end
117
- output.each do |h|
118
- msg = h.gsub(/^\s*command_id:\s+:\w+\s*$/,'')
119
- unless msg.match?(/\A\s*\z/)
120
- respond msg, dest, unfurl_links: false, unfurl_media: false
121
+ if send_to_file
122
+ content = output.join("\n\n")
123
+ content.gsub!(/\*<([^>]*)\|([^>]*)>\*/, '## [\2](\1)')
124
+ content.gsub!(/^\s*(\*.+\*)\s*$/, '# \1')
125
+ content.gsub!(/command_id:\s+:/, '### :')
126
+ content = content.gsub("\n", " \n").gsub(/\|[\w\s]*>/i,">").gsub(/^\s*\-\-\-\-\-\-/, "\n------")
127
+ dest == :on_thread ? dest_file = dchannel : dest_file = dest
128
+ send_file(dest_file, "SmartBot Help", "", 'smartbot_help.md', "text/markdown", "markdown", content: content)
129
+ else
130
+ output.each do |h|
131
+ msg = h.gsub(/^\s*command_id:\s+:\w+\s*$/,'')
132
+ msg.gsub!(/^\s*>.+$/,'') if help_command.to_s != ''
133
+ unless msg.match?(/\A\s*\z/)
134
+ respond msg, dest, unfurl_links: false, unfurl_media: false
135
+ end
121
136
  end
122
137
  end
123
138
  return output.join("\n")