chatgpt_assistant 0.1.6 → 0.1.7

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/.env_sample +16 -7
  3. data/.rubocop.yml +14 -3
  4. data/Dockerfile +11 -5
  5. data/Gemfile +25 -23
  6. data/Gemfile.lock +123 -85
  7. data/README.md +15 -18
  8. data/Rakefile +1 -0
  9. data/docker-compose.yml +8 -4
  10. data/exe/chatgpt_assistant +1 -1
  11. data/lib/{bots → chatgpt_assistant/bots}/application_bot.rb +0 -6
  12. data/lib/chatgpt_assistant/bots/discord/actions.rb +104 -0
  13. data/lib/chatgpt_assistant/bots/discord/auth.rb +36 -0
  14. data/lib/chatgpt_assistant/bots/discord/bot.rb +29 -0
  15. data/lib/chatgpt_assistant/bots/discord/chat_actions.rb +33 -0
  16. data/lib/chatgpt_assistant/bots/discord/events.rb +138 -0
  17. data/lib/chatgpt_assistant/bots/discord/validations.rb +38 -0
  18. data/lib/chatgpt_assistant/bots/discord/voice_actions.rb +33 -0
  19. data/lib/chatgpt_assistant/bots/discord/voice_checkers.rb +35 -0
  20. data/lib/chatgpt_assistant/bots/discord_bot.rb +42 -0
  21. data/lib/chatgpt_assistant/bots/helpers/messenger_helper.rb +16 -0
  22. data/lib/{bots → chatgpt_assistant/bots}/jobs/register_job.rb +2 -2
  23. data/lib/chatgpt_assistant/bots/mailers/account_mailer.rb +30 -0
  24. data/lib/chatgpt_assistant/bots/mailers/application_mailer.rb +21 -0
  25. data/lib/chatgpt_assistant/bots/services/new_chat_service.rb +59 -0
  26. data/lib/chatgpt_assistant/bots/services/register_service.rb +45 -0
  27. data/lib/chatgpt_assistant/bots/telegram/actions.rb +54 -0
  28. data/lib/chatgpt_assistant/bots/telegram/auth.rb +40 -0
  29. data/lib/chatgpt_assistant/bots/telegram/bot.rb +17 -0
  30. data/lib/chatgpt_assistant/bots/telegram/chat_actions.rb +30 -0
  31. data/lib/chatgpt_assistant/bots/telegram/events.rb +120 -0
  32. data/lib/chatgpt_assistant/bots/telegram/events_controller.rb +48 -0
  33. data/lib/chatgpt_assistant/bots/telegram/permissions.rb +48 -0
  34. data/lib/chatgpt_assistant/bots/telegram/validations.rb +55 -0
  35. data/lib/chatgpt_assistant/bots/telegram/voice_actions.rb +36 -0
  36. data/lib/chatgpt_assistant/bots/telegram_bot.rb +44 -0
  37. data/lib/chatgpt_assistant/chatter.rb +10 -2
  38. data/lib/chatgpt_assistant/config.rb +4 -1
  39. data/lib/chatgpt_assistant/default_messages.rb +10 -4
  40. data/lib/chatgpt_assistant/error.rb +9 -0
  41. data/lib/chatgpt_assistant/migrations.rb +5 -0
  42. data/lib/chatgpt_assistant/models.rb +20 -0
  43. data/lib/chatgpt_assistant/version.rb +1 -1
  44. data/lib/chatgpt_assistant.rb +5 -3
  45. metadata +34 -24
  46. data/.env_prod_sample +0 -18
  47. data/docker-compose.prod.yml +0 -34
  48. data/lib/bots/discord_bot.rb +0 -182
  49. data/lib/bots/helpers/authentication_helper.rb +0 -48
  50. data/lib/bots/helpers/discord_helper.rb +0 -124
  51. data/lib/bots/helpers/discord_voice_helper.rb +0 -50
  52. data/lib/bots/helpers/messenger_helper.rb +0 -133
  53. data/lib/bots/helpers/telegram_helper.rb +0 -73
  54. data/lib/bots/helpers/telegram_voice_helper.rb +0 -33
  55. data/lib/bots/helpers/validation_helper.rb +0 -38
  56. data/lib/bots/helpers/visit_helper.rb +0 -28
  57. data/lib/bots/services/new_chat_service.rb +0 -34
  58. data/lib/bots/services/register_service.rb +0 -36
  59. data/lib/bots/telegram_bot.rb +0 -180
  60. /data/lib/{bots → chatgpt_assistant/bots}/helpers/audio_helper.rb +0 -0
  61. /data/lib/{bots → chatgpt_assistant/bots}/helpers/file_helper.rb +0 -0
  62. /data/lib/{bots → chatgpt_assistant/bots}/helpers/search_helper.rb +0 -0
  63. /data/lib/{bots → chatgpt_assistant/bots}/jobs/new_chat_job.rb +0 -0
  64. /data/lib/{bots → chatgpt_assistant/bots}/jobs/voice_connect_job.rb +0 -0
  65. /data/lib/{bots → chatgpt_assistant/bots}/services/voice_connect_service.rb +0 -0
@@ -1,133 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ChatgptAssistant
4
- # Helper for messenger
5
- module MessengerHelper
6
- def chat_success(chat_id)
7
- user_message = Message.new(chat_id: chat_id, content: msg.text, role: "user")
8
- if user_message&.save
9
- text = chatter.chat(msg.text, chat_id, error_messages[:something_went_wrong])
10
- mess = parse_message(text, 4096)
11
- mess.each { |m| send_message m, msg.chat.id }
12
- else
13
- send_message error_messages[:something_went_wrong], msg.chat.id
14
- end
15
- end
16
-
17
- def respond_with_success(chat)
18
- user.update(current_chat_id: chat.id)
19
- send_message success_messages[:chat_created]
20
- end
21
-
22
- def parse_message(message, max_length)
23
- if message.length > max_length
24
- array = message.scan(/.{1,#{max_length}}/) if max_length.positive?
25
- array = ["Something went wrong! Try again later"] if max_length <= 0
26
- else
27
- array = [message]
28
- end
29
- array
30
- end
31
-
32
- def send_message(text, chat_id = nil)
33
- @send_message = bot.respond_to?(:api) ? telegram_send_message(text, chat_id) : discord_send_message(text)
34
- end
35
-
36
- def telegram_send_message(text, chat_id)
37
- messages = parse_message(text, 4096)
38
- messages.each { |m| bot.api.send_message(chat_id: chat_id, text: m) }
39
- end
40
-
41
- def discord_send_message(text)
42
- messages = parse_message(text, 2000)
43
- messages.each { |m| evnt.respond m }
44
- end
45
-
46
- def discord_help_message
47
- help_messages.join("\n").gsub(" /", discord_prefix)
48
- .gsub("register/", "#{discord_prefix}register ")
49
- .gsub("login/", "#{discord_prefix}login ")
50
- .gsub("new_chat/", "#{discord_prefix}new_chat/")
51
- .gsub("sl_chat/", "#{discord_prefix}sl_chat/")
52
- end
53
-
54
- def user_logged_message
55
- user.update(telegram_id: msg.chat.id)
56
- bot.api&.send_message(chat_id: msg.chat.id, text: success_messages[:user_logged_in]) if bot.respond_to?(:api)
57
- evnt&.respond success_messages[:user_logged_in] if evnt.present?
58
- end
59
-
60
- def invalid_command_error_message
61
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:invalid_command]) if bot.respond_to?(:api)
62
- evnt&.respond error_messages[:invalid_command]
63
- end
64
-
65
- def user_not_found_error_message
66
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:user_not_found]) if bot.respond_to?(:api)
67
- evnt&.respond error_messages[:user_not_found] if evnt.present?
68
- end
69
-
70
- def user_created_message
71
- bot.api&.send_message(chat_id: msg.chat.id, text: success_messages[:user_created]) if bot.respond_to?(:api)
72
- evnt&.respond success_messages[:user_created] if evnt.present?
73
- end
74
-
75
- def user_creation_error_message
76
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:user_creation]) if bot.respond_to?(:api)
77
- evnt&.respond error_messages[:user_creation] if evnt.present?
78
- end
79
-
80
- def chat_created_message(chat)
81
- user&.update(current_chat_id: chat.id)
82
- return telegram_created(chat) if bot.respond_to?(:api)
83
-
84
- discord_created(chat)
85
- end
86
-
87
- def telegram_created(chat)
88
- bot.api.send_message(chat_id: msg.chat.id, text: "Intructions sended to actor:\n#{chat.prompt}") unless chat.actor.nil?
89
- bot.api.send_message(chat_id: msg.chat.id, text: "Response from assistant:\n#{chat.messages[1].content}") unless chat.actor.nil?
90
- bot.api.send_message(chat_id: msg.chat.id, text: success_messages[:chat_created]) if bot.respond_to?(:api)
91
- end
92
-
93
- def discord_created(chat)
94
- evnt.respond "Intructions sended to actor:\n#{chat.prompt}" unless chat.actor.nil?
95
- evnt.respond success_messages[:chat_created] if evnt.present?
96
- end
97
-
98
- def not_logged_in_message
99
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:user_not_logged_in]) if bot.respond_to?(:api)
100
- evnt&.respond(error_messages[:user_not_logged_in])
101
- end
102
-
103
- def wrong_password_error_message
104
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:password]) if bot.respond_to?(:api)
105
- evnt&.respond(error_messages[:password])
106
- end
107
-
108
- def chat_not_found_message
109
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:chat_not_found]) if bot.respond_to?(:api)
110
- evnt&.respond(error_messages[:chat_not_found])
111
- end
112
-
113
- def no_chat_selected_message
114
- bot&.api&.send_message(chat_id: msg.chat.id, text: error_messages[:no_chat_selected]) if bot.respond_to?(:api)
115
- evnt&.respond(error_messages[:no_chat_selected])
116
- end
117
-
118
- def no_messages_founded_message
119
- bot&.api&.send_message(chat_id: msg.chat.id, text: error_messages[:no_messages_founded]) if bot.respond_to?(:api)
120
- evnt&.respond(error_messages[:no_messages_founded])
121
- end
122
-
123
- def chat_creation_failed_message
124
- bot&.api&.send_message(chat_id: msg.chat.id, text: error_messages[:chat_creation_failed]) if bot.respond_to?(:api)
125
- evnt&.respond(error_messages[:chat_creation_failed])
126
- end
127
-
128
- def user_logged_in_message
129
- bot.api&.send_message(chat_id: msg.chat.id, text: success_messages[:user_logged_in]) if bot.respond_to?(:api)
130
- evnt&.respond(success_messages[:user_logged_in])
131
- end
132
- end
133
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ChatgptAssistant
4
- # Helper for telegram
5
- module TelegramHelper
6
- def user
7
- @user = find_user(telegram_id: msg.chat.id)
8
- end
9
-
10
- def bot
11
- @bot ||= Telegram::Bot::Client.new(telegram_token)
12
- end
13
-
14
- def telegram_chat_event
15
- user ? chat_if_exists : not_logged_in_message
16
- end
17
-
18
- def telegram_user_create(visitor_id, email, password)
19
- visitor = Visitor.find_by(id: visitor_id)
20
- return false unless visitor
21
-
22
- visitor.tel_user.update(telegram_id: nil) if visitor.tel_user.present?
23
- user = User.new(telegram_id: visitor.telegram_id, email: email, password: password)
24
- user.save ? user.email : user.errors.full_messages
25
- end
26
-
27
- def telegram_send_start_message
28
- send_message common_messages[:start], msg.chat.id
29
- help_message = help_messages.join("\n").to_s
30
- send_message help_message, msg.chat.id
31
- send_message common_messages[:start_helper], msg.chat.id
32
- send_message common_messages[:start_sec_helper], msg.chat.id
33
- end
34
-
35
- def telegram_create_chat
36
- text = msg.text
37
- title = text.split("/").last
38
- mode = nil
39
- if title.include?(":")
40
- mode = title.split(":").last
41
- title = title.split(":").first
42
- end
43
- actor_modes = AwesomeChatgptActors::CastControl.actors
44
- return send_message "invalid mode", msg.chat.id unless (mode.to_i >= 1 && mode.to_i <= actor_modes.size + 1) || mode.nil?
45
- return send_message "invalid chat title", msg.chat.id if title.nil? || title.empty?
46
- return send_message "You already have a chat with this title", msg.chat.id if user.chat_by_title(title)
47
-
48
- actor_name = actor_modes[mode.to_i - 1] if mode
49
- actor = AwesomeChatgptActors::Actor.new(prompt_type: actor_name) if actor_name
50
- chat = Chat.new(user_id: user.id, status: 0, title: title, actor: actor_name, prompt: actor.prompt) if actor
51
- chat = Chat.new(user_id: user.id, status: 0, title: title) unless actor
52
- return send_message "Something went wrong", msg.chat.id unless chat
53
-
54
- chat.save ? chat_created_message(chat) : chat_creation_failed_message
55
- end
56
-
57
- def telegram_text_or_audio?
58
- msg.respond_to?(:text) || msg.respond_to?(:audio) || msg.respond_to?(:voice)
59
- end
60
-
61
- def telegram_message_has_text?
62
- msg.text.present?
63
- end
64
-
65
- def telegram_message_has_audio?
66
- msg.audio.present? || msg.voice.present?
67
- end
68
-
69
- def telegram_actions?
70
- msg.text.include?("new_chat/") || msg.text.include?("sl_chat/") || msg.text.include?("login/") || msg.text.include?("register/")
71
- end
72
- end
73
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ChatgptAssistant
4
- # Telegram Voice Helper
5
- module TelegramVoiceHelper
6
- def telegram_audio_info
7
- bot.api.get_file(file_id: telegram_audio.file_id)
8
- end
9
-
10
- def telegram_audio_url
11
- "https://api.telegram.org/file/bot#{telegram_token}/#{telegram_audio_info["result"]["file_path"]}"
12
- end
13
-
14
- def telegram_audio
15
- msg.audio || msg.voice
16
- end
17
-
18
- def telegram_process_ai_voice(user_audio)
19
- ai_text = chatter.chat(user_audio["text"], user.current_chat_id, error_messages[:something_went_wrong])
20
- ai_voice = synthesis.synthesize_text(ai_text)
21
- {
22
- voice: ai_voice,
23
- text: ai_text
24
- }
25
- end
26
-
27
- def telegram_send_voice_message(voice: nil, text: nil)
28
- messages = parse_message text, 4096
29
- bot.api.send_voice(chat_id: msg.chat.id, voice: Faraday::UploadIO.new(voice, "audio/mp3"))
30
- messages.each { |message| send_message message, msg.chat.id }
31
- end
32
- end
33
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ChatgptAssistant
4
- # This module is responsible for the validation of the bot actions
5
- module ValidationHelper
6
- def valid_for_list_action?
7
- not_logged_in_message if user.nil?
8
- chat_not_found_message if user.chats.count.zero?
9
- !user.nil? && user.chats.count.positive?
10
- end
11
-
12
- def chat_if_exists
13
- chat = Chat.find_by(user_id: user.id, id: user.current_chat_id)
14
- chat ? chat_success(chat.id) : no_chat_selected_message
15
- end
16
-
17
- def visitor_user?
18
- visitor&.tel_user.nil? && visitor&.dis_user.nil?
19
- end
20
-
21
- def discord_voice_bot_disconnected?
22
- user && evnt.user.voice_channel && !evnt.voice && !chat.nil?
23
- end
24
-
25
- def discord_voice_bot_connected?
26
- user && evnt.user.voice_channel && evnt.voice && !chat.nil?
27
- end
28
-
29
- def discord_next_action?
30
- return true if evnt.channel.type != 1 && evnt.channel.name != "ai-spaces"
31
-
32
- %w[login register start help new_chat sl_chat ask list hist connect disconnect speak].each do |action|
33
- return true if evnt.message.content.include?("#{discord_prefix}#{action}")
34
- end
35
- false
36
- end
37
- end
38
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ChatgptAssistant
4
- # Helper for visit
5
- module VisitHelper
6
- def telegram_visited?(chat_id)
7
- return unless msg
8
-
9
- visitor = Visitor.find_by(telegram_id: chat_id, name: msg.from.first_name)
10
- if visitor.nil?
11
- Visitor.create(telegram_id: chat_id, name: msg.from.first_name)
12
- else
13
- visitor
14
- end
15
- end
16
-
17
- def discord_visited?(user_id)
18
- return unless evnt
19
-
20
- visitor = Visitor.find_by(discord_id: user_id, name: evnt.user.name)
21
- if visitor.nil?
22
- Visitor.create(discord_id: user_id, name: evnt.user.name)
23
- else
24
- visitor
25
- end
26
- end
27
- end
28
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ChatgptAssistant
4
- # This class is responsible to background the new chat service
5
- class NewChatService
6
- def initialize(chat_title, user_id, chat_id, config)
7
- @chat_title = chat_title
8
- @user_id = user_id
9
- @chat_id = chat_id
10
- @config = config
11
- end
12
-
13
- def telegram_async
14
- TelegramBot.new(@config)
15
- end
16
-
17
- def call
18
- raise ChatAlreadyExistsError if Chat.find_by(title: @chat_title)
19
- raise NilError if @chat_title.nil?
20
- raise NilError if @user_id.nil?
21
- raise NilError if @chat_id.nil?
22
-
23
- chat = Chat.new(title: @chat_title, user_id: @user_id)
24
- if chat.save
25
- telegram_async.send_message("Chat created succesfully", @chat_id)
26
- else
27
- raise ChatAlreadyExistsError if Chat.find_by(title: @chat_title)
28
- raise NilError if chat.errors[:title].any?
29
- end
30
- rescue ChatAlreadyExistsError, NilError => e
31
- telegram_async.send_message(e.message, @chat_id)
32
- end
33
- end
34
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ChatgptAssistant
4
- # This class is responsible to background the register service
5
- class RegisterService
6
- def initialize(email, password, chat_id)
7
- @email = email
8
- @password = password
9
- @chat_id = chat_id
10
- @config = Config.new
11
- @config.db_connection
12
- end
13
-
14
- def telegram_async
15
- TelegramBot.new(@config)
16
- end
17
-
18
- def call
19
- user = User.find_by(email: @email)
20
- if user
21
- telegram_async.send_message("User already exists", @chat_id)
22
- else
23
- user = User.new(email: @email, password: @password, telegram_id: @chat_id)
24
- if user.save
25
- telegram_async.send_message("User created", @chat_id)
26
- else
27
- raise UserAlreadyExistsError if User.find_by(email: @email)
28
- raise WrongEmailError if user.errors[:email].any?
29
- raise WrongPasswordError if user.errors[:password].any?
30
- end
31
- end
32
- rescue UserAlreadyExistsError, WrongEmailError, WrongPasswordError => e
33
- telegram_async.send_message(e.message, @chat_id)
34
- end
35
- end
36
- end
@@ -1,180 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helpers/telegram_helper"
4
- require_relative "helpers/telegram_voice_helper"
5
-
6
- module ChatgptAssistant
7
- # This class is responsible for the telegram bot features
8
- class TelegramBot < ApplicationBot
9
- def start
10
- bot.listen do |message|
11
- @msg = message
12
- @visitor = telegram_visited?(@msg.chat.id)
13
- next unless telegram_text_or_audio?
14
-
15
- text_events if telegram_message_has_text?
16
- audio_event if telegram_message_has_audio?
17
- end
18
- rescue StandardError => e
19
- Error.create(message: e.message, backtrace: e.backtrace)
20
- retry
21
- end
22
-
23
- private
24
-
25
- include TelegramHelper
26
- include TelegramVoiceHelper
27
-
28
- attr_accessor :msg, :visitor, :chat, :chat_id
29
-
30
- def text_events
31
- case msg.text
32
- when "/start"
33
- start_event
34
- when "/help"
35
- help_event
36
- when "/hist"
37
- hist_event
38
- when "/list"
39
- list_event
40
- when "/stop"
41
- stop_event
42
- when nil
43
- raise NilError
44
- else
45
- action_events
46
- end
47
- rescue NilError => e
48
- send_message e.message, msg.chat.id
49
- end
50
-
51
- def start_event
52
- telegram_send_start_message
53
- end
54
-
55
- def help_event
56
- help_messages.each { |m| send_message m, msg.chat.id }
57
- end
58
-
59
- def hist_event
60
- raise UserNotLoggedInError if user.nil?
61
- raise NoChatSelectedError if user.current_chat.nil?
62
- raise NoMessagesFoundedError if user.current_chat.messages.count.zero?
63
-
64
- user.chat_history.each do |m|
65
- send_message m, msg.chat.id
66
- end
67
- rescue NoChatSelectedError, UserNotLoggedInError, NoMessagesFoundedError => e
68
- send_message e.message, msg.chat.id
69
- end
70
-
71
- def list_event
72
- raise UserNotLoggedInError if user.nil?
73
- raise NoChatsFoundedError if user.chats.count.zero?
74
-
75
- send_message common_messages[:chat_list], msg.chat.id
76
- chats_str = ""
77
- user.chats.each_with_index { |c, i| chats_str += "Chat #{i + 1} - #{c.title}\n" }
78
- send_message chats_str, msg.chat.id
79
- rescue NoChatsFoundedError, UserNotLoggedInError => e
80
- send_message e.message, msg.chat.id
81
- end
82
-
83
- def action_events
84
- return auth_events if auth_event?
85
- return new_chat_event if msg.text.include?("new_chat/")
86
- return select_chat_event if msg.text.include?("sl_chat/")
87
- return telegram_chat_event unless telegram_actions?
88
-
89
- raise InvalidCommandError
90
- rescue InvalidCommandError => e
91
- send_message e.message, msg.chat.id
92
- end
93
-
94
- def auth_event?
95
- msg.text.include?("login/") || msg.text.include?("register/") || msg.text.include?("sign_out/")
96
- end
97
-
98
- def auth_events
99
- return login_event if msg.text.include?("login/")
100
- return register_event if msg.text.include?("register/")
101
- return sign_out_event if msg.text.include?("sign_out/")
102
- end
103
-
104
- def login_event
105
- raise UserLoggedInError if user
106
-
107
- user_info = msg.text.split("/").last
108
- email, password = user_info.split(":")
109
- case telegram_user_auth(email, password, msg.chat.id)
110
- when "user not found"
111
- raise UserNotFoundError
112
- when "wrong password"
113
- raise WrongPasswordError
114
- when email
115
- user_logged_in_message
116
- end
117
- rescue UserNotFoundError, WrongPasswordError, UserLoggedInError => e
118
- send_message e.message, msg.chat.id
119
- end
120
-
121
- def register_event
122
- user_info = msg.text.split("/").last
123
- raise NoRegisterInfoError if user_info.nil?
124
- raise UserLoggedInError if user
125
-
126
- email, password = user_info.split(":")
127
- raise NoRegisterInfoError if email.nil? || password.nil?
128
-
129
- RegisterJob.perform_async(email, password, visitor.telegram_id)
130
- rescue NoRegisterInfoError, UserLoggedInError => e
131
- send_message e.message, msg.chat.id
132
- end
133
-
134
- def sign_out_event
135
- raise UserNotLoggedInError if user.nil?
136
-
137
- user.update(telegram_id: nil)
138
- send_message success_messages[:user_logged_out], msg.chat.id
139
- rescue UserNotLoggedInError => e
140
- send_message e.message, msg.chat.id
141
- end
142
-
143
- def new_chat_event
144
- raise UserNotLoggedInError if user.nil?
145
-
146
- NewChatJob.perform_async(msg.text.split("/").last, user.id, msg.chat.id)
147
- rescue UserNotLoggedInError => e
148
- send_message e.message, msg.chat.id
149
- end
150
-
151
- def select_chat_event
152
- raise UserNotLoggedInError if user.nil?
153
-
154
- title = msg.text.split("/").last
155
- chat = user.chat_by_title(title)
156
- raise ChatNotFoundError if chat.nil?
157
-
158
- raise ChatNotFoundError unless user.update(current_chat_id: chat.id)
159
-
160
- send_message success_messages[:chat_selected], msg.chat.id
161
- rescue UserNotLoggedInError, ChatNotFoundError => e
162
- send_message e.message, msg.chat.id
163
- end
164
-
165
- def audio_event
166
- raise UserNotLoggedInError if user.nil?
167
- raise NoChatSelectedError if user.current_chat.nil?
168
-
169
- user_audio = transcribe_file(telegram_audio_url)
170
- message = Message.new(content: user_audio[:text], chat_id: user.current_chat_id, role: "user")
171
- raise MessageNotSavedError unless message.save
172
-
173
- ai_response = telegram_process_ai_voice(user_audio[:file])
174
- telegram_send_voice_message(voice: ai_response[:voice], text: ai_response[:text])
175
- delete_file ai_response[:voice]
176
- rescue UserNotLoggedInError, NoChatSelectedError, MessageNotSavedError => e
177
- send_message e.message, msg.chat.id
178
- end
179
- end
180
- end