chatgpt_assistant 0.1.2 → 0.1.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c2a41c81a5e742715d9b0710ff7c5866ba40d718931c3a6f0caa470613b23cd
4
- data.tar.gz: 73d6d84ccabd93c017b776083689f799f78e7b81355f02ca33a552fba601cf89
3
+ metadata.gz: c735d019dd75e4679918ae36b75d61978f78cf4b7ca11c8530915cc738cb7ec6
4
+ data.tar.gz: 73bdda5095040e37e3bb270c287ec8549fe156749a35b28ecca592c5205b17c9
5
5
  SHA512:
6
- metadata.gz: e55c21e292cc6bb2ee86bf86dca5ed881a02e834e30b5bf982f028dd0e34cf23c6c1978274873a04c50a845f157034cc1132050104d13899dce97d3c62e808cd
7
- data.tar.gz: ca83c1370beed7b168375ed3f8ecfd168950d0fde50c72a12784e2c28a58660c5838de0c969528bd8a47ddca11b1bc6a121c825f370a20165a09dda5fec0d59e
6
+ metadata.gz: 5ebf7e87f62c820eb5988dfe6a0635d385a2329bdb7b690e5ee15bac182ab162f8e502b111d14fb4c66aa6923a702e57b7f8ae5fef351582ff5b1a9a1bd7bf8f
7
+ data.tar.gz: 78367d4df7a05b0290889fb854a925abd239b277e8fe9f7236db9c6715405c989f40ed0d732c0db05e3abd6e63c70099c96317fe5f3c13213f53aa26d5cf84f8
data/.env_prod_sample CHANGED
@@ -3,7 +3,7 @@ LANGUAGE=en # or pt currently
3
3
  MODE=aws # or ibm
4
4
  DISCORD_PREFIX=gpt!
5
5
 
6
- POSTGRES_DB=telegram_chatgpt_development # or your database
6
+ POSTGRES_DB=chatgpt_assistant_production # or your database
7
7
  POSTGRES_USER=postgres # or your user
8
8
  POSTGRES_PASSWORD=postgres # or your password
9
9
 
data/.env_sample CHANGED
@@ -3,7 +3,7 @@ LANGUAGE=en # or pt currently
3
3
  MODE=aws # or ibm
4
4
  DISCORD_PREFIX=dgpt!
5
5
 
6
- POSTGRES_DB=telegram_chatgpt_development # or your database
6
+ POSTGRES_DB=chatgpt_assistant_development # or your database
7
7
  POSTGRES_USER=postgres # or your user
8
8
  POSTGRES_PASSWORD=postgres # or your password
9
9
 
data/.rubocop.yml CHANGED
@@ -12,15 +12,26 @@ Style/StringLiteralsInInterpolation:
12
12
  Layout/LineLength:
13
13
  Max: 160
14
14
 
15
- # remove code length limit
15
+ Metrics/ModuleLength:
16
+ Max: 120
17
+
16
18
  Metrics/MethodLength:
17
19
  Max: 200
18
20
 
19
- # Metrics/BlockLength:
20
- # Enabled: false
21
+ Metrics/BlockLength:
22
+ Max: 200
21
23
 
22
24
  Metrics/ClassLength:
23
- Enabled: false
25
+ Max: 300
24
26
 
25
27
  Metrics/AbcSize:
26
- Max: 40
28
+ Max: 35
29
+
30
+ Layout/AccessModifierIndentation:
31
+ EnforcedStyle: indent
32
+
33
+ Layout/IndentationWidth:
34
+ Width: 2
35
+
36
+ Layout/IndentationConsistency:
37
+ EnforcedStyle: indented_internal_methods
data/Dockerfile CHANGED
@@ -5,11 +5,8 @@ COPY Gemfile /chatgpt_assistant/Gemfile
5
5
  COPY Gemfile.lock /chatgpt_assistant/Gemfile.lock
6
6
  RUN bundle install
7
7
 
8
- # Opus Installation for voice messages
9
-
10
8
  RUN apt-get install -y wget
11
9
  RUN wget https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz
12
10
  RUN tar -xvf opus-1.3.1.tar.gz
13
11
  RUN cd opus-1.3.1 && ./configure && make && make install
14
- RUN rm -rf opus-1.3.1.tar.gz opus-1.3.1
15
-
12
+ RUN rm -rf opus-1.3.1.tar.gz opus-1.3.1
@@ -31,7 +31,7 @@ end
31
31
  end
32
32
 
33
33
  %w[deploy_and_build.sh deploy.sh].each do |file|
34
- `cp #{gem_dir}/bin/#{file} #{path}`
34
+ `cp #{gem_dir}/#{file} #{path}`
35
35
  end
36
36
 
37
37
  %w[/.bundle/ /.yardoc /_yardoc/ /coverage/ /doc/ /pkg/ /spec/reports/ /tmp/ /db_data /db_data/*
@@ -42,7 +42,7 @@ end
42
42
  `cd #{path} && git init`
43
43
 
44
44
  `mkdir -p #{path}/.github/workflows`
45
- `cp #{gem_dir}/.github/workflows/*.yml #{path}/.github/workflows`
45
+ `cp #{gem_dir}/workflows/*.yml #{path}/.github/workflows`
46
46
 
47
47
  puts "Done! Now you can run 'cd #{path} && bundle install'"
48
48
  puts "Build the docker image with 'rake compose:build'"
@@ -1,8 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "helpers/messenger_helper"
4
+ require_relative "helpers/authentication_helper"
5
+ require_relative "helpers/visit_helper"
6
+ require_relative "helpers/audio_helper"
7
+ require_relative "helpers/logger_action_helper"
8
+ require_relative "helpers/search_helper"
9
+ require_relative "helpers/validation_helper"
10
+ require_relative "helpers/file_helper"
3
11
  module ChatgptAssistant
4
12
  # This class is responsible to contain the shared variables between the bot classes
5
13
  class ApplicationBot
14
+ include MessengerHelper
15
+ include AuthenticationHelper
16
+ include VisitHelper
17
+ include AudioHelper
18
+ include LoggerActionHelper
19
+ include SearchHelper
20
+ include ValidationHelper
21
+ include FileHelper
22
+
6
23
  def initialize(config)
7
24
  @config = config
8
25
  default_msg = DefaultMessages.new(@config.language)
@@ -19,100 +36,14 @@ module ChatgptAssistant
19
36
  @help_messages = default_msg.help_messages
20
37
  end
21
38
 
22
- def chatter
23
- @chatter ||= Chatter.new(openai_api_key)
24
- end
25
-
26
- def audio_recognition
27
- @audio_recognition ||= AudioRecognition.new(openai_api_key)
28
- end
29
-
30
- def audio_synthesis
31
- @audio_synthesis ||= AudioSynthesis.new(config)
32
- end
33
-
34
- def transcribed_text
35
- audio_recognition.transcribe_audio(audio_url)
36
- end
37
-
38
- def find_useremail(email)
39
- User.find_by(email: email)
40
- end
41
-
42
- def find_userdiscord(discord_id)
43
- User.find_by(discord_id: discord_id)
44
- end
45
-
46
- def find_usertelegram(telegram_id)
47
- User.find_by(telegram_id: telegram_id)
48
- end
49
-
50
- def valid_password?(user, password)
51
- return false if password.nil?
52
-
53
- salt = user.password_salt
54
- password_hash = user.password_hash
55
-
56
- BCrypt::Engine.hash_secret(password, salt) == password_hash
57
- end
58
-
59
- def auth_userdiscord(email, password, discord_id)
60
- user = find_useremail(email)
61
- return "user not found" unless user
62
- return "wrong password" if password.nil?
63
-
64
- valid_password?(user, password) ? user_disc_access(discord_id, user.email) : "wrong password"
65
- end
66
-
67
- def user_disc_access(discord_id, user_email)
68
- last_access = find_userdiscord(discord_id)
69
- new_access = find_useremail(user_email)
70
- last_acess.update(discord_id: nil) if last_access && (last_access != new_access)
71
- new_access.update(discord_id: discord_id)
72
- new_access
73
- end
74
-
75
- def discord_user_create(discord_id, email, password, name)
76
- user = User.new(discord_id: discord_id, email: email, password_hash: password, name: name)
77
- last_access = find_userdiscord(discord_id)
78
- last_access&.update(discord_id: nil)
79
- user.save
80
- end
81
-
82
- def auth_usertelegram(email, password, telegram_id)
83
- user = find_useremail(email)
84
- return "user not found" unless user
85
- return "wrong password" if password.nil?
86
-
87
- valid_password?(user, password) ? user_tele_access(telegram_id, user.email) : "wrong password"
88
- end
89
-
90
- def user_tele_access(telegram_id, user_email)
91
- last_access = find_usertelegram(telegram_id)
92
- new_access = find_useremail(user_email)
93
- last_acess.update(telegram_id: nil) if last_access && (last_access != new_access)
94
- new_access.update(telegram_id: telegram_id)
95
- new_access
96
- end
97
-
98
- def telegram_user_create(telegram_id, email, password, name)
99
- user = User.new(telegram_id: telegram_id, email: email, password_hash: password, name: name)
100
- last_access = find_usertelegram(telegram_id)
101
- last_access&.update(telegram_id: nil)
102
- user.save
103
- end
104
-
105
- def delete_all_voice_files
106
- Dir.glob("voice/*").each do |file|
107
- next if [".keep", "voice/.keep"].include?(file)
108
-
109
- File.delete(file)
110
- end
111
- end
112
-
113
39
  attr_reader :openai_api_key, :telegram_token, :database, :default_msg,
114
40
  :mode, :config, :discord_token, :discord_client_id,
115
41
  :discord_prefix, :commom_messages, :error_messages, :success_messages,
116
42
  :help_messages
43
+ attr_accessor :msg, :evnt, :bot, :audio_url, :visitor, :user, :chat, :chat_id
44
+
45
+ def chatter
46
+ @chatter ||= Chatter.new(openai_api_key)
47
+ end
117
48
  end
118
49
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "helpers/discord_helper"
4
+ require_relative "helpers/discord_voice_helper"
5
+
3
6
  module ChatgptAssistant
4
7
  # This class is responsible to handle the discord bot
5
8
  class DiscordBot < ApplicationBot
@@ -21,274 +24,132 @@ module ChatgptAssistant
21
24
 
22
25
  private
23
26
 
24
- attr_reader :message
25
- attr_accessor :evnt, :user, :chats, :chat
27
+ include DiscordHelper
28
+ include DiscordVoiceHelper
26
29
 
27
- def bot
28
- @bot ||= Discordrb::Commands::CommandBot.new(
29
- token: discord_token,
30
- client_id: discord_client_id,
31
- prefix: discord_prefix
32
- )
33
- end
30
+ attr_reader :message
31
+ attr_accessor :evnt, :user, :chats, :chat
34
32
 
35
- def start_event
36
- bot.command :start do |event|
37
- @evnt = event
38
- @user = event.user
39
- start_action
33
+ def start_event
34
+ bot.command :start do |event|
35
+ @evnt = event
36
+ @user = event.user
37
+ start_action
38
+ end
40
39
  end
41
- end
42
-
43
- def start_action
44
- evnt.respond commom_messages[:start_helper].gsub("register/", "gpt!register ")
45
- evnt.respond commom_messages[:start_sec_helper].gsub("login/", "gpt!login ")
46
- end
47
40
 
48
- def login_event
49
- bot.command :login do |event|
50
- @message = event.message.content.split(" ")[1]
51
- @evnt = event
52
- message.nil? ? event.respond(commom_messages[:login]) : login_action
41
+ def login_event
42
+ bot.command :login do |event|
43
+ @message = event.message.content.split(" ")[1]
44
+ @evnt = event
45
+ message.nil? ? event.respond(commom_messages[:login]) : login_action
46
+ end
53
47
  end
54
- end
55
48
 
56
- def login_action
57
- user_email = message.split(":")[0]
58
- user_password = message.split(":")[1]
59
- case auth_userdiscord(user_email, user_password, evnt.user.id)
60
- when "user not found"
61
- evnt.respond error_messages[:user_not_found]
62
- when "wrong password"
63
- evnt.respond error_messages[:wrong_password]
64
- when find_useremail(user_email)
65
- evnt.respond success_messages[:user_logged_in]
49
+ def register_event
50
+ bot.command :register do |event|
51
+ @message = event.message.content.split(" ")[1]
52
+ @evnt = event
53
+ message.nil? ? event.respond(commom_messages[:register]) : register_action
54
+ end
66
55
  end
67
- end
68
56
 
69
- def register_event
70
- bot.command :register do |event|
71
- @message = event.message.content.split(" ")[1]
72
- @evnt = event
73
- message.nil? ? event.respond(commom_messages[:register]) : register_action
57
+ def list_event
58
+ bot.command :list do |event|
59
+ @evnt = event
60
+ @user = find_user(discord_id: event.user.id)
61
+ event.respond error_messages[:user_not_logged_in] if user.nil?
62
+ event.respond error_messages[:chat_not_found] if user.chats.empty? && user
63
+ list_action if user && !user.chats.empty?
64
+ end
74
65
  end
75
- end
76
-
77
- def register_action
78
- user_email = message.split(":")[0]
79
- user_password = message.split(":")[1]
80
- find_useremail(user_email).nil? ? create_user_action(user_email, user_password) : evnt.respond(error_messages[:user_already_exists])
81
- end
82
-
83
- def create_user_action(mail, pass)
84
- id = evnt.user.id
85
- name = evnt.user.username
86
- discord_user_create(id, mail, pass, name) ? evnt.respond(success_messages[:user_created]) : evnt.respond(error_messages[:user_not_created])
87
- end
88
-
89
- def list_event
90
- bot.command :list do |event|
91
- @evnt = event
92
- @user = find_userdiscord(event.user.id)
93
- event.respond error_messages[:user_not_logged_in] if user.nil?
94
- event.respond error_messages[:chat_not_found] if user.chats.empty? && user
95
- list_action if user && !user.chats.empty?
96
- end
97
- end
98
66
 
99
- def list_action
100
- chats_title = user.chats.map(&:title)
101
- evnt.respond commom_messages[:chat_list]
102
- evnt.respond chats_title.join("\n")
103
- end
104
-
105
- def hist_event
106
- bot.command :hist do |event|
107
- @evnt = event
108
- @user = find_userdiscord(event.user.id)
109
- event.respond error_messages[:user_not_logged_in] if user.nil?
110
- title = event.message.content.split(" ")[1..].join(" ")
111
- @chat = user.chat_by_title(title)
112
- event.respond error_messages[:chat_not_found] if chat.nil? && user
113
- hist_action if user && chat
67
+ def hist_event
68
+ bot.command :hist do |event|
69
+ @evnt = event
70
+ event.respond error_messages[:user_not_logged_in] if user.nil?
71
+ title = event.message.content.split(" ")[1..].join(" ")
72
+ @chat = user.chat_by_title(title)
73
+ event.respond error_messages[:chat_not_found] if chat.nil? && user
74
+ hist_action if user && chat
75
+ end
114
76
  end
115
- end
116
77
 
117
- def hist_action
118
- messages = Message.where(chat_id: chat.id).order(:created_at)
119
- messages.each do |message|
120
- evnt.respond "#{message.role} - #{message.content}\n#{message.created_at.strftime("%d/%m/%Y %H:%M")}"
78
+ def help_event
79
+ bot.command :help do |event|
80
+ @evnt = event
81
+ help_action
82
+ end
121
83
  end
122
- "This is the end of the chat history"
123
- end
124
84
 
125
- def help_event
126
- bot.command :help do |event|
127
- @evnt = event
128
- help_action
85
+ def new_chat_event
86
+ bot.command :new_chat do |event|
87
+ @evnt = event
88
+ @user = find_user(discord_id: event.user.id)
89
+ event.respond error_messages[:user_not_logged_in] if user.nil?
90
+ create_chat_action if user
91
+ end
129
92
  end
130
- end
131
93
 
132
- def help_action
133
- message = help_messages.join("\n").gsub(" /", discord_prefix)
134
- .gsub("register/", "#{discord_prefix}register ")
135
- .gsub("login/", "#{discord_prefix}login ")
136
- .gsub("new_chat/", "#{discord_prefix}new_chat/")
137
- .gsub("sl_chat/", "#{discord_prefix}sl_chat/")
138
- evnt.respond message
139
- end
94
+ def sl_chat_event
95
+ bot.command :sl_chat do |event|
96
+ @evnt = event
97
+ chat_to_select = event.message.content.split(" ")[1..].join(" ")
98
+ @user = find_user(discord_id: event.user.id)
99
+ event.respond error_messages[:user_not_logged_in] if user.nil?
140
100
 
141
- def new_chat_event
142
- bot.command :new_chat do |event|
143
- @evnt = event
144
- @user = find_userdiscord(event.user.id)
145
- event.respond error_messages[:user_not_logged_in] if user.nil?
146
- create_chat_action if user
101
+ sl_chat_action(chat_to_select) if user
102
+ end
147
103
  end
148
- end
149
104
 
150
- def create_chat_action
151
- chat_title = evnt.message.content.split(" ")[1..].join(" ")
152
- @chat = Chat.new(user_id: user.id, title: chat_title, status: 0)
153
- chat.save ? respond_with_success : evnt.respond(error_messages[:chat_creation])
154
- end
155
-
156
- def respond_with_success
157
- user.update(current_chat_id: chat.id)
158
- evnt.respond success_messages[:chat_created]
159
- end
160
-
161
- def sl_chat_event
162
- bot.command :sl_chat do |event|
163
- @evnt = event
164
- chat_to_select = event.message.content.split(" ")[1..].join(" ")
165
- @user = find_userdiscord(event.user.id)
166
- event.respond error_messages[:user_not_logged_in] if user.nil?
167
-
168
- sl_chat_action(chat_to_select) if user
105
+ def ask_event
106
+ bot.command :ask do |event|
107
+ @evnt = event
108
+ @message = event.message.content.split(" ")[1..].join(" ")
109
+ @user = find_user(discord_id: event.user.id)
110
+ event.respond error_messages[:user_not_logged_in] if user.nil?
111
+ ask_action if user
112
+ end
169
113
  end
170
- end
171
-
172
- def sl_chat_action(chat_to_select)
173
- @chat = user.chat_by_title(chat_to_select)
174
- evnt.respond error_messages[:chat_not_found] if chat.nil?
175
- user.update(current_chat_id: chat.id) if chat
176
- evnt.respond success_messages[:chat_selected] if chat
177
- end
178
114
 
179
- def ask_event
180
- bot.command :ask do |event|
181
- @evnt = event
182
- @message = event.message.content.split(" ")[1..].join(" ")
183
- @user = find_userdiscord(event.user.id)
184
- event.respond error_messages[:user_not_logged_in] if user.nil?
185
- ask_action if user
115
+ def voice_connect_event
116
+ bot.command :connect do |event|
117
+ @evnt = event
118
+ @user = find_user(discord_id: event.user.id)
119
+ @chat = Chat.where(id: user.current_chat_id).last
120
+ voice_connect_checker_action
121
+ voice_connection_checker_action
122
+ discord_voice_bot_connect
123
+ end
186
124
  end
187
- end
188
-
189
- def ask_action
190
- @chat = Chat.where(id: user.current_chat_id).last
191
- evnt.respond error_messages[:chat_not_found] if chat.nil?
192
- @message = Message.new(chat_id: chat.id, content: message, role: "user") if chat
193
- (message.save ? answer_action : evnt.respond(error_messages[:message_not_saved])) if chat
194
- end
195
-
196
- def answer_action
197
- response = chatter.chat(message.content, chat.id)
198
- evnt.respond response
199
- end
200
125
 
201
- def voice_connect_event
202
- bot.command :connect do |event|
203
- @evnt = event
204
- @user = find_userdiscord(event.user.id)
205
- @chat = Chat.where(id: user.current_chat_id).last
206
- voice_connect_checker_action
207
- voice_connection_checker_action
208
- bot.voice_connect(event.user.voice_channel) if bot_disconnected?
209
- bot_connected? ? "Connected to voice channel" : "Error connecting to voice channel"
126
+ def disconnect_event
127
+ bot.command :disconnect do |event|
128
+ @evnt = event
129
+ @user = find_user(discord_id: event.user.id)
130
+ disconnect_checker_action
131
+ disconnect_action if user && event.user.voice_channel && event.voice
132
+ end
210
133
  end
211
- end
212
-
213
- def voice_connect_checker_action
214
- evnt.respond error_messages[:user_not_logged_in] if user.nil?
215
- evnt.respond error_messages[:chat_not_found] if user && chat.nil?
216
- end
217
134
 
218
- def voice_connection_checker_action
219
- evnt.respond error_messages[:user_not_in_voice_channel] if evnt.user.voice_channel.nil? && user
220
- evnt.respond error_messages[:bot_already_connected] if evnt.voice && user
221
- end
222
-
223
- def bot_disconnected?
224
- user && evnt.user.voice_channel && !evnt.voice && !chat.nil?
225
- end
226
-
227
- def bot_connected?
228
- user && evnt.user.voice_channel && evnt.voice && !chat.nil?
229
- end
230
-
231
- def disconnect_event
232
- bot.command :disconnect do |event|
233
- @evnt = event
234
- @user = find_userdiscord(event.user.id)
235
- disconnect_checker_action
236
- disconnect_action if user && event.user.voice_channel && event.voice
135
+ def speak_event
136
+ bot.command :speak do |event|
137
+ @evnt = event
138
+ @message = event.message.content.split(" ")[1..].join(" ")
139
+ @user = find_user(discord_id: event.user.id)
140
+ @chat = user.current_chat
141
+ speak_connect_checker_action
142
+ speak_connection_checker_action
143
+ ask_to_speak_action if user && event.user.voice_channel && event.voice && !chat.nil?
144
+ end
237
145
  end
238
- end
239
146
 
240
- def disconnect_checker_action
241
- evnt.respond error_messages[:user_not_logged_in] if user.nil?
242
- evnt.respond error_messages[:user_not_in_voice_channel] if evnt.user.voice_channel.nil? && user
243
- evnt.respond error_messages[:user_not_connected] if !evnt.voice && user
244
- end
245
-
246
- def disconnect_action
247
- bot.voice_destroy(evnt.user.voice_channel)
248
- "Disconnected from voice channel"
249
- end
250
-
251
- def speak_event
252
- bot.command :speak do |event|
253
- @evnt = event
254
- @message = event.message.content.split(" ")[1..].join(" ")
255
- @user = find_userdiscord(event.user.id)
256
- @chat = user.current_chat
257
- speak_connect_checker_action
258
- speak_connection_checker_action
259
- ask_to_speak_action if user && event.user.voice_channel && event.voice && !chat.nil?
147
+ def bot_init
148
+ at_exit { bot.stop }
149
+ bot.run
150
+ rescue StandardError => e
151
+ Error.create(message: e.message, backtrace: e.backtrace)
152
+ retry
260
153
  end
261
- end
262
-
263
- def speak_connect_checker_action
264
- evnt.respond error_messages[:user_not_logged_in] if user.nil?
265
- evnt.respond error_messages[:chat_not_found] if user && evnt.user.voice_channel && evnt.voice && chat.nil?
266
- end
267
-
268
- def speak_connection_checker_action
269
- evnt.respond error_messages[:user_not_in_voice_channel] if evnt.user.voice_channel.nil? && user
270
- evnt.respond error_messages[:bot_not_in_voice_channel] if !evnt.voice && user
271
- end
272
-
273
- def ask_to_speak_action
274
- Message.create(chat_id: chat.id, content: message, role: "user")
275
- response = chatter.chat(message, chat.id)
276
- audio_path = audio_synthesis.synthesize_text(response)
277
- speak_answer_action(audio_path, response)
278
- end
279
-
280
- def speak_answer_action(audio_path, response)
281
- evnt.respond response
282
- evnt.voice.play_file(audio_path)
283
- delete_all_voice_files
284
- "OK"
285
- end
286
-
287
- def bot_init
288
- at_exit { bot.stop }
289
- bot.run
290
- rescue StandardError
291
- start
292
- end
293
154
  end
294
155
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ChatgptAssistant
4
+ # Helper for audio
5
+ module AudioHelper
6
+ def recognition
7
+ @recognition ||= AudioRecognition.new(openai_api_key)
8
+ end
9
+
10
+ def synthesis
11
+ @synthesis ||= AudioSynthesis.new(config)
12
+ end
13
+
14
+ def transcribe_file(url)
15
+ recognition.transcribe_audio(url)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ChatgptAssistant
4
+ # Helper for authentication
5
+ module AuthenticationHelper
6
+ def valid_password?(password, hash, salt)
7
+ BCrypt::Engine.hash_secret(password, salt) == hash
8
+ end
9
+
10
+ def telegram_user_auth(email, password, telegram_id)
11
+ return "wrong password" if password.nil?
12
+
13
+ visitor_access = find_visitor(telegram_id: telegram_id)
14
+ return "something went wrong" unless visitor_access
15
+
16
+ new_access = find_user(email: email)
17
+ return "user not found" unless new_access
18
+
19
+ hash = new_access.password_hash
20
+ salt = new_access.password_salt
21
+ valid_password?(password, hash, salt) ? telegram_user_access(visitor_access, new_access) : "wrong password"
22
+ end
23
+
24
+ def telegram_user_access(visitor, new_access)
25
+ other_access = where_user(telegram_id: visitor.telegram_id)
26
+ other_access&.each { |access| access.update(telegram_id: nil) }
27
+ new_access.update(telegram_id: visitor.telegram_id)
28
+ new_access.email
29
+ end
30
+
31
+ def discord_user_auth(email, password, discord_id)
32
+ user = find_user(email: email)
33
+ return "user not found" unless user
34
+ return "wrong passwords" if password.nil?
35
+
36
+ valid_password?(password, user.password_hash, user.password_salt) ? discord_user_access(discord_id, user.email) : "wrong password"
37
+ end
38
+
39
+ def discord_user_access(discord_id, user_email)
40
+ last_access = find_user(discord_id: discord_id)
41
+ new_access = find_user(email: user_email)
42
+ last_acess.update(discord_id: nil) if last_access&.email != new_access&.email
43
+ new_access&.update(discord_id: discord_id)
44
+ new_access.email
45
+ end
46
+ end
47
+ end