From c03d24741d75273a2f82c02c4c80e034cc498e81 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Thu, 3 Apr 2025 16:41:37 +0200 Subject: [PATCH] refractor: dont import chatEntry into each api --- .config/ags/modules/sideleft/apis/booru.js | 7 +- .config/ags/modules/sideleft/apis/chatgpt.js | 18 ++- .config/ags/modules/sideleft/apis/gemini.js | 18 ++- .config/ags/modules/sideleft/apis/waifu.js | 3 +- .config/ags/modules/sideleft/apiwidgets.js | 112 ++++++++++--------- 5 files changed, 78 insertions(+), 80 deletions(-) diff --git a/.config/ags/modules/sideleft/apis/booru.js b/.config/ags/modules/sideleft/apis/booru.js index 5cca5e0bd..6d8e5242a 100644 --- a/.config/ags/modules/sideleft/apis/booru.js +++ b/.config/ags/modules/sideleft/apis/booru.js @@ -8,7 +8,6 @@ import { MaterialIcon } from '../../.commonwidgets/materialicon.js'; import { MarginRevealer } from '../../.widgethacks/advancedrevealers.js'; import { setupCursorHover, setupCursorHoverInfo } from '../../.widgetutils/cursorhover.js'; import BooruService from '../../../services/booru.js'; -import { chatEntry } from '../apiwidgets.js'; import { ConfigToggle } from '../../.commonwidgets/configwidgets.js'; import { SystemMessage } from './ai_chatmessage.js'; @@ -19,7 +18,7 @@ const USER_CACHE_DIR = GLib.get_user_cache_dir(); Utils.exec(`bash -c 'mkdir -p ${USER_CACHE_DIR}/ags/media/waifus'`); Utils.exec(`bash -c 'rm ${USER_CACHE_DIR}/ags/media/waifus/*'`); -const TagButton = (command) => Button({ +const TagButton = (command, chatEntry) => Button({ className: 'sidebar-chat-chip sidebar-chat-chip-action txt txt-small', onClicked: () => { chatEntry.buffer.text += `${command} ` }, setup: setupCursorHover, @@ -453,7 +452,7 @@ const booruContent = Box({ , }); -export const booruView = Scrollable({ +export const BooruView = (chatEntry) => Scrollable({ className: 'sidebar-chat-viewport', vexpand: true, child: Box({ @@ -533,7 +532,7 @@ const clearChat = () => { // destroy!! }); } -export const sendMessage = (text) => { +export const sendMessage = (text, booruView) => { // Commands if (text.startsWith('+')) { // Next page const lastQuery = BooruService.queries.at(-1); diff --git a/.config/ags/modules/sideleft/apis/chatgpt.js b/.config/ags/modules/sideleft/apis/chatgpt.js index b382f554f..daaa7506a 100644 --- a/.config/ags/modules/sideleft/apis/chatgpt.js +++ b/.config/ags/modules/sideleft/apis/chatgpt.js @@ -1,5 +1,4 @@ const { Gtk } = imports.gi; -import App from 'resource:///com/github/Aylur/ags/app.js'; import Widget from 'resource:///com/github/Aylur/ags/widget.js'; import * as Utils from 'resource:///com/github/Aylur/ags/utils.js'; @@ -11,7 +10,6 @@ import { ConfigToggle, ConfigSegmentedSelection, ConfigGap } from '../../.common import { markdownTest } from '../../.miscutils/md2pango.js'; import { MarginRevealer } from '../../.widgethacks/advancedrevealers.js'; import { MaterialIcon } from '../../.commonwidgets/materialicon.js'; -import { chatEntry } from '../apiwidgets.js'; export const chatGPTTabIcon = Icon({ hpack: 'center', @@ -280,19 +278,19 @@ export const sendMessage = (text) => { if (text.length == 0) return; if (GPTService.key.length == 0) { GPTService.key = text; - chatContent.add(SystemMessage(`Key saved to\n\`${GPTService.keyPath}\``, 'API Key', chatGPTView)); + chatContent.add(SystemMessage(`Key saved to\n\`${GPTService.keyPath}\``, 'API Key', ChatGPTView)); text = ''; return; } // Commands if (text.startsWith('/')) { if (text.startsWith('/clear')) clearChat(); - else if (text.startsWith('/model')) chatContent.add(SystemMessage(`${getString("Currently using")} \`${GPTService.modelName}\``, '/model', chatGPTView)) + else if (text.startsWith('/model')) chatContent.add(SystemMessage(`${getString("Currently using")} \`${GPTService.modelName}\``, '/model', ChatGPTView)) else if (text.startsWith('/prompt')) { const firstSpaceIndex = text.indexOf(' '); const prompt = text.slice(firstSpaceIndex + 1); if (firstSpaceIndex == -1 || prompt.length < 1) { - chatContent.add(SystemMessage(`Usage: \`/prompt MESSAGE\``, '/prompt', chatGPTView)) + chatContent.add(SystemMessage(`Usage: \`/prompt MESSAGE\``, '/prompt', ChatGPTView)) } else { GPTService.addMessage('user', prompt) @@ -303,23 +301,23 @@ export const sendMessage = (text) => { if (parts.length == 1) chatContent.add(SystemMessage( `${getString("Key stored in:")}\n\`${GPTService.keyPath}\`\n${getString("To update this key, type")} \`/key YOUR_API_KEY\``, '/key', - chatGPTView)); + ChatGPTView)); else { GPTService.key = parts[1]; - chatContent.add(SystemMessage(`${getString("Updated API Key at")}\n\`${GPTService.keyPath}\``, '/key', chatGPTView)); + chatContent.add(SystemMessage(`${getString("Updated API Key at")}\n\`${GPTService.keyPath}\``, '/key', ChatGPTView)); } } else if (text.startsWith('/test')) - chatContent.add(SystemMessage(markdownTest, `Markdown test`, chatGPTView)); + chatContent.add(SystemMessage(markdownTest, `Markdown test`, ChatGPTView)); else - chatContent.add(SystemMessage(getString("Invalid command."), 'Error', chatGPTView)) + chatContent.add(SystemMessage(getString("Invalid command."), 'Error', ChatGPTView)) } else { GPTService.send(text); } } -export const chatGPTView = Box({ +export const ChatGPTView = (chatEntry) => Box({ vertical: true, children: [ ProviderSwitcher(), diff --git a/.config/ags/modules/sideleft/apis/gemini.js b/.config/ags/modules/sideleft/apis/gemini.js index 63f85d826..e5f22dcd1 100644 --- a/.config/ags/modules/sideleft/apis/gemini.js +++ b/.config/ags/modules/sideleft/apis/gemini.js @@ -1,5 +1,4 @@ const { Gtk } = imports.gi; -import App from 'resource:///com/github/Aylur/ags/app.js'; import Widget from 'resource:///com/github/Aylur/ags/widget.js'; import * as Utils from 'resource:///com/github/Aylur/ags/utils.js'; @@ -10,7 +9,6 @@ import { SystemMessage, ChatMessage } from "./ai_chatmessage.js"; import { ConfigToggle, ConfigSegmentedSelection, ConfigGap } from '../../.commonwidgets/configwidgets.js'; import { markdownTest } from '../../.miscutils/md2pango.js'; import { MarginRevealer } from '../../.widgethacks/advancedrevealers.js'; -import { chatEntry } from '../apiwidgets.js'; const MODEL_NAME = `Gemini`; @@ -212,7 +210,7 @@ export const sendMessage = (text) => { if (text.length == 0) return; if (GeminiService.key.length == 0) { GeminiService.key = text; - chatContent.add(SystemMessage(`Key saved to\n\`${GeminiService.keyPath}\``, 'API Key', geminiView)); + chatContent.add(SystemMessage(`Key saved to\n\`${GeminiService.keyPath}\``, 'API Key', GeminiView)); text = ''; return; } @@ -223,12 +221,12 @@ export const sendMessage = (text) => { clearChat(); GeminiService.loadHistory(); } - else if (text.startsWith('/model')) chatContent.add(SystemMessage(`${getString("Currently using")} \`${GeminiService.modelName}\``, '/model', geminiView)) + else if (text.startsWith('/model')) chatContent.add(SystemMessage(`${getString("Currently using")} \`${GeminiService.modelName}\``, '/model', GeminiView)) else if (text.startsWith('/prompt')) { const firstSpaceIndex = text.indexOf(' '); const prompt = text.slice(firstSpaceIndex + 1); if (firstSpaceIndex == -1 || prompt.length < 1) { - chatContent.add(SystemMessage(`Usage: \`/prompt MESSAGE\``, '/prompt', geminiView)) + chatContent.add(SystemMessage(`Usage: \`/prompt MESSAGE\``, '/prompt', GeminiView)) } else { GeminiService.addMessage('user', prompt) @@ -239,23 +237,23 @@ export const sendMessage = (text) => { if (parts.length == 1) chatContent.add(SystemMessage( `${getString("Key stored in:")} \n\`${GeminiService.keyPath}\`\n${getString("To update this key, type")} \`/key YOUR_API_KEY\``, '/key', - geminiView)); + GeminiView)); else { GeminiService.key = parts[1]; - chatContent.add(SystemMessage(`${getString("Updated API Key at")}\n\`${GeminiService.keyPath}\``, '/key', geminiView)); + chatContent.add(SystemMessage(`${getString("Updated API Key at")}\n\`${GeminiService.keyPath}\``, '/key', GeminiView)); } } else if (text.startsWith('/test')) - chatContent.add(SystemMessage(markdownTest, `Markdown test`, geminiView)); + chatContent.add(SystemMessage(markdownTest, `Markdown test`, GeminiView)); else - chatContent.add(SystemMessage(getString(`Invalid command.`), 'Error', geminiView)) + chatContent.add(SystemMessage(getString(`Invalid command.`), 'Error', GeminiView)) } else { GeminiService.send(text); } } -export const geminiView = Box({ +export const GeminiView = (chatEntry) => Box({ homogeneous: true, children: [Scrollable({ className: 'sidebar-chat-viewport', diff --git a/.config/ags/modules/sideleft/apis/waifu.js b/.config/ags/modules/sideleft/apis/waifu.js index 89684d9a1..0eb8d212c 100644 --- a/.config/ags/modules/sideleft/apis/waifu.js +++ b/.config/ags/modules/sideleft/apis/waifu.js @@ -12,7 +12,6 @@ import { MarginRevealer } from '../../.widgethacks/advancedrevealers.js'; import { setupCursorHover, setupCursorHoverInfo } from '../../.widgetutils/cursorhover.js'; import WaifuService from '../../../services/waifus.js'; import { darkMode } from '../../.miscutils/system.js'; -import { chatEntry } from '../apiwidgets.js'; async function getImageViewerApp(preferredApp) { Utils.execAsync(['bash', '-c', `command -v ${preferredApp}`]) @@ -302,7 +301,7 @@ const waifuContent = Box({ , }); -export const waifuView = Scrollable({ +export const WaifuView = (chatEntry) => Scrollable({ className: 'sidebar-chat-viewport', vexpand: true, child: Box({ diff --git a/.config/ags/modules/sideleft/apiwidgets.js b/.config/ags/modules/sideleft/apiwidgets.js index 3ed999416..e2352c8cf 100644 --- a/.config/ags/modules/sideleft/apiwidgets.js +++ b/.config/ags/modules/sideleft/apiwidgets.js @@ -7,10 +7,10 @@ import { setupCursorHover } from '../.widgetutils/cursorhover.js'; // APIs import GPTService from '../../services/gpt.js'; import Gemini from '../../services/gemini.js'; -import { geminiView, geminiCommands, sendMessage as geminiSendMessage, geminiTabIcon } from './apis/gemini.js'; -import { chatGPTView, chatGPTCommands, sendMessage as chatGPTSendMessage, chatGPTTabIcon } from './apis/chatgpt.js'; -import { waifuView, waifuCommands, sendMessage as waifuSendMessage, waifuTabIcon } from './apis/waifu.js'; -import { booruView, booruCommands, sendMessage as booruSendMessage, booruTabIcon } from './apis/booru.js'; +import { GeminiView, geminiCommands, sendMessage as geminiSendMessage, geminiTabIcon } from './apis/gemini.js'; +import { ChatGPTView, chatGPTCommands, sendMessage as chatGPTSendMessage, chatGPTTabIcon } from './apis/chatgpt.js'; +import { WaifuView, waifuCommands, sendMessage as waifuSendMessage, waifuTabIcon } from './apis/waifu.js'; +import { BooruView, booruCommands, sendMessage as booruSendMessage, booruTabIcon } from './apis/booru.js'; import { enableClickthrough } from "../.widgetutils/clickthrough.js"; import { checkKeybind } from '../.widgetutils/keybind.js'; const TextView = Widget.subclass(Gtk.TextView, "AgsTextView"); @@ -19,56 +19,6 @@ import { widgetContent } from './sideleft.js'; import { IconTabContainer } from '../.commonwidgets/tabcontainer.js'; const EXPAND_INPUT_THRESHOLD = 30; -const APILIST = { - 'gemini': { - name: 'Assistant (Gemini Pro)', - sendCommand: geminiSendMessage, - contentWidget: geminiView, - commandBar: geminiCommands, - tabIcon: geminiTabIcon, - placeholderText: getString('Message Gemini...'), - }, - 'gpt': { - name: 'Assistant (GPTs)', - sendCommand: chatGPTSendMessage, - contentWidget: chatGPTView, - commandBar: chatGPTCommands, - tabIcon: chatGPTTabIcon, - placeholderText: getString('Message the model...'), - }, - 'waifu': { - name: 'Waifus', - sendCommand: waifuSendMessage, - contentWidget: waifuView, - commandBar: waifuCommands, - tabIcon: waifuTabIcon, - placeholderText: getString('Enter tags'), - }, - 'booru': { - name: 'Booru', - sendCommand: booruSendMessage, - contentWidget: booruView, - commandBar: booruCommands, - tabIcon: booruTabIcon, - placeholderText: getString('Enter tags and/or page number'), - }, -} -const APIS = userOptions.sidebar.pages.apis.order.map((apiName) => APILIST[apiName]); -let currentApiId = 0; - -function apiSendMessage(textView) { - // Get text - const buffer = textView.get_buffer(); - const [start, end] = buffer.get_bounds(); - const text = buffer.get_text(start, end, true).trimStart(); - if (!text || text.length == 0) return; - // Send - APIS[currentApiId].sendCommand(text) - // Reset - buffer.set_text("", -1); - chatEntryWrapper.toggleClassName('sidebar-chat-wrapper-extended', false); - chatEntry.set_valign(Gtk.Align.CENTER); -} export const chatEntry = TextView({ hexpand: true, @@ -117,6 +67,60 @@ export const chatEntry = TextView({ , }); +const APILIST = { + 'gemini': { + name: 'Assistant (Gemini Pro)', + sendCommand: geminiSendMessage, + contentWidget: GeminiView(chatEntry), + commandBar: geminiCommands, + tabIcon: geminiTabIcon, + placeholderText: getString('Message Gemini...'), + }, + 'gpt': { + name: 'Assistant (GPTs)', + sendCommand: chatGPTSendMessage, + contentWidget: ChatGPTView(chatEntry), + commandBar: chatGPTCommands, + tabIcon: chatGPTTabIcon, + placeholderText: getString('Message the model...'), + }, + 'waifu': { + name: 'Waifus', + sendCommand: waifuSendMessage, + contentWidget: WaifuView(chatEntry), + commandBar: waifuCommands, + tabIcon: waifuTabIcon, + placeholderText: getString('Enter tags'), + }, + 'booru': { + name: 'Booru', + sendCommand: booruSendMessage, + contentWidget: BooruView(chatEntry), + commandBar: booruCommands, + tabIcon: booruTabIcon, + placeholderText: getString('Enter tags and/or page number'), + }, +} +const APIS = userOptions.sidebar.pages.apis.order.map((apiName) => APILIST[apiName]); +let currentApiId = 0; + +function apiSendMessage(textView) { + // Get text + const buffer = textView.get_buffer(); + const [start, end] = buffer.get_bounds(); + const text = buffer.get_text(start, end, true).trimStart(); + if (!text || text.length == 0) return; + // Send + if (APIS[currentApiId].name == APILIST['booru'].name) + APIS[currentApiId].sendCommand(text, APILIST['booru'].contentWidget) + else + APIS[currentApiId].sendCommand(text) + // Reset + buffer.set_text("", -1); + chatEntryWrapper.toggleClassName('sidebar-chat-wrapper-extended', false); + chatEntry.set_valign(Gtk.Align.CENTER); +} + chatEntry.get_buffer().connect("changed", (buffer) => { const bufferText = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter(), true); chatSendButton.toggleClassName('sidebar-chat-send-available', bufferText.length > 0);