9 Commits

Author SHA1 Message Date
SantaSpeen 59c113ade5 minor 2023-08-17 21:25:52 +03:00
SantaSpeen a06c48dca5 Add _synced #1 2023-08-17 21:25:47 +03:00
SantaSpeen 42e4a8e05e Feature ev_data is None -> continue 2023-08-17 18:32:48 +03:00
SantaSpeen 074589da47 FIX GetPlayers #1 2023-08-17 18:27:16 +03:00
SantaSpeen 50c12f4b5c FIX _identifiers and e | e 2023-08-17 18:26:53 +03:00
SantaSpeen f145048cc1 FIX #1 2023-08-16 05:11:48 +03:00
SantaSpeen 68bf7d0d00 More debug info 2023-08-16 05:02:51 +03:00
SantaSpeen e9815cdfcf FIX _get_player #1 2023-08-16 05:02:39 +03:00
SantaSpeen acb2b45626 linux fix 2023-08-16 01:03:02 +03:00
9 changed files with 42 additions and 17 deletions
+11 -1
View File
@@ -32,6 +32,7 @@ class Client:
self.nick = None self.nick = None
self.roles = None self.roles = None
self._guest = True self._guest = True
self._synced = False
self._ready = False self._ready = False
self._identifiers = [] self._identifiers = []
self._cars = [None] * 21 # Max 20 cars per player + 1 snowman self._cars = [None] * 21 # Max 20 cars per player + 1 snowman
@@ -72,6 +73,10 @@ class Client:
def guest(self): def guest(self):
return self._guest return self._guest
@property
def synced(self):
return self._synced
@property @property
def ready(self): def ready(self):
return self._ready return self._ready
@@ -617,6 +622,8 @@ class Client:
ev_data_list.extend(d2) ev_data_list.extend(d2)
need_send = True need_send = True
for ev_data in ev_data_list: for ev_data in ev_data_list:
if ev_data is None:
continue
try: try:
message = ev_data["message"] message = ev_data["message"]
to_all = ev_data.get("to_all") to_all = ev_data.get("to_all")
@@ -634,7 +641,9 @@ class Client:
self.log.info(f"{message}" if to_all else f"{self.nick}: {msg}") self.log.info(f"{message}" if to_all else f"{self.nick}: {msg}")
await self._send(f"C:{message}", to_all=to_all, to_self=to_self, writer=writer) await self._send(f"C:{message}", to_all=to_all, to_self=to_self, writer=writer)
need_send = False need_send = False
except KeyError | AttributeError: except KeyError:
self.log.error(i18n.client_event_invalid_data.format(ev_data))
except AttributeError:
self.log.error(i18n.client_event_invalid_data.format(ev_data)) self.log.error(i18n.client_event_invalid_data.format(ev_data))
if need_send: if need_send:
if config.Options['log_chat']: if config.Options['log_chat']:
@@ -702,6 +711,7 @@ class Client:
tasks = self.__tasks tasks = self.__tasks
recv = asyncio.create_task(self._recv()) recv = asyncio.create_task(self._recv())
tasks.append(recv) tasks.append(recv)
self._synced = True
while self.__alive: while self.__alive:
if len(self.__packets_queue) > 0: if len(self.__packets_queue) > 0:
for index, packet in enumerate(self.__packets_queue): for index, packet in enumerate(self.__packets_queue):
+3
View File
@@ -32,6 +32,7 @@ class Client:
self.roles: str = None self.roles: str = None
self._guest = True self._guest = True
self.__alive = True self.__alive = True
self._synced = False
self._ready = False self._ready = False
self._focus_car = -1 self._focus_car = -1
self._identifiers = [] self._identifiers = []
@@ -55,6 +56,8 @@ class Client:
@property @property
def guest(self) -> bool: ... def guest(self) -> bool: ...
@property @property
def synced(self) -> bool: ...
@property
def ready(self) -> bool: ... def ready(self) -> bool: ...
@property @property
def identifiers(self) -> list: ... def identifiers(self) -> list: ...
+1 -1
View File
@@ -11,7 +11,7 @@ __title__ = 'KuiToi-Server'
__description__ = 'BeamingDrive Multiplayer server compatible with BeamMP clients.' __description__ = 'BeamingDrive Multiplayer server compatible with BeamMP clients.'
__url__ = 'https://github.com/kuitoi/kuitoi-Server' __url__ = 'https://github.com/kuitoi/kuitoi-Server'
__version__ = '0.4.5' __version__ = '0.4.5'
__build__ = 2300 # Я это считаю лог файлами __build__ = 2303 # Я это считаю лог файлами
__author__ = 'SantaSpeen' __author__ = 'SantaSpeen'
__author_email__ = 'admin@kuitoi.su' __author_email__ = 'admin@kuitoi.su'
__license__ = "FPA" __license__ = "FPA"
+1 -1
View File
@@ -57,7 +57,7 @@ class Core:
return None return None
if cid is not None: if cid is not None:
if cid == -1: if cid == -1:
return [i for i in self.clients if i is not None] return [i for i in self.clients if i is not None and i.synced]
return self.clients_by_id.get(cid) return self.clients_by_id.get(cid)
if nick: if nick:
return self.clients_by_nick.get(nick) return self.clients_by_nick.get(nick)
+2
View File
@@ -53,6 +53,8 @@ class TCPServer:
client.roles = res["roles"] client.roles = res["roles"]
client._guest = res["guest"] client._guest = res["guest"]
client._identifiers = {k: v for s in res["identifiers"] for k, v in [s.split(':')]} client._identifiers = {k: v for s in res["identifiers"] for k, v in [s.split(':')]}
if not client._identifiers.get("ip"):
client._identifiers["ip"] = client._addr[0]
# noinspection PyProtectedMember # noinspection PyProtectedMember
client._update_logger() client._update_logger()
except Exception as e: except Exception as e:
@@ -25,7 +25,8 @@ class Config:
"access_token": secrets.token_hex(16)} "access_token": secrets.token_hex(16)}
def __repr__(self): def __repr__(self):
return "%s(Auth=%r, Game=%r, Server=%r)" % (self.__class__.__name__, self.Auth, self.Game, self.Server) return f"{self.__class__.__name__}(Auth={self.Auth!r}, Game={self.Game!r}, Server={self.Server!r}, " \
f"RCON={self.RCON!r}, Options={self.Options!r}, WebAPI={self.WebAPI!r})"
class ConfigProvider: class ConfigProvider:
+4 -1
View File
@@ -15,7 +15,10 @@ from prompt_toolkit import PromptSession, print_formatted_text, HTML
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit.completion import NestedCompleter from prompt_toolkit.completion import NestedCompleter
from prompt_toolkit.history import FileHistory from prompt_toolkit.history import FileHistory
from prompt_toolkit.output.win32 import NoConsoleScreenBufferError try:
from prompt_toolkit.output.win32 import NoConsoleScreenBufferError
except AssertionError:
class NoConsoleScreenBufferError(Exception): ...
from prompt_toolkit.patch_stdout import patch_stdout from prompt_toolkit.patch_stdout import patch_stdout
from core import get_logger from core import get_logger
+1 -1
View File
@@ -141,7 +141,7 @@ class EventsSystem:
return funcs_data return funcs_data
def call_lua_event(self, event_name, *args): def call_lua_event(self, event_name, *args):
self.log.debug(f"Calling lua event: '{event_name}'") self.log.debug(f"Calling lua event: '{event_name} ({args})'")
funcs_data = [] funcs_data = []
if event_name in self.__lua_events.keys(): if event_name in self.__lua_events.keys():
for data in self.__lua_events[event_name]: for data in self.__lua_events[event_name]:
@@ -110,7 +110,7 @@ class MP:
def TriggerLocalEvent(self, event_name, *args): def TriggerLocalEvent(self, event_name, *args):
self.log.debug("request TriggerLocalEvent()") self.log.debug("request TriggerLocalEvent()")
self.log.debug(f"Calling local lua event: '{event_name}'") self.log.debug(f"Calling local lua event: '{event_name}{args}'")
funcs_data = [] funcs_data = []
if event_name in self._local_events.keys(): if event_name in self._local_events.keys():
for func_name in self._local_events[event_name]: for func_name in self._local_events[event_name]:
@@ -157,7 +157,7 @@ class MP:
to_all = False to_all = False
if player_id < 0: if player_id < 0:
to_all = True to_all = True
client = client[0] client = client[0] if len(client) > 0 else None
if client and event_name and data: if client and event_name and data:
t = self.loop.create_task(client.send_event(event_name, data, to_all=to_all)) t = self.loop.create_task(client.send_event(event_name, data, to_all=to_all))
self.tasks.append(t) self.tasks.append(t)
@@ -168,7 +168,7 @@ class MP:
return False, "Can't found event_name or data" return False, "Can't found event_name or data"
def TriggerClientEventJson(self, player_id, event_name, data): def TriggerClientEventJson(self, player_id, event_name, data):
self.log.debug("request TriggerClientEventJson()") self.log.debug(f"request TriggerClientEventJson({player_id, event_name, data})")
data = self._lua.globals().Util.JsonEncode(data) data = self._lua.globals().Util.JsonEncode(data)
self.TriggerClientEvent(player_id, event_name, data) self.TriggerClientEvent(player_id, event_name, data)
@@ -232,8 +232,8 @@ class MP:
def GetPlayers(self): def GetPlayers(self):
self.log.debug("request GetPlayers()") self.log.debug("request GetPlayers()")
clients = ev.call_event("_get_players", cid=-1) clients = ev.call_event("_get_player", cid=-1)[0]
return self._lua.table_from(clients) return self._lua.table_from([i.nick for i in clients])
def IsPlayerGuest(self, player_id) -> bool: def IsPlayerGuest(self, player_id) -> bool:
self.log.debug("request IsPlayerGuest()") self.log.debug("request IsPlayerGuest()")
@@ -312,12 +312,18 @@ class Util:
return {k: v for k, v in new_dict.items() if v is not None} return {k: v for k, v in new_dict.items() if v is not None}
def JsonEncode(self, table): def JsonEncode(self, table):
data = {}
try:
self.log.debug("requesting JsonEncode()") self.log.debug("requesting JsonEncode()")
if all(isinstance(k, int) for k in table.keys()): if all(isinstance(k, int) for k in table.keys()):
data = self._recursive_list_encode(table) data = self._recursive_list_encode(table)
else: else:
data = self._recursive_dict_encode(table) data = self._recursive_dict_encode(table)
return json.dumps(data) except Exception as e:
self.log.exception(e)
data = json.dumps(data)
self.log.debug(f"Encoded: {data}")
return data
def JsonDecode(self, string): def JsonDecode(self, string):
self.log.debug("requesting JsonDecode()") self.log.debug("requesting JsonDecode()")