#include "StarInterfaceLuaBindings.hpp" #include "StarWidgetLuaBindings.hpp" #include "StarJsonExtra.hpp" #include "StarLuaGameConverters.hpp" #include "StarMainInterface.hpp" #include "StarGuiContext.hpp" #include "StarChat.hpp" #include "StarUniverseClient.hpp" #include "StarClientCommandProcessor.hpp" namespace Star { LuaCallbacks LuaBindings::makeInterfaceCallbacks(MainInterface* mainInterface) { LuaCallbacks callbacks; callbacks.registerCallbackWithSignature( "hudVisible", bind(mem_fn(&MainInterface::hudVisible), mainInterface)); callbacks.registerCallbackWithSignature( "setHudVisible", bind(mem_fn(&MainInterface::setHudVisible), mainInterface, _1)); callbacks.registerCallback("bindCanvas", [mainInterface](String const& canvasName, Maybe ignoreInterfaceScale) -> Maybe { if (auto canvas = mainInterface->fetchCanvas(canvasName, ignoreInterfaceScale.value(false))) return canvas; return {}; }); callbacks.registerCallback("bindRegisteredPane", [mainInterface](String const& registeredPaneName) -> Maybe { if (auto pane = mainInterface->paneManager()->maybeRegisteredPane(MainInterfacePanesNames.getLeft(registeredPaneName))) return pane->makePaneCallbacks(); return {}; }); callbacks.registerCallback("displayRegisteredPane", [mainInterface](String const& registeredPaneName) { auto pane = MainInterfacePanesNames.getLeft(registeredPaneName); auto paneManager = mainInterface->paneManager(); if (paneManager->maybeRegisteredPane(pane)) paneManager->displayRegisteredPane(pane); }); callbacks.registerCallback("scale", []() -> int { return GuiContext::singleton().interfaceScale(); }); callbacks.registerCallback("queueMessage", [mainInterface](String const& message, Maybe cooldown, Maybe springState) { mainInterface->queueMessage(message, cooldown, springState.value(0)); }); return callbacks; } LuaCallbacks LuaBindings::makeChatCallbacks(MainInterface* mainInterface, UniverseClient* client) { LuaCallbacks callbacks; auto chat = as(mainInterface->paneManager()->registeredPane(MainInterfacePanes::Chat).get()); callbacks.registerCallback("send", [chat, client](String const& message, Maybe modeName, Maybe speak) { auto sendMode = modeName ? ChatSendModeNames.getLeft(*modeName) : ChatSendMode::Broadcast; client->sendChat(message, sendMode, speak); }); // just for SE compat - this shoulda been a utility callback :moyai: callbacks.registerCallback("parseArguments", [](String const& args) -> LuaVariadic { return Json::parseSequence(args).toArray(); }); callbacks.registerCallback("command", [mainInterface](String const& command) -> StringList { return mainInterface->commandProcessor()->handleCommand(command); }); callbacks.registerCallback("addMessage", [client, chat](String const& text, Maybe config) { ChatReceivedMessage message({MessageContext::Mode::CommandResult, ""}, client->clientContext()->connectionId(), "", text); if (config) { if (auto mode = config->optString("mode")) message.context.mode = MessageContextModeNames.getLeft(*mode); if (auto channelName = config->optString("channelName")) message.context.channelName = std::move(*channelName); if (auto portrait = config->optString("portrait")) message.portrait = std::move(*portrait); if (auto fromNick = config->optString("fromNick")) message.fromNick = std::move(*fromNick); } chat->addMessages({std::move(message)}, config ? config->getBool("showPane", true) : true); }); callbacks.registerCallback("input", [chat]() -> String { return chat->currentChat(); }); callbacks.registerCallback("setInput", [chat](String const& text, Maybe moveCursor) -> bool { return chat->setCurrentChat(text, moveCursor.value(false)); }); callbacks.registerCallback("clear", [chat](Maybe count) { chat->clear(count.value(std::numeric_limits::max())); }); return callbacks; } }