feat: Added conversion SqTable -> Dictionary

+ Added onBan event
+ Fixed wrong argument order in onTime event
This commit is contained in:
AURUMVORXX
2024-11-02 18:32:07 +03:00
parent 9361f00246
commit f5a748e1ff
5 changed files with 74 additions and 6 deletions

View File

@@ -28,9 +28,10 @@ def removeEventHandler(name, func):
if item['function'] == func: if item['function'] == func:
del eventList[name][index] del eventList[name][index]
## registering all the events ## registering all events
addEvent('onInit') addEvent('onInit')
addEvent('onExit') addEvent('onExit')
addEvent('onTick') addEvent('onTick')
addEvent('onTime') addEvent('onTime')
addEvent('onBan')

47
src/sqcontainers.cpp Normal file
View File

@@ -0,0 +1,47 @@
#include <sqapi.h>
#include <pybind11/embed.h>
#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;
}

6
src/sqcontainers.h Normal file
View File

@@ -0,0 +1,6 @@
#pragma once
namespace py = pybind11;
using namespace pybind11::literals;
py::dict sqParseTable(Sqrat::Table);

View File

@@ -1,6 +1,6 @@
#include <sqapi.h> #include <sqapi.h>
#include <pybind11/embed.h> #include <pybind11/embed.h>
#include <iostream> #include "sqcontainers.h"
namespace py = pybind11; namespace py = pybind11;
using namespace pybind11::literals; using namespace pybind11::literals;
@@ -19,7 +19,7 @@ void addEventHandler(const char* eventName, SQFUNCTION closure, unsigned int pri
HSQOBJECT closureHandle; HSQOBJECT closureHandle;
sq_newclosure(vm, closure, 0); sq_newclosure(vm, closure, 0);
sq_getstackobj(vm, -1, &closureHandle); sq_getstackobj(vm, -1, &closureHandle);
Sqrat::Function func(vm, Sqrat::RootTable().GetObject(), closureHandle); Sqrat::Function func(vm, Sqrat::RootTable().GetObject(), closureHandle);
sq_addEventHandler(eventName, func, priority); sq_addEventHandler(eventName, func, priority);
@@ -49,9 +49,9 @@ SQInteger sq_onTime(HSQUIRRELVM vm)
{ {
SQInteger day, hour, min; SQInteger day, hour, min;
sq_getinteger(vm, 4, &day); sq_getinteger(vm, 2, &day);
sq_getinteger(vm, 3, &hour); 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); py::dict kwargs = py::dict("day"_a=day, "hour"_a=hour, "min"_a=min);
g2o.attr("callEvent")("onTime", **kwargs); g2o.attr("callEvent")("onTime", **kwargs);
@@ -59,10 +59,23 @@ SQInteger sq_onTime(HSQUIRRELVM vm)
return 0; 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() void registerSquirrelEvents()
{ {
addEventHandler("onInit", sq_onInit, 0); addEventHandler("onInit", sq_onInit, 0);
addEventHandler("onExit", sq_onExit, 0); addEventHandler("onExit", sq_onExit, 0);
addEventHandler("onTick", sq_onTick, 0); addEventHandler("onTick", sq_onTick, 0);
addEventHandler("onTime", sq_onTime, 0); addEventHandler("onTime", sq_onTime, 0);
addEventHandler("onBan", sq_onBan, 0);
} }

View File

@@ -4,5 +4,6 @@ SQInteger sq_onInit(HSQUIRRELVM);
SQInteger sq_onExit(HSQUIRRELVM); SQInteger sq_onExit(HSQUIRRELVM);
SQInteger sq_onTick(HSQUIRRELVM); SQInteger sq_onTick(HSQUIRRELVM);
SQInteger sq_onTime(HSQUIRRELVM); SQInteger sq_onTime(HSQUIRRELVM);
SQInteger sq_onBan(HSQUIRRELVM);
void registerSquirrelEvents(); void registerSquirrelEvents();