mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
* set isForced to true on input
* make floating auto-complete follow horizontal scrolling
* add callable closure vars
* changes to /let and /var for callable closures
* fix error message
* fix scope for closure arguments
* if should return the pipe result from closures
* use /run to call closures and no arguments on immediate closures
* throw exception from QRs window-function if no match
* when to show autocomplete vs info only
* autocomplete positioning
* autocomplete styling
* add theming to autocomplete (theme, dark, light)
* improve autocomplete show/hide logic and editor selection
* use blur tint color instead of chat tint color and use blur setting
* cleanup and docs
* use scope macros for QR args
* add enter to select autocomplete
* fix no executor found
* cleanup and comment
* fix alias list in help string
* fallback to empty string piped value if null or undefined
* fix typo
* blur textarea on ctrl+enter execute (and refocus after)
* stop executeSlashCommand if parser throws
* move /let and /var callbacks into functions
* switch textarea to monospace when value starts with slash
* add double pipe a pipe breaker
* fix /? slash
* remove some logging
* add "/:name" as shorthand for "/run name" after all
* move shit around
* fix error message
* use testRunShorthandEnd
* use parseQuotedValue and parseValue to determine name for "/:"
QR labels and set names can include spaces
* add some adjustments to make autocomplete work properly
some hint in there about "/:" would still be nice
* add autocomplete style selector
* only strip quotes from subcommand if they are at both ends
* fix JSDoc
* escaping
* allow open quotes on dry run
* throwing shit at the wall for /: autocomplete
* escapes only for symbols
* clean up autocomplete
* improve performance
* fix scope macros
* remove unescaping of pipes
* fix macros in scope copy
* fix "/? slash"
* don't run parser for getNameAt if text has not changed
* fix options filter
* re-enable blur listener
* restore selection on non-replace select
* fix for escaping first character of value
* add support for {{pipe}} and {{var::}} closures
* add index support to var macro
* add scoped var macro to macro help
* more escape fixes
* reduce autocomplete render debounce
* cleanup
* restore old escape handling and parser flag for strict escaping
* fix "no match" autocomplete message
* add dummy commands for comments and parser flag
* fix type annotations
* somewhat safer macro replacements
* fix autocomplete select on blank / "no match"
* fix cutting off handled part in substitution
* add parser flag REPLACE_GETVAR
Replaces all {{getvar::}} and {{getglobalvar::}} macros with {{var::}}.
Inserts a series of command executors before the command with the macros that:
- save {{pipe}} to a var
- call /getvar or /getglobalvar to get the variable used in the macro
- call /let to save the retrieved variable
- return the saved {{pipe}} value
This helps to avoid double-substitutions when the var values contain text that could be interpreted as macros.
* remove old parser
* fix send on enter when no match
* deal with pipes in quoted values (loose escaping)
* add default parser flags to user settings
* allow quoted values in unnamed argument
* set parser flag without explicit state to "on"
* add click hint on parser error toast
* dirty more detailed cmd defs
* remove name from unnamed arg
* move autocomplete into class and floating with details
* replace jQuery's trigger('input') on #send_textarea with native events because jQuery does not dispatch the native event
* fix ctrl+space
* fix arrow navigation
* add comments
* fix pointer block
* add static fromProps
* fix up dummy commands
* migrate all commands to addCommandObject
* remove commented comment command
* fix alias in details
* add range as argument type
* switch to addCommandObject
* switch to addCommandObject
* fix height
* fix floating details position on left
* re-enable blur event
* use auto width for full details on floating autocomplete
* auto-size floating full details
* fix typo
* re-enable blur listener
* don't prevent enter when selected item is fully typed out
* add autocomplete details tooltips
* add language to slash command examples
* move makeItem into option and command and fix click select
* use autocomplete parts in /? slash
* fix alias formatting
* add language to slash command examples
* fix details position on initial input history
* small screen styles
* replace registerSlashCommand with detailed declarations
* put name on first line
* add missing returns
* fix missing comma
* fix alias display in autocomplete list
* remove args from help string
* move parser settings to its own section
* jsdoc
* hljs stscript lang
* add hljs to autocomplete help examples
* add missing import
* apply autocomplete colors to stscript codeblocks (hljs)
* add fromProps
* cache autocomplete elements
* towards generic autocomplete
* remove unused imports
* fix blanks
* add return types
* re-enable blur
* fix blank check
* Caption messages by id
* add aborting command execution
* fix return type
* fix chat input font reset
* add slash command progress indicator
* add missing return
* mark registerSlashCommand deprecated
* why??
* separate abort logic for commands
* remove parsing of quoted values from unnamed arg
* add adjustable autocomplete width
* revert stop button pulse
* add progress and pause/abort to QR editor
* add resize event on autocomplete width change
* add key= argument to all get vars
* refactoring
* introduce NamedArgumentAsignment
* add TODOs
* refactoring
* record start and end of named arg assignment
* refactoring
* prevent duplicate calls to show
* refactoring
* remove macro ac
* add secondary autocomplete and enum descriptions
* add syntax highlighting to QR editor
* add enum descriptions to /while
* add /let key=... to scope variable names
* add unnamed argument assignment class and unnamed argument splitting
* fix QR editor style
* remove dash before autocomplete help text
* add autocomplete for unnamed enums
* fix remaining dom after holding backslash
* fix for unnamed enums
* fix autocomplete for /parser-flag
* add parser-flag enum help
* fix type annotations
* fix autocomplete result for /:
* add colored autocomplete type icons
* collapse second line autocomplete help if empty
* mark optional named args in autocomplete
* fix when what
* remove duplicate debug buttons
* dispatch input on autocomplete select
* prevent grow from editor syntax layer
* add auto-adjust qr editor caret color
* remove text-shadow from autocomplete
* join value strings in /let and /var
* add /abort syntax highlight
* fix attempting secondary result when there is none
* rename settings headers and split autocomplete / stscript
* add parser flag tooltips
* add tooltips to chat width stops
* fix typo
* return clone of help item
* fix enum string
* don't make optional notice for autocomplete arguments smaller
* avoid scrollbar in chat input
* add rudimentary macro autocomplete
* strip macro from helptext
* finally remove closure delimiters around root
* cleanup
* fix index stuff for removed closure delimiters
* fix type hint
* add child commands to progress indicator
* include sub-separator in macro autocomplete
* remove all mentions of interruptsGeneration and purge
* remove unused imports
* fix syntax highlight with newline at end of input
* cleanup select pointer events
* coalesce onProgress call
* add regex to STscript syntax highlighting
* fix closure end
* fix autocomplete type icon alignment
* adjustments for small screens
* fix removing wrong element
* add missing "at=" arg to /sys, /comment, /sendas
* add font scale setting for autocomplete
* add target=_blank for parser flag links
* fix for searching enums
* remove REGEXP_MODE from hljs
just causes trouble
* fix autocomplete in closures
* fix typo
* fix type hint
* Get rid of scroll bar on load
* Add type hint for /send name argument. Fix 'at' types
* Add 'negative' arg hint to /sd command
* reenable blur event
* Allow /summarize to process any text
* Compact layout of script toggles
* Expand CSS by default
* fix double ranger indicator and adjust to narrow container
* make custom css input fill available vertical space
* reduce scroll lag
* use default cursor on scrollbar
* Clean-up module loading in index.html
* fix tab indent with hljs
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
564 lines
21 KiB
JavaScript
564 lines
21 KiB
JavaScript
import { SlashCommand } from '../../../slash-commands/SlashCommand.js';
|
||
import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from '../../../slash-commands/SlashCommandArgument.js';
|
||
import { SlashCommandParser } from '../../../slash-commands/SlashCommandParser.js';
|
||
import { isTrueBoolean } from '../../../utils.js';
|
||
// eslint-disable-next-line no-unused-vars
|
||
import { QuickReplyApi } from '../api/QuickReplyApi.js';
|
||
|
||
export class SlashCommandHandler {
|
||
/**@type {QuickReplyApi}*/ api;
|
||
|
||
|
||
|
||
|
||
constructor(/**@type {QuickReplyApi}*/api) {
|
||
this.api = api;
|
||
}
|
||
|
||
|
||
|
||
|
||
init() {
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr',
|
||
callback: (_, value) => this.executeQuickReplyByIndex(Number(value)),
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'number', [ARGUMENT_TYPE.NUMBER], true,
|
||
),
|
||
],
|
||
helpString: 'Activates the specified Quick Reply',
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qrset',
|
||
callback: () => toastr.warning('The command /qrset has been deprecated. Use /qr-set, /qr-set-on, and /qr-set-off instead.'),
|
||
helpString: '<strong>DEPRECATED</strong> – The command /qrset has been deprecated. Use /qr-set, /qr-set-on, and /qr-set-off instead.',
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-set',
|
||
callback: (args, value) => this.toggleGlobalSet(value, args),
|
||
namedArgumentList: [
|
||
new SlashCommandNamedArgument(
|
||
'visible', 'set visibility', [ARGUMENT_TYPE.BOOLEAN], false, false, 'true',
|
||
),
|
||
],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'QR set name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: 'Toggle global QR set',
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-set-on',
|
||
callback: (args, value) => this.addGlobalSet(value, args),
|
||
namedArgumentList: [
|
||
new SlashCommandNamedArgument(
|
||
'visible', 'set visibility', [ARGUMENT_TYPE.BOOLEAN], false, false, 'true',
|
||
),
|
||
],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'QR set name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: 'Activate global QR set',
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-set-off',
|
||
callback: (_, value) => this.removeGlobalSet(value),
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'QR set name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: 'Deactivate global QR set',
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-chat-set',
|
||
callback: (args, value) => this.toggleChatSet(value, args),
|
||
namedArgumentList: [
|
||
new SlashCommandNamedArgument(
|
||
'visible', 'set visibility', [ARGUMENT_TYPE.BOOLEAN], false, false, 'true',
|
||
),
|
||
],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'QR set name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: 'Toggle chat QR set',
|
||
}));
|
||
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-chat-set-on',
|
||
callback: (args, value) => this.addChatSet(value, args),
|
||
namedArgumentList: [
|
||
new SlashCommandNamedArgument(
|
||
'visible', 'whether the QR set should be visible', [ARGUMENT_TYPE.BOOLEAN], false, false, 'true', ['true', 'false'],
|
||
),
|
||
],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'QR set name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: 'Activate chat QR set',
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-chat-set-off',
|
||
callback: (_, value) => this.removeChatSet(value),
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'QR set name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: 'Deactivate chat QR set',
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-set-list',
|
||
callback: (_, value) => this.listSets(value ?? 'all'),
|
||
returns: 'list of QR sets',
|
||
namedArgumentList: [],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'set type', [ARGUMENT_TYPE.STRING], false, false, null, ['all', 'global', 'chat'],
|
||
),
|
||
],
|
||
helpString: 'Gets a list of the names of all quick reply sets.',
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-list',
|
||
callback: (_, value) => this.listQuickReplies(value),
|
||
returns: 'list of QRs',
|
||
namedArgumentList: [],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'set name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: 'Gets a list of the names of all quick replies in this quick reply set.',
|
||
}));
|
||
|
||
const qrArgs = [
|
||
new SlashCommandNamedArgument('label', 'text on the button, e.g., label=MyButton', [ARGUMENT_TYPE.STRING]),
|
||
new SlashCommandNamedArgument('set', 'name of the QR set, e.g., set=PresetName1', [ARGUMENT_TYPE.STRING]),
|
||
new SlashCommandNamedArgument('hidden', 'whether the button should be hidden, e.g., hidden=true', [ARGUMENT_TYPE.BOOLEAN], false, false, 'false'),
|
||
new SlashCommandNamedArgument('startup', 'auto execute on app startup, e.g., startup=true', [ARGUMENT_TYPE.BOOLEAN], false, false, 'false'),
|
||
new SlashCommandNamedArgument('user', 'auto execute on user message, e.g., user=true', [ARGUMENT_TYPE.BOOLEAN], false, false, 'false'),
|
||
new SlashCommandNamedArgument('bot', 'auto execute on AI message, e.g., bot=true', [ARGUMENT_TYPE.BOOLEAN], false, false, 'false'),
|
||
new SlashCommandNamedArgument('load', 'auto execute on chat load, e.g., load=true', [ARGUMENT_TYPE.BOOLEAN], false, false, 'false'),
|
||
new SlashCommandNamedArgument('group', 'auto execute on group member selection, e.g., group=true', [ARGUMENT_TYPE.BOOLEAN], false, false, 'false'),
|
||
new SlashCommandNamedArgument('title', 'title / tooltip to be shown on button, e.g., title="My Fancy Button"', [ARGUMENT_TYPE.STRING], false),
|
||
];
|
||
const qrUpdateArgs = [
|
||
new SlashCommandNamedArgument('newlabel', 'new text for the button', [ARGUMENT_TYPE.STRING], false),
|
||
];
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-create',
|
||
callback: (args, message) => this.createQuickReply(args, message),
|
||
namedArgumentList: qrArgs,
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'command', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: `
|
||
<div>Creates a new Quick Reply.</div>
|
||
<div>
|
||
<strong>Example:</strong>
|
||
<ul>
|
||
<li>
|
||
<pre><code>/qr-create set=MyPreset label=MyButton /echo 123</code></pre>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
`,
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-update',
|
||
callback: (args, message) => this.updateQuickReply(args, message),
|
||
returns: 'updated quick reply',
|
||
namedArgumentList: [...qrUpdateArgs, ...qrArgs],
|
||
helpString: `
|
||
<div>
|
||
Updates Quick Reply.
|
||
</div>
|
||
<div>
|
||
<strong>Example:</strong>
|
||
<ul>
|
||
<li>
|
||
<pre><code>/qr-update set=MyPreset label=MyButton newlabel=MyRenamedButton /echo 123</code></pre>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
`,
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-delete',
|
||
callback: (args, name) => this.deleteQuickReply(args, name),
|
||
namedArgumentList: [
|
||
new SlashCommandNamedArgument(
|
||
'set', 'Quick Reply set', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
new SlashCommandNamedArgument(
|
||
'label', 'Quick Reply label', [ARGUMENT_TYPE.STRING], false,
|
||
),
|
||
],
|
||
helpString: 'Deletes a Quick Reply from the specified set. If no label is provided, the entire set is deleted.',
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-contextadd',
|
||
callback: (args, name) => this.createContextItem(args, name),
|
||
namedArgumentList: [
|
||
new SlashCommandNamedArgument(
|
||
'set', 'string', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
new SlashCommandNamedArgument(
|
||
'label', 'string', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
new SlashCommandNamedArgument(
|
||
'chain', 'boolean', [ARGUMENT_TYPE.BOOLEAN], false, false, 'false',
|
||
),
|
||
],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'preset name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: `
|
||
<div>
|
||
Add context menu preset to a QR.
|
||
</div>
|
||
<div>
|
||
<strong>Example:</strong>
|
||
<ul>
|
||
<li>
|
||
<pre><code>/qr-contextadd set=MyPreset label=MyButton chain=true MyOtherPreset</code></pre>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
`,
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-contextdel',
|
||
callback: (args, name) => this.deleteContextItem(args, name),
|
||
namedArgumentList: [
|
||
new SlashCommandNamedArgument(
|
||
'set', 'string', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
new SlashCommandNamedArgument(
|
||
'label', 'string', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'preset name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: `
|
||
<div>
|
||
Remove context menu preset from a QR.
|
||
</div>
|
||
<div>
|
||
<strong>Example:</strong>
|
||
<ul>
|
||
<li>
|
||
<pre><code>/qr-contextdel set=MyPreset label=MyButton MyOtherPreset</code></pre>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
`,
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-contextclear',
|
||
callback: (args, label) => this.clearContextMenu(args, label),
|
||
namedArgumentList: [
|
||
new SlashCommandNamedArgument(
|
||
'set', 'context menu preset name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'label', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: `
|
||
<div>
|
||
Remove all context menu presets from a QR.
|
||
</div>
|
||
<div>
|
||
<strong>Example:</strong>
|
||
<ul>
|
||
<li>
|
||
<pre><code>/qr-contextclear set=MyPreset MyButton</code></pre>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
`,
|
||
}));
|
||
|
||
const presetArgs = [
|
||
new SlashCommandNamedArgument('nosend', 'disable send / insert in user input (invalid for slash commands)', [ARGUMENT_TYPE.BOOLEAN], false),
|
||
new SlashCommandNamedArgument('before', 'place QR before user input', [ARGUMENT_TYPE.BOOLEAN], false),
|
||
new SlashCommandNamedArgument('inject', 'inject user input automatically (if disabled use {{input}})', [ARGUMENT_TYPE.BOOLEAN], false),
|
||
];
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-set-create',
|
||
callback: (args, name) => this.createSet(name, args),
|
||
aliases: ['qr-presetadd'],
|
||
namedArgumentList: presetArgs,
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument(
|
||
'name', [ARGUMENT_TYPE.STRING], true,
|
||
),
|
||
],
|
||
helpString: `
|
||
<div>
|
||
Create a new preset (overrides existing ones).
|
||
</div>
|
||
<div>
|
||
<strong>Example:</strong>
|
||
<ul>
|
||
<li>
|
||
<pre><code>/qr-set-add MyNewPreset</code></pre>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
`,
|
||
}));
|
||
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-set-update',
|
||
callback: (args, name) => this.updateSet(name, args),
|
||
aliases: ['qr-presetupdate'],
|
||
namedArgumentList: presetArgs,
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument('name', [ARGUMENT_TYPE.STRING], true),
|
||
],
|
||
helpString: `
|
||
<div>
|
||
Update an existing preset.
|
||
</div>
|
||
<div>
|
||
<strong>Example:</strong>
|
||
<pre><code>/qr-set-update enabled=false MyPreset</code></pre>
|
||
</div>
|
||
`,
|
||
}));
|
||
SlashCommandParser.addCommandObject(SlashCommand.fromProps({ name: 'qr-set-delete',
|
||
callback: (args, name) => this.deleteSet(name),
|
||
aliases: ['qr-presetdelete'],
|
||
unnamedArgumentList: [
|
||
new SlashCommandArgument('name', [ARGUMENT_TYPE.STRING], true),
|
||
],
|
||
helpString: `
|
||
<div>
|
||
Delete an existing preset.
|
||
</div>
|
||
<div>
|
||
<strong>Example:</strong>
|
||
<pre><code>/qr-set-delete MyPreset</code></pre>
|
||
</div>
|
||
`,
|
||
}));
|
||
}
|
||
|
||
|
||
|
||
|
||
getSetByName(name) {
|
||
const set = this.api.getSetByName(name);
|
||
if (!set) {
|
||
toastr.error(`No Quick Reply Set with the name "${name}" could be found.`);
|
||
}
|
||
return set;
|
||
}
|
||
|
||
getQrByLabel(setName, label) {
|
||
const qr = this.api.getQrByLabel(setName, label);
|
||
if (!qr) {
|
||
toastr.error(`No Quick Reply with the label "${label}" could be found in the set "${setName}"`);
|
||
}
|
||
return qr;
|
||
}
|
||
|
||
|
||
|
||
|
||
async executeQuickReplyByIndex(idx) {
|
||
try {
|
||
return await this.api.executeQuickReplyByIndex(idx);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
|
||
|
||
toggleGlobalSet(name, args = {}) {
|
||
try {
|
||
this.api.toggleGlobalSet(name, isTrueBoolean(args.visible ?? 'true'));
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
addGlobalSet(name, args = {}) {
|
||
try {
|
||
this.api.addGlobalSet(name, isTrueBoolean(args.visible ?? 'true'));
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
removeGlobalSet(name) {
|
||
try {
|
||
this.api.removeGlobalSet(name);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
|
||
|
||
toggleChatSet(name, args = {}) {
|
||
try {
|
||
this.api.toggleChatSet(name, isTrueBoolean(args.visible ?? 'true'));
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
addChatSet(name, args = {}) {
|
||
try {
|
||
this.api.addChatSet(name, isTrueBoolean(args.visible ?? 'true'));
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
removeChatSet(name) {
|
||
try {
|
||
this.api.removeChatSet(name);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
|
||
|
||
createQuickReply(args, message) {
|
||
try {
|
||
this.api.createQuickReply(
|
||
args.set ?? '',
|
||
args.label ?? '',
|
||
{
|
||
message: message ?? '',
|
||
title: args.title,
|
||
isHidden: isTrueBoolean(args.hidden),
|
||
executeOnStartup: isTrueBoolean(args.startup),
|
||
executeOnUser: isTrueBoolean(args.user),
|
||
executeOnAi: isTrueBoolean(args.bot),
|
||
executeOnChatChange: isTrueBoolean(args.load),
|
||
executeOnGroupMemberDraft: isTrueBoolean(args.group),
|
||
automationId: args.automationId ?? '',
|
||
},
|
||
);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
updateQuickReply(args, message) {
|
||
try {
|
||
this.api.updateQuickReply(
|
||
args.set ?? '',
|
||
args.label ?? '',
|
||
{
|
||
newLabel: args.newlabel,
|
||
message: (message ?? '').trim().length > 0 ? message : undefined,
|
||
title: args.title,
|
||
isHidden: args.hidden === undefined ? undefined : isTrueBoolean(args.hidden),
|
||
executeOnStartup: args.startup === undefined ? undefined : isTrueBoolean(args.startup),
|
||
executeOnUser: args.user === undefined ? undefined : isTrueBoolean(args.user),
|
||
executeOnAi: args.bot === undefined ? undefined : isTrueBoolean(args.bot),
|
||
executeOnChatChange: args.load === undefined ? undefined : isTrueBoolean(args.load),
|
||
executeOnGroupMemberDraft: args.group === undefined ? undefined : isTrueBoolean(args.group),
|
||
automationId: args.automationId ?? '',
|
||
},
|
||
);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
deleteQuickReply(args, label) {
|
||
try {
|
||
this.api.deleteQuickReply(args.set, label);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
|
||
|
||
createContextItem(args, name) {
|
||
try {
|
||
this.api.createContextItem(
|
||
args.set,
|
||
args.label,
|
||
name,
|
||
isTrueBoolean(args.chain),
|
||
);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
deleteContextItem(args, name) {
|
||
try {
|
||
this.api.deleteContextItem(args.set, args.label, name);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
clearContextMenu(args, label) {
|
||
try {
|
||
this.api.clearContextMenu(args.set, args.label ?? label);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
|
||
|
||
createSet(name, args) {
|
||
try {
|
||
this.api.createSet(
|
||
args.name ?? name ?? '',
|
||
{
|
||
disableSend: isTrueBoolean(args.nosend),
|
||
placeBeforeInput: isTrueBoolean(args.before),
|
||
injectInput: isTrueBoolean(args.inject),
|
||
},
|
||
);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
updateSet(name, args) {
|
||
try {
|
||
this.api.updateSet(
|
||
args.name ?? name ?? '',
|
||
{
|
||
disableSend: args.nosend !== undefined ? isTrueBoolean(args.nosend) : undefined,
|
||
placeBeforeInput: args.before !== undefined ? isTrueBoolean(args.before) : undefined,
|
||
injectInput: args.inject !== undefined ? isTrueBoolean(args.inject) : undefined,
|
||
},
|
||
);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
deleteSet(name) {
|
||
try {
|
||
this.api.deleteSet(name ?? '');
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
|
||
listSets(source) {
|
||
try {
|
||
switch (source) {
|
||
case 'global':
|
||
return this.api.listGlobalSets();
|
||
case 'chat':
|
||
return this.api.listChatSets();
|
||
default:
|
||
return this.api.listSets();
|
||
}
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
listQuickReplies(name) {
|
||
try {
|
||
return this.api.listQuickReplies(name);
|
||
} catch (ex) {
|
||
toastr.error(ex.message);
|
||
}
|
||
}
|
||
}
|