mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-13 19:49:51 +01:00
lua: Change CompletionRequested handler to use an event table. (#5280)
This commit is contained in:
parent
b35f10fa54
commit
d4b8feac7d
|
@ -51,6 +51,7 @@
|
||||||
- Minor: IPC files are now stored in the Chatterino directory instead of system directories on Windows. (#5226)
|
- Minor: IPC files are now stored in the Chatterino directory instead of system directories on Windows. (#5226)
|
||||||
- Minor: 7TV emotes now have a 4x image rather than a 3x image. (#5209)
|
- Minor: 7TV emotes now have a 4x image rather than a 3x image. (#5209)
|
||||||
- Minor: Add `reward.cost` `reward.id`, `reward.title` filter variables. (#5275)
|
- Minor: Add `reward.cost` `reward.id`, `reward.title` filter variables. (#5275)
|
||||||
|
- Minor: Change Lua `CompletionRequested` handler to use an event table. (#5280)
|
||||||
- Bugfix: Fixed an issue where certain emojis did not send to Twitch chat correctly. (#4840)
|
- Bugfix: Fixed an issue where certain emojis did not send to Twitch chat correctly. (#4840)
|
||||||
- Bugfix: Fixed the `/shoutout` command not working with usernames starting with @'s (e.g. `/shoutout @forsen`). (#4800)
|
- Bugfix: Fixed the `/shoutout` command not working with usernames starting with @'s (e.g. `/shoutout @forsen`). (#4800)
|
||||||
- Bugfix: Fixed capitalized channel names in log inclusion list not being logged. (#4848)
|
- Bugfix: Fixed capitalized channel names in log inclusion list not being logged. (#4848)
|
||||||
|
|
14
docs/chatterino.d.ts
vendored
14
docs/chatterino.d.ts
vendored
|
@ -75,6 +75,13 @@ declare module c2 {
|
||||||
handler: (ctx: CommandContext) => void
|
handler: (ctx: CommandContext) => void
|
||||||
): boolean;
|
): boolean;
|
||||||
|
|
||||||
|
class CompletionEvent {
|
||||||
|
query: string;
|
||||||
|
full_text_content: string;
|
||||||
|
cursor_position: number;
|
||||||
|
is_first_word: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
class CompletionList {
|
class CompletionList {
|
||||||
values: String[];
|
values: String[];
|
||||||
hide_others: boolean;
|
hide_others: boolean;
|
||||||
|
@ -84,12 +91,7 @@ declare module c2 {
|
||||||
CompletionRequested = "CompletionRequested",
|
CompletionRequested = "CompletionRequested",
|
||||||
}
|
}
|
||||||
|
|
||||||
type CbFuncCompletionsRequested = (
|
type CbFuncCompletionsRequested = (ev: CompletionEvent) => CompletionList;
|
||||||
query: string,
|
|
||||||
full_text_content: string,
|
|
||||||
cursor_position: number,
|
|
||||||
is_first_word: boolean
|
|
||||||
) => CompletionList;
|
|
||||||
type CbFunc<T> = T extends EventType.CompletionRequested
|
type CbFunc<T> = T extends EventType.CompletionRequested
|
||||||
? CbFuncCompletionsRequested
|
? CbFuncCompletionsRequested
|
||||||
: never;
|
: never;
|
||||||
|
|
|
@ -167,7 +167,7 @@ Limitations/known issues:
|
||||||
|
|
||||||
#### `register_callback("CompletionRequested", handler)`
|
#### `register_callback("CompletionRequested", handler)`
|
||||||
|
|
||||||
Registers a callback (`handler`) to process completions. The callback gets the following parameters:
|
Registers a callback (`handler`) to process completions. The callback takes a single table with the following entries:
|
||||||
|
|
||||||
- `query`: The queried word.
|
- `query`: The queried word.
|
||||||
- `full_text_content`: The whole input.
|
- `full_text_content`: The whole input.
|
||||||
|
@ -190,8 +190,8 @@ end
|
||||||
|
|
||||||
c2.register_callback(
|
c2.register_callback(
|
||||||
"CompletionRequested",
|
"CompletionRequested",
|
||||||
function(query, full_text_content, cursor_position, is_first_word)
|
function(event)
|
||||||
if ("!join"):startswith(query) then
|
if ("!join"):startswith(event.query) then
|
||||||
---@type CompletionList
|
---@type CompletionList
|
||||||
return { hide_others = true, values = { "!join" } }
|
return { hide_others = true, values = { "!join" } }
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
# include <lua.h>
|
# include <lua.h>
|
||||||
}
|
}
|
||||||
|
# include "controllers/plugins/LuaUtilities.hpp"
|
||||||
|
|
||||||
# include <QString>
|
# include <QString>
|
||||||
|
|
||||||
# include <cassert>
|
# include <cassert>
|
||||||
|
@ -55,6 +57,28 @@ struct CompletionList {
|
||||||
bool hideOthers{};
|
bool hideOthers{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @lua@class CompletionEvent
|
||||||
|
*/
|
||||||
|
struct CompletionEvent {
|
||||||
|
/**
|
||||||
|
* @lua@field query string The word being completed
|
||||||
|
*/
|
||||||
|
QString query;
|
||||||
|
/**
|
||||||
|
* @lua@field full_text_content string Content of the text input
|
||||||
|
*/
|
||||||
|
QString full_text_content;
|
||||||
|
/**
|
||||||
|
* @lua@field cursor_position integer Position of the cursor in the text input in unicode codepoints (not bytes)
|
||||||
|
*/
|
||||||
|
int cursor_position{};
|
||||||
|
/**
|
||||||
|
* @lua@field is_first_word boolean True if this is the first word in the input
|
||||||
|
*/
|
||||||
|
bool is_first_word{};
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @includefile common/Channel.hpp
|
* @includefile common/Channel.hpp
|
||||||
* @includefile controllers/plugins/api/ChannelRef.hpp
|
* @includefile controllers/plugins/api/ChannelRef.hpp
|
||||||
|
@ -74,7 +98,7 @@ int c2_register_command(lua_State *L);
|
||||||
* Registers a callback to be invoked when completions for a term are requested.
|
* Registers a callback to be invoked when completions for a term are requested.
|
||||||
*
|
*
|
||||||
* @lua@param type "CompletionRequested"
|
* @lua@param type "CompletionRequested"
|
||||||
* @lua@param func fun(query: string, full_text_content: string, cursor_position: integer, is_first_word: boolean): CompletionList The callback to be invoked.
|
* @lua@param func fun(event: CompletionEvent): CompletionList The callback to be invoked.
|
||||||
* @exposed c2.register_callback
|
* @exposed c2.register_callback
|
||||||
*/
|
*/
|
||||||
int c2_register_callback(lua_State *L);
|
int c2_register_callback(lua_State *L);
|
||||||
|
|
|
@ -142,6 +142,20 @@ StackIdx push(lua_State *L, const int &b)
|
||||||
return lua_gettop(L);
|
return lua_gettop(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StackIdx push(lua_State *L, const api::CompletionEvent &ev)
|
||||||
|
{
|
||||||
|
auto idx = pushEmptyTable(L, 4);
|
||||||
|
# define PUSH(field) \
|
||||||
|
lua::push(L, ev.field); \
|
||||||
|
lua_setfield(L, idx, #field)
|
||||||
|
PUSH(query);
|
||||||
|
PUSH(full_text_content);
|
||||||
|
PUSH(cursor_position);
|
||||||
|
PUSH(is_first_word);
|
||||||
|
# undef PUSH
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
bool peek(lua_State *L, int *out, StackIdx idx)
|
bool peek(lua_State *L, int *out, StackIdx idx)
|
||||||
{
|
{
|
||||||
StackGuard guard(L);
|
StackGuard guard(L);
|
||||||
|
|
|
@ -28,6 +28,7 @@ namespace chatterino::lua {
|
||||||
|
|
||||||
namespace api {
|
namespace api {
|
||||||
struct CompletionList;
|
struct CompletionList;
|
||||||
|
struct CompletionEvent;
|
||||||
} // namespace api
|
} // namespace api
|
||||||
|
|
||||||
constexpr int ERROR_BAD_PEEK = LUA_OK - 1;
|
constexpr int ERROR_BAD_PEEK = LUA_OK - 1;
|
||||||
|
@ -66,6 +67,7 @@ StackIdx push(lua_State *L, const QString &str);
|
||||||
StackIdx push(lua_State *L, const std::string &str);
|
StackIdx push(lua_State *L, const std::string &str);
|
||||||
StackIdx push(lua_State *L, const bool &b);
|
StackIdx push(lua_State *L, const bool &b);
|
||||||
StackIdx push(lua_State *L, const int &b);
|
StackIdx push(lua_State *L, const int &b);
|
||||||
|
StackIdx push(lua_State *L, const api::CompletionEvent &ev);
|
||||||
|
|
||||||
// returns OK?
|
// returns OK?
|
||||||
bool peek(lua_State *L, int *out, StackIdx idx = -1);
|
bool peek(lua_State *L, int *out, StackIdx idx = -1);
|
||||||
|
|
|
@ -98,8 +98,8 @@ public:
|
||||||
|
|
||||||
// Note: The CallbackFunction object's destructor will remove the function from the lua stack
|
// Note: The CallbackFunction object's destructor will remove the function from the lua stack
|
||||||
using LuaCompletionCallback =
|
using LuaCompletionCallback =
|
||||||
lua::CallbackFunction<lua::api::CompletionList, QString, QString, int,
|
lua::CallbackFunction<lua::api::CompletionList,
|
||||||
bool>;
|
lua::api::CompletionEvent>;
|
||||||
std::optional<LuaCompletionCallback> getCompletionCallback()
|
std::optional<LuaCompletionCallback> getCompletionCallback()
|
||||||
{
|
{
|
||||||
if (this->state_ == nullptr || !this->error_.isNull())
|
if (this->state_ == nullptr || !this->error_.isNull())
|
||||||
|
@ -123,7 +123,7 @@ public:
|
||||||
|
|
||||||
// move
|
// move
|
||||||
return std::make_optional<lua::CallbackFunction<
|
return std::make_optional<lua::CallbackFunction<
|
||||||
lua::api::CompletionList, QString, QString, int, bool>>(
|
lua::api::CompletionList, lua::api::CompletionEvent>>(
|
||||||
this->state_, lua_gettop(this->state_));
|
this->state_, lua_gettop(this->state_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -433,8 +433,12 @@ std::pair<bool, QStringList> PluginController::updateCustomCompletions(
|
||||||
qCDebug(chatterinoLua)
|
qCDebug(chatterinoLua)
|
||||||
<< "Processing custom completions from plugin" << name;
|
<< "Processing custom completions from plugin" << name;
|
||||||
auto &cb = *opt;
|
auto &cb = *opt;
|
||||||
auto errOrList =
|
auto errOrList = cb(lua::api::CompletionEvent{
|
||||||
cb(query, fullTextContent, cursorPosition, isFirstWord);
|
.query = query,
|
||||||
|
.full_text_content = fullTextContent,
|
||||||
|
.cursor_position = cursorPosition,
|
||||||
|
.is_first_word = isFirstWord,
|
||||||
|
});
|
||||||
if (std::holds_alternative<int>(errOrList))
|
if (std::holds_alternative<int>(errOrList))
|
||||||
{
|
{
|
||||||
guard.handled();
|
guard.handled();
|
||||||
|
|
Loading…
Reference in a new issue