mirror of
https://github.com/kuitoi/kuitoi-Server.git
synced 2026-06-19 15:11:25 +00:00
[~] Minor
This commit is contained in:
+18
-14
@@ -355,11 +355,10 @@ class Client:
|
|||||||
speed = speed / 2
|
speed = speed / 2
|
||||||
half_size = math.floor(size / 2)
|
half_size = math.floor(size / 2)
|
||||||
t = time.monotonic()
|
t = time.monotonic()
|
||||||
uploads = [
|
async with asyncio.TaskGroup() as tg:
|
||||||
self._split_load(0, half_size, False, file, speed),
|
sl0 = tg.create_task(self._split_load(0, half_size, False, file, speed))
|
||||||
self._split_load(half_size, size, True, file, speed)
|
sl1 = tg.create_task(self._split_load(half_size, size, True, file, speed))
|
||||||
]
|
sl0, sl1 = sl0.result(), sl1.result()
|
||||||
sl0, sl1 = await asyncio.gather(*uploads)
|
|
||||||
tr = (time.monotonic() - t) or 0.0001
|
tr = (time.monotonic() - t) or 0.0001
|
||||||
if self._core.lock_upload:
|
if self._core.lock_upload:
|
||||||
self._core.lock_upload = False
|
self._core.lock_upload = False
|
||||||
@@ -691,7 +690,7 @@ class Client:
|
|||||||
self.__alive = False
|
self.__alive = False
|
||||||
return
|
return
|
||||||
if len(data) == 0:
|
if len(data) == 0:
|
||||||
self.__alive = False
|
await self.kick("Bad data from client")
|
||||||
return
|
return
|
||||||
|
|
||||||
_bytes = False
|
_bytes = False
|
||||||
@@ -768,6 +767,7 @@ class Client:
|
|||||||
self.udp_pps = self._udp_count_recv
|
self.udp_pps = self._udp_count_recv
|
||||||
self._tpc_count_recv = 0
|
self._tpc_count_recv = 0
|
||||||
self._udp_count_recv = 0
|
self._udp_count_recv = 0
|
||||||
|
self.log.debug("PPS")
|
||||||
if self.tcp_pps > self._core.target_tps or self.udp_pps > self._core.target_tps:
|
if self.tcp_pps > self._core.target_tps or self.udp_pps > self._core.target_tps:
|
||||||
self.log.warning(f"PPS > TPS; PPS: TPC: {self.tcp_pps}, UDP: {self.udp_pps}")
|
self.log.warning(f"PPS > TPS; PPS: TPC: {self.tcp_pps}, UDP: {self.udp_pps}")
|
||||||
|
|
||||||
@@ -810,9 +810,9 @@ class Client:
|
|||||||
await self._send(f"P{self.cid}") # Send clientID
|
await self._send(f"P{self.cid}") # Send clientID
|
||||||
await self._sync_resources()
|
await self._sync_resources()
|
||||||
ev.call_lua_event("onPlayerJoining", self.cid)
|
ev.call_lua_event("onPlayerJoining", self.cid)
|
||||||
ev.register("serverTick", self.__tick_player_tcp)
|
self.__tpt_id = ev.register("serverTick", self.__tick_player_tcp)
|
||||||
ev.register("serverTick", self.__tick_player_udp)
|
self.__tpu_id = ev.register("serverTick", self.__tick_player_udp)
|
||||||
ev.register("serverTick_1s", self._tick_pps)
|
self.__tpp_id = ev.register("serverTick_1s", self._tick_pps)
|
||||||
await self._recv()
|
await self._recv()
|
||||||
|
|
||||||
async def _remove_me(self):
|
async def _remove_me(self):
|
||||||
@@ -830,18 +830,22 @@ class Client:
|
|||||||
ev.call_lua_event("onPlayerDisconnect", self.cid)
|
ev.call_lua_event("onPlayerDisconnect", self.cid)
|
||||||
ev.call_event("onPlayerDisconnect", player=self)
|
ev.call_event("onPlayerDisconnect", player=self)
|
||||||
await ev.call_async_event("onPlayerDisconnect", player=self)
|
await ev.call_async_event("onPlayerDisconnect", player=self)
|
||||||
ev.unregister(self.__tick_player_tcp)
|
ev.unregister_by_id(self.__tpt_id) # self.__tick_player_tcp
|
||||||
ev.unregister(self.__tick_player_udp)
|
ev.unregister_by_id(self.__tpu_id) # self.__tick_player_udp
|
||||||
ev.unregister(self._tick_pps)
|
ev.unregister_by_id(self.__tpp_id) # self._tick_pps
|
||||||
gt = round((time.monotonic() - self._connect_time) / 60, 2)
|
gt = round((time.monotonic() - self._connect_time) / 60, 2)
|
||||||
self.log.info(i18n.client_player_disconnected.format(gt))
|
self.log.info(i18n.client_player_disconnected.format(gt))
|
||||||
self._core.clients[self.cid] = None
|
self._core.clients[self.cid] = None
|
||||||
del self._core.clients_by_id[self.cid]
|
del self._core.clients_by_id[self.cid]
|
||||||
del self._core.clients_by_nick[self.nick]
|
del self._core.clients_by_nick[self.nick]
|
||||||
|
self.log.debug(f"TPC: "
|
||||||
|
f"Recv: {self._tpc_count_total_recv}; {self._tpc_size_total_recv / KB:.4f}kb; "
|
||||||
|
f"Sent: {self._tpc_count_total_sent}; {self._tpc_size_total_sent / KB:.4f}kb;")
|
||||||
|
self.log.debug(f"UDP: "
|
||||||
|
f"Recv: {self._udp_count_total_recv}; {self._udp_size_total_recv / KB:.4f}kb; "
|
||||||
|
f"Sent: {self._udp_count_total_sent}; {self._udp_size_total_sent / KB:.4f}kb;")
|
||||||
else:
|
else:
|
||||||
self.log.debug(f"Removing client; Closing connection...")
|
self.log.debug(f"Removing client; Closing connection...")
|
||||||
self.log.debug(f"TPC: Recv: {self._tpc_count_total_recv}; {self._tpc_size_total_recv / KB:.4f}kb; Sent: {self._tpc_count_total_sent}; {self._tpc_size_total_sent / KB:.4f}kb;")
|
|
||||||
self.log.debug(f"UDP: Recv: {self._udp_count_total_recv}; {self._udp_size_total_recv / KB:.4f}kb; Sent: {self._udp_count_total_sent}; {self._udp_size_total_sent / KB:.4f}kb;")
|
|
||||||
await asyncio.sleep(0.001)
|
await asyncio.sleep(0.001)
|
||||||
try:
|
try:
|
||||||
self.__writer.close()
|
self.__writer.close()
|
||||||
|
|||||||
+4
-1
@@ -55,6 +55,9 @@ class Client:
|
|||||||
self._unicycle: Dict[str, Union[int, str]] = {"id": -1, "packet": ""}
|
self._unicycle: Dict[str, Union[int, str]] = {"id": -1, "packet": ""}
|
||||||
self._last_position = {}
|
self._last_position = {}
|
||||||
self._lock = Lock()
|
self._lock = Lock()
|
||||||
|
self.__tpt_id = 0
|
||||||
|
self.__tpu_id = 0
|
||||||
|
self.__tpp_id = 0
|
||||||
|
|
||||||
async def __gracefully_kick(self): ...
|
async def __gracefully_kick(self): ...
|
||||||
@property
|
@property
|
||||||
@@ -92,7 +95,7 @@ class Client:
|
|||||||
async def _send(self, data: bytes | str, to_all: bool = False, to_self: bool = True, to_udp: bool = False, writer: StreamWriter = None) -> None: ...
|
async def _send(self, data: bytes | str, to_all: bool = False, to_self: bool = True, to_udp: bool = False, writer: StreamWriter = None) -> None: ...
|
||||||
async def _sync_resources(self) -> None: ...
|
async def _sync_resources(self) -> None: ...
|
||||||
async def _recv(self, one=False) -> bytes | None: ...
|
async def _recv(self, one=False) -> bytes | None: ...
|
||||||
async def _split_load(self, start: int, end: int, d_sock: bool, filename: str, sl: float) -> None: ...
|
async def _split_load(self, start: int, end: int, d_sock: bool, filename: str, sl: float) -> int: ...
|
||||||
async def _get_cid_vid(self, s: str) -> Tuple[int, int]: ...
|
async def _get_cid_vid(self, s: str) -> Tuple[int, int]: ...
|
||||||
async def _spawn_car(self, data: str) -> None: ...
|
async def _spawn_car(self, data: str) -> None: ...
|
||||||
async def delete_car(self, car_id: int) -> None: ...
|
async def delete_car(self, car_id: int) -> None: ...
|
||||||
|
|||||||
@@ -10,7 +10,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.8'
|
__version__ = '0.4.8'
|
||||||
__build__ = 2679 # Я это считаю лог файлами
|
__build__ = 2747 # Я это считаю лог файлами
|
||||||
__author__ = 'SantaSpeen'
|
__author__ = 'SantaSpeen'
|
||||||
__author_email__ = 'admin@anidev.ru'
|
__author_email__ = 'admin@anidev.ru'
|
||||||
__license__ = "FPA"
|
__license__ = "FPA"
|
||||||
@@ -19,6 +19,7 @@ __copyright__ = 'Copyright 2024 © SantaSpeen (Maxim Khomutov)'
|
|||||||
import asyncio
|
import asyncio
|
||||||
import builtins
|
import builtins
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
|
||||||
import prompt_toolkit.shortcuts as shortcuts
|
import prompt_toolkit.shortcuts as shortcuts
|
||||||
@@ -30,15 +31,17 @@ from modules import ConfigProvider, EventsSystem
|
|||||||
from modules import Console
|
from modules import Console
|
||||||
from modules import MultiLanguage
|
from modules import MultiLanguage
|
||||||
|
|
||||||
|
builtins.Ts = time.monotonic()
|
||||||
args, _ = parser.parse_known_args()
|
args, _ = parser.parse_known_args()
|
||||||
if args.version:
|
if args.version:
|
||||||
print(f"{__title__}:\n\tVersion: {__version__}\n\tBuild: {__build__}")
|
print(f"{__title__}:\n\tVersion: {__version__}\n\tBuild: {__build__}")
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
loop = asyncio.new_event_loop()
|
loop = asyncio.new_event_loop()
|
||||||
asyncio.set_event_loop(loop)
|
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
|
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
|
||||||
|
# loop.set_task_factory(asyncio.eager_task_factory)
|
||||||
|
asyncio.set_event_loop(loop)
|
||||||
log = get_logger("core.init")
|
log = get_logger("core.init")
|
||||||
|
|
||||||
# Config file init
|
# Config file init
|
||||||
|
|||||||
+7
-17
@@ -126,9 +126,10 @@ class TCPServer:
|
|||||||
result, client = await self.auth_client(reader, writer)
|
result, client = await self.auth_client(reader, writer)
|
||||||
if result:
|
if result:
|
||||||
await client._looper()
|
await client._looper()
|
||||||
return result, client
|
return "U", client
|
||||||
case "D":
|
case "D":
|
||||||
await self.set_down_rw(reader, writer)
|
await self.set_down_rw(reader, writer)
|
||||||
|
return "D", None
|
||||||
case "P":
|
case "P":
|
||||||
writer.write(b"P")
|
writer.write(b"P")
|
||||||
await writer.drain()
|
await writer.drain()
|
||||||
@@ -137,34 +138,28 @@ class TCPServer:
|
|||||||
self.log.warning(f"Unknown code: {code}")
|
self.log.warning(f"Unknown code: {code}")
|
||||||
self.log.warning("Report about that!")
|
self.log.warning("Report about that!")
|
||||||
writer.close()
|
writer.close()
|
||||||
return False, None
|
return "E", None
|
||||||
|
|
||||||
async def handle_client(self, reader, writer):
|
async def handle_client(self, reader, writer):
|
||||||
while self.run:
|
|
||||||
self._connections.add(writer)
|
self._connections.add(writer)
|
||||||
try:
|
try:
|
||||||
ip = writer.get_extra_info('peername')[0]
|
ip = writer.get_extra_info('peername')[0]
|
||||||
if self.rl.is_banned(ip):
|
if self.rl.is_banned(ip):
|
||||||
await self.rl.notify(ip, writer)
|
await self.rl.notify(ip, writer)
|
||||||
writer.close()
|
writer.close()
|
||||||
break
|
|
||||||
data = await reader.read(1)
|
data = await reader.read(1)
|
||||||
if not data:
|
if not data:
|
||||||
break
|
return
|
||||||
code = data.decode()
|
code = data.decode()
|
||||||
self.log.debug(f"Received {code!r} from {writer.get_extra_info('sockname')!r}")
|
self.log.debug(f"Received {code!r} from {writer.get_extra_info('sockname')!r}")
|
||||||
# task = asyncio.create_task(self.handle_code(code, reader, writer))
|
_type, cl = await self.handle_code(code, reader, writer)
|
||||||
# await asyncio.wait([task], return_when=asyncio.FIRST_EXCEPTION)
|
self.log.debug(f"[{_type}] cl returned: {cl}")
|
||||||
_, cl = await self.handle_code(code, reader, writer)
|
|
||||||
self.log.debug(f"cl returned: {cl}")
|
|
||||||
if cl:
|
if cl:
|
||||||
await cl._remove_me()
|
await cl._remove_me()
|
||||||
break
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.log.error("Error while handling connection...")
|
self.log.error("Error while handling connection...")
|
||||||
self.log.exception(e)
|
self.log.exception(e)
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
break
|
|
||||||
|
|
||||||
async def start(self):
|
async def start(self):
|
||||||
self.log.debug("Starting TCP server.")
|
self.log.debug("Starting TCP server.")
|
||||||
@@ -172,17 +167,12 @@ class TCPServer:
|
|||||||
try:
|
try:
|
||||||
self.server = await asyncio.start_server(self.handle_client, self.host, self.port,
|
self.server = await asyncio.start_server(self.handle_client, self.host, self.port,
|
||||||
backlog=int(config.Game["players"] * 4))
|
backlog=int(config.Game["players"] * 4))
|
||||||
self.log.debug(f"TCP server started on {self.server.sockets[0].getsockname()!r}")
|
|
||||||
while True:
|
|
||||||
async with self.server:
|
async with self.server:
|
||||||
|
self.log.debug(f"TCP server started on {self.server.sockets[0].getsockname()!r}")
|
||||||
await self.server.serve_forever()
|
await self.server.serve_forever()
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
self.log.error(i18n.core_bind_failed.format(e))
|
self.log.error(i18n.core_bind_failed.format(e))
|
||||||
raise e
|
raise e
|
||||||
except KeyboardInterrupt:
|
|
||||||
pass
|
|
||||||
except ConnectionResetError as e:
|
|
||||||
self.log.debug(f"ConnectionResetError {e}")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.log.exception(e)
|
self.log.exception(e)
|
||||||
raise e
|
raise e
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
# (c) kuitoi.su 2024
|
# (c) kuitoi.su 2024
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
|
import time
|
||||||
|
|
||||||
from core import utils
|
from core import utils
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user