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
@@ -2,7 +2,7 @@ class SlackSmartBot
|
|
2
2
|
# list of available emojis: https://www.webfx.com/tools/emoji-cheat-sheet/
|
3
3
|
# unreact(:thumbsup)
|
4
4
|
# ts: can be true, false or a specific ts
|
5
|
-
def unreact(emoji, ts=false)
|
5
|
+
def unreact(emoji, ts=false, channel: Thread.current[:dest])
|
6
6
|
begin
|
7
7
|
if ts.is_a?(TrueClass) or ts.is_a?(FalseClass)
|
8
8
|
parent = ts
|
@@ -21,7 +21,7 @@ class SlackSmartBot
|
|
21
21
|
@logger.warn 'unreact method no ts supplied'
|
22
22
|
else
|
23
23
|
begin
|
24
|
-
client.web_client.reactions_remove(channel:
|
24
|
+
client.web_client.reactions_remove(channel: channel, name: emoji, timestamp: ts) unless config.simulate
|
25
25
|
rescue Exception => stack
|
26
26
|
@logger.warn stack
|
27
27
|
end
|
data/lib/slack/smart-bot/comm.rb
CHANGED
@@ -13,31 +13,41 @@ class SlackSmartBot
|
|
13
13
|
end
|
14
14
|
messages = []
|
15
15
|
admins = config.masters.dup
|
16
|
+
team_id_admins = config.team_id_masters.dup
|
17
|
+
|
16
18
|
channels = get_channels()
|
17
19
|
channel_found = channels.detect { |c| c.id == channel }
|
18
20
|
if !channel_found.nil? and channel_found.creator.to_s != ''
|
19
|
-
creator_info =
|
21
|
+
creator_info = find_user(channel_found.creator)
|
20
22
|
admins << creator_info.name
|
23
|
+
team_id_admins << "#{creator_info.team_id}_#{creator_info.name}"
|
21
24
|
end
|
22
25
|
if Thread.current[:typem] == :on_bot or Thread.current[:typem] == :on_master
|
23
26
|
admins << config.admins.dup
|
27
|
+
team_id_admins << config.team_id_admins.dup
|
24
28
|
end
|
25
29
|
if @admins_channels.key?(channel) and @admins_channels[channel].size > 0
|
26
|
-
|
30
|
+
team_id_admins << @admins_channels[channel]
|
31
|
+
#remove the team_id from the names on @admins_channels
|
32
|
+
admins << @admins_channels[channel].map { |a| a.split('_')[1..-1].join('_') }
|
27
33
|
end
|
28
34
|
admins.flatten!
|
29
35
|
admins.uniq!
|
30
36
|
admins.delete(nil)
|
31
|
-
|
32
|
-
|
33
|
-
|
37
|
+
team_id_admins.flatten!
|
38
|
+
team_id_admins.uniq!
|
39
|
+
team_id_admins.delete(nil)
|
40
|
+
if team_id_admins.include?("#{user.team_id}_#{user.name}")
|
41
|
+
admin_info = find_user(admin_user)
|
42
|
+
if team_id_admins.include?("#{admin_info.team_id}_#{admin_info.name}")
|
34
43
|
messages << "This user is already an admin of this channel."
|
35
44
|
else
|
36
45
|
@admins_channels[channel] ||= []
|
37
|
-
@admins_channels[channel] << admin_info.name
|
46
|
+
@admins_channels[channel] << "#{admin_info.team_id}_#{admin_info.name}"
|
38
47
|
update_admins_channels()
|
39
48
|
messages << "The user is an admin of this channel from now on."
|
40
49
|
admins << admin_info.name
|
50
|
+
team_id_admins << "#{admin_info.team_id}_#{admin_info.name}"
|
41
51
|
end
|
42
52
|
messages << "*Admins*: <@#{admins.join('>, <@')}>"
|
43
53
|
else
|
@@ -9,18 +9,18 @@ class SlackSmartBot
|
|
9
9
|
channel = Thread.current[:dest]
|
10
10
|
end
|
11
11
|
if File.exist?("#{config.path}/announcements/#{channel}.csv") and !@announcements.key?(channel)
|
12
|
-
t = CSV.table("#{config.path}/announcements/#{channel}.csv", headers: ['message_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'message'])
|
12
|
+
t = CSV.table("#{config.path}/announcements/#{channel}.csv", headers: ['message_id', 'user_team_id_deleted', 'user_deleted', 'user_team_id_created', 'user_created', 'date', 'time', 'type', 'message'])
|
13
13
|
@announcements[channel] = t
|
14
14
|
num = t[:message_id].max + 1
|
15
15
|
elsif !@announcements.key?(channel)
|
16
16
|
File.open("#{config.path}/announcements/#{channel}.csv","w")
|
17
|
-
t = CSV.table("#{config.path}/announcements/#{channel}.csv", headers: ['message_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'message'])
|
17
|
+
t = CSV.table("#{config.path}/announcements/#{channel}.csv", headers: ['message_id', 'user_team_id_deleted', 'user_deleted', 'user_team_id_created', 'user_created', 'date', 'time', 'type', 'message'])
|
18
18
|
num = 1
|
19
19
|
@announcements[channel] = t
|
20
20
|
else
|
21
21
|
num = @announcements[channel][:message_id].max + 1
|
22
22
|
end
|
23
|
-
values = [num, '', user.name, Time.now.strftime("%Y/%m/%d"), Time.now.strftime("%H:%M"), type, message]
|
23
|
+
values = [num, '', '', user.team_id, user.name, Time.now.strftime("%Y/%m/%d"), Time.now.strftime("%H:%M"), type, message]
|
24
24
|
@announcements[channel] << values
|
25
25
|
CSV.open("#{config.path}/announcements/#{channel}.csv", "a+") do |csv|
|
26
26
|
csv << values
|
@@ -8,13 +8,29 @@ class SlackSmartBot
|
|
8
8
|
if type.match?(/sick\s+baby/i) or type.match?(/sick\s+child/i)
|
9
9
|
type = 'sick child'
|
10
10
|
end
|
11
|
+
team_id_user = "#{user.team_id}_#{user.name}"
|
12
|
+
if @vacations.key?(team_id_user) and @vacations[team_id_user][:public_holidays].to_s != ""
|
13
|
+
country_region = @vacations[team_id_user][:public_holidays].downcase
|
14
|
+
elsif config[:public_holidays].key?(:default_calendar)
|
15
|
+
country_region = config[:public_holidays][:default_calendar].downcase
|
16
|
+
else
|
17
|
+
country_region = ''
|
18
|
+
end
|
19
|
+
|
20
|
+
local_day_time = local_time(country_region)
|
21
|
+
if local_day_time.nil?
|
22
|
+
today = Date.today
|
23
|
+
else
|
24
|
+
today = local_day_time.to_date
|
25
|
+
end
|
11
26
|
|
12
27
|
if from=='today'
|
13
|
-
from =
|
28
|
+
from = today.strftime("%Y/%m/%d")
|
14
29
|
elsif from =='tomorrow'
|
15
|
-
from = (
|
30
|
+
from = (today+1).strftime("%Y/%m/%d")
|
16
31
|
elsif from.match?(/next\s+week/)
|
17
|
-
from =
|
32
|
+
from = today + ((8 - today.wday) % 7)
|
33
|
+
from += 7 if from == today
|
18
34
|
to = (from + 6).strftime("%Y/%m/%d")
|
19
35
|
from = from.strftime("%Y/%m/%d")
|
20
36
|
end
|
@@ -35,21 +51,21 @@ class SlackSmartBot
|
|
35
51
|
respond "It seems like the date #{to} is not in the correct format: YYYY/MM/DD or is a wrong date."
|
36
52
|
else
|
37
53
|
vacations = @vacations.deep_copy
|
38
|
-
vacations[
|
39
|
-
if !vacations[
|
40
|
-
vacations[
|
41
|
-
vacations[
|
54
|
+
vacations[team_id_user] ||= { user_id: user.id, periods: [] }
|
55
|
+
if !vacations[team_id_user].key?(:periods)
|
56
|
+
vacations[team_id_user][:user_id] = user.id
|
57
|
+
vacations[team_id_user][:periods] = []
|
42
58
|
end
|
43
59
|
|
44
|
-
if vacations[
|
60
|
+
if vacations[team_id_user].periods.empty?
|
45
61
|
vacation_id = 1
|
46
62
|
else
|
47
|
-
vacation_id = vacations[
|
63
|
+
vacation_id = vacations[team_id_user].periods[-1].vacation_id + 1
|
48
64
|
end
|
49
|
-
vacations[
|
50
|
-
update_vacations({
|
65
|
+
vacations[team_id_user].periods << { vacation_id: vacation_id, type: type.downcase, from: from, to: to }
|
66
|
+
update_vacations({team_id_user => vacations[team_id_user]})
|
51
67
|
respond "Period has been added ##{vacation_id}"
|
52
|
-
check_vacations(date:
|
68
|
+
check_vacations(date: today, team_id: user.team_id, user: user.name, set_status: true, only_first_day: false)
|
53
69
|
end
|
54
70
|
end
|
55
71
|
end
|
@@ -3,33 +3,282 @@ class SlackSmartBot
|
|
3
3
|
module General
|
4
4
|
module AI
|
5
5
|
module OpenAI
|
6
|
-
def open_ai_chat(message, delete_history)
|
7
|
-
save_stats(__method__)
|
6
|
+
def open_ai_chat(message, delete_history, type, model: '', tag: '', description: '', files: [])
|
8
7
|
get_personal_settings()
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
8
|
+
user = Thread.current[:user].dup
|
9
|
+
user_name = user.name
|
10
|
+
team_id = user.team_id
|
11
|
+
team_id_user = Thread.current[:team_id_user]
|
12
|
+
if model != '' and !@open_ai_models.include?(model)
|
13
|
+
open_ai_models('', just_models: true) if @open_ai_models.empty?
|
14
|
+
model_selected = @open_ai_models.select{|m| m.include?(model)}
|
15
|
+
model = model_selected[0] if model_selected.size == 1
|
16
|
+
end
|
17
|
+
|
18
|
+
@active_chat_gpt_sessions[team_id_user] ||= {}
|
19
|
+
if delete_history
|
20
|
+
@active_chat_gpt_sessions[team_id_user][Thread.current[:dest]] = ''
|
21
|
+
session_name = ''
|
22
|
+
end
|
23
|
+
|
24
|
+
if @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:thread_ts]) and Thread.current[:thread_ts]!='' #added and Thread.current[:thread_ts]!='' for testing when SIMULATE==true and not in a thread
|
25
|
+
session_name = @active_chat_gpt_sessions[team_id_user][Thread.current[:thread_ts]]
|
26
|
+
elsif @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:dest])
|
27
|
+
session_name = @active_chat_gpt_sessions[team_id_user][Thread.current[:dest]]
|
28
|
+
else
|
29
|
+
session_name = ''
|
30
|
+
@active_chat_gpt_sessions[team_id_user][Thread.current[:dest]] = ''
|
31
|
+
end
|
32
|
+
if type == :start or type == :continue
|
33
|
+
session_name = message
|
34
|
+
@active_chat_gpt_sessions[team_id_user] ||= {}
|
35
|
+
@active_chat_gpt_sessions[team_id_user][Thread.current[:thread_ts]] = session_name
|
36
|
+
message = ''
|
37
|
+
get_openai_sessions(session_name)
|
38
|
+
@open_ai[team_id_user] ||= {}
|
39
|
+
@open_ai[team_id_user][:chat_gpt] ||= {}
|
40
|
+
@open_ai[team_id_user][:chat_gpt][:sessions] ||= {}
|
41
|
+
if !@open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name)
|
42
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name] = {
|
43
|
+
team_creator: team_id,
|
44
|
+
user_creator: user_name,
|
45
|
+
started: Time.now.strftime("%Y-%m-%d %H:%M:%S"),
|
46
|
+
last_activity: Time.now.strftime("%Y-%m-%d %H:%M:%S"),
|
47
|
+
collaborators: [],
|
48
|
+
num_prompts: 0,
|
49
|
+
model: model,
|
50
|
+
copy_of_session: '',
|
51
|
+
copy_of_team: '',
|
52
|
+
copy_of_user: '',
|
53
|
+
users_copying: [],
|
54
|
+
public: false,
|
55
|
+
shared: [],
|
56
|
+
description: description,
|
57
|
+
tag: tag.downcase
|
58
|
+
}
|
59
|
+
else # type == :continue or loading
|
60
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name][:model] = model if model != ''
|
61
|
+
num_prompts = @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:num_prompts]
|
62
|
+
respond "*ChatGPT*: I just loaded *#{session_name}*.\nThere are *#{num_prompts} prompts* in this session.\nThis was the *last prompt* from the session:\n"
|
63
|
+
content = @ai_gpt[team_id_user][session_name].join("\n")
|
64
|
+
index_last_prompt = content.rindex(/^(Me>\s.*)$/)
|
65
|
+
if index_last_prompt.nil?
|
66
|
+
respond "No prompts found"
|
67
|
+
else
|
68
|
+
last_prompt = content[index_last_prompt..-1].gsub(/^Me>/, '*Me>*').gsub(/^chatGPT>/i, "\n*ChatGPT>*")
|
69
|
+
respond last_prompt
|
70
|
+
end
|
71
|
+
end
|
72
|
+
if Thread.current[:on_thread] and
|
73
|
+
(Thread.current[:thread_ts] == Thread.current[:ts] or
|
74
|
+
( @open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name) and
|
75
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name].key?(:thread_ts) and
|
76
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name][:thread_ts].include?(Thread.current[:thread_ts]) ) )
|
77
|
+
react :running, Thread.current[:thread_ts]
|
78
|
+
@listening[team_id_user] ||= {}
|
79
|
+
@listening[team_id_user][Thread.current[:thread_ts]] = Time.now
|
80
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name][:thread_ts] ||= []
|
81
|
+
|
82
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name][:thread_ts] << Thread.current[:thread_ts]
|
83
|
+
@listening[:threads][Thread.current[:thread_ts]] = Thread.current[:dest]
|
19
84
|
else
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
85
|
+
@active_chat_gpt_sessions[team_id_user][Thread.current[:dest]] = session_name
|
86
|
+
end
|
87
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name][:description] = description if description != ''
|
88
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name][:tag] = tag.downcase if tag != ''
|
89
|
+
open_ai_chat_use_model(model, dont_save_stats: true) if model != ''
|
90
|
+
elsif type == :temporary and
|
91
|
+
(!@chat_gpt_collaborating.key?(team_id_user) or !@chat_gpt_collaborating[team_id_user].key?(Thread.current[:thread_ts]))
|
92
|
+
|
93
|
+
@open_ai[team_id_user] ||= {}
|
94
|
+
@open_ai[team_id_user][:chat_gpt] ||= {}
|
95
|
+
@open_ai[team_id_user][:chat_gpt][:sessions] ||= {}
|
96
|
+
|
97
|
+
if Thread.current[:on_thread] and
|
98
|
+
(Thread.current[:thread_ts] == Thread.current[:ts] or
|
99
|
+
(@open_ai[team_id_user][:chat_gpt][:sessions].key?("") and @open_ai[team_id_user][:chat_gpt][:sessions][""].key?(:thread_ts) and
|
100
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][""][:thread_ts].include?(Thread.current[:thread_ts]) ))
|
101
|
+
@listening[team_id_user] ||= {}
|
102
|
+
@listening[team_id_user][Thread.current[:thread_ts]] = Time.now
|
103
|
+
@listening[:threads][Thread.current[:thread_ts]] = Thread.current[:dest]
|
104
|
+
react :running if Thread.current[:thread_ts] == Thread.current[:ts]
|
105
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][""] ||= {}
|
106
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][""][:thread_ts] ||= []
|
107
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][""][:thread_ts] << Thread.current[:thread_ts]
|
108
|
+
@active_chat_gpt_sessions[team_id_user] ||= {}
|
109
|
+
@active_chat_gpt_sessions[team_id_user][Thread.current[:thread_ts]] ||= ""
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
#for collaborators
|
114
|
+
if @chat_gpt_collaborating.key?(team_id_user) and @chat_gpt_collaborating[team_id_user].key?(Thread.current[:thread_ts])
|
115
|
+
team_creator = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:team_creator]
|
116
|
+
user_creator = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:user_creator]
|
117
|
+
session_name = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:session_name]
|
118
|
+
collaborator = true
|
119
|
+
else
|
120
|
+
team_creator = team_id
|
121
|
+
user_creator = user_name
|
122
|
+
collaborator = false
|
123
|
+
end
|
124
|
+
team_id_user_creator = team_creator + "_" + user_creator
|
125
|
+
unless type != :temporary and
|
126
|
+
(!@open_ai.key?(team_id_user_creator) or !@open_ai[team_id_user_creator].key?(:chat_gpt) or !@open_ai[team_id_user_creator][:chat_gpt].key?(:sessions) or
|
127
|
+
!@open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name) or
|
128
|
+
(@open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name) and !collaborator and user_creator!=user.name))
|
129
|
+
save_stats(__method__)
|
130
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:last_activity] = Time.now.strftime("%Y-%m-%d %H:%M:%S") unless session_name == ''
|
131
|
+
@ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, reconnect: delete_history, service: :chat_gpt)
|
132
|
+
|
133
|
+
respond message_connect if message_connect
|
134
|
+
if !@ai_open_ai[team_id_user_creator].nil? and !@ai_open_ai[team_id_user_creator][:chat_gpt][:client].nil?
|
135
|
+
@ai_gpt[team_id_user_creator] ||= {}
|
136
|
+
@ai_gpt[team_id_user_creator][session_name] ||= []
|
137
|
+
|
138
|
+
if delete_history or !@open_ai.key?(team_id_user_creator) or !@open_ai[team_id_user_creator].key?(:chat_gpt) or !@open_ai[team_id_user_creator][:chat_gpt].key?(:sessions) or
|
139
|
+
!@open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name) or !@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name].key?(:model) or
|
140
|
+
!@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name].key?(:num_prompts)
|
141
|
+
|
142
|
+
if delete_history and session_name == '' && @open_ai.key?(team_id_user_creator) && @open_ai[team_id_user_creator].key?(:chat_gpt) &&
|
143
|
+
@open_ai[team_id_user_creator][:chat_gpt].key?(:sessions) && @open_ai[team_id_user_creator][:chat_gpt][:sessions].key?("") &&
|
144
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions][""].key?(:thread_ts)
|
145
|
+
|
146
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions][""][:thread_ts].each do |thread_ts|
|
147
|
+
if thread_ts != Thread.current[:thread_ts] && @listening[:threads].key?(thread_ts)
|
148
|
+
unreact :running, thread_ts, channel: @listening[:threads][thread_ts]
|
149
|
+
message_chatgpt = "I'm sorry, but I'm no longer listening to this thread since you started a new temporary session."
|
150
|
+
respond message_chatgpt, @listening[:threads][thread_ts], thread_ts: thread_ts
|
151
|
+
@listening[team_id_user_creator].delete(thread_ts)
|
152
|
+
@listening[:threads].delete(thread_ts)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
@open_ai[team_id_user_creator] ||= {}
|
158
|
+
@open_ai[team_id_user_creator][:chat_gpt] ||= {}
|
159
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions] ||= {}
|
160
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name] ||= {}
|
161
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:model] = model
|
162
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:num_prompts] = 0
|
163
|
+
end
|
164
|
+
|
165
|
+
if message == "" and session_name == '' # ?? is called
|
166
|
+
@ai_gpt[team_id_user_creator][session_name] = []
|
167
|
+
respond "*ChatGPT*: Let's start a new temporary conversation. Ask me anything."
|
168
|
+
open_ai_chat_use_model(model, dont_save_stats: true) if model != ''
|
169
|
+
else
|
170
|
+
react :speech_balloon
|
171
|
+
begin
|
172
|
+
urls_messages = []
|
173
|
+
get_openai_sessions(session_name, team_id: team_creator, user_name: user_creator)
|
174
|
+
@ai_gpt[team_id_user_creator][session_name] = [] if delete_history
|
175
|
+
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
|
176
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name) and @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name].key?(:model)
|
177
|
+
if model == ''
|
178
|
+
model = @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:model].to_s
|
179
|
+
else
|
180
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:model] = model
|
181
|
+
end
|
182
|
+
else
|
183
|
+
model = ''
|
184
|
+
end
|
185
|
+
model = @ai_open_ai[team_id_user_creator].chat_gpt.model if model.empty?
|
186
|
+
if message == ''
|
187
|
+
res = ''
|
188
|
+
else
|
189
|
+
if !files.nil? and files.size == 1
|
190
|
+
http = NiceHttp.new(host: "https://files.slack.com", headers: { "Authorization" => "Bearer #{config.token}" })
|
191
|
+
res = http.get(files[0].url_private_download)
|
192
|
+
message = "#{message}\n\n#{res.data}"
|
193
|
+
end
|
194
|
+
|
195
|
+
@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:num_prompts] += 1
|
196
|
+
urls = message.scan(/!(https?:\/\/[\S]+)/).flatten
|
197
|
+
urls.uniq.each do |url|
|
198
|
+
begin
|
199
|
+
parsed_url = URI.parse(url)
|
200
|
+
|
201
|
+
headers = {}
|
202
|
+
authorizations = {}
|
203
|
+
|
204
|
+
if config.key?(:authorizations)
|
205
|
+
config[:authorizations].each do |key, value|
|
206
|
+
if value.key?(:host)
|
207
|
+
authorizations[value[:host]] = value
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
if @personal_settings_hash.key?(team_id_user) and @personal_settings_hash[team_id_user].key?(:authorizations)
|
213
|
+
@personal_settings_hash[team_id_user][:authorizations].each do |key, value|
|
214
|
+
if value.key?(:host)
|
215
|
+
authorizations[value[:host]] = value
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
authorizations.each do |key, value|
|
221
|
+
if key.match?(/^(https:\/\/|http:\/\/)?#{parsed_url.host.gsub('.','\.')}/)
|
222
|
+
value.each do |k, v|
|
223
|
+
headers[k.to_sym] = v unless k == :host
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
domain = "#{parsed_url.scheme}://#{parsed_url.host}"
|
229
|
+
http = NiceHttp.new(host: domain, headers: headers, log: :no)
|
230
|
+
response = http.get(parsed_url.path)
|
231
|
+
html_doc = Nokogiri::HTML(response.body)
|
232
|
+
html_doc.search('script, style').remove
|
233
|
+
text = html_doc.text.strip
|
234
|
+
text.gsub!(/^\s*$/m, "")
|
235
|
+
urls_messages << "> #{url}: content extracted and added to prompt\n"
|
236
|
+
http.close
|
237
|
+
rescue Exception => e
|
238
|
+
text = "Error: #{e.message}"
|
239
|
+
urls_messages << "> #{url}: #{text}\n"
|
240
|
+
end
|
241
|
+
message.gsub!("!#{url}", '')
|
242
|
+
message += "\n #{text}\n"
|
243
|
+
end
|
244
|
+
|
245
|
+
@ai_gpt[team_id_user_creator][session_name] << "Me> #{message}"
|
246
|
+
prompts = @ai_gpt[team_id_user_creator][session_name].join("\n\n")
|
247
|
+
prompts.gsub!(/^Me>\s*/,'')
|
248
|
+
prompts.gsub!(/^chatGPT>\s*/,'')
|
249
|
+
success, res = SlackSmartBot::AI::OpenAI.send_gpt_chat(@ai_open_ai[team_id_user_creator][:chat_gpt][:client], model, prompts, @ai_open_ai[team_id_user_creator].chat_gpt)
|
250
|
+
if success
|
251
|
+
@ai_gpt[team_id_user_creator][session_name] << "chatGPT> #{res}"
|
252
|
+
end
|
253
|
+
end
|
254
|
+
if session_name == ''
|
255
|
+
temp_session_name = @ai_gpt[team_id_user_creator][''].first[0..35].gsub('Me> ','')
|
256
|
+
respond "*ChatGPT* Temporary session: _<#{temp_session_name.gsub("\n",' ').gsub("`",' ')}...>_ model: #{model}\n#{res.to_s.strip}"
|
257
|
+
if res.to_s.strip == ''
|
258
|
+
respond "It seems like GPT is not responding. Please try again later or use another model, as it might be overloaded."
|
259
|
+
end
|
260
|
+
#to avoid logging the prompt or the response
|
261
|
+
if config.encrypt
|
262
|
+
Thread.current[:encrypted] ||= []
|
263
|
+
Thread.current[:encrypted] << message
|
264
|
+
end
|
265
|
+
elsif res.to_s.strip == ''
|
266
|
+
res = "\nAll prompts were removed from session." if delete_history
|
267
|
+
respond "*ChatGPT* Session _<#{session_name}>_ model: #{model}#{res}"
|
268
|
+
respond "It seems like GPT is not responding. Please try again later or use another model, as it might be overloaded." if message != ''
|
269
|
+
else
|
270
|
+
respond "*ChatGPT* Session _<#{session_name}>_ model: #{model}\n#{res.to_s.strip}"
|
271
|
+
end
|
272
|
+
if urls_messages.size > 0
|
273
|
+
respond urls_messages.join("\n")
|
274
|
+
end
|
275
|
+
update_openai_sessions(session_name, team_id: team_creator, user_name: user_creator) unless session_name == ''
|
276
|
+
rescue => exception
|
277
|
+
respond "*ChatGPT*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later."
|
278
|
+
@logger.warn exception
|
27
279
|
end
|
28
|
-
|
29
|
-
rescue => exception
|
30
|
-
respond "*GPT*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later."
|
280
|
+
unreact :speech_balloon
|
31
281
|
end
|
32
|
-
unreact :speech_balloon
|
33
282
|
end
|
34
283
|
end
|
35
284
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
module Commands
|
3
|
+
module General
|
4
|
+
module AI
|
5
|
+
module OpenAI
|
6
|
+
def open_ai_chat_add_collaborator(cname)
|
7
|
+
save_stats(__method__)
|
8
|
+
|
9
|
+
user = Thread.current[:user]
|
10
|
+
team_id = user.team_id
|
11
|
+
team_id_user = Thread.current[:team_id_user]
|
12
|
+
|
13
|
+
@active_chat_gpt_sessions[team_id_user] ||= {}
|
14
|
+
|
15
|
+
if @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:thread_ts])
|
16
|
+
session_name = @active_chat_gpt_sessions[team_id_user][Thread.current[:thread_ts]]
|
17
|
+
elsif @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:dest])
|
18
|
+
session_name = @active_chat_gpt_sessions[team_id_user][Thread.current[:dest]]
|
19
|
+
else
|
20
|
+
session_name = ''
|
21
|
+
end
|
22
|
+
|
23
|
+
if session_name != "" and @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:thread_ts])
|
24
|
+
collaborator = find_user(cname)
|
25
|
+
team_id_user_collaborator = collaborator.team_id + "_" + collaborator.name
|
26
|
+
unless @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:collaborators].include?(team_id_user_collaborator)
|
27
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name][:collaborators] << team_id_user_collaborator
|
28
|
+
end
|
29
|
+
@listening[team_id_user_collaborator] ||= {}
|
30
|
+
@listening[team_id_user_collaborator][Thread.current[:thread_ts]] = Time.now
|
31
|
+
@chat_gpt_collaborating[team_id_user_collaborator] ||= {}
|
32
|
+
@chat_gpt_collaborating[team_id_user_collaborator][Thread.current[:thread_ts]] ||= { team_creator: team_id, user_creator: user.name, session_name: session_name }
|
33
|
+
respond "Now <@#{collaborator.name}> is a collaborator of this session only when on a thread.\nIn case you don't want to send a message as a prompt, just start the message with hyphen (-)."
|
34
|
+
else
|
35
|
+
respond "You can add collaborators for the chatGPT session only when started on a thread and using a session name."
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
module Commands
|
3
|
+
module General
|
4
|
+
module AI
|
5
|
+
module OpenAI
|
6
|
+
def open_ai_chat_copy_session(team_orig, user_orig, session_name, new_session_name)
|
7
|
+
if user_orig == ""
|
8
|
+
save_stats(__method__)
|
9
|
+
else
|
10
|
+
save_stats(:open_ai_chat_copy_session_from_user)
|
11
|
+
end
|
12
|
+
|
13
|
+
user = Thread.current[:user].dup
|
14
|
+
team_id = user.team_id
|
15
|
+
if user_orig == ""
|
16
|
+
user_orig = user.name
|
17
|
+
team_orig = team_id
|
18
|
+
end
|
19
|
+
team_orig = team_id if team_orig == ""
|
20
|
+
dest = Thread.current[:dest]
|
21
|
+
get_openai_sessions()
|
22
|
+
orig_team_id_user = team_orig + "_" + user_orig
|
23
|
+
team_id_user = team_id + "_" + user.name
|
24
|
+
|
25
|
+
if !@open_ai.key?(orig_team_id_user)
|
26
|
+
respond "*ChatGPT*: The user *#{user_orig}* doesn't exist."
|
27
|
+
elsif !@open_ai[orig_team_id_user][:chat_gpt][:sessions].key?(session_name)
|
28
|
+
respond "*ChatGPT*: The session *#{session_name}* doesn't exist."
|
29
|
+
elsif user_orig != user.name and
|
30
|
+
!@open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name][:public] and
|
31
|
+
!@open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name][:shared].include?(dest)
|
32
|
+
respond "*ChatGPT*: The session *#{session_name}* doesn't exist or it is not shared."
|
33
|
+
else
|
34
|
+
@open_ai[team_id_user] ||= {}
|
35
|
+
@open_ai[team_id_user][:chat_gpt] ||= {}
|
36
|
+
@open_ai[team_id_user][:chat_gpt][:sessions] ||= {}
|
37
|
+
session_orig = @open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name]
|
38
|
+
open_ai_new_session = {
|
39
|
+
team_creator: team_id,
|
40
|
+
user_creator: user.name,
|
41
|
+
started: Time.now.strftime("%Y-%m-%d %H:%M:%S"),
|
42
|
+
last_activity: Time.now.strftime("%Y-%m-%d %H:%M:%S"),
|
43
|
+
collaborators: [],
|
44
|
+
num_prompts: session_orig[:num_prompts],
|
45
|
+
model: session_orig[:model],
|
46
|
+
shared: [],
|
47
|
+
copy_of_session: session_name,
|
48
|
+
copy_of_team: team_orig,
|
49
|
+
copy_of_user: user_orig,
|
50
|
+
users_copying: [],
|
51
|
+
public: false,
|
52
|
+
description: session_orig[:description],
|
53
|
+
tag: session_orig[:tag]
|
54
|
+
}
|
55
|
+
new_session_name = session_name if new_session_name == ""
|
56
|
+
session_names = @open_ai[team_id_user][:chat_gpt][:sessions].keys
|
57
|
+
if session_names.include?(new_session_name)
|
58
|
+
number = session_names.join("\n").scan(/^#{new_session_name}(\d+)$/).max
|
59
|
+
if number.nil?
|
60
|
+
number = "1"
|
61
|
+
else
|
62
|
+
number = number.flatten[-1].to_i + 1
|
63
|
+
end
|
64
|
+
new_session_name = "#{new_session_name}#{number}"
|
65
|
+
end
|
66
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][new_session_name] = open_ai_new_session
|
67
|
+
|
68
|
+
if user_orig != user.name or team_id != team_orig
|
69
|
+
@open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name][:users_copying] ||= []
|
70
|
+
@open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name][:users_copying] << user.name
|
71
|
+
update_openai_sessions("", team_id: team_orig, user_name: user_orig)
|
72
|
+
end
|
73
|
+
|
74
|
+
get_openai_sessions(session_name, team_id: team_orig, user_name: user_orig)
|
75
|
+
@ai_gpt[team_id_user] ||= {}
|
76
|
+
@ai_gpt[team_id_user][new_session_name] = @ai_gpt[orig_team_id_user][session_name].dup
|
77
|
+
update_openai_sessions(new_session_name, team_id: team_id, user_name: user.name)
|
78
|
+
if user_orig != user.name or team_id != team_orig
|
79
|
+
respond "*ChatGPT*: Session #{session_name} (#{user_orig}) copied to #{new_session_name}.\nNow you can call `^chatGPT #{new_session_name}` to use it."
|
80
|
+
else
|
81
|
+
respond "*ChatGPT*: Session #{session_name} copied to #{new_session_name}.\nNow you can call `^chatGPT #{new_session_name}` to use it."
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
module Commands
|
3
|
+
module General
|
4
|
+
module AI
|
5
|
+
module OpenAI
|
6
|
+
def open_ai_chat_delete_session(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
|
+
#todo: add confirmation message
|
15
|
+
@open_ai[team_id_user] ||= {}
|
16
|
+
@open_ai[team_id_user][:chat_gpt] ||= {}
|
17
|
+
@open_ai[team_id_user][:chat_gpt][:sessions] ||= {}
|
18
|
+
if @open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name)
|
19
|
+
delete_threads = []
|
20
|
+
@active_chat_gpt_sessions[team_id_user].each do |thread_ts, sname|
|
21
|
+
delete_threads << thread_ts if sname == session_name
|
22
|
+
end
|
23
|
+
delete_threads.each do |thread_ts|
|
24
|
+
@active_chat_gpt_sessions[team_id_user].delete(thread_ts)
|
25
|
+
@listening[team_id_user].delete(thread_ts) if @listening.key?(team_id_user)
|
26
|
+
@open_ai[team_id_user][:chat_gpt][:sessions][session_name][:collaborators].each do |collaborator|
|
27
|
+
collaborator_name = collaborator.split("_")[1..-1].join("_")
|
28
|
+
@listening[collaborator_name].delete(thread_ts) if @listening.key?(collaborator_name)
|
29
|
+
@chat_gpt_collaborating[collaborator].delete(thread_ts) if @chat_gpt_collaborating.key?(collaborator)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
@open_ai[team_id_user][:chat_gpt][:sessions].delete(session_name)
|
34
|
+
|
35
|
+
update_openai_sessions(session_name)
|
36
|
+
respond "*ChatGPT*: Session *#{session_name}* deleted."
|
37
|
+
else
|
38
|
+
respond "*ChatGPT*: You don't have a session with that name.\nCall `chatGPT list sessions` to see your saved sessions."
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|