chatgpt_assistant 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.env_sample +1 -1
  3. data/.rubocop.yml +4 -4
  4. data/Gemfile +18 -6
  5. data/Gemfile.lock +62 -59
  6. data/README.md +14 -13
  7. data/docker-compose.prod.yml +1 -1
  8. data/docker-compose.yml +18 -0
  9. data/exe/chatgpt_bot +3 -0
  10. data/lib/bots/application_bot.rb +15 -5
  11. data/lib/bots/discord_bot.rb +6 -9
  12. data/lib/bots/helpers/authentication_helper.rb +3 -2
  13. data/lib/bots/helpers/discord_helper.rb +4 -4
  14. data/lib/bots/helpers/messenger_helper.rb +14 -15
  15. data/lib/bots/helpers/search_helper.rb +3 -3
  16. data/lib/bots/helpers/telegram_helper.rb +3 -7
  17. data/lib/bots/helpers/validation_helper.rb +1 -1
  18. data/lib/bots/helpers/visit_helper.rb +4 -0
  19. data/lib/bots/jobs/new_chat_job.rb +17 -0
  20. data/lib/bots/jobs/register_job.rb +16 -0
  21. data/lib/bots/jobs/voice_connect_job.rb +14 -0
  22. data/lib/bots/services/new_chat_service.rb +34 -0
  23. data/lib/bots/services/register_service.rb +36 -0
  24. data/lib/bots/services/voice_connect_service.rb +29 -0
  25. data/lib/bots/telegram_bot.rb +70 -39
  26. data/lib/chatgpt_assistant/config.rb +23 -1
  27. data/lib/chatgpt_assistant/default_messages.rb +72 -30
  28. data/lib/chatgpt_assistant/error.rb +219 -0
  29. data/lib/chatgpt_assistant/models.rb +18 -13
  30. data/lib/chatgpt_assistant/sidekiq.rb +7 -0
  31. data/lib/chatgpt_assistant/sidekiq.yml +10 -0
  32. data/lib/chatgpt_assistant/version.rb +1 -1
  33. data/lib/chatgpt_assistant.rb +3 -12
  34. data/prompts-data/{awesome-chatgpt-prompts.csv → awesome-en-prompts.csv} +164 -164
  35. data/prompts-data/awesome-pt-prompts.csv +164 -0
  36. metadata +14 -5
  37. data/lib/bots/helpers/logger_action_helper.rb +0 -7
@@ -5,7 +5,7 @@ module ChatgptAssistant
5
5
  module MessengerHelper
6
6
  def chat_success(chat_id)
7
7
  user_message = Message.new(chat_id: chat_id, content: msg.text, role: "user")
8
- if user_message.save
8
+ if user_message&.save
9
9
  text = chatter.chat(msg.text, chat_id, error_messages[:something_went_wrong])
10
10
  mess = parse_message(text, 4096)
11
11
  mess.each { |m| send_message m, msg.chat.id }
@@ -53,27 +53,27 @@ module ChatgptAssistant
53
53
 
54
54
  def user_logged_message
55
55
  user.update(telegram_id: msg.chat.id)
56
- bot.api&.send_message(chat_id: msg.chat.id, text: success_messages[:user_logged_in])
56
+ bot.api&.send_message(chat_id: msg.chat.id, text: success_messages[:user_logged_in]) if bot.respond_to?(:api)
57
57
  evnt&.respond success_messages[:user_logged_in] if evnt.present?
58
58
  end
59
59
 
60
60
  def invalid_command_error_message
61
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:invalid_command])
61
+ bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:invalid_command]) if bot.respond_to?(:api)
62
62
  evnt&.respond error_messages[:invalid_command]
63
63
  end
64
64
 
65
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.api.present?
66
+ bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:user_not_found]) if bot.respond_to?(:api)
67
67
  evnt&.respond error_messages[:user_not_found] if evnt.present?
68
68
  end
69
69
 
70
70
  def user_created_message
71
- bot.api&.send_message(chat_id: msg.chat.id, text: success_messages[:user_created]) if bot.api.present?
71
+ bot.api&.send_message(chat_id: msg.chat.id, text: success_messages[:user_created]) if bot.respond_to?(:api)
72
72
  evnt&.respond success_messages[:user_created] if evnt.present?
73
73
  end
74
74
 
75
75
  def user_creation_error_message
76
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:user_creation]) if bot.api.present?
76
+ bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:user_creation]) if bot.respond_to?(:api)
77
77
  evnt&.respond error_messages[:user_creation] if evnt.present?
78
78
  end
79
79
 
@@ -87,47 +87,46 @@ module ChatgptAssistant
87
87
  def telegram_created(chat)
88
88
  bot.api.send_message(chat_id: msg.chat.id, text: "Intructions sended to actor:\n#{chat.prompt}") unless chat.actor.nil?
89
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.api.present?
90
+ bot.api.send_message(chat_id: msg.chat.id, text: success_messages[:chat_created]) if bot.respond_to?(:api)
91
91
  end
92
92
 
93
93
  def discord_created(chat)
94
94
  evnt.respond "Intructions sended to actor:\n#{chat.prompt}" unless chat.actor.nil?
95
- evnt.respond "Response from assistant:\n#{chat.messages[1].content}" unless chat.actor.nil?
96
95
  evnt.respond success_messages[:chat_created] if evnt.present?
97
96
  end
98
97
 
99
98
  def not_logged_in_message
100
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:user_not_logged_in])
99
+ bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:user_not_logged_in]) if bot.respond_to?(:api)
101
100
  evnt&.respond(error_messages[:user_not_logged_in])
102
101
  end
103
102
 
104
103
  def wrong_password_error_message
105
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:password])
104
+ bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:password]) if bot.respond_to?(:api)
106
105
  evnt&.respond(error_messages[:password])
107
106
  end
108
107
 
109
108
  def chat_not_found_message
110
- bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:chat_not_found])
109
+ bot.api&.send_message(chat_id: msg.chat.id, text: error_messages[:chat_not_found]) if bot.respond_to?(:api)
111
110
  evnt&.respond(error_messages[:chat_not_found])
112
111
  end
113
112
 
114
113
  def no_chat_selected_message
115
- bot&.api&.send_message(chat_id: msg.chat.id, text: error_messages[:no_chat_selected])
114
+ bot&.api&.send_message(chat_id: msg.chat.id, text: error_messages[:no_chat_selected]) if bot.respond_to?(:api)
116
115
  evnt&.respond(error_messages[:no_chat_selected])
117
116
  end
118
117
 
119
118
  def no_messages_founded_message
120
- bot&.api&.send_message(chat_id: msg.chat.id, text: error_messages[:no_messages_founded])
119
+ bot&.api&.send_message(chat_id: msg.chat.id, text: error_messages[:no_messages_founded]) if bot.respond_to?(:api)
121
120
  evnt&.respond(error_messages[:no_messages_founded])
122
121
  end
123
122
 
124
123
  def chat_creation_failed_message
125
- bot&.api&.send_message(chat_id: msg.chat.id, text: error_messages[:chat_creation_failed])
124
+ bot&.api&.send_message(chat_id: msg.chat.id, text: error_messages[:chat_creation_failed]) if bot.respond_to?(:api)
126
125
  evnt&.respond(error_messages[:chat_creation_failed])
127
126
  end
128
127
 
129
128
  def user_logged_in_message
130
- bot.api&.send_message(chat_id: msg.chat.id, text: success_messages[:user_logged_in])
129
+ bot.api&.send_message(chat_id: msg.chat.id, text: success_messages[:user_logged_in]) if bot.respond_to?(:api)
131
130
  evnt&.respond(success_messages[:user_logged_in])
132
131
  end
133
132
  end
@@ -23,11 +23,11 @@ module ChatgptAssistant
23
23
 
24
24
  def where_user(telegram_id: nil, discord_id: nil, email: nil)
25
25
  if telegram_id
26
- User.where(telegram_id: telegram_id)
26
+ User.where(telegram_id: telegram_id).to_a
27
27
  elsif discord_id
28
- User.where(discord_id: discord_id)
28
+ User.where(discord_id: discord_id).to_a
29
29
  elsif email
30
- User.where(email: email)
30
+ User.where(email: email).to_a
31
31
  end
32
32
  end
33
33
  end
@@ -25,11 +25,11 @@ module ChatgptAssistant
25
25
  end
26
26
 
27
27
  def telegram_send_start_message
28
- send_message commom_messages[:start], msg.chat.id
28
+ send_message common_messages[:start], msg.chat.id
29
29
  help_message = help_messages.join("\n").to_s
30
30
  send_message help_message, msg.chat.id
31
- send_message commom_messages[:start_helper], msg.chat.id
32
- send_message commom_messages[:start_sec_helper], 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
33
  end
34
34
 
35
35
  def telegram_create_chat
@@ -54,10 +54,6 @@ module ChatgptAssistant
54
54
  chat.save ? chat_created_message(chat) : chat_creation_failed_message
55
55
  end
56
56
 
57
- def telegram_user_history
58
- user.current_chat.messages.last(10).map { |m| "#{m.role}: #{m.content}\nat: #{m.created_at}" }
59
- end
60
-
61
57
  def telegram_text_or_audio?
62
58
  msg.respond_to?(:text) || msg.respond_to?(:audio) || msg.respond_to?(:voice)
63
59
  end
@@ -27,7 +27,7 @@ module ChatgptAssistant
27
27
  end
28
28
 
29
29
  def discord_next_action?
30
- return true if evnt.channel.type != 1
30
+ return true if evnt.channel.type != 1 && evnt.channel.name != "ai-spaces"
31
31
 
32
32
  %w[login register start help new_chat sl_chat ask list hist connect disconnect speak].each do |action|
33
33
  return true if evnt.message.content.include?("#{discord_prefix}#{action}")
@@ -4,6 +4,8 @@ module ChatgptAssistant
4
4
  # Helper for visit
5
5
  module VisitHelper
6
6
  def telegram_visited?(chat_id)
7
+ return unless msg
8
+
7
9
  visitor = Visitor.find_by(telegram_id: chat_id, name: msg.from.first_name)
8
10
  if visitor.nil?
9
11
  Visitor.create(telegram_id: chat_id, name: msg.from.first_name)
@@ -13,6 +15,8 @@ module ChatgptAssistant
13
15
  end
14
16
 
15
17
  def discord_visited?(user_id)
18
+ return unless evnt
19
+
16
20
  visitor = Visitor.find_by(discord_id: user_id, name: evnt.user.name)
17
21
  if visitor.nil?
18
22
  Visitor.create(discord_id: user_id, name: evnt.user.name)
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq"
4
+
5
+ module ChatgptAssistant
6
+ # This class is responsible to background the new chat service
7
+ class NewChatJob
8
+ include Sidekiq::Job
9
+
10
+ def perform(chat_title, user_id, chat_id)
11
+ @config = Config.new
12
+ @config.db_connection
13
+
14
+ NewChatService.new(chat_title, user_id, chat_id, @config).call
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq"
4
+
5
+ module ChatgptAssistant
6
+ # This class is responsible to background the register service
7
+ class RegisterJob
8
+ include Sidekiq::Job
9
+
10
+ sidekiq_options queue: :default
11
+
12
+ def perform(email, password, chat_id)
13
+ RegisterService.new(email, password, chat_id).call
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq"
4
+
5
+ module ChatgptAssistant
6
+ # This class is responsible to background the voice connect service
7
+ class VoiceConnectJob
8
+ include Sidekiq::Worker
9
+
10
+ def perform(channel_id)
11
+ VoiceConnectService.new(channel_id).call
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,34 @@
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
@@ -0,0 +1,36 @@
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
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ChatgptAssistant
4
+ # This class is responsible to handle the discord bot
5
+ class VoiceConnectService
6
+ def initialize(channel_id)
7
+ @channel_id = channel_id
8
+ @config = Config.new
9
+ # @config.db_connection
10
+ end
11
+
12
+ def bot
13
+ @bot ||= Discordrb::Bot.new(token: @config.discord_token)
14
+ end
15
+
16
+ def call
17
+ bot.run :async
18
+ channel = bot.channel(@channel_id)
19
+
20
+ bot.voice_connect(channel)
21
+ bot.join
22
+ true
23
+ rescue StandardError => e
24
+ puts e.message
25
+ e.backtrace.each { |line| puts line }
26
+ false
27
+ end
28
+ end
29
+ end
@@ -8,8 +8,6 @@ module ChatgptAssistant
8
8
  class TelegramBot < ApplicationBot
9
9
  def start
10
10
  bot.listen do |message|
11
- next if message.chat.type != "private" # disable group and channel messages, we will enable it later
12
-
13
11
  @msg = message
14
12
  @visitor = telegram_visited?(@msg.chat.id)
15
13
  next unless telegram_text_or_audio?
@@ -42,10 +40,12 @@ module ChatgptAssistant
42
40
  when "/stop"
43
41
  stop_event
44
42
  when nil
45
- nil_event
43
+ raise NilError
46
44
  else
47
45
  action_events
48
46
  end
47
+ rescue NilError => e
48
+ send_message e.message, msg.chat.id
49
49
  end
50
50
 
51
51
  def start_event
@@ -57,93 +57,124 @@ module ChatgptAssistant
57
57
  end
58
58
 
59
59
  def hist_event
60
- return not_logged_in_message unless user
61
- return no_chat_selected_message unless user.current_chat
62
- return no_messages_founded_message if user.current_chat.messages.count.zero?
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
63
 
64
- telegram_user_history.each do |m|
64
+ user.chat_history.each do |m|
65
65
  send_message m, msg.chat.id
66
66
  end
67
+ rescue NoChatSelectedError, UserNotLoggedInError, NoMessagesFoundedError => e
68
+ send_message e.message, msg.chat.id
67
69
  end
68
70
 
69
71
  def list_event
70
- return unless valid_for_list_action?
72
+ raise UserNotLoggedInError if user.nil?
73
+ raise NoChatsFoundedError if user.chats.count.zero?
71
74
 
72
- send_message commom_messages[:chat_list], msg.chat.id
75
+ send_message common_messages[:chat_list], msg.chat.id
73
76
  chats_str = ""
74
77
  user.chats.each_with_index { |c, i| chats_str += "Chat #{i + 1} - #{c.title}\n" }
75
78
  send_message chats_str, msg.chat.id
79
+ rescue NoChatsFoundedError, UserNotLoggedInError => e
80
+ send_message e.message, msg.chat.id
76
81
  end
77
82
 
78
83
  def action_events
79
- return login_event if msg.text.include?("login/")
80
- return register_event if msg.text.include?("register/")
84
+ return auth_events if auth_event?
81
85
  return new_chat_event if msg.text.include?("new_chat/")
82
86
  return select_chat_event if msg.text.include?("sl_chat/")
83
87
  return telegram_chat_event unless telegram_actions?
84
88
 
85
- invalid_command_error_message
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/")
86
102
  end
87
103
 
88
104
  def login_event
105
+ raise UserLoggedInError if user
106
+
89
107
  user_info = msg.text.split("/").last
90
108
  email, password = user_info.split(":")
91
109
  case telegram_user_auth(email, password, msg.chat.id)
92
110
  when "user not found"
93
- user_not_found_error_message
111
+ raise UserNotFoundError
94
112
  when "wrong password"
95
- wrong_password_error_message
113
+ raise WrongPasswordError
96
114
  when email
97
115
  user_logged_in_message
98
116
  end
117
+ rescue UserNotFoundError, WrongPasswordError, UserLoggedInError => e
118
+ send_message e.message, msg.chat.id
99
119
  end
100
120
 
101
121
  def register_event
102
122
  user_info = msg.text.split("/").last
123
+ raise NoRegisterInfoError if user_info.nil?
124
+ raise UserLoggedInError if user
125
+
103
126
  email, password = user_info.split(":")
104
- registered_email = telegram_user_create visitor.id, email, password
105
- registered_email == email ? user_created_message : user_creation_error_message
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
106
141
  end
107
142
 
108
143
  def new_chat_event
109
- return not_logged_in_message unless user
144
+ raise UserNotLoggedInError if user.nil?
110
145
 
111
- telegram_create_chat
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
112
149
  end
113
150
 
114
151
  def select_chat_event
115
- return not_logged_in_message unless user
152
+ raise UserNotLoggedInError if user.nil?
116
153
 
117
154
  title = msg.text.split("/").last
118
155
  chat = user.chat_by_title(title)
119
- return chat_not_found_message unless chat
156
+ raise ChatNotFoundError if chat.nil?
120
157
 
121
- user.update(current_chat_id: chat.id)
122
- send_message success_messages[:chat_selected], msg.chat.id
123
- end
158
+ raise ChatNotFoundError unless user.update(current_chat_id: chat.id)
124
159
 
125
- def stop_event
126
- send_message commom_messages[:stop], msg.chat.id
127
- bot.api.leave_chat(chat_id: msg.chat.id)
128
- end
129
-
130
- def nil_event
131
- send_message error_messages[:nil], msg.chat.id
160
+ send_message success_messages[:chat_selected], msg.chat.id
161
+ rescue UserNotLoggedInError, ChatNotFoundError => e
162
+ send_message e.message, msg.chat.id
132
163
  end
133
164
 
134
165
  def audio_event
135
- return not_logged_in_message unless user
136
- return no_chat_selected_message if user.current_chat_id.nil?
166
+ raise UserNotLoggedInError if user.nil?
167
+ raise NoChatSelectedError if user.current_chat.nil?
137
168
 
138
169
  user_audio = transcribe_file(telegram_audio_url)
139
170
  message = Message.new(content: user_audio[:text], chat_id: user.current_chat_id, role: "user")
140
- if message.save
141
- ai_response = telegram_process_ai_voice(user_audio[:file])
142
- telegram_send_voice_message(voice: ai_response[:voice], text: ai_response[:text])
143
- delete_file ai_response[:voice]
144
- else
145
- send_message error_messages[:message_creation_error], msg.chat.id
146
- end
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
147
178
  end
148
179
  end
149
180
  end
@@ -44,9 +44,25 @@ module ChatgptAssistant
44
44
  ActiveRecord::Base.logger = Logger.new($stdout) if ENV["ENV_TYPE"] == "development"
45
45
  end
46
46
 
47
+ def create_db
48
+ db_connection
49
+ return if database_exists?
50
+
51
+ ActiveRecord::Base.establish_connection(
52
+ adapter: "postgresql",
53
+ host: database_host,
54
+ port: 5432,
55
+ database: "postgres",
56
+ username: database_username,
57
+ password: database_password
58
+ )
59
+ ActiveRecord::Base.logger = Logger.new($stdout) if ENV["ENV_TYPE"] == "development"
60
+ ActiveRecord::Base.connection.create_database(database_name)
61
+ end
62
+
47
63
  def migrate
48
64
  db_connection
49
- ActiveRecord::Base.logger = Logger.new($stdout)
65
+ ActiveRecord::Base.logger = Logger.new($stdout) if ENV["ENV_TYPE"] == "development"
50
66
  VisitorMigration.new.migrate(:up)
51
67
  UserMigration.new.migrate(:up)
52
68
  ChatMigration.new.migrate(:up)
@@ -57,5 +73,11 @@ module ChatgptAssistant
57
73
  private
58
74
 
59
75
  attr_reader :database_host, :database_name, :database_username, :database_password
76
+
77
+ def database_exists?
78
+ ActiveRecord::Base.connection
79
+ rescue ActiveRecord::NoDatabaseError
80
+ false
81
+ end
60
82
  end
61
83
  end