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.
- checksums.yaml +4 -4
- data/README.md +222 -37
- data/img/chat_gpt.png +0 -0
- data/img/chat_gpt_session.png +0 -0
- data/img/chat_gpt_share.png +0 -0
- data/img/command_add_sc.png +0 -0
- data/img/command_bot_help_echo.png +0 -0
- data/img/command_loop.png +0 -0
- data/img/command_my_timeoff.png +0 -0
- data/img/command_recap.png +0 -0
- data/img/command_repl1.png +0 -0
- data/img/command_repl2.png +0 -0
- data/img/command_ruby.png +0 -0
- data/img/command_run_repl.png +0 -0
- data/img/command_see_announcements.png +0 -0
- data/img/command_see_statuses.png +0 -0
- data/img/command_see_team.png +0 -0
- data/img/command_summarize.png +0 -0
- data/img/commands_inline.png +0 -0
- data/img/commands_on_demand.png +0 -0
- data/img/commands_on_external_call.png +0 -0
- data/img/image_editing.png +0 -0
- data/img/image_generation.png +0 -0
- data/img/image_variations.png +0 -0
- data/img/openai-300.png +0 -0
- data/img/openai.png +0 -0
- data/img/slack-300.png +0 -0
- data/img/slack.png +0 -0
- data/img/smart-bot-150.png +0 -0
- data/img/smart-bot-profile-pic-2.png +0 -0
- data/img/smart-bot-profile-pic.png +0 -0
- data/img/smart-bot.png +0 -0
- data/img/whisper.png +0 -0
- data/lib/slack/smart-bot/ai/open_ai/connect.rb +165 -43
- data/lib/slack/smart-bot/ai/open_ai/models.rb +61 -9
- data/lib/slack/smart-bot/ai/open_ai/send_gpt_chat.rb +67 -11
- data/lib/slack/smart-bot/ai/open_ai/send_image_edit.rb +4 -3
- data/lib/slack/smart-bot/ai/open_ai/send_image_generation.rb +4 -4
- data/lib/slack/smart-bot/ai/open_ai/send_image_variation.rb +4 -3
- data/lib/slack/smart-bot/ai/open_ai/whisper_transcribe.rb +4 -3
- data/lib/slack/smart-bot/comm/ask.rb +20 -8
- data/lib/slack/smart-bot/comm/dont_understand.rb +2 -2
- data/lib/slack/smart-bot/comm/event_hello.rb +30 -1
- data/lib/slack/smart-bot/comm/get_channel_members.rb +2 -1
- data/lib/slack/smart-bot/comm/get_presence.rb +1 -0
- data/lib/slack/smart-bot/comm/get_smartbot_team_info.rb +10 -0
- data/lib/slack/smart-bot/comm/get_user_info.rb +45 -6
- data/lib/slack/smart-bot/comm/get_users.rb +8 -1
- data/lib/slack/smart-bot/comm/respond.rb +225 -196
- data/lib/slack/smart-bot/comm/send_msg_channel.rb +2 -2
- data/lib/slack/smart-bot/comm/send_msg_user.rb +10 -9
- data/lib/slack/smart-bot/comm/unreact.rb +2 -2
- data/lib/slack/smart-bot/comm.rb +1 -0
- data/lib/slack/smart-bot/commands/general/add_admin.rb +16 -6
- data/lib/slack/smart-bot/commands/general/add_announcement.rb +3 -3
- data/lib/slack/smart-bot/commands/general/add_vacation.rb +28 -12
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat.rb +272 -23
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_add_collaborator.rb +42 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_copy_session.rb +89 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_delete_session.rb +45 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_get_prompts.rb +41 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_list_sessions.rb +81 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_share_session.rb +52 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_use_model.rb +52 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_edit_image.rb +14 -11
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_generate_image.rb +15 -11
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_models.rb +29 -17
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_variations_image.rb +16 -13
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_whisper.rb +13 -7
- data/lib/slack/smart-bot/commands/general/allow_access.rb +8 -4
- data/lib/slack/smart-bot/commands/general/bot_help.rb +24 -10
- data/lib/slack/smart-bot/commands/general/bye_bot.rb +9 -5
- data/lib/slack/smart-bot/commands/general/delete_announcement.rb +2 -1
- data/lib/slack/smart-bot/commands/general/delete_share.rb +2 -1
- data/lib/slack/smart-bot/commands/general/deny_access.rb +1 -1
- data/lib/slack/smart-bot/commands/general/get_smartbot_readme.rb +15 -0
- data/lib/slack/smart-bot/commands/general/hi_bot.rb +10 -4
- data/lib/slack/smart-bot/commands/general/personal_settings.rb +26 -8
- data/lib/slack/smart-bot/commands/general/poster.rb +26 -2
- data/lib/slack/smart-bot/commands/general/public_holidays.rb +14 -24
- data/lib/slack/smart-bot/commands/general/recap.rb +399 -0
- data/lib/slack/smart-bot/commands/general/remove_admin.rb +19 -9
- data/lib/slack/smart-bot/commands/general/remove_vacation.rb +23 -6
- data/lib/slack/smart-bot/commands/general/see_access.rb +2 -1
- data/lib/slack/smart-bot/commands/general/see_admins.rb +8 -4
- data/lib/slack/smart-bot/commands/general/see_announcements.rb +5 -5
- data/lib/slack/smart-bot/commands/general/see_favorite_commands.rb +4 -4
- data/lib/slack/smart-bot/commands/general/see_shares.rb +1 -1
- data/lib/slack/smart-bot/commands/general/see_vacations.rb +34 -17
- data/lib/slack/smart-bot/commands/general/set_public_holidays.rb +4 -2
- data/lib/slack/smart-bot/commands/general/share_messages.rb +3 -3
- data/lib/slack/smart-bot/commands/general/summarize.rb +191 -0
- data/lib/slack/smart-bot/commands/general/teams/add_team.rb +4 -8
- data/lib/slack/smart-bot/commands/general/teams/delete_team.rb +3 -3
- data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team.rb +34 -29
- data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team_comment.rb +1 -1
- data/lib/slack/smart-bot/commands/general/teams/memos/delete_memo_team.rb +6 -4
- data/lib/slack/smart-bot/commands/general/teams/memos/see_memo_team.rb +26 -15
- data/lib/slack/smart-bot/commands/general/teams/memos/see_memos_team.rb +33 -24
- data/lib/slack/smart-bot/commands/general/teams/memos/set_memo_status.rb +4 -4
- data/lib/slack/smart-bot/commands/general/teams/ping_team.rb +10 -8
- data/lib/slack/smart-bot/commands/general/teams/see_teams.rb +73 -61
- data/lib/slack/smart-bot/commands/general/teams/see_vacations_team.rb +28 -13
- data/lib/slack/smart-bot/commands/general/teams/update_team.rb +9 -9
- data/lib/slack/smart-bot/commands/general_bot_commands.rb +1152 -839
- data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +18 -17
- data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +11 -9
- data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +2 -0
- data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +1 -0
- data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +5 -3
- data/lib/slack/smart-bot/commands/on_bot/admin_master/delete_message.rb +2 -3
- data/lib/slack/smart-bot/commands/on_bot/admin_master/get_bot_logs.rb +2 -3
- data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +2 -3
- data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +7 -6
- data/lib/slack/smart-bot/commands/on_bot/admin_master/update_message.rb +2 -3
- data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +1 -1
- data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +21 -20
- data/lib/slack/smart-bot/commands/on_bot/general/bot_stats.rb +40 -7
- data/lib/slack/smart-bot/commands/on_bot/general/bot_status.rb +6 -2
- data/lib/slack/smart-bot/commands/on_bot/general/stop_using_rules.rb +7 -6
- data/lib/slack/smart-bot/commands/on_bot/general/suggest_command.rb +5 -4
- data/lib/slack/smart-bot/commands/on_bot/general/use_rules.rb +4 -3
- data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +4 -4
- data/lib/slack/smart-bot/commands/on_bot/kill_repl.rb +1 -1
- data/lib/slack/smart-bot/commands/on_bot/repl.rb +109 -53
- data/lib/slack/smart-bot/commands/on_bot/repl_client.rb +35 -29
- data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +5 -5
- data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +1 -2
- data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +5 -4
- data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +22 -12
- data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +12 -7
- data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +2 -2
- data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +1 -1
- data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +5 -5
- data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +5 -5
- data/lib/slack/smart-bot/commands/on_master/create_bot.rb +3 -3
- data/lib/slack/smart-bot/commands.rb +10 -0
- data/lib/slack/smart-bot/config.rb +126 -0
- data/lib/slack/smart-bot/listen.rb +12 -11
- data/lib/slack/smart-bot/process.rb +62 -55
- data/lib/slack/smart-bot/process_first.rb +106 -65
- data/lib/slack/smart-bot/treat_message.rb +79 -47
- data/lib/slack/smart-bot/utils/answer.rb +11 -3
- data/lib/slack/smart-bot/utils/answer_delete.rb +11 -3
- data/lib/slack/smart-bot/utils/check_vacations.rb +21 -3
- data/lib/slack/smart-bot/utils/create_routine_thread.rb +13 -13
- data/lib/slack/smart-bot/utils/display_calendar.rb +42 -8
- data/lib/slack/smart-bot/utils/encryption/decrypt.rb +16 -9
- data/lib/slack/smart-bot/utils/encryption/encrypt.rb +14 -11
- data/lib/slack/smart-bot/utils/find_user.rb +71 -0
- data/lib/slack/smart-bot/utils/get_access_channels.rb +22 -3
- data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +3 -4
- data/lib/slack/smart-bot/utils/get_command_ids.rb +5 -5
- data/lib/slack/smart-bot/utils/get_countries_candelarific.rb +18 -0
- data/lib/slack/smart-bot/utils/get_help.rb +21 -19
- data/lib/slack/smart-bot/utils/get_openai_sessions.rb +47 -0
- data/lib/slack/smart-bot/utils/get_personal_settings.rb +29 -3
- data/lib/slack/smart-bot/utils/get_rules_imported.rb +27 -6
- data/lib/slack/smart-bot/utils/get_shares.rb +1 -1
- data/lib/slack/smart-bot/utils/get_team_members.rb +4 -4
- data/lib/slack/smart-bot/utils/get_vacations.rb +15 -7
- data/lib/slack/smart-bot/utils/has_access.rb +10 -4
- data/lib/slack/smart-bot/utils/is_admin.rb +25 -17
- data/lib/slack/smart-bot/utils/local_time.rb +29 -0
- data/lib/slack/smart-bot/utils/save_stats.rb +5 -3
- data/lib/slack/smart-bot/utils/update_access_channels.rb +19 -3
- data/lib/slack/smart-bot/utils/update_openai_sessions.rb +42 -0
- data/lib/slack/smart-bot/utils/update_personal_settings.rb +11 -3
- data/lib/slack/smart-bot/utils/update_rules_imported.rb +18 -3
- data/lib/slack/smart-bot/utils/update_vacations.rb +5 -2
- data/lib/slack/smart-bot/utils/upgrade_to_use_team_ids.rb +276 -0
- data/lib/slack/smart-bot/utils.rb +6 -1
- data/lib/slack-smart-bot.rb +182 -76
- data/lib/slack-smart-bot_general_commands.rb +10 -9
- data/whats_new.txt +30 -13
- 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
|
-
|
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[
|
17
|
+
@ai_open_ai_image[team_id_user] ||= []
|
15
18
|
react :art
|
16
19
|
begin
|
17
|
-
@ai_open_ai_image[
|
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/#{
|
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[
|
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[
|
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[
|
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[
|
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/#{
|
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
|
-
|
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[
|
17
|
+
@ai_open_ai_image[team_id_user] ||= []
|
15
18
|
react :art
|
16
19
|
begin
|
17
|
-
@ai_open_ai_image[
|
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[
|
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[
|
24
|
-
success, res = SlackSmartBot::AI::OpenAI.send_image_generation(@ai_open_ai[
|
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[
|
32
|
-
messagersp = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[
|
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/#{
|
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
|
-
|
13
|
-
|
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[
|
16
|
-
if model == ''
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
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
|
-
|
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[
|
21
|
+
@ai_open_ai_image[team_id_user] ||= []
|
19
22
|
react :art
|
20
23
|
begin
|
21
|
-
@ai_open_ai_image[
|
24
|
+
@ai_open_ai_image[team_id_user] = [] if !files.nil? and files.size == 1
|
22
25
|
|
23
|
-
if (!File.exist?("#{config.path}/tmp/#{
|
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/#{
|
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[
|
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[
|
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[
|
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[
|
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[
|
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/#{
|
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
|
-
|
13
|
-
|
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/#{
|
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[
|
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[
|
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
|
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 =
|
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] +=
|
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
|
-
|
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
|
-
|
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
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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")
|