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.
- checksums.yaml +4 -4
- data/README.md +237 -48
- 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 -9
- 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 +1153 -835
- data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +19 -17
- data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +12 -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 +110 -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 -11
- 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 +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
|
-
|
|
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,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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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")
|