diff --git a/g2o/events.py b/g2o/events.py index 715e660..74b81e1 100644 --- a/g2o/events.py +++ b/g2o/events.py @@ -28,9 +28,10 @@ def removeEventHandler(name, func): if item['function'] == func: del eventList[name][index] -## registering all the events +## registering all events addEvent('onInit') addEvent('onExit') addEvent('onTick') -addEvent('onTime') \ No newline at end of file +addEvent('onTime') +addEvent('onBan') \ No newline at end of file diff --git a/src/sqcontainers.cpp b/src/sqcontainers.cpp new file mode 100644 index 0000000..4c07e16 --- /dev/null +++ b/src/sqcontainers.cpp @@ -0,0 +1,47 @@ +#include +#include +#include "sqcontainers.h" + +namespace py = pybind11; +using namespace pybind11::literals; + +py::dict sqParseTable(Sqrat::Table tab) +{ + py::dict result; + Sqrat::Object::iterator tabIterator; + int i = 0; + + while (tab.Next(tabIterator)) + { + HSQOBJECT key = tabIterator.getKey(); + HSQOBJECT value = tabIterator.getValue(); + + if (key._type != OT_STRING) + continue; + + py::str pkey = "{0}_"; + + switch(value._type) + { + case OT_STRING: + // TODO: for some reason, key names 'name' and 'reason' crashing the server (maybe some more) + // Adding _ to key names is fixing this, but need to find a better solution + result[pkey.format(sq_objtostring(&key))] = sq_objtostring(&value); + break; + case OT_INTEGER: + result[sq_objtostring(&key)] = sq_objtointeger(&value); + break; + case OT_FLOAT: + result[sq_objtostring(&key)] = sq_objtofloat(&value); + break; + case OT_TABLE: + result[sq_objtostring(&key)] = sqParseTable(Sqrat::Table(value)); + break; + + default: + continue; + } + } + + return result; +} \ No newline at end of file diff --git a/src/sqcontainers.h b/src/sqcontainers.h new file mode 100644 index 0000000..e2a58fb --- /dev/null +++ b/src/sqcontainers.h @@ -0,0 +1,6 @@ +#pragma once + +namespace py = pybind11; +using namespace pybind11::literals; + +py::dict sqParseTable(Sqrat::Table); \ No newline at end of file diff --git a/src/sqevents.cpp b/src/sqevents.cpp index 0b5cf31..1b4501b 100644 --- a/src/sqevents.cpp +++ b/src/sqevents.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include "sqcontainers.h" namespace py = pybind11; using namespace pybind11::literals; @@ -19,7 +19,7 @@ void addEventHandler(const char* eventName, SQFUNCTION closure, unsigned int pri HSQOBJECT closureHandle; sq_newclosure(vm, closure, 0); - sq_getstackobj(vm, -1, &closureHandle); + sq_getstackobj(vm, -1, &closureHandle); Sqrat::Function func(vm, Sqrat::RootTable().GetObject(), closureHandle); sq_addEventHandler(eventName, func, priority); @@ -49,9 +49,9 @@ SQInteger sq_onTime(HSQUIRRELVM vm) { SQInteger day, hour, min; - sq_getinteger(vm, 4, &day); + sq_getinteger(vm, 2, &day); sq_getinteger(vm, 3, &hour); - sq_getinteger(vm, 2, &min); + sq_getinteger(vm, 4, &min); py::dict kwargs = py::dict("day"_a=day, "hour"_a=hour, "min"_a=min); g2o.attr("callEvent")("onTime", **kwargs); @@ -59,10 +59,23 @@ SQInteger sq_onTime(HSQUIRRELVM vm) return 0; } +SQInteger sq_onBan(HSQUIRRELVM vm) +{ + SQObject obj; + sq_getstackobj(vm, 2, &obj); + Sqrat::Table banData = Sqrat::Table(obj, vm); + + py::dict kwargs = sqParseTable(banData); + g2o.attr("callEvent")("onBan", **kwargs); + + return 0; +} + void registerSquirrelEvents() { addEventHandler("onInit", sq_onInit, 0); addEventHandler("onExit", sq_onExit, 0); addEventHandler("onTick", sq_onTick, 0); addEventHandler("onTime", sq_onTime, 0); + addEventHandler("onBan", sq_onBan, 0); } \ No newline at end of file diff --git a/src/sqevents.h b/src/sqevents.h index f43f53d..7ad91f2 100644 --- a/src/sqevents.h +++ b/src/sqevents.h @@ -4,5 +4,6 @@ SQInteger sq_onInit(HSQUIRRELVM); SQInteger sq_onExit(HSQUIRRELVM); SQInteger sq_onTick(HSQUIRRELVM); SQInteger sq_onTime(HSQUIRRELVM); +SQInteger sq_onBan(HSQUIRRELVM); void registerSquirrelEvents(); \ No newline at end of file