summaryrefslogtreecommitdiff
path: root/bot/src/commands/lua.cpp
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-04-12 16:55:51 +0500
committerilotterytea <iltsu@alright.party>2025-04-12 16:55:51 +0500
commit9fc268e10ec78830df8ebb6b60f201790e5d5d6f (patch)
tree47d055d424537a96075804b99acbdd04b4747dfd /bot/src/commands/lua.cpp
parent0e1b8bcdd6435ea1f1ad878a6f0813ab72259c24 (diff)
feat: db functions for lua
Diffstat (limited to 'bot/src/commands/lua.cpp')
-rw-r--r--bot/src/commands/lua.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/bot/src/commands/lua.cpp b/bot/src/commands/lua.cpp
index 1140334..df14181 100644
--- a/bot/src/commands/lua.cpp
+++ b/bot/src/commands/lua.cpp
@@ -22,6 +22,7 @@
#include "commands/request.hpp"
#include "commands/response.hpp"
#include "commands/response_error.hpp"
+#include "config.hpp"
#include "cpr/api.h"
#include "cpr/cprtypes.h"
#include "cpr/multipart.h"
@@ -353,6 +354,117 @@ namespace bot::command::lua {
});
}
+ void add_db_library(std::shared_ptr<sol::state> state,
+ const Configuration &cfg) {
+ state->set_function("db_execute", [state, cfg](
+ const std::string &query,
+ const sol::table &parameters) {
+ pqxx::connection conn(GET_DATABASE_CONNECTION_URL(cfg));
+ pqxx::params p;
+
+ for (const auto &kv : parameters) {
+ auto v = kv.second;
+ switch (v.get_type()) {
+ case sol::type::lua_nil: {
+ p.append(nullptr);
+ break;
+ }
+ case sol::type::string: {
+ p.append(v.as<std::string>());
+ break;
+ }
+ case sol::type::boolean: {
+ p.append(v.as<bool>());
+ break;
+ }
+ case sol::type::number: {
+ double num = v.as<double>();
+ if (std::floor(num) == num) {
+ p.append(static_cast<long long>(num));
+ } else {
+ p.append(num);
+ }
+ break;
+ }
+ default:
+ throw std::runtime_error("Unsupported Lua type for DB queries");
+ }
+ }
+
+ pqxx::work work(conn);
+
+ work.exec_params(query, p);
+
+ work.commit();
+ conn.close();
+ });
+
+ state->set_function("db_query", [state, cfg](
+ const std::string &query,
+ const sol::table &parameters) {
+ pqxx::connection conn(GET_DATABASE_CONNECTION_URL(cfg));
+ pqxx::params p;
+
+ for (const auto &kv : parameters) {
+ auto v = kv.second;
+ switch (v.get_type()) {
+ case sol::type::lua_nil: {
+ p.append(nullptr);
+ break;
+ }
+ case sol::type::string: {
+ p.append(v.as<std::string>());
+ break;
+ }
+ case sol::type::boolean: {
+ p.append(v.as<bool>());
+ break;
+ }
+ case sol::type::number: {
+ double num = v.as<double>();
+ if (std::floor(num) == num) {
+ p.append(static_cast<long long>(num));
+ } else {
+ p.append(num);
+ }
+ break;
+ }
+ default:
+ throw std::runtime_error("Unsupported Lua type for DB queries");
+ }
+ }
+
+ pqxx::work work(conn);
+ pqxx::result res = work.exec_params(query, p);
+
+ sol::table o = state->create_table();
+
+ for (const auto &row : res) {
+ sol::table r = state->create_table();
+
+ for (int i = 0; i < row.size(); i++) {
+ auto v = row[i];
+
+ sol::object obj;
+ if (v.is_null()) {
+ obj = sol::make_object(*state, sol::nil);
+ } else {
+ obj = sol::make_object(*state, v.as<std::string>());
+ }
+
+ r[res.column_name(i)] = obj;
+ }
+
+ o.add(r);
+ }
+
+ work.commit();
+ conn.close();
+
+ return o;
+ });
+ }
+
void add_base_libraries(std::shared_ptr<sol::state> state) {
add_bot_library(state);
add_time_library(state);