slack-smart-bot 1.14.1 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +237 -48
  3. data/img/chat_gpt.png +0 -0
  4. data/img/chat_gpt_session.png +0 -0
  5. data/img/chat_gpt_share.png +0 -0
  6. data/img/command_add_sc.png +0 -0
  7. data/img/command_bot_help_echo.png +0 -0
  8. data/img/command_loop.png +0 -0
  9. data/img/command_my_timeoff.png +0 -0
  10. data/img/command_recap.png +0 -0
  11. data/img/command_repl1.png +0 -0
  12. data/img/command_repl2.png +0 -0
  13. data/img/command_ruby.png +0 -0
  14. data/img/command_run_repl.png +0 -0
  15. data/img/command_see_announcements.png +0 -0
  16. data/img/command_see_statuses.png +0 -0
  17. data/img/command_see_team.png +0 -0
  18. data/img/command_summarize.png +0 -0
  19. data/img/commands_inline.png +0 -0
  20. data/img/commands_on_demand.png +0 -0
  21. data/img/commands_on_external_call.png +0 -0
  22. data/img/image_editing.png +0 -0
  23. data/img/image_generation.png +0 -0
  24. data/img/image_variations.png +0 -0
  25. data/img/openai-300.png +0 -0
  26. data/img/openai.png +0 -0
  27. data/img/slack-300.png +0 -0
  28. data/img/slack.png +0 -0
  29. data/img/smart-bot-150.png +0 -0
  30. data/img/smart-bot-profile-pic-2.png +0 -0
  31. data/img/smart-bot-profile-pic.png +0 -0
  32. data/img/smart-bot.png +0 -0
  33. data/img/whisper.png +0 -0
  34. data/lib/slack/smart-bot/ai/open_ai/connect.rb +165 -43
  35. data/lib/slack/smart-bot/ai/open_ai/models.rb +61 -9
  36. data/lib/slack/smart-bot/ai/open_ai/send_gpt_chat.rb +67 -11
  37. data/lib/slack/smart-bot/ai/open_ai/send_image_edit.rb +4 -3
  38. data/lib/slack/smart-bot/ai/open_ai/send_image_generation.rb +4 -4
  39. data/lib/slack/smart-bot/ai/open_ai/send_image_variation.rb +4 -3
  40. data/lib/slack/smart-bot/ai/open_ai/whisper_transcribe.rb +4 -3
  41. data/lib/slack/smart-bot/comm/ask.rb +20 -8
  42. data/lib/slack/smart-bot/comm/dont_understand.rb +2 -2
  43. data/lib/slack/smart-bot/comm/event_hello.rb +30 -1
  44. data/lib/slack/smart-bot/comm/get_channel_members.rb +2 -1
  45. data/lib/slack/smart-bot/comm/get_presence.rb +1 -0
  46. data/lib/slack/smart-bot/comm/get_smartbot_team_info.rb +10 -0
  47. data/lib/slack/smart-bot/comm/get_user_info.rb +45 -6
  48. data/lib/slack/smart-bot/comm/get_users.rb +8 -1
  49. data/lib/slack/smart-bot/comm/respond.rb +225 -196
  50. data/lib/slack/smart-bot/comm/send_msg_channel.rb +2 -2
  51. data/lib/slack/smart-bot/comm/send_msg_user.rb +10 -9
  52. data/lib/slack/smart-bot/comm/unreact.rb +2 -2
  53. data/lib/slack/smart-bot/comm.rb +1 -0
  54. data/lib/slack/smart-bot/commands/general/add_admin.rb +16 -6
  55. data/lib/slack/smart-bot/commands/general/add_announcement.rb +3 -3
  56. data/lib/slack/smart-bot/commands/general/add_vacation.rb +28 -12
  57. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat.rb +272 -23
  58. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_add_collaborator.rb +42 -0
  59. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_copy_session.rb +89 -0
  60. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_delete_session.rb +45 -0
  61. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_get_prompts.rb +41 -0
  62. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_list_sessions.rb +81 -0
  63. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_share_session.rb +52 -0
  64. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_use_model.rb +52 -0
  65. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_edit_image.rb +14 -11
  66. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_generate_image.rb +15 -11
  67. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_models.rb +29 -17
  68. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_variations_image.rb +16 -13
  69. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_whisper.rb +13 -7
  70. data/lib/slack/smart-bot/commands/general/allow_access.rb +8 -4
  71. data/lib/slack/smart-bot/commands/general/bot_help.rb +24 -9
  72. data/lib/slack/smart-bot/commands/general/bye_bot.rb +9 -5
  73. data/lib/slack/smart-bot/commands/general/delete_announcement.rb +2 -1
  74. data/lib/slack/smart-bot/commands/general/delete_share.rb +2 -1
  75. data/lib/slack/smart-bot/commands/general/deny_access.rb +1 -1
  76. data/lib/slack/smart-bot/commands/general/get_smartbot_readme.rb +15 -0
  77. data/lib/slack/smart-bot/commands/general/hi_bot.rb +10 -4
  78. data/lib/slack/smart-bot/commands/general/personal_settings.rb +26 -8
  79. data/lib/slack/smart-bot/commands/general/poster.rb +26 -2
  80. data/lib/slack/smart-bot/commands/general/public_holidays.rb +14 -24
  81. data/lib/slack/smart-bot/commands/general/recap.rb +399 -0
  82. data/lib/slack/smart-bot/commands/general/remove_admin.rb +19 -9
  83. data/lib/slack/smart-bot/commands/general/remove_vacation.rb +23 -6
  84. data/lib/slack/smart-bot/commands/general/see_access.rb +2 -1
  85. data/lib/slack/smart-bot/commands/general/see_admins.rb +8 -4
  86. data/lib/slack/smart-bot/commands/general/see_announcements.rb +5 -5
  87. data/lib/slack/smart-bot/commands/general/see_favorite_commands.rb +4 -4
  88. data/lib/slack/smart-bot/commands/general/see_shares.rb +1 -1
  89. data/lib/slack/smart-bot/commands/general/see_vacations.rb +34 -17
  90. data/lib/slack/smart-bot/commands/general/set_public_holidays.rb +4 -2
  91. data/lib/slack/smart-bot/commands/general/share_messages.rb +3 -3
  92. data/lib/slack/smart-bot/commands/general/summarize.rb +191 -0
  93. data/lib/slack/smart-bot/commands/general/teams/add_team.rb +4 -8
  94. data/lib/slack/smart-bot/commands/general/teams/delete_team.rb +3 -3
  95. data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team.rb +34 -29
  96. data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team_comment.rb +1 -1
  97. data/lib/slack/smart-bot/commands/general/teams/memos/delete_memo_team.rb +6 -4
  98. data/lib/slack/smart-bot/commands/general/teams/memos/see_memo_team.rb +26 -15
  99. data/lib/slack/smart-bot/commands/general/teams/memos/see_memos_team.rb +33 -24
  100. data/lib/slack/smart-bot/commands/general/teams/memos/set_memo_status.rb +4 -4
  101. data/lib/slack/smart-bot/commands/general/teams/ping_team.rb +10 -8
  102. data/lib/slack/smart-bot/commands/general/teams/see_teams.rb +73 -61
  103. data/lib/slack/smart-bot/commands/general/teams/see_vacations_team.rb +28 -13
  104. data/lib/slack/smart-bot/commands/general/teams/update_team.rb +9 -9
  105. data/lib/slack/smart-bot/commands/general_bot_commands.rb +1153 -835
  106. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +19 -17
  107. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +12 -9
  108. data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +2 -0
  109. data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +1 -0
  110. data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +5 -3
  111. data/lib/slack/smart-bot/commands/on_bot/admin_master/delete_message.rb +2 -3
  112. data/lib/slack/smart-bot/commands/on_bot/admin_master/get_bot_logs.rb +2 -3
  113. data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +2 -3
  114. data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +7 -6
  115. data/lib/slack/smart-bot/commands/on_bot/admin_master/update_message.rb +2 -3
  116. data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +1 -1
  117. data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +21 -20
  118. data/lib/slack/smart-bot/commands/on_bot/general/bot_stats.rb +40 -7
  119. data/lib/slack/smart-bot/commands/on_bot/general/bot_status.rb +6 -2
  120. data/lib/slack/smart-bot/commands/on_bot/general/stop_using_rules.rb +7 -6
  121. data/lib/slack/smart-bot/commands/on_bot/general/suggest_command.rb +5 -4
  122. data/lib/slack/smart-bot/commands/on_bot/general/use_rules.rb +4 -3
  123. data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +4 -4
  124. data/lib/slack/smart-bot/commands/on_bot/kill_repl.rb +1 -1
  125. data/lib/slack/smart-bot/commands/on_bot/repl.rb +110 -53
  126. data/lib/slack/smart-bot/commands/on_bot/repl_client.rb +35 -29
  127. data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +5 -5
  128. data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +1 -2
  129. data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +5 -4
  130. data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +22 -11
  131. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +12 -7
  132. data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +2 -2
  133. data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +1 -1
  134. data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +5 -5
  135. data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +5 -5
  136. data/lib/slack/smart-bot/commands/on_master/create_bot.rb +3 -3
  137. data/lib/slack/smart-bot/commands.rb +10 -0
  138. data/lib/slack/smart-bot/config.rb +126 -0
  139. data/lib/slack/smart-bot/listen.rb +12 -11
  140. data/lib/slack/smart-bot/process.rb +62 -55
  141. data/lib/slack/smart-bot/process_first.rb +106 -65
  142. data/lib/slack/smart-bot/treat_message.rb +79 -47
  143. data/lib/slack/smart-bot/utils/answer.rb +11 -3
  144. data/lib/slack/smart-bot/utils/answer_delete.rb +11 -3
  145. data/lib/slack/smart-bot/utils/check_vacations.rb +21 -3
  146. data/lib/slack/smart-bot/utils/create_routine_thread.rb +13 -13
  147. data/lib/slack/smart-bot/utils/display_calendar.rb +42 -8
  148. data/lib/slack/smart-bot/utils/encryption/decrypt.rb +16 -9
  149. data/lib/slack/smart-bot/utils/encryption/encrypt.rb +14 -11
  150. data/lib/slack/smart-bot/utils/find_user.rb +71 -0
  151. data/lib/slack/smart-bot/utils/get_access_channels.rb +22 -3
  152. data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +3 -4
  153. data/lib/slack/smart-bot/utils/get_command_ids.rb +5 -5
  154. data/lib/slack/smart-bot/utils/get_countries_candelarific.rb +18 -0
  155. data/lib/slack/smart-bot/utils/get_help.rb +21 -19
  156. data/lib/slack/smart-bot/utils/get_openai_sessions.rb +47 -0
  157. data/lib/slack/smart-bot/utils/get_personal_settings.rb +29 -3
  158. data/lib/slack/smart-bot/utils/get_rules_imported.rb +27 -6
  159. data/lib/slack/smart-bot/utils/get_shares.rb +1 -1
  160. data/lib/slack/smart-bot/utils/get_team_members.rb +4 -4
  161. data/lib/slack/smart-bot/utils/get_vacations.rb +15 -7
  162. data/lib/slack/smart-bot/utils/has_access.rb +10 -4
  163. data/lib/slack/smart-bot/utils/is_admin.rb +25 -17
  164. data/lib/slack/smart-bot/utils/local_time.rb +29 -0
  165. data/lib/slack/smart-bot/utils/save_stats.rb +5 -3
  166. data/lib/slack/smart-bot/utils/update_access_channels.rb +19 -3
  167. data/lib/slack/smart-bot/utils/update_openai_sessions.rb +42 -0
  168. data/lib/slack/smart-bot/utils/update_personal_settings.rb +11 -3
  169. data/lib/slack/smart-bot/utils/update_rules_imported.rb +18 -3
  170. data/lib/slack/smart-bot/utils/update_vacations.rb +5 -2
  171. data/lib/slack/smart-bot/utils/upgrade_to_use_team_ids.rb +276 -0
  172. data/lib/slack/smart-bot/utils.rb +6 -1
  173. data/lib/slack-smart-bot.rb +182 -76
  174. data/lib/slack-smart-bot_general_commands.rb +10 -9
  175. data/whats_new.txt +30 -13
  176. metadata +152 -18
@@ -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: Thread.current[:dest], name: emoji, timestamp: ts) unless config.simulate
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
@@ -17,3 +17,4 @@ require_relative 'comm/delete'
17
17
  require_relative 'comm/get_presence'
18
18
  require_relative 'comm/set_status'
19
19
  require_relative 'comm/update'
20
+ require_relative 'comm/get_smartbot_team_info'
@@ -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 = @users.select{|u| u.id == channel_found.creator or (u.key?(:enterprise_user) and u.enterprise_user.id == channel_found.creator)}[-1]
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
- admins << @admins_channels[channel]
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
- if admins.include?(user.name)
32
- admin_info = @users.select{|u| u.id == admin_user or (u.key?(:enterprise_user) and u.enterprise_user.id == admin_user)}[-1]
33
- if admins.include?(admin_info.name)
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 = Date.today.strftime("%Y/%m/%d")
28
+ from = today.strftime("%Y/%m/%d")
14
29
  elsif from =='tomorrow'
15
- from = (Date.today+1).strftime("%Y/%m/%d")
30
+ from = (today+1).strftime("%Y/%m/%d")
16
31
  elsif from.match?(/next\s+week/)
17
- from = Date.today + ((1 - Date.today.wday) % 7)
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[user.name] ||= { user_id: user.id, periods: [] }
39
- if !vacations[user.name].key?(:periods)
40
- vacations[user.name][:user_id] = user.id
41
- vacations[user.name][:periods] = []
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[user.name].periods.empty?
60
+ if vacations[team_id_user].periods.empty?
45
61
  vacation_id = 1
46
62
  else
47
- vacation_id = vacations[user.name].periods[-1].vacation_id + 1
63
+ vacation_id = vacations[team_id_user].periods[-1].vacation_id + 1
48
64
  end
49
- vacations[user.name].periods << { vacation_id: vacation_id, type: type.downcase, from: from, to: to }
50
- update_vacations({user.name => vacations[user.name]})
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: Date.today, user: user.name, set_status: true, only_first_day: false)
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
- @ai_open_ai, message_connect = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, reconnect: delete_history)
10
- respond message_connect if message_connect
11
- user = Thread.current[:user]
12
- if !@ai_open_ai[user.name].nil? and !@ai_open_ai[user.name][:client].nil?
13
- @ai_gpt ||= {}
14
- @ai_gpt[user.name] ||= []
15
-
16
- if message == "" # ?? is called
17
- @ai_gpt[user.name] = []
18
- respond "*GPT*: Let's start a new conversation. Ask me anything."
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
- react :speech_balloon
21
- begin
22
- @ai_gpt[user.name] = [] if delete_history
23
- @ai_gpt[user.name] << message
24
- success, res = SlackSmartBot::AI::OpenAI.send_gpt_chat(@ai_open_ai[user.name][:client], @ai_open_ai[user.name].gpt_model, @ai_gpt[user.name].join("\n"))
25
- if success
26
- @ai_gpt[user.name] << res
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
- respond "*GPT* Session: _<#{@ai_gpt[user.name].first[0..29]}...>_ (id:#{@ai_gpt[user.name].object_id}) \n#{res.strip}"
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