From b345588c02a12b5744c5535ef7c64173ea2d0b79 Mon Sep 17 00:00:00 2001 From: SantaSpeen Date: Fri, 21 Jul 2023 01:15:31 +0300 Subject: [PATCH] Prepare for lua events; Add _get_player for info; client.send_message(); --- src/core/Client.py | 2 +- src/core/core.py | 8 ++-- src/modules/EventsSystem/events_system.py | 38 ++++++++++++++++++- .../EventsSystem/events_systems-builtins.pyi | 4 +- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/core/Client.py b/src/core/Client.py index d004c6f..29c1c98 100644 --- a/src/core/Client.py +++ b/src/core/Client.py @@ -94,7 +94,7 @@ class Client: self.__alive = False async def send_message(self, message, to_all=True): - pass + await self._send(f"C:{message}", to_all=to_all) async def send_event(self, event_name, event_data): pass diff --git a/src/core/core.py b/src/core/core.py index 4d40439..43fe13a 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -47,12 +47,12 @@ class Core: self.BeamMP_version = "3.1.1" # 20.07.2023 ev.register_event("_get_BeamMP_version", lambda x: tuple([int(i) for i in self.BeamMP_version.split(".")])) - ev.register_event("_get_player", self.get_client) + ev.register_event("_get_player", lambda x: self.get_client(**x['kwargs'])) - def get_client(self, cid=None, nick=None, from_ev=None): - if from_ev is not None: - return self.get_client(*from_ev['args'], **from_ev['kwargs']) + def get_client(self, cid=None, nick=None): if cid is not None: + if cid == -1: + return [i for i in self.clients if i is not None] return self.clients_by_id.get(cid) if nick: return self.clients_by_nick.get(nick) diff --git a/src/modules/EventsSystem/events_system.py b/src/modules/EventsSystem/events_system.py index 0eda1d2..4d53764 100644 --- a/src/modules/EventsSystem/events_system.py +++ b/src/modules/EventsSystem/events_system.py @@ -10,6 +10,8 @@ import asyncio import builtins import inspect +import lupa + from core import get_logger @@ -46,12 +48,41 @@ class EventsSystem: "onServerStopped": [] } + self.__lua_events = { + "onInit": [], # onServerStarted + "onShutdown": [], # onServerStopped + "onPlayerAuth": [], # onPlayerAuthenticated + "onPlayerConnecting": [], # TODO lua onPlayerConnecting + "onPlayerJoining": [], # TODO lua onPlayerJoining + "onPlayerJoin": [], # onPlayerJoin + "onPlayerDisconnect": [], # TODO lua onPlayerDisconnect + "onChatMessage": [], # onChatReceive + "onVehicleSpawn": [], # "onCarSpawn + "onVehicleEdited": [], # onCarEdited + "onVehicleDeleted": [], # onCarDelete + "onVehicleReset": [], # onCarReset + "onFileChanged": [], # TODO lua onFileChanged + } + def builtins_hook(self): self.log.debug("used builtins_hook") builtins.ev = self - def register_event(self, event_name, event_func, async_event=False): - self.log.debug(f"register_event({event_name}, {event_func}):") + def register_event(self, event_name, event_func, async_event=False, lua=None): + self.log.debug(f"register_event(event_name='{event_name}', event_func='{event_func}', " + f"async_event={async_event}, lua_event={lua}):") + if lua: + if type(event_func) != str and type(lua) != lupa.lua53.LuaRuntime: + self.log.error(f"Cannot add event '{event_name}'. " + f"Use `MP.RegisterEvent(\"{event_name}\", \"function\")` instead. Skipping it...") + return + if event_name not in self.__lua_events: + self.__lua_events.update({str(event_name): [{"func": event_func, "engine": lua}]}) + else: + self.__lua_events[event_name].append(event_func) + + return + if not callable(event_func): # TODO: i18n self.log.error(f"Cannot add event '{event_name}'. " @@ -106,3 +137,6 @@ class EventsSystem: self.log.warning(f"Event {event_name} does not exist, maybe ev.call_async_event()?. Just skipping it...") return funcs_data + + def call_lua_event(self, *args): + pass diff --git a/src/modules/EventsSystem/events_systems-builtins.pyi b/src/modules/EventsSystem/events_systems-builtins.pyi index 8548b09..bc33af8 100644 --- a/src/modules/EventsSystem/events_systems-builtins.pyi +++ b/src/modules/EventsSystem/events_systems-builtins.pyi @@ -3,9 +3,11 @@ from typing import Any class EventsSystem: @staticmethod - def register_event(event_name, event_func): ... + def register_event(event_name, event_func, async_event: bool = False, lua: bool | object = None): ... @staticmethod async def call_async_event(event_name, *args, **kwargs) -> list[Any]: ... @staticmethod def call_event(event_name, *data, **kwargs) -> list[Any]: ... + @staticmethod + def call_lua_event(event_name, *data) -> list[Any]: ... class ev(EventsSystem): ...