slack-smart-bot 1.14.2 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +222 -37
  3. data/img/chat_gpt.png +0 -0
  4. data/img/chat_gpt_session.png +0 -0
  5. data/img/chat_gpt_share.png +0 -0
  6. data/img/command_add_sc.png +0 -0
  7. data/img/command_bot_help_echo.png +0 -0
  8. data/img/command_loop.png +0 -0
  9. data/img/command_my_timeoff.png +0 -0
  10. data/img/command_recap.png +0 -0
  11. data/img/command_repl1.png +0 -0
  12. data/img/command_repl2.png +0 -0
  13. data/img/command_ruby.png +0 -0
  14. data/img/command_run_repl.png +0 -0
  15. data/img/command_see_announcements.png +0 -0
  16. data/img/command_see_statuses.png +0 -0
  17. data/img/command_see_team.png +0 -0
  18. data/img/command_summarize.png +0 -0
  19. data/img/commands_inline.png +0 -0
  20. data/img/commands_on_demand.png +0 -0
  21. data/img/commands_on_external_call.png +0 -0
  22. data/img/image_editing.png +0 -0
  23. data/img/image_generation.png +0 -0
  24. data/img/image_variations.png +0 -0
  25. data/img/openai-300.png +0 -0
  26. data/img/openai.png +0 -0
  27. data/img/slack-300.png +0 -0
  28. data/img/slack.png +0 -0
  29. data/img/smart-bot-150.png +0 -0
  30. data/img/smart-bot-profile-pic-2.png +0 -0
  31. data/img/smart-bot-profile-pic.png +0 -0
  32. data/img/smart-bot.png +0 -0
  33. data/img/whisper.png +0 -0
  34. data/lib/slack/smart-bot/ai/open_ai/connect.rb +165 -43
  35. data/lib/slack/smart-bot/ai/open_ai/models.rb +61 -9
  36. data/lib/slack/smart-bot/ai/open_ai/send_gpt_chat.rb +67 -11
  37. data/lib/slack/smart-bot/ai/open_ai/send_image_edit.rb +4 -3
  38. data/lib/slack/smart-bot/ai/open_ai/send_image_generation.rb +4 -4
  39. data/lib/slack/smart-bot/ai/open_ai/send_image_variation.rb +4 -3
  40. data/lib/slack/smart-bot/ai/open_ai/whisper_transcribe.rb +4 -3
  41. data/lib/slack/smart-bot/comm/ask.rb +20 -8
  42. data/lib/slack/smart-bot/comm/dont_understand.rb +2 -2
  43. data/lib/slack/smart-bot/comm/event_hello.rb +30 -1
  44. data/lib/slack/smart-bot/comm/get_channel_members.rb +2 -1
  45. data/lib/slack/smart-bot/comm/get_presence.rb +1 -0
  46. data/lib/slack/smart-bot/comm/get_smartbot_team_info.rb +10 -0
  47. data/lib/slack/smart-bot/comm/get_user_info.rb +45 -6
  48. data/lib/slack/smart-bot/comm/get_users.rb +8 -1
  49. data/lib/slack/smart-bot/comm/respond.rb +225 -196
  50. data/lib/slack/smart-bot/comm/send_msg_channel.rb +2 -2
  51. data/lib/slack/smart-bot/comm/send_msg_user.rb +10 -9
  52. data/lib/slack/smart-bot/comm/unreact.rb +2 -2
  53. data/lib/slack/smart-bot/comm.rb +1 -0
  54. data/lib/slack/smart-bot/commands/general/add_admin.rb +16 -6
  55. data/lib/slack/smart-bot/commands/general/add_announcement.rb +3 -3
  56. data/lib/slack/smart-bot/commands/general/add_vacation.rb +28 -12
  57. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat.rb +272 -23
  58. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_add_collaborator.rb +42 -0
  59. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_copy_session.rb +89 -0
  60. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_delete_session.rb +45 -0
  61. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_get_prompts.rb +41 -0
  62. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_list_sessions.rb +81 -0
  63. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_share_session.rb +52 -0
  64. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_use_model.rb +52 -0
  65. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_edit_image.rb +14 -11
  66. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_generate_image.rb +15 -11
  67. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_models.rb +29 -17
  68. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_variations_image.rb +16 -13
  69. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_whisper.rb +13 -7
  70. data/lib/slack/smart-bot/commands/general/allow_access.rb +8 -4
  71. data/lib/slack/smart-bot/commands/general/bot_help.rb +24 -10
  72. data/lib/slack/smart-bot/commands/general/bye_bot.rb +9 -5
  73. data/lib/slack/smart-bot/commands/general/delete_announcement.rb +2 -1
  74. data/lib/slack/smart-bot/commands/general/delete_share.rb +2 -1
  75. data/lib/slack/smart-bot/commands/general/deny_access.rb +1 -1
  76. data/lib/slack/smart-bot/commands/general/get_smartbot_readme.rb +15 -0
  77. data/lib/slack/smart-bot/commands/general/hi_bot.rb +10 -4
  78. data/lib/slack/smart-bot/commands/general/personal_settings.rb +26 -8
  79. data/lib/slack/smart-bot/commands/general/poster.rb +26 -2
  80. data/lib/slack/smart-bot/commands/general/public_holidays.rb +14 -24
  81. data/lib/slack/smart-bot/commands/general/recap.rb +399 -0
  82. data/lib/slack/smart-bot/commands/general/remove_admin.rb +19 -9
  83. data/lib/slack/smart-bot/commands/general/remove_vacation.rb +23 -6
  84. data/lib/slack/smart-bot/commands/general/see_access.rb +2 -1
  85. data/lib/slack/smart-bot/commands/general/see_admins.rb +8 -4
  86. data/lib/slack/smart-bot/commands/general/see_announcements.rb +5 -5
  87. data/lib/slack/smart-bot/commands/general/see_favorite_commands.rb +4 -4
  88. data/lib/slack/smart-bot/commands/general/see_shares.rb +1 -1
  89. data/lib/slack/smart-bot/commands/general/see_vacations.rb +34 -17
  90. data/lib/slack/smart-bot/commands/general/set_public_holidays.rb +4 -2
  91. data/lib/slack/smart-bot/commands/general/share_messages.rb +3 -3
  92. data/lib/slack/smart-bot/commands/general/summarize.rb +191 -0
  93. data/lib/slack/smart-bot/commands/general/teams/add_team.rb +4 -8
  94. data/lib/slack/smart-bot/commands/general/teams/delete_team.rb +3 -3
  95. data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team.rb +34 -29
  96. data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team_comment.rb +1 -1
  97. data/lib/slack/smart-bot/commands/general/teams/memos/delete_memo_team.rb +6 -4
  98. data/lib/slack/smart-bot/commands/general/teams/memos/see_memo_team.rb +26 -15
  99. data/lib/slack/smart-bot/commands/general/teams/memos/see_memos_team.rb +33 -24
  100. data/lib/slack/smart-bot/commands/general/teams/memos/set_memo_status.rb +4 -4
  101. data/lib/slack/smart-bot/commands/general/teams/ping_team.rb +10 -8
  102. data/lib/slack/smart-bot/commands/general/teams/see_teams.rb +73 -61
  103. data/lib/slack/smart-bot/commands/general/teams/see_vacations_team.rb +28 -13
  104. data/lib/slack/smart-bot/commands/general/teams/update_team.rb +9 -9
  105. data/lib/slack/smart-bot/commands/general_bot_commands.rb +1152 -839
  106. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +18 -17
  107. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +11 -9
  108. data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +2 -0
  109. data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +1 -0
  110. data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +5 -3
  111. data/lib/slack/smart-bot/commands/on_bot/admin_master/delete_message.rb +2 -3
  112. data/lib/slack/smart-bot/commands/on_bot/admin_master/get_bot_logs.rb +2 -3
  113. data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +2 -3
  114. data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +7 -6
  115. data/lib/slack/smart-bot/commands/on_bot/admin_master/update_message.rb +2 -3
  116. data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +1 -1
  117. data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +21 -20
  118. data/lib/slack/smart-bot/commands/on_bot/general/bot_stats.rb +40 -7
  119. data/lib/slack/smart-bot/commands/on_bot/general/bot_status.rb +6 -2
  120. data/lib/slack/smart-bot/commands/on_bot/general/stop_using_rules.rb +7 -6
  121. data/lib/slack/smart-bot/commands/on_bot/general/suggest_command.rb +5 -4
  122. data/lib/slack/smart-bot/commands/on_bot/general/use_rules.rb +4 -3
  123. data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +4 -4
  124. data/lib/slack/smart-bot/commands/on_bot/kill_repl.rb +1 -1
  125. data/lib/slack/smart-bot/commands/on_bot/repl.rb +109 -53
  126. data/lib/slack/smart-bot/commands/on_bot/repl_client.rb +35 -29
  127. data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +5 -5
  128. data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +1 -2
  129. data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +5 -4
  130. data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +22 -12
  131. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +12 -7
  132. data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +2 -2
  133. data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +1 -1
  134. data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +5 -5
  135. data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +5 -5
  136. data/lib/slack/smart-bot/commands/on_master/create_bot.rb +3 -3
  137. data/lib/slack/smart-bot/commands.rb +10 -0
  138. data/lib/slack/smart-bot/config.rb +126 -0
  139. data/lib/slack/smart-bot/listen.rb +12 -11
  140. data/lib/slack/smart-bot/process.rb +62 -55
  141. data/lib/slack/smart-bot/process_first.rb +106 -65
  142. data/lib/slack/smart-bot/treat_message.rb +79 -47
  143. data/lib/slack/smart-bot/utils/answer.rb +11 -3
  144. data/lib/slack/smart-bot/utils/answer_delete.rb +11 -3
  145. data/lib/slack/smart-bot/utils/check_vacations.rb +21 -3
  146. data/lib/slack/smart-bot/utils/create_routine_thread.rb +13 -13
  147. data/lib/slack/smart-bot/utils/display_calendar.rb +42 -8
  148. data/lib/slack/smart-bot/utils/encryption/decrypt.rb +16 -9
  149. data/lib/slack/smart-bot/utils/encryption/encrypt.rb +14 -11
  150. data/lib/slack/smart-bot/utils/find_user.rb +71 -0
  151. data/lib/slack/smart-bot/utils/get_access_channels.rb +22 -3
  152. data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +3 -4
  153. data/lib/slack/smart-bot/utils/get_command_ids.rb +5 -5
  154. data/lib/slack/smart-bot/utils/get_countries_candelarific.rb +18 -0
  155. data/lib/slack/smart-bot/utils/get_help.rb +21 -19
  156. data/lib/slack/smart-bot/utils/get_openai_sessions.rb +47 -0
  157. data/lib/slack/smart-bot/utils/get_personal_settings.rb +29 -3
  158. data/lib/slack/smart-bot/utils/get_rules_imported.rb +27 -6
  159. data/lib/slack/smart-bot/utils/get_shares.rb +1 -1
  160. data/lib/slack/smart-bot/utils/get_team_members.rb +4 -4
  161. data/lib/slack/smart-bot/utils/get_vacations.rb +15 -7
  162. data/lib/slack/smart-bot/utils/has_access.rb +10 -4
  163. data/lib/slack/smart-bot/utils/is_admin.rb +25 -17
  164. data/lib/slack/smart-bot/utils/local_time.rb +29 -0
  165. data/lib/slack/smart-bot/utils/save_stats.rb +5 -3
  166. data/lib/slack/smart-bot/utils/update_access_channels.rb +19 -3
  167. data/lib/slack/smart-bot/utils/update_openai_sessions.rb +42 -0
  168. data/lib/slack/smart-bot/utils/update_personal_settings.rb +11 -3
  169. data/lib/slack/smart-bot/utils/update_rules_imported.rb +18 -3
  170. data/lib/slack/smart-bot/utils/update_vacations.rb +5 -2
  171. data/lib/slack/smart-bot/utils/upgrade_to_use_team_ids.rb +276 -0
  172. data/lib/slack/smart-bot/utils.rb +6 -1
  173. data/lib/slack-smart-bot.rb +182 -76
  174. data/lib/slack-smart-bot_general_commands.rb +10 -9
  175. data/whats_new.txt +30 -13
  176. metadata +148 -20
@@ -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