@@ -4,161 +4,85 @@ import {
44 deleteConversation ,
55 generateAnswersWithChatgptWebApi ,
66 sendMessageFeedback ,
7- } from './apis/chatgpt-web'
8- import { generateAnswersWithBingWebApi } from './apis/bing-web.mjs'
7+ } from '../services /apis/chatgpt-web'
8+ import { generateAnswersWithBingWebApi } from '../services /apis/bing-web.mjs'
99import {
1010 generateAnswersWithChatgptApi ,
1111 generateAnswersWithGptCompletionApi ,
12- } from './apis/openai-api'
13- import { generateAnswersWithCustomApi } from './apis/custom-api.mjs'
14- import { generateAnswersWithAzureOpenaiApi } from './apis/azure-openai-api.mjs'
15- import { generateAnswersWithWaylaidwandererApi } from './apis/waylaidwanderer-api.mjs'
16- import { generateAnswersWithPoeWebApi } from './apis/poe-web.mjs'
12+ } from '../services /apis/openai-api'
13+ import { generateAnswersWithCustomApi } from '../services /apis/custom-api.mjs'
14+ import { generateAnswersWithAzureOpenaiApi } from '../services /apis/azure-openai-api.mjs'
15+ import { generateAnswersWithWaylaidwandererApi } from '../services /apis/waylaidwanderer-api.mjs'
16+ import { generateAnswersWithPoeWebApi } from '../services /apis/poe-web.mjs'
1717import {
1818 azureOpenAiApiModelKeys ,
1919 bingWebModelKeys ,
2020 chatgptApiModelKeys ,
2121 chatgptWebModelKeys ,
22- clearOldAccessToken ,
2322 customApiModelKeys ,
24- defaultConfig ,
25- getPreferredLanguageKey ,
26- getUserConfig ,
2723 githubThirdPartyApiModelKeys ,
2824 gptApiModelKeys ,
2925 Models ,
3026 poeWebModelKeys ,
31- setAccessToken ,
3227} from '../config/index.mjs'
33- import { config as menuConfig } from '../content-script/menu-tools'
34- import { t , changeLanguage } from 'i18next'
3528import '../_locales/i18n'
3629import { openUrl } from '../utils/open-url'
37-
38- async function getChatGptAccessToken ( ) {
39- await clearOldAccessToken ( )
40- const userConfig = await getUserConfig ( )
41- if ( userConfig . accessToken ) {
42- return userConfig . accessToken
43- } else {
44- const cookie = ( await Browser . cookies . getAll ( { url : 'https://chat.openai.com/' } ) )
45- . map ( ( cookie ) => {
46- return `${ cookie . name } =${ cookie . value } `
47- } )
48- . join ( '; ' )
49- const resp = await fetch ( 'https://chat.openai.com/api/auth/session' , {
50- headers : {
51- Cookie : cookie ,
52- } ,
53- } )
54- if ( resp . status === 403 ) {
55- throw new Error ( 'CLOUDFLARE' )
56- }
57- const data = await resp . json ( ) . catch ( ( ) => ( { } ) )
58- if ( ! data . accessToken ) {
59- throw new Error ( 'UNAUTHORIZED' )
30+ import {
31+ getBingAccessToken ,
32+ getChatGptAccessToken ,
33+ registerPortListener ,
34+ } from '../services/wrappers.mjs'
35+ import { refreshMenu } from './menus.mjs'
36+ import { registerCommands } from './commands.mjs'
37+
38+ async function executeApi ( session , port , config ) {
39+ if ( chatgptWebModelKeys . includes ( session . modelName ) ) {
40+ const accessToken = await getChatGptAccessToken ( )
41+ session . messageId = uuidv4 ( )
42+ if ( session . parentMessageId == null ) {
43+ session . parentMessageId = uuidv4 ( )
6044 }
61- await setAccessToken ( data . accessToken )
62- return data . accessToken
45+ await generateAnswersWithChatgptWebApi ( port , session . question , session , accessToken )
46+ } else if ( bingWebModelKeys . includes ( session . modelName ) ) {
47+ const accessToken = await getBingAccessToken ( )
48+ if ( session . modelName === 'bingFreeSydney' )
49+ await generateAnswersWithBingWebApi ( port , session . question , session , accessToken , true )
50+ else await generateAnswersWithBingWebApi ( port , session . question , session , accessToken )
51+ } else if ( gptApiModelKeys . includes ( session . modelName ) ) {
52+ await generateAnswersWithGptCompletionApi (
53+ port ,
54+ session . question ,
55+ session ,
56+ config . apiKey ,
57+ session . modelName ,
58+ )
59+ } else if ( chatgptApiModelKeys . includes ( session . modelName ) ) {
60+ await generateAnswersWithChatgptApi (
61+ port ,
62+ session . question ,
63+ session ,
64+ config . apiKey ,
65+ session . modelName ,
66+ )
67+ } else if ( customApiModelKeys . includes ( session . modelName ) ) {
68+ await generateAnswersWithCustomApi ( port , session . question , session , '' , config . customModelName )
69+ } else if ( azureOpenAiApiModelKeys . includes ( session . modelName ) ) {
70+ await generateAnswersWithAzureOpenaiApi ( port , session . question , session )
71+ } else if ( githubThirdPartyApiModelKeys . includes ( session . modelName ) ) {
72+ await generateAnswersWithWaylaidwandererApi ( port , session . question , session )
73+ } else if ( poeWebModelKeys . includes ( session . modelName ) ) {
74+ if ( session . modelName === 'poeAiWebCustom' )
75+ await generateAnswersWithPoeWebApi ( port , session . question , session , config . poeCustomBotName )
76+ else
77+ await generateAnswersWithPoeWebApi (
78+ port ,
79+ session . question ,
80+ session ,
81+ Models [ session . modelName ] . value ,
82+ )
6383 }
6484}
6585
66- async function getBingAccessToken ( ) {
67- return ( await Browser . cookies . get ( { url : 'https://bing.com/' , name : '_U' } ) ) ?. value
68- }
69-
70- Browser . runtime . onConnect . addListener ( ( port ) => {
71- console . debug ( 'connected' )
72- const onMessage = async ( msg ) => {
73- console . debug ( 'received msg' , msg )
74- const session = msg . session
75- if ( ! session ) return
76- const config = await getUserConfig ( )
77- if ( ! session . modelName ) session . modelName = config . modelName
78- if ( ! session . aiName ) session . aiName = Models [ session . modelName ] . desc
79- port . postMessage ( { session } )
80-
81- try {
82- if ( chatgptWebModelKeys . includes ( session . modelName ) ) {
83- const accessToken = await getChatGptAccessToken ( )
84- session . messageId = uuidv4 ( )
85- if ( session . parentMessageId == null ) {
86- session . parentMessageId = uuidv4 ( )
87- }
88- await generateAnswersWithChatgptWebApi ( port , session . question , session , accessToken )
89- } else if ( bingWebModelKeys . includes ( session . modelName ) ) {
90- const accessToken = await getBingAccessToken ( )
91- if ( session . modelName === 'bingFreeSydney' )
92- await generateAnswersWithBingWebApi ( port , session . question , session , accessToken , true )
93- else await generateAnswersWithBingWebApi ( port , session . question , session , accessToken )
94- } else if ( gptApiModelKeys . includes ( session . modelName ) ) {
95- await generateAnswersWithGptCompletionApi (
96- port ,
97- session . question ,
98- session ,
99- config . apiKey ,
100- session . modelName ,
101- )
102- } else if ( chatgptApiModelKeys . includes ( session . modelName ) ) {
103- await generateAnswersWithChatgptApi (
104- port ,
105- session . question ,
106- session ,
107- config . apiKey ,
108- session . modelName ,
109- )
110- } else if ( customApiModelKeys . includes ( session . modelName ) ) {
111- await generateAnswersWithCustomApi (
112- port ,
113- session . question ,
114- session ,
115- '' ,
116- config . customModelName ,
117- )
118- } else if ( azureOpenAiApiModelKeys . includes ( session . modelName ) ) {
119- await generateAnswersWithAzureOpenaiApi ( port , session . question , session )
120- } else if ( githubThirdPartyApiModelKeys . includes ( session . modelName ) ) {
121- await generateAnswersWithWaylaidwandererApi ( port , session . question , session )
122- } else if ( poeWebModelKeys . includes ( session . modelName ) ) {
123- if ( session . modelName === 'poeAiWebCustom' )
124- await generateAnswersWithPoeWebApi (
125- port ,
126- session . question ,
127- session ,
128- config . poeCustomBotName ,
129- )
130- else
131- await generateAnswersWithPoeWebApi (
132- port ,
133- session . question ,
134- session ,
135- Models [ session . modelName ] . value ,
136- )
137- }
138- } catch ( err ) {
139- console . error ( err )
140- if ( ! err . message . includes ( 'aborted' ) ) {
141- if (
142- [ 'message you submitted was too long' , 'maximum context length' ] . some ( ( m ) =>
143- err . message . includes ( m ) ,
144- )
145- )
146- port . postMessage ( { error : t ( 'Exceeded maximum context length' ) + '\n' + err . message } )
147- else port . postMessage ( { error : err . message } )
148- }
149- }
150- }
151-
152- const onDisconnect = ( ) => {
153- console . debug ( 'port disconnected, remove listener' )
154- port . onMessage . removeListener ( onMessage )
155- port . onDisconnect . removeListener ( onDisconnect )
156- }
157-
158- port . onMessage . addListener ( onMessage )
159- port . onDisconnect . addListener ( onDisconnect )
160- } )
161-
16286Browser . runtime . onMessage . addListener ( async ( message ) => {
16387 if ( message . type === 'FEEDBACK' ) {
16488 const token = await getChatGptAccessToken ( )
@@ -170,105 +94,11 @@ Browser.runtime.onMessage.addListener(async (message) => {
17094 } else if ( message . type === 'OPEN_URL' ) {
17195 const data = message . data
17296 openUrl ( data . url )
173- }
174- } )
175-
176- Browser . commands . onCommand . addListener ( async ( command ) => {
177- const message = {
178- itemId : command ,
179- selectionText : '' ,
180- useMenuPosition : false ,
181- }
182- console . debug ( 'command triggered' , message )
183-
184- if ( command in menuConfig ) {
185- if ( menuConfig [ command ] . action ) {
186- menuConfig [ command ] . action ( )
187- }
188-
189- if ( menuConfig [ command ] . genPrompt ) {
190- const currentTab = ( await Browser . tabs . query ( { active : true , currentWindow : true } ) ) [ 0 ]
191- Browser . tabs . sendMessage ( currentTab . id , {
192- type : 'CREATE_CHAT' ,
193- data : message ,
194- } )
195- }
196- }
197- } )
198-
199- function refreshMenu ( ) {
200- Browser . contextMenus . removeAll ( ) . then ( async ( ) => {
201- await getPreferredLanguageKey ( ) . then ( ( lang ) => {
202- changeLanguage ( lang )
203- } )
204- const menuId = 'ChatGPTBox-Menu'
205- Browser . contextMenus . create ( {
206- id : menuId ,
207- title : 'ChatGPTBox' ,
208- contexts : [ 'all' ] ,
209- } )
210-
211- for ( const [ k , v ] of Object . entries ( menuConfig ) ) {
212- Browser . contextMenus . create ( {
213- id : menuId + k ,
214- parentId : menuId ,
215- title : t ( v . label ) ,
216- contexts : [ 'all' ] ,
217- } )
218- }
219- Browser . contextMenus . create ( {
220- id : menuId + 'separator1' ,
221- parentId : menuId ,
222- contexts : [ 'selection' ] ,
223- type : 'separator' ,
224- } )
225- for ( const index in defaultConfig . selectionTools ) {
226- const key = defaultConfig . selectionTools [ index ]
227- const desc = defaultConfig . selectionToolsDesc [ index ]
228- Browser . contextMenus . create ( {
229- id : menuId + key ,
230- parentId : menuId ,
231- title : t ( desc ) ,
232- contexts : [ 'selection' ] ,
233- } )
234- }
235-
236- Browser . contextMenus . onClicked . addListener ( ( info , tab ) => {
237- Browser . tabs . query ( { active : true , currentWindow : true } ) . then ( ( tabs ) => {
238- const currentTab = tabs [ 0 ]
239- const message = {
240- itemId : info . menuItemId . replace ( menuId , '' ) ,
241- selectionText : info . selectionText ,
242- useMenuPosition : tab . id === currentTab . id ,
243- }
244- console . debug ( 'menu clicked' , message )
245-
246- if ( defaultConfig . selectionTools . includes ( message . itemId ) ) {
247- Browser . tabs . sendMessage ( currentTab . id , {
248- type : 'CREATE_CHAT' ,
249- data : message ,
250- } )
251- } else if ( message . itemId in menuConfig ) {
252- if ( menuConfig [ message . itemId ] . action ) {
253- menuConfig [ message . itemId ] . action ( )
254- }
255-
256- if ( menuConfig [ message . itemId ] . genPrompt ) {
257- Browser . tabs . sendMessage ( currentTab . id , {
258- type : 'CREATE_CHAT' ,
259- data : message ,
260- } )
261- }
262- }
263- } )
264- } )
265- } )
266- }
267-
268- Browser . runtime . onMessage . addListener ( async ( message ) => {
269- if ( message . type === 'REFRESH_MENU' ) {
97+ } else if ( message . type === 'REFRESH_MENU' ) {
27098 refreshMenu ( )
27199 }
272100} )
273101
102+ registerPortListener ( async ( session , port , config ) => await executeApi ( session , port , config ) )
103+ registerCommands ( )
274104refreshMenu ( )
0 commit comments