(function($){
'use strict';
function AysChatGPTChatBoxPublic(element, options){
this.el=element;
this.$el=$(element);
this.ajaxAction='ays_chatgpt_admin_ajax';
this.CHATGPT_ASSISTANT_CLASS_PREFIX='ays-chatgpt-assistant';
this.CHATGPT_ASSISTANT_ID_PREFIX='ays-chatgpt-assistant';
this.CHATGPT_ASSISTANT_NAME_PREFIX='ays_chatgpt_assistant';
this.CHATGPT_ASSISTANT_OPTIONS_PREFIX='chatgpt_assistant_';
this.dbOptions=undefined;
this.chatConversation=[];
this.promptFirstM='Converse as if you are an AI assistant. ';
this.promptSecondM='Answer the question as truthfully as possible.';
this.messageFirstM='';
this.PINECONE_QUERY_URL="/query";
this.REQUEST_URL="";
this.API_MAIN_URL="https://api.openai.com/v1";
this.API_EMBEDDING_URL="/embeddings";
this.API_COMPLETIONS_URL="/completions";
this.API_CHAT_COMPLETIONS_URL="/chat/completions";
this.GEMINI_API_TEXT_URL="https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent";
this.GEMINI_API_EMBEDDING_URL="https://generativelanguage.googleapis.com/v1beta/models/embedding-001:embedContent";
this.ttsVoices=[];
this.logIndicator=false;
this.currentLogId=0;
this.tokensSum=0;
this.requestCount=0;
this.informationFormData={};
this.ongoingRequest=false;
this.init();
this.setWindowEvents();
return this;
}
AysChatGPTChatBoxPublic.prototype.init=function(){
var _this=this;
_this.$el.show();
_this.setEvents();
};
AysChatGPTChatBoxPublic.prototype.setEvents=function(e){
var _this=this;
_this.setDbOptions();
_this.setUpPromptParametrs();
_this.setUpRequestParametrs();
_this.speechToText();
_this.makeResizableDiv(".ays-assistant-chatbox .ays-assistant-chatbox-main-container");
var promptEl=_this.$el.find('#ays-assistant-chatbox-prompt');
autosize(promptEl);
_this.$el.find('.ays-assistant-chatbox-closed-view').one('click', function (){
if(_this.dbOptions.chatGreetingMessage){
_this.setGreetingMessage();
}});
_this.$el.find('.ays-assistant-chatbox-closed-view').on('click', function (){
$(this).hide();
var container=_this.$el.find('.ays-assistant-chatbox-main-container');
var bg=_this.$el.find('.ays-assistant-chatbox-maximized-bg');
if(container.hasClass('ays-assistant-chatbox-main-container-maximized-view')){
bg.show();
$('body').addClass('ays-assistant-chatbox-disabled-scroll-body');
}
container.show();
_this.$el.find('.ays-assistant-chatbox-prompt-input').focus();
});
_this.$el.on('click', '.ays-assistant-chatbox-close-bttn' ,function (){
window.speechSynthesis.cancel();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-speak').show();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-pause').hide();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-resume').hide();
var container=$(this).parents('.ays-assistant-chatbox-main-container');
var bg=_this.$el.find('.ays-assistant-chatbox-maximized-bg');
if(container.hasClass('ays-assistant-chatbox-main-container-maximized-view')){
bg.hide();
$('body').removeClass('ays-assistant-chatbox-disabled-scroll-body');
}
container.hide();
_this.$el.find('.ays-assistant-chatbox-closed-view').show();
});
_this.$el.on('click', '.ays-assistant-chatbox-end-bttn' ,function (){
var modal=_this.$el.find('.ays-assistant-chatbox-main-chat-modal');
modal.find('.ays-assistant-chatbox-main-chat-modal-body-image').append('<img src="'+AysChatGPTChatSettings.translations.endChat.modalIcon+'">');
modal.find('.ays-assistant-chatbox-main-chat-modal-body-text').append(AysChatGPTChatSettings.translations.endChat.warningMsg);
modal.find('.ays-assistant-chatbox-main-chat-modal-footer-button').append('<button data-modal-action="confirm">'+AysChatGPTChatSettings.translations.endChat.buttonMsg+'</button>');
modal.css('display', 'flex');
_this.$el.find('.ays-assistant-chatbox-more-menu').hide();
modal.on('click', function (e){
if($(e.target).attr('data-modal-action')==='confirm'){
window.speechSynthesis.cancel();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-speak').show();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-pause').hide();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-resume').hide();
_this.$el.find('.ays-assistant-chatbox-messages-box').find('.ays-assistant-chatbox-ai-message-box').remove();
_this.$el.find('.ays-assistant-chatbox-messages-box').find('.ays-assistant-chatbox-user-message-box').remove();
_this.$el.find('.ays-assistant-chatbox-rate-chat-row').css('display', 'flex');
if(_this.dbOptions.chatGreetingMessage){
_this.setGreetingMessage();
}
if(_this.dbOptions.chatSaveChatLog&&_this.dbOptions.chatInformationForm){
_this.$el.find('.ays-assistant-chatbox-information-form-container').css('display', 'flex');
if(_this.dbOptions.chatInformationFormRequired){
_this.$el.find('.ays-assistant-chatbox-input-box').addClass('display_none');
}}
_this.chatConversation=[];
_this.logIndicator=false;
_this.currentLogId=0;
_this.tokensSum=0;
_this.informationFormData={};
_this.setUpRequestParametrs();
modal.hide('fast');
modal.find('.ays-assistant-chatbox-main-chat-modal-body-image').empty();
modal.find('.ays-assistant-chatbox-main-chat-modal-body-text').empty();
modal.find('.ays-assistant-chatbox-main-chat-modal-footer-button').empty();
var container=$(this).parents('.ays-assistant-chatbox-main-container');
var bg=_this.$el.find('.ays-assistant-chatbox-maximized-bg');
if(container.hasClass('ays-assistant-chatbox-main-container-maximized-view')){
bg.hide();
$('body').removeClass('ays-assistant-chatbox-disabled-scroll-body');
}
container.hide();
_this.$el.find('.ays-assistant-chatbox-closed-view').show();
}else if($(e.target).attr('data-modal-action')==='close'){
modal.hide('fast');
modal.find('.ays-assistant-chatbox-main-chat-modal-body-image').empty();
modal.find('.ays-assistant-chatbox-main-chat-modal-body-text').empty();
modal.find('.ays-assistant-chatbox-main-chat-modal-footer-button').empty();
}});
_this.$el.find('.ays-assistant-chatbox-prompt-input').focus();
});
_this.$el.find('.ays-assistant-chatbox-resize-bttn').on('click', function (){
var container=$(this).parents('.ays-assistant-chatbox-main-container');
var bg=_this.$el.find('.ays-assistant-chatbox-maximized-bg');
var src=$(this).attr('src');
if(!container.hasClass('ays-assistant-chatbox-main-container-maximized-view')){
$(this).attr('src', src.replace('maximize', 'minimize'));
$(this).attr('alt', "Minimize");
container.addClass('ays-assistant-chatbox-main-container-maximized-view');
bg.show();
$('body').addClass('ays-assistant-chatbox-disabled-scroll-body');
}else{
$(this).attr('src', src.replace('minimize', 'maximize'));
$(this).attr('alt', "Maximize");
container.removeClass('ays-assistant-chatbox-main-container-maximized-view');
bg.hide();
$('body').removeClass('ays-assistant-chatbox-disabled-scroll-body');
}});
$(document).on('mouseup', function(e){
var container=_this.$el.find('.ays-assistant-chatbox-main-container');
if(container.hasClass('ays-assistant-chatbox-main-container-maximized-view')&&container.css('display')!=='none'){
if(!container.is(e.target)&&container.has(e.target).length===0){
_this.$el.find('.ays-assistant-chatbox-resize-bttn').trigger("click");
}}
});
_this.$el.find('.ays-assistant-chatbox-prompt-input').on('input', function (){
if(!_this.ongoingRequest){
var sendBttn=_this.$el.find('.ays-assistant-chatbox-send-button');
if($(this).val().trim()!=""){
sendBttn.prop('disabled', false);
}else{
sendBttn.prop('disabled', true);
}}
});
_this.$el.find('.ays-assistant-chatbox-regenerate-response-button').on('click', function (){
var prompt=_this.$el.find('.ays-assistant-chatbox-user-message-box:last').text();
_this.$el.find('.ays-assistant-chatbox-prompt-input').val(prompt);
_this.$el.find('.ays-assistant-chatbox-send-button').trigger('click', {indicator: true, type: 'regenerate'});
});
_this.$el.find('.ays-assistant-chatbox-send-button').on('click', function (event, eventProps){
var key=_this.dbOptions.chatAK;
var embeddingKey=_this.dbOptions.embeddingAK;
var prompt=_this.$el.find('.ays-assistant-chatbox-prompt-input').val();
var loader=_this.$el.find('.ays-assistant-chatbox-loading-box');
var sendBttn=_this.$el.find('.ays-assistant-chatbox-send-button');
if(eventProps===undefined){
var userProfilePicture='';
if(_this.dbOptions.chatboxTheme=='chatgpt'){
userProfilePicture='<div class="ays-assistant-chatbox-chatgpt-theme-user-icon">' + _this.dbOptions.userProfilePicture + '</div>';
}
var userMessage=$("<div>", {"class": "ays-assistant-chatbox-user-message-box"}).html(userProfilePicture + prompt);
_this.$el.find('.ays-assistant-chatbox-messages-box').append(userMessage).scrollTop(_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight);
promptEl.css("height" , "54px");
}
var scrolledHeight=_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight;
var elementHeight=Math.round(_this.$el.find('.ays-assistant-chatbox-messages-box').outerHeight());
loader.css('bottom', (10 + elementHeight - scrolledHeight));
_this.$el.find('.ays-assistant-chatbox-prompt-input').val('');
var index=key.indexOf("chgafr");
if(index!==-1){
var readyK=key.substring(0, index);
}
var embeddingIndex=embeddingKey.indexOf("chgafr");
if(embeddingIndex!==-1){
var embeddingReadyK=embeddingKey.substring(0, embeddingIndex);
}
if(_this.dbOptions.enableRequestLimitations){
_this.requestCount++;
}
if(_this.checkSession()){
if(key!=''&&prompt.trim()!=''){
loader.show();
_this.ongoingRequest=true;
if(_this.dbOptions.chatboxTheme=='chatgpt'){
_this.$el.find('.ays-assistant-chatbox-messages-box').scrollTop(scrolledHeight + 50);
}
sendBttn.prop('disabled', true);
_this.$el.find('.ays-assistant-chatbox-regenerate-response-button').prop('disabled', true);
_this.$el.find('.ays-assistant-chatbox-speech-to-text-button').prop('disabled', false);
var sendData={
requestUrl:_this.REQUEST_URL,
apiKey:readyK,
prompt:prompt,
chatConversation:_this.chatConversation,
}
if(_this.dbOptions.enableEmbedding=='on'&&_this.dbOptions.pineconeConnection=='true'&&_this.dbOptions.embeddedPostsCount > 0){
_this.textEmbedding(prompt, embeddingReadyK)
.then(response=> {
if(!(typeof response.error=="object")){
var embeddedValues;
if(_this.dbOptions.embeddingApiType==='gemini'){
embeddedValues=response.embedding.values
}else{
embeddedValues=response.data[0].embedding
}
var queryData={
topK: 3,
includeMetadata: true,
includeValues: false,
namespace: "",
vector: embeddedValues
}
_this.pineconeQuery(queryData)
.then((context)=> {
if(_this.dbOptions.apiType==='gemini'){
sendData.chatConversation[0].parts[0]={text: _this.generateEmbedCompletion(context)};}else{
sendData.chatConversation[0]={role: 'system', content: _this.generateEmbedCompletion(context)};
switch(_this.dbOptions.chatModel){
case 'gpt-3.5-turbo':
sendData.chatConversation[0]={role: 'system', content: _this.generateEmbedCompletion(context)};
_this.dbOptions.chatMaxTokents=300;
break;
case 'gpt-3.5-turbo-16k':
case 'gpt-4':
case 'gpt-4-turbo-preview':
_this.dbOptions.chatMaxTokents=1000;
sendData.chatConversation[0]={role: 'system', content: _this.generateEmbedCompletion(context)};
break;
default:
sendData.chatConversation[0]=_this.generateEmbedCompletion(context);
break;
}}
makeRequest(sendData , _this.dbOptions, _this.dbOptions.apiType)
.then(data=> {
if(_this.dbOptions.chatSaveChatLog){
_this.saveConversation(data)
.then(res=> {
_this.gettingResponse(data, eventProps);
});
}else{
_this.gettingResponse(data, eventProps);
}});
},
(reject)=> {
_this.$el.find('.ays-assistant-chatbox-messages-box').append($("<div>", {"class": "ays-assistant-chatbox-error-message-box"}).html(reject)).scrollTop(_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight);
scrolledHeight=_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight;
elementHeight=Math.round(_this.$el.find('.ays-assistant-chatbox-messages-box').outerHeight());
loader.css('bottom', (10 + elementHeight - scrolledHeight));
loader.hide();
_this.ongoingRequest=false;
}
);
}else{
var errorMessage='';
if(response.error.type=="insufficient_quota"){
errorMessage=" <a href='https://platform.openai.com/account/usage'> https://platform.openai.com/account/usage </a>";
}
_this.$el.find('.ays-assistant-chatbox-messages-box').append($("<div>", {"class": "ays-assistant-chatbox-error-message-box"}).html(response.error.message + errorMessage)).scrollTop(_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight);
loader.hide();
_this.ongoingRequest=false;
}});
}else{
makeRequest(sendData , _this.dbOptions, _this.dbOptions.apiType)
.then(data=> {
if(_this.dbOptions.chatSaveChatLog){
_this.saveConversation(data)
.then(res=> {
_this.gettingResponse(data, eventProps);
});
}else{
_this.gettingResponse(data, eventProps);
}});
}}
}});
_this.$el.on('click', '.ays-assistant-chatbox-ai-message-copy', function(){
var thisButton=$(this);
var text=thisButton.parents(".ays-assistant-chatbox-ai-message-box").find('span.ays-assistant-chatbox-ai-response-message').text();
var thisButton=$(this);
_this.copyResponse(text);
$(this).attr('title', 'Copied!');
var copyIcon=$(this).html();
$(this).html('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#636a84"><path d="M470.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L192 338.7 425.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/></svg>');
setTimeout(function(){
thisButton.html(copyIcon);
}, 700);
});
_this.$el.on('mouseover', '.ays-assistant-chatbox-ai-message-copy', function(){
$(this).attr('title', 'Click to Copy');
});
_this.$el.on('click', '.ays-assistant-chatbox-ai-message-tts-speak', function(){
var text=$(this).parents('.ays-assistant-chatbox-ai-message-buttons').prev('span').text();
_this.ttsResponse(text, $(this).parents('.ays-assistant-chatbox-ai-message-tts'));
});
_this.$el.on('click', '.ays-assistant-chatbox-ai-message-tts-pause', function(){
window.speechSynthesis.pause();
var container=$(this).parents('.ays-assistant-chatbox-ai-message-tts');
var startBttn=container.find('.ays-assistant-chatbox-ai-message-tts-speak');
var pauseBttn=container.find('.ays-assistant-chatbox-ai-message-tts-pause');
var resumeBttn=container.find('.ays-assistant-chatbox-ai-message-tts-resume');
startBttn.hide();
pauseBttn.hide();
resumeBttn.show();
});
_this.$el.on('click', '.ays-assistant-chatbox-ai-message-tts-resume', function(){
window.speechSynthesis.resume();
var container=$(this).parents('.ays-assistant-chatbox-ai-message-tts');
var startBttn=container.find('.ays-assistant-chatbox-ai-message-tts-speak');
var pauseBttn=container.find('.ays-assistant-chatbox-ai-message-tts-pause');
var resumeBttn=container.find('.ays-assistant-chatbox-ai-message-tts-resume');
startBttn.hide();
pauseBttn.show();
resumeBttn.hide();
});
if(_this.dbOptions.chatAutoOpening){
setTimeout(()=> {
_this.$el.find('.ays-assistant-chatbox-closed-view').trigger('click');
}, _this.dbOptions.chatAutoOpeningDelay);
}
if(_this.dbOptions.iconTextOpenDelay > 0){
setTimeout(()=> {
_this.$el.find('.ays-assistant-chatbox-closed-view-text').show();
}, _this.dbOptions.iconTextOpenDelay);
}
_this.$el.on('click', '#chatgpt-assistant-information-form-submit', function (e){
e.preventDefault();
if(_this.dbOptions.chatInformationForm){
var inputBox=_this.$el.find('.ays-assistant-chatbox-input-box');
var errorContainer=_this.$el.find('.chatgpt-assistant-information-form-error-message');
var nameInput=_this.$el.find('#chatgpt-assistant-information-form-name');
var emailInput=_this.$el.find('#chatgpt-assistant-information-form-email');
var name=nameInput.val();
var email=emailInput.val();
if(_this.dbOptions.chatInformationFormRequired){
if(name!==''&&email!==''){
if(validateEmail(email)){
_this.informationFormData.name=name;
_this.informationFormData.email=email;
$(this).parents('.ays-assistant-chatbox-information-form-container').hide();
nameInput.val('');
emailInput.val('');
inputBox.removeClass('display_none');
}else{
errorContainer.text(AysChatGPTChatSettings.translations.invalidEmail).show();
setTimeout(()=> {
errorContainer.hide().empty();
}, 1000);
}}else{
errorContainer.text(AysChatGPTChatSettings.translations.emptyForm).show();
setTimeout(()=> {
errorContainer.hide().empty();
}, 1000);
}}else{
if(email===''||validateEmail(email)){
_this.informationFormData.name=name;
_this.informationFormData.email=email;
$(this).parents('.ays-assistant-chatbox-information-form-container').hide();
nameInput.val('');
emailInput.val('');
inputBox.removeClass('display_none');
}else{
errorContainer.text(AysChatGPTChatSettings.translations.invalidEmail).show();
setTimeout(()=> {
errorContainer.hide().empty();
}, 1000);
}}
}
_this.$el.find('.ays-assistant-chatbox-prompt-input').focus();
});
$(document).on('keypress', function (e){
if(e.which==13&&!e.shiftKe&&!_this.ongoingRequest){
var target=$(e.target);
if(target.hasClass('ays-assistant-chatbox-prompt-input')){
var chatBotMainBoxOpened = !_this.$el.find(".ays-assistant-chatbox-main-container").is(':hidden');
if(chatBotMainBoxOpened){
var prompt=_this.$el.find('.ays-assistant-chatbox-prompt-input');
if(prompt.length > 0){
if($(prompt).val().trim()!=''&&$(prompt).is(":focus")){
var button=_this.$el.find('.ays-assistant-chatbox-send-button');
if(!button.prop('disabled')){
e.preventDefault();
button.trigger("click");
}}
}}
}else if(target.hasClass('ays-assistant-chatbox-rate-chat-comment')){
var button=_this.$el.find('.ays-assistant-chatbox-rate-chat-submit');
if(!button.prop('disabled')){
e.preventDefault();
button.trigger("click");
}}
}});
_this.$el.on('click', '.ays-assistant-chatbox-more-bttn', function (e){
_this.$el.find('.ays-assistant-chatbox-more-menu').slideToggle('fast');
});
_this.$el.on('click', '.ays-assistant-chatbox-more-menu-container li.ays-assistant-chatbox-more-menu-item', function (e){
e.preventDefault();
var action=$(this).attr('data-action');
switch (action){
case 'txt-export':
default:
_this.exportChatTxt();
break;
}
_this.$el.find('.ays-assistant-chatbox-more-menu').slideUp('fast');
_this.$el.find('.ays-assistant-chatbox-prompt-input').focus();
});
_this.$el.on('click', '.ays-assistant-chatbox-rate-chat-like, .ays-assistant-chatbox-rate-chat-dislike', function (e){
_this.feedbackEvents($(this));
});
}
AysChatGPTChatBoxPublic.prototype.exportChatTxt=function (){
var _this=this;
var botName=_this.dbOptions.chatName!='' ? _this.dbOptions.chatName:'AI';
var userName=_this.informationFormData.name&&_this.informationFormData.name!='' ? _this.informationFormData.name:(_this.dbOptions.wpUserName&&_this.dbOptions.wpUserName!='' ? _this.dbOptions.wpUserName:'Guest');
var conversation=_this.chatConversation;
var content=[];
if(typeof conversation[0]==='object'&&conversation[0]!==null){
conversation.forEach(message=> {
if(message.role=='assistant'||message.role=='model'){
var roleName=botName;
}else if(message.role=='user'){
var roleName=userName;
}
if(_this.dbOptions.apiType==='gemini'){
content.push(roleName + ': ' + message.parts[message.parts.length - 1].text);
}else{
content.push(roleName + ': ' + message.content);
}});
}else{
conversation.forEach(message=> {
var role=message.substring(0, message.indexOf(" "));
if(role=='Chatbot:'){
content.push(botName + ': ' + message.replace(role, ''));
}else if(role=='Human:'){
content.push(userName + ': ' + message.replace(role, ''));
}});
}
var link=document.createElement("a");
var file=new Blob([content.join('\n\n')], { type: 'text/plain' });
link.href=URL.createObjectURL(file);
link.download="chat-conversation.txt";
link.click();
URL.revokeObjectURL(link.href);
}
AysChatGPTChatBoxPublic.prototype.gettingResponse=function (data, eventProps){
var _this=this;
var apiType=_this.dbOptions.apiType;
var loader=_this.$el.find('.ays-assistant-chatbox-loading-box');
var scrolledHeight=_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight;
var elementHeight=Math.round(_this.$el.find('.ays-assistant-chatbox-messages-box').outerHeight());
loader.hide();
var checkError=(typeof data.error=="object") ? false:true;
if(checkError){
if(apiType==='gemini'){
if(typeof data.candidates!=='undefined'){
_this.chatConversation.push(data.candidates[0].content);
var response="<span class='ays-assistant-chatbox-ai-response-message'>" + (data.candidates[0].content.parts[0].text.replace(/^\n+/, '')) + "</span>";
}else{
if(typeof data.promptFeedback!=='undefined'){
if(data.promptFeedback.blockReason==='SAFETY'){
_this.chatConversation.push({role: 'model', parts: [{text: AysChatGPTChatSettings.translations.geminiSafetyNotice}]});
var response="<span class='ays-assistant-chatbox-ai-response-message'>" + (AysChatGPTChatSettings.translations.geminiSafetyNotice) + "</span>";
}}
}}else{
switch(_this.dbOptions.chatModel){
case 'gpt-3.5-turbo':
case 'gpt-3.5-turbo-16k':
case 'gpt-4':
case 'gpt-4-turbo-preview':
_this.chatConversation.push(data.choices[0].message);
var response="<span class='ays-assistant-chatbox-ai-response-message'>" + (data.choices[0].message.content.replace(/^\n+/, '')) + "</span>";
break;
default:
_this.chatConversation.push("Chatbot: " + data.choices[0].text.replace(/^[^:]+:\s*/, '').replace(/^\n+/, ''));
var response="<span class='ays-assistant-chatbox-ai-response-message'>" + (data.choices[0].text.replace(/^[^:]+:\s*/, '').replace(/^\n+/, '')) + "</span>";
break;
}}
var chatBotIcon='';
if(_this.dbOptions.chatboxTheme=='chatgpt'){
chatBotIcon='<div class="ays-assistant-chatbox-chatgpt-theme-ai-icon"><img src="' + _this.dbOptions.chatAvatar + '"></div>';
}
var buttons=getAIButtons(_this.dbOptions);
var aiMessage=$("<div>", {"class": "ays-assistant-chatbox-ai-message-box"}).html(chatBotIcon + response + buttons);
_this.$el.find('.ays-assistant-chatbox-messages-box').append(aiMessage).scrollTop(_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight);
if(eventProps!=undefined&&eventProps.indicator&&eventProps.type=='audio'&&_this.dbOptions.sttResponseAutoplay){
_this.$el.find('.ays-assistant-chatbox-messages-box').find('.ays-assistant-chatbox-ai-message-box:last-child').find('.ays-assistant-chatbox-ai-message-tts-speak').trigger('click');
}}else{
var errorMessage='';
if(data.error.type=="insufficient_quota"){
errorMessage=" <a href='https://platform.openai.com/account/usage'> https://platform.openai.com/account/usage </a>";
}
_this.$el.find('.ays-assistant-chatbox-messages-box').append($("<div>", {"class": "ays-assistant-chatbox-error-message-box"}).html(data.error.message + errorMessage)).scrollTop(_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight);
}
scrolledHeight=_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight;
elementHeight=Math.round(_this.$el.find('.ays-assistant-chatbox-messages-box').outerHeight());
loader.css('bottom', (10 + elementHeight - scrolledHeight));
_this.$el.find('.ays-assistant-chatbox-regenerate-response-button').prop('disabled', false);
_this.$el.find('.ays-assistant-chatbox-speech-to-text-button').prop('disabled', false);
_this.ongoingRequest=false;
}
AysChatGPTChatBoxPublic.prototype.copyResponse=function (text){
var _this=this;
var el=jQuery('<textarea>').appendTo('body').val(text).select();
document.execCommand ('copy');
el.remove();
}
AysChatGPTChatBoxPublic.prototype.ttsResponse=function (text, container){
var _this=this;
if(!('speechSynthesis' in window)){
alert('Text-to-speech not supported in this browser');
return;
}
var startBttn=container.find('.ays-assistant-chatbox-ai-message-tts-speak');
var pauseBttn=container.find('.ays-assistant-chatbox-ai-message-tts-pause');
var resumeBttn=container.find('.ays-assistant-chatbox-ai-message-tts-resume');
var synth=window.speechSynthesis;
synth.cancel();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-speak').show();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-pause').hide();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-resume').hide();
var utterance=new SpeechSynthesisUtterance(text);
if(_this.ttsVoices.length!==0){
_this.ttsVoices.forEach((voice, index)=> {
if(voice.name==_this.dbOptions.textToSpeechVoice){
utterance.voice=_this.ttsVoices[index];
utterance.lang=utterance.voice.lang
}});
}
utterance.onstart=function(e){
startBttn.hide();
pauseBttn.show();
resumeBttn.hide();
};
utterance.onend=function(e){
startBttn.show();
pauseBttn.hide();
resumeBttn.hide();
};
synth.speak(utterance);
}
AysChatGPTChatBoxPublic.prototype.setDbOptions=function (){
var _this=this;
var chatAK=AysChatGPTChatSettings.translations.ka ? atob(AysChatGPTChatSettings.translations.ka):'';
var apiType=AysChatGPTChatSettings.apiType ? AysChatGPTChatSettings.apiType:'openai';
var embeddingAK=AysChatGPTChatSettings.translations.embeddingKa ? atob(AysChatGPTChatSettings.translations.embeddingKa):'';
var embeddingApiType=AysChatGPTChatSettings.embeddingApiType ? AysChatGPTChatSettings.embeddingApiType:'openai';
var sttAK=AysChatGPTChatSettings.translations.sttKa ? atob(AysChatGPTChatSettings.translations.sttKa):'';
var sttApiType=AysChatGPTChatSettings.sttApiType ? AysChatGPTChatSettings.sttApiType:'openai';
var chatAutoOpening=AysChatGPTChatSettings.chatAutoOpening ? true:false;
var chatAutoOpeningDelay=AysChatGPTChatSettings.chatAutoOpeningDelay ? +AysChatGPTChatSettings.chatAutoOpeningDelay:0;
var chatRegenerateResponse=AysChatGPTChatSettings.chatRegenerateResponse ? true:false;
var chatSaveChatLog=AysChatGPTChatSettings.chatSaveChatLog ? true:false;
var chatInformationForm=AysChatGPTChatSettings.chatInformationForm ? true:false;
var chatInformationFormRequired=AysChatGPTChatSettings.chatInformationFormRequired ? true:false;
var chatTemperature=AysChatGPTChatSettings.chatTemprature ? +AysChatGPTChatSettings.chatTemprature:0.7;
var chatTopP=AysChatGPTChatSettings.chatTopP ? +AysChatGPTChatSettings.chatTopP:1;
var chatMaxTokents=AysChatGPTChatSettings.chatMaxTokents ? +AysChatGPTChatSettings.chatMaxTokents:1500;
var chatFrequencyPenalty=AysChatGPTChatSettings.chatFrequencyPenalty ? +AysChatGPTChatSettings.chatFrequencyPenalty:0.01;
var chatPresencePenalty=AysChatGPTChatSettings.chatPresencePenalty ? +AysChatGPTChatSettings.chatPresencePenalty:0.01;
var chatBestOf=AysChatGPTChatSettings.chatBestOf ? +AysChatGPTChatSettings.chatBestOf:1;
var chatContext=AysChatGPTChatSettings.chatContext!=='' ? AysChatGPTChatSettings.chatContext:'';
var chatProfession=AysChatGPTChatSettings.chatProfession ? AysChatGPTChatSettings.chatProfession:'';
var chatTone=AysChatGPTChatSettings.chatTone ? AysChatGPTChatSettings.chatTone:'';
var chatName=AysChatGPTChatSettings.chatName ? AysChatGPTChatSettings.chatName:'';
var chatLanguage=AysChatGPTChatSettings.chatLanguage ? AysChatGPTChatSettings.chatLanguage:'';
var chatModel=AysChatGPTChatSettings.chatModel ? AysChatGPTChatSettings.chatModel:'gpt-3.5-turbo-16k';
var chatboxPosition=AysChatGPTChatSettings.chatboxPosition;
var chatGreetingMessage=AysChatGPTChatSettings.chatGreetingMessage;
var enableResponseTts=AysChatGPTChatSettings.enableResponseTts;
var textToSpeechVoice=AysChatGPTChatSettings.textToSpeechVoice;
var sttResponseAutoplay=AysChatGPTChatSettings.sttResponseAutoplay=='on' ? true:false;
var enableEmbedding=AysChatGPTChatSettings.enableEmbedding;
var pineconeConnection=AysChatGPTChatSettings.pineconeConnection;
var pineconeApiKey=AysChatGPTChatSettings.pineconeApiKey;
var pineconeIndex=AysChatGPTChatSettings.pineconeIndex;
var embeddedPostsCount=AysChatGPTChatSettings.embeddedPostsCount;
var postId=AysChatGPTChatSettings.postId;
var chatboxTheme=AysChatGPTChatSettings.chatboxTheme ? AysChatGPTChatSettings.chatboxTheme:'default';
var chatIcon=AysChatGPTChatSettings.chatIcon;
var chatAvatar=AysChatGPTChatSettings.chatAvatar;
var userProfilePicture=AysChatGPTChatSettings.userProfilePicture;
var iconTextOpenDelay=AysChatGPTChatSettings.iconTextOpenDelay ? +AysChatGPTChatSettings.iconTextOpenDelay:0;
var wpUserName=AysChatGPTChatSettings.wpUserName ? AysChatGPTChatSettings.wpUserName:'';
var enableRequestLimitations=AysChatGPTChatSettings.enableRequestLimitations;
var requestLimitationsLimit=AysChatGPTChatSettings.requestLimitationsLimit
var requestLimitationsInterval=AysChatGPTChatSettings.requestLimitationsInterval;
var rateChatLikeOptions=AysChatGPTChatSettings.rateChatOptions.like ? AysChatGPTChatSettings.rateChatOptions.like:[];
var rateChatDislikeOptions=AysChatGPTChatSettings.rateChatOptions.dislike ? AysChatGPTChatSettings.rateChatOptions.dislike:[];
var rateChatImages=AysChatGPTChatSettings.rateChatOptions.images ? AysChatGPTChatSettings.rateChatOptions.images:[];
if(enableRequestLimitations){
if(getCookie('wp-ays-cgpta-wndw-count')!==undefined){
_this.requestCount=+getCookie('wp-ays-cgpta-wndw-count');
}}
_this.dbOptions={
chatAK:chatAK,
apiType:apiType,
embeddingAK:embeddingAK,
embeddingApiType:embeddingApiType,
sttAK:sttAK,
sttApiType:sttApiType,
chatAutoOpening:chatAutoOpening,
chatAutoOpeningDelay:chatAutoOpeningDelay,
chatRegenerateResponse:chatRegenerateResponse,
chatSaveChatLog:chatSaveChatLog,
chatInformationForm:chatInformationForm,
chatInformationFormRequired:chatInformationFormRequired,
chatTemperature:chatTemperature,
chatTopP:chatTopP,
chatMaxTokents:chatMaxTokents,
chatFrequencyPenalty:chatFrequencyPenalty,
chatPresencePenalty:chatPresencePenalty,
chatModel:chatModel,
chatBestOf:chatBestOf,
chatContext:chatContext,
chatProfession:chatProfession,
chatTone:chatTone,
chatLanguage:chatLanguage,
chatName:chatName,chatboxPosition: chatboxPosition,
chatGreetingMessage:chatGreetingMessage,
enableResponseTts:enableResponseTts,
textToSpeechVoice:textToSpeechVoice,
sttResponseAutoplay:sttResponseAutoplay,
enableEmbedding:enableEmbedding,
pineconeConnection:pineconeConnection,
pineconeApiKey:pineconeApiKey,
pineconeIndex:pineconeIndex,
embeddedPostsCount:embeddedPostsCount,
postId:postId,
chatboxTheme:chatboxTheme,
chatIcon:chatIcon,
chatAvatar:chatAvatar,
userProfilePicture:userProfilePicture,
wpUserName:wpUserName,
enableRequestLimitations:enableRequestLimitations,
requestLimitationsLimit:requestLimitationsLimit,
requestLimitationsInterval:requestLimitationsInterval,
rateChat: {
like:rateChatLikeOptions,
dislike:rateChatDislikeOptions,
images:rateChatImages,
},
iconTextOpenDelay: iconTextOpenDelay,
}}
AysChatGPTChatBoxPublic.prototype.setUpRequestParametrs=function (){
var _this=this;
if(_this.dbOptions.apiType==='gemini'){
_this.REQUEST_URL=_this.GEMINI_API_TEXT_URL;
_this.messageFirstM={role: 'user', parts: [{text: _this.promptFirstM + _this.promptSecondM}]};
_this.chatConversation.push(_this.messageFirstM);
}else{
switch(_this.dbOptions.chatModel){
case 'gpt-3.5-turbo':
case 'gpt-3.5-turbo-16k':
case 'gpt-4':
case 'gpt-4-turbo-preview':
_this.messageFirstM={role: 'system', content: _this.promptFirstM + _this.promptSecondM};
_this.chatConversation.push(_this.messageFirstM);
_this.REQUEST_URL=_this.API_MAIN_URL + _this.API_CHAT_COMPLETIONS_URL;
break;
default:
_this.chatConversation.push(_this.promptFirstM , _this.promptSecondM);
_this.REQUEST_URL=_this.API_MAIN_URL + _this.API_COMPLETIONS_URL;
break;
}}
}
AysChatGPTChatBoxPublic.prototype.setUpPromptParametrs=function (){
var _this=this;
var professionFirstText='Act as: ';
var toneFirstText='Tone: ';
var languageText='Language: ';
var nameText='Name: ';
var finalText='';
if(_this.dbOptions.chatContext!=''){
_this.promptSecondM=_this.dbOptions.chatContext;
_this.promptFirstM='';
}
if(_this.dbOptions.chatProfession){
professionFirstText +=_this.dbOptions.chatProfession;
finalText +=professionFirstText;
}
if(_this.dbOptions.chatTone&&_this.dbOptions.chatTone!='none'){
if(finalText){
finalText +='. ';
}
var capitalizedTone=_this.dbOptions.chatTone.charAt(0).toUpperCase() + _this.dbOptions.chatTone.slice(1)
toneFirstText +=capitalizedTone;
finalText +=toneFirstText;
}
if(_this.dbOptions.chatLanguage){
if(finalText){
finalText +='. ';
}
var coutries=getCountries();
languageText +=coutries[_this.dbOptions.chatLanguage];
finalText +=languageText;
}
if(_this.dbOptions.chatName){
nameText +=_this.dbOptions.chatName;
_this.promptFirstM="Your name is " + _this.dbOptions.chatName + ". " + this.promptFirstM;
}
if(finalText){
finalText +='. ';
_this.promptSecondM +=finalText;
}}
AysChatGPTChatBoxPublic.prototype.speechToText=function (){
var _this=this;
var chunks=[], recorder, isRecording=false, type={}, mediaType="", recName="";
_this.globalSttData={
chunks: chunks,
recorder: recorder,
isRecording: isRecording,
type: type,
mediaType: mediaType ,
recName: recName,
}
_this.$el.find('.ays-assistant-chatbox-speech-to-text-button').on('click', function (){
if(!_this.globalSttData.isRecording){
_this.startRecording($(this));
}else{
_this.stopRecording($(this));
}
_this.globalSttData.isRecording = !_this.globalSttData.isRecording;
});
}
AysChatGPTChatBoxPublic.prototype.startRecording=function (bttn){
var _this=this;
navigator.mediaDevices.getUserMedia({ audio: true })
.then(function (stream){
bttn.css('animation', 'bgColor 2s infinite linear');
if(MediaRecorder.isTypeSupported('audio/webm')){
_this.globalSttData.type={mimeType: 'audio/webm'};
_this.globalSttData.recName='recording.webm';
}else if(MediaRecorder.isTypeSupported('video/mp4')){
_this.globalSttData.type={mimeType: 'video/mp4'};
_this.globalSttData.recName='recording.mp4';
}else{
alert("No suitable mimetype found for this device");
}
_this.globalSttData.recorder=new MediaRecorder(stream, _this.globalSttData.type);
_this.globalSttData.recorder.ondataavailable=function (e){
_this.globalSttData.chunks.push(e.data);
};
_this.globalSttData.recorder.onstop=function (){
_this.saveAudio(new Blob(_this.globalSttData.chunks));
_this.globalSttData.chunks=[];
};
_this.globalSttData.mediaType=_this.globalSttData.recorder.mimeType;
_this.globalSttData.recorder.start();
})
.catch(function (error){
_this.$el.find('.ays-assistant-chatbox-speech-to-text-error').text(error).fadeIn('fast');
setTimeout(()=> {
_this.$el.find('.ays-assistant-chatbox-speech-to-text-error').fadeOut('fast');
}, 2000);
_this.globalSttData.isRecording=false;
});
}
AysChatGPTChatBoxPublic.prototype.stopRecording=function (bttn){
var _this=this;
bttn.css('animation', 'unset');
_this.globalSttData.recorder.stop();
}
AysChatGPTChatBoxPublic.prototype.saveAudio=function (blob){
var _this=this;
var audioBlob=new Blob([blob], { type: 'audio/mp3' });
var url=URL.createObjectURL(audioBlob);
var audioTag=$("<audio controls></audio>", {"class": "ays-assistant-chatbox-user-audio-message"}).attr("src", url);
var userProfilePicture='';
if(_this.dbOptions.chatboxTheme=='chatgpt'){
userProfilePicture='<div class="ays-assistant-chatbox-chatgpt-theme-user-icon">' + _this.dbOptions.userProfilePicture + '</div>';
}
var userMessage=$("<div>", {"class": "ays-assistant-chatbox-user-message-box ays-assistant-chatbox-user-message-audio-box"});
userMessage.append(userProfilePicture, audioTag);
_this.$el.find('.ays-assistant-chatbox-messages-box').append(userMessage).scrollTop(_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight);
var scrolledHeight=_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight;
var elementHeight=Math.round(_this.$el.find('.ays-assistant-chatbox-messages-box').outerHeight());
_this.$el.find('.ays-assistant-chatbox-loading-box').css('bottom', (10 + elementHeight - scrolledHeight));
var file=new File([blob], _this.globalSttData.recName, {type: _this.globalSttData.mediaType});
_this.sendAudio(file);
}
AysChatGPTChatBoxPublic.prototype.sendAudio=function (audioFile){
var _this=this;
var url="https://api.openai.com/v1/audio/transcriptions";
var key=_this.dbOptions.sttAK;
var index=key.indexOf("chgafr");
var readyK=key.substring(0, index);
var formData=new FormData();
formData.append('file', audioFile);
formData.append('model', 'whisper-1');
_this.$el.find('.ays-assistant-chatbox-loading-box').show();
fetch(url, {
headers: {
'Authorization': `Bearer ${readyK}`
},
method: 'POST',
body: formData
})
.then((response)=> response.json())
.then((result)=> {
if(!(typeof result.error=="object")){
if(result.text!=""){
_this.$el.find('.ays-assistant-chatbox-prompt-input').val(result.text);
_this.$el.find('.ays-assistant-chatbox-send-button').trigger('click', {indicator: true, type: 'audio'});
}else{
_this.$el.find('.ays-assistant-chatbox-loading-box').hide();
_this.$el.find('.ays-assistant-chatbox-speech-to-text-error').text('Error: No sound').fadeIn('fast');
setTimeout(()=> {
_this.$el.find('.ays-assistant-chatbox-speech-to-text-error').fadeOut('fast');
}, 2000);
}}else{
_this.$el.find('.ays-assistant-chatbox-loading-box').hide();
var errorMessage='';
if(result.error.type=="insufficient_quota"){
errorMessage=" <a href='https://platform.openai.com/account/usage'> https://platform.openai.com/account/usage </a>";
}
_this.$el.find('.ays-assistant-chatbox-speech-to-text-error').text(result.error.message + errorMessage).fadeIn('fast');
setTimeout(()=> {
_this.$el.find('.ays-assistant-chatbox-speech-to-text-error').fadeOut('fast');
}, 2000);
}}).catch((error)=> {
_this.$el.find('.ays-assistant-chatbox-loading-box').hide();
_this.$el.find('.ays-assistant-chatbox-speech-to-text-error').text(error).fadeIn('fast');
setTimeout(()=> {
_this.$el.find('.ays-assistant-chatbox-speech-to-text-error').fadeOut('fast');
}, 2000);
});
}
AysChatGPTChatBoxPublic.prototype.setGreetingMessage=function (){
var _this=this;
var buttons=getAIButtons(_this.dbOptions);
var aIGMessage="<span class='ays-assistant-chatbox-ai-response-message'>" + AysChatGPTChatSettings.translations.chatGreetingMessage + "</span>";
var chatBotIcon='';
if(_this.dbOptions.chatboxTheme=='chatgpt'){
chatBotIcon='<div class="ays-assistant-chatbox-chatgpt-theme-ai-icon"><img src="' + _this.dbOptions.chatAvatar + '"></div>';
}
var aiGreetingMessage=$("<div>", {"class": "ays-assistant-chatbox-ai-message-box"}).html(chatBotIcon + aIGMessage + buttons);
_this.$el.find('.ays-assistant-chatbox-messages-box').prepend(aiGreetingMessage);
}
AysChatGPTChatBoxPublic.prototype.makeResizableDiv=function(el){
var _this=this;
var element=$(document).find(el);
var resizer=element.find('.ays-assistant-chatbox-header-row');
var minimum_width=320;
var minimum_height=430;
var original_width=0;
var original_height=0;
var original_mouse_x=0;
var original_mouse_y=0;
if(resizer.length > 0){
resizer.on('mousedown', function(e){
e.preventDefault();
original_width=parseFloat(element.css('width'));
original_height=parseFloat(element.css('height'));
original_mouse_x=e.pageX;
original_mouse_y=e.pageY;
$(window).on('mousemove', function(e){
var dataObj={
element: element,
original_width: original_width,
original_height: original_height,
original_mouse_x: original_mouse_x,
original_mouse_y:original_mouse_y ,
minimum_width: minimum_width,
minimum_height: minimum_height,
}
_this.startResize(e , dataObj);
});
$(window).on('mouseup', function(){
_this.stopResize();
});
});
}}
AysChatGPTChatBoxPublic.prototype.startResize=function(e , dataObj){
if(!dataObj.element.hasClass('ays-assistant-chatbox-main-container-maximized-view')){
if(AysChatGPTChatSettings.chatboxPosition!=='right'){
var width=dataObj.original_width + (e.pageX - dataObj.original_mouse_x);
var height=dataObj.original_height - (e.pageY - dataObj.original_mouse_y);
var maximum_width=$(window).innerWidth() - 50;
var maximum_height=$(window).innerHeight() - 50;
if(width < maximum_width&&height < maximum_height){
if(width > dataObj.minimum_width){
dataObj.element.css('width', width + 'px');
}
if(height > dataObj.minimum_height){
dataObj.element.css('height', height + 'px');
}}
}else{
var width=dataObj.original_width - (e.pageX - dataObj.original_mouse_x);
var height=dataObj.original_height - (e.pageY - dataObj.original_mouse_y);
var maximum_width=$(window).innerWidth() - 50;
var maximum_height=$(window).innerHeight() - 50;
if(width < maximum_width&&height < maximum_height){
if(width > dataObj.minimum_width){
dataObj.element.css('width', width + 'px');
}
if(height > dataObj.minimum_height){
dataObj.element.css('height', height + 'px');
}}
}}
}
AysChatGPTChatBoxPublic.prototype.stopResize=function (){
$(window).off('mousemove');
}
AysChatGPTChatBoxPublic.prototype.textEmbedding=function (content, key){
var _this=this;
var requestHeaders={};
var requestBody={};
if(_this.dbOptions.embeddingApiType==='gemini'){
var url=_this.GEMINI_API_EMBEDDING_URL + `?key=${key}`;
requestHeaders={
"Content-Type": "application/json",
};
requestBody={
model: "models/embedding-001",
content: {
parts:[{
text: content
}]
}};}else{
var url=_this.API_MAIN_URL + _this.API_EMBEDDING_URL;
requestHeaders={
"Content-Type": "application/json",
"Authorization": `Bearer ${key}`,
};
requestBody={
model: "text-embedding-ada-002",
input: content,
};}
return fetch(url, {
method: "POST",
headers: requestHeaders,
body: JSON.stringify(requestBody),
})
.then(response=> {
return response.json();
})
}
AysChatGPTChatBoxPublic.prototype.pineconeQuery=function (queryData){
var _this=this;
var index=_this.dbOptions.pineconeIndex.indexOf("https://")===-1 ? 'https://'+_this.dbOptions.pineconeIndex:_this.dbOptions.pineconeIndex;
return new Promise(function(resolve, reject){
$.ajax({
url: AysChatGPTChatSettings.ajaxUrl,
method: 'post',
dataType: 'json',
data: {
pinecone_url: index + _this.PINECONE_QUERY_URL,
pinecone_key: _this.dbOptions.pineconeApiKey,
query_data: JSON.stringify(queryData),
action: _this.ajaxAction,
function: 'ays_chatgpt_pinecone_query',
},
success: function (response){
var check=false;
var matches='';
if(typeof response!=="undefined"){
var data=JSON.parse(response);
if(data.status){
if(data.response.matches.length > 0){
data.response.matches.forEach(match=> {
if(match.metadata!==undefined){
if(match.metadata.text!==undefined&&match.metadata.text!==''){
matches +=match.metadata.text;
}else{
check=true;
}}else{
check=true;
}});
}else{
check=true;
}}else{
reject(data.response);
}}else{
check=true;
}
if(check){
reject("No embedded data. Please embed the content of your website first.");
}else{
matches=stripSlashes(stripTags(matches, '')).replace(/\s+/g,' ').trim();
resolve(matches);
}},
error: function (xhr, status, error){
reject(error);
}});
});
}
AysChatGPTChatBoxPublic.prototype.generateEmbedCompletion=function (context){
var _this=this;
var prompt=_this.promptFirstM + "\n\nAnswer the question based on the context below, checking the context detailed.\n\nContext:" + context + "\n\nDo not say based on what, just answer the question. If you don't understand the question, apologize and always ask for clarification of the question. If you dont find a specific answer to the question, politely say no." + _this.promptSecondM;
return prompt;
}
AysChatGPTChatBoxPublic.prototype.saveConversation=function (response){
var _this=this;
var apiType=_this.dbOptions.apiType;
var checkError=(typeof response.error=="object") ? false:true;
if(checkError){
if(apiType==='openai'){
_this.tokensSum +=+response.usage.total_tokens
}}
var encoder=new TextEncoder();
var encodedData=encoder.encode(JSON.stringify(_this.chatConversation));
var encodedString=btoa(String.fromCharCode.apply(null, encodedData));
var sendData={
action:_this.ajaxAction,
function:'chatgpt_assistant_save_chat_log',
logIndicator: _this.logIndicator,
currentLogId: _this.currentLogId,
postId: _this.dbOptions.postId,
informationForm: _this.informationFormData,
chatType: {
source: 'public',
type: 'chatbot'
},
logData: {
tokens: _this.tokensSum,
conversation: encodedString,
lastResponse: response
}}
return new Promise(function(resolve, reject){
if(sendData.logData.conversation.length > 0){
$.ajax({
url: AysChatGPTChatSettings.ajaxUrl,
method: 'post',
dataType: 'json',
data: sendData,
success: function (r){
var res=JSON.parse(r);
_this.logIndicator=true;
_this.currentLogId=res.insertId;
if(!res.status){
reject(res.message);
}else{
resolve(res.message);
}},
error: function (xhr, status, error){
reject(error);
}});
}else{
resolve('No data');
}});
}
AysChatGPTChatBoxPublic.prototype.setWindowEvents=function (){
var _this=this;
window.speechSynthesis.addEventListener('voiceschanged', function(){
_this.ttsVoices=window.speechSynthesis.getVoices();
});
window.addEventListener('unload', function(event){
event.preventDefault();
speechSynthesis.cancel();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-speak').show();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-pause').hide();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-resume').hide();
});
window.addEventListener("blur", (event)=> {
event.preventDefault();
var synth=window.speechSynthesis;
synth.cancel();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-speak').show();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-pause').hide();
_this.$el.find('.ays-assistant-chatbox-ai-message-tts-resume').hide();
});
}
AysChatGPTChatBoxPublic.prototype.feedbackEvents=function ($this){
var _this=this;
var action=$this.attr('data-action');
var htmlOptions=_this.dbOptions.rateChat[action];
var modal=_this.$el.find('.ays-assistant-chatbox-main-chat-modal');
modal.find('.ays-assistant-chatbox-main-chat-modal-body').css('margin-top', '-20px')
modal.find('.ays-assistant-chatbox-main-chat-modal-body-image').append('<img src="'+_this.dbOptions.rateChat.images[action]+'">').addClass('ays-assistant-chatbox-main-chat-modal-body-image-rate-chat');
var readyContent='<span class="ays-assistant-chatbox-rate-chat-text">'+htmlOptions.text+'</span>';
if(htmlOptions.action=='feedback'){
readyContent +='<textarea class="ays-assistant-chatbox-rate-chat-comment"></textarea>';
readyContent +='<button class="ays-assistant-chatbox-rate-chat-submit" data-modal-action="submit">'+AysChatGPTChatSettings.translations.leaveComment+'</button>';
}else if(htmlOptions.action=='help'){
var helpOptions=htmlOptions.help;
for (var k in helpOptions){
if(Object.hasOwnProperty.call(helpOptions, k)){
var data=helpOptions[k];
if(data.status){
readyContent +='<a class="ays-assistant-chatbox-rate-chat-link" target="_blank" href="'+data.url+'">';
readyContent +='<img src="'+_this.dbOptions.rateChat.images.linkIcon+'"> ';
readyContent +=data.text;
readyContent +='</img>';
}}
}}
modal.find('.ays-assistant-chatbox-main-chat-modal-body-text').append(readyContent);
modal.css('display', 'flex');
modal.on('click', function (e){
if($(e.target).attr('data-modal-action')==='submit'){
var textarea=$(e.target).prev('textarea.ays-assistant-chatbox-rate-chat-comment');
var feedback=textarea.length > 0 ? textarea.val():'';
if(feedback.trim()!=''){
$.ajax({
url: AysChatGPTChatSettings.ajaxUrl,
method: 'post',
dataType: 'json',
data: {
action: _this.ajaxAction,
function: 'ays_chatgpt_save_feedback',
feedback_data: JSON.stringify({
log_id: _this.currentLogId,
post_id: _this.dbOptions.postId,
user_name: _this.informationFormData.name,
user_email: _this.informationFormData.email,
source: 'public',
type: 'chatbot',
feedback: feedback,
feedback_action: action,
}),
},
success: function (response){
_this.$el.find('.ays-assistant-chatbox-rate-chat-row').hide();
},
error: function (error){
console.log(error);
}});
}
modal.hide('fast');
modal.find('.ays-assistant-chatbox-main-chat-modal-body-image').removeClass('ays-assistant-chatbox-main-chat-modal-body-image-rate-chat');
modal.find('.ays-assistant-chatbox-main-chat-modal-body').css('margin-top', '');
modal.find('.ays-assistant-chatbox-main-chat-modal-body-image').empty();
modal.find('.ays-assistant-chatbox-main-chat-modal-body-text').empty();
}else if($(e.target).attr('data-modal-action')==='close'){
modal.hide('fast');
modal.find('.ays-assistant-chatbox-main-chat-modal-body-image').removeClass('ays-assistant-chatbox-main-chat-modal-body-image-rate-chat');
modal.find('.ays-assistant-chatbox-main-chat-modal-body').css('margin-top', '');
modal.find('.ays-assistant-chatbox-main-chat-modal-body-image').empty();
modal.find('.ays-assistant-chatbox-main-chat-modal-body-text').empty();
}});
}
AysChatGPTChatBoxPublic.prototype.checkSession=function (){
var _this=this;
if(_this.dbOptions.enableRequestLimitations){
var limit=+_this.dbOptions.requestLimitationsLimit;
var interval=_this.dbOptions.requestLimitationsInterval;
var timeInSeconds=1;
switch (interval){
case 'hour':
timeInSeconds=60 * 60;
break;
case 'day':
timeInSeconds=24 * 60 * 60;
break;
case 'week':
timeInSeconds=7 * 24 * 60 * 60;
break;
case 'month':
timeInSeconds=30 * 7 * 24 * 60 * 60;
break;
default:
break;
}
if(limit > 0&&timeInSeconds > 1){
if(getCookie('wp-ays-cgpta-wndw-count')===undefined){
_this.requestCount=1;
var expiryDate=new Date();
expiryDate.setSeconds(expiryDate.getSeconds() + timeInSeconds);
setCookie('wp-ays-cgpta-wndw-count-start', expiryDate.toUTCString(), {'expires': expiryDate.toUTCString()});
setCookie('wp-ays-cgpta-wndw-count', _this.requestCount, {'expires': expiryDate.toUTCString()});
}else{
if(+getCookie('wp-ays-cgpta-wndw-count') < limit){
var expires=getCookie('wp-ays-cgpta-wndw-count-start');
setCookie('wp-ays-cgpta-wndw-count', _this.requestCount, {'expires': expires});
}else{
_this.$el.find('.ays-assistant-chatbox-messages-box').append($("<div>", {"class": "ays-assistant-chatbox-error-message-box"}).html(AysChatGPTChatSettings.translations.requestLimitReached[interval])).scrollTop(_this.$el.find('.ays-assistant-chatbox-messages-box')[0].scrollHeight);
return false;
}}
}}else{
if(getCookie('wp-ays-cgpta-wndw-count')!==undefined){
deleteCookie('wp-ays-cgpta-wndw-count');
}
if(getCookie('wp-ays-cgpta-wndw-count-start')!==undefined){
deleteCookie('wp-ays-cgpta-wndw-count-start');
}}
return true;
}
$.fn.AysChatGPTChatBoxPublicMain=function(options){
if(!$.data(this, 'AysChatGPTChatBoxPublicMain')){
$.data(this, 'AysChatGPTChatBoxPublicMain', new AysChatGPTChatBoxPublic(this, options));
}else{
try {
$(this).data('AysChatGPTChatBoxPublicMain').init();
} catch (err){
console.error('AysChatGPTChatBoxPublicMain has not initiated properly');
}}
};})(jQuery);