slack-smart-bot 1.14.2 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +222 -37
  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 -10
  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 +1152 -839
  106. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +18 -17
  107. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +11 -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 +109 -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 -12
  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 +148 -20
@@ -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,15 +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
- msg.gsub!(/^\s*>.+$/,'') if help_command.to_s != ''
120
- unless msg.match?(/\A\s*\z/)
121
- 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
122
136
  end
123
137
  end
124
138
  return output.join("\n")