diff options
| author | ilotterytea <iltsu@alright.party> | 2025-04-10 21:58:06 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-04-10 21:58:06 +0500 |
| commit | 5c2cd6d3e293dc524415893cb1b8950193dce3e2 (patch) | |
| tree | 76205d0047fc041a4b18249da3f348f751ef1eca /bot/src/commands/lua.cpp | |
| parent | f649ead41180d3fc2c24480c843b0cf4bb636f97 (diff) | |
feat: l10n libraries
Diffstat (limited to 'bot/src/commands/lua.cpp')
| -rw-r--r-- | bot/src/commands/lua.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/bot/src/commands/lua.cpp b/bot/src/commands/lua.cpp index 589fd27..40524dc 100644 --- a/bot/src/commands/lua.cpp +++ b/bot/src/commands/lua.cpp @@ -226,11 +226,64 @@ namespace bot::command::lua { }); } + void add_l10n_library(std::shared_ptr<sol::state> state) { + state->set_function( + "l10n_custom_formatted_line_request", + [](const sol::table &request, const sol::table &lines, + const std::string &line_id, const sol::table ¶meters) { + // TODO: use Localization class instead!!! + + // TODO: convert the table to C++ struct for type safety later + std::string language = request["channel_preference"]["language"]; + + if (!lines[language].valid() || !lines[language][line_id].valid()) { + } + + std::string line = lines[language][line_id]; + + std::vector<std::string> args; + + for (auto &kv : parameters) { + args.push_back(kv.second.as<std::string>()); + } + + int pos = 0; + int index = 0; + + while ((pos = line.find("%s", pos)) != std::string::npos) { + line.replace(pos, 2, args[index]); + pos += args[index].size(); + ++index; + + if (index >= args.size()) { + break; + } + } + + std::map<std::string, std::string> token_map = { + {"{sender.alias_name}", request["sender"]["alias_name"]}, + {"{source.alias_name}", request["channel"]["alias_name"]}, + {"{default.prefix}", DEFAULT_PREFIX}}; + + for (const auto &pair : token_map) { + int pos = line.find(pair.first); + + while (pos != std::string::npos) { + line.replace(pos, pair.first.length(), pair.second); + pos = line.find(pair.first, pos + pair.second.length()); + } + } + + return line; + }); + } + void add_base_libraries(std::shared_ptr<sol::state> state) { add_bot_library(state); add_time_library(state); add_json_library(state); add_net_library(state); + add_l10n_library(state); } void add_twitch_library(std::shared_ptr<sol::state> state, |
