mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2026-02-07 16:27:26 +08:00
Rearrange Link Play module
- Try to ensure thread safety by using TCP socket
This commit is contained in:
@@ -38,7 +38,12 @@ class Constant:
|
||||
DOWNLOAD_LINK_PREFIX = Config.DOWNLOAD_LINK_PREFIX
|
||||
|
||||
LINK_PLAY_UNLOCK_LENGTH = 512 # Units: bytes
|
||||
LINK_PLAY_TIMEOUT = 10 # Units: seconds
|
||||
LINK_PLAY_TIMEOUT = 5 # Units: seconds
|
||||
|
||||
LINK_PLAY_HOST = '127.0.0.1' if Config.SET_LINK_PLAY_SERVER_AS_SUB_PROCESS else Config.LINK_PLAY_HOST
|
||||
LINK_PLAY_TCP_PORT = Config.LINK_PLAY_TCP_PORT
|
||||
LINK_PLAY_UDP_PORT = Config.LINK_PLAY_UDP_PORT
|
||||
LINK_PLAY_AUTHENTICATION = Config.LINK_PLAY_AUTHENTICATION
|
||||
|
||||
COURSE_STAMINA_COST = 4
|
||||
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
from base64 import b64encode
|
||||
import socket
|
||||
from base64 import b64decode, b64encode
|
||||
|
||||
from core.error import ArcError, Timeout
|
||||
|
||||
from .constant import Constant
|
||||
from .user import UserInfo
|
||||
|
||||
socket.setdefaulttimeout(Constant.LINK_PLAY_TIMEOUT)
|
||||
|
||||
|
||||
def get_song_unlock(client_song_map: dict) -> bytes:
|
||||
'''处理可用歌曲bit,返回bytes'''
|
||||
@@ -82,9 +85,8 @@ class Room:
|
||||
}
|
||||
|
||||
|
||||
class LocalMultiPlayer:
|
||||
def __init__(self, conn=None) -> None:
|
||||
self.conn = conn
|
||||
class RemoteMultiPlayer:
|
||||
def __init__(self) -> None:
|
||||
self.user: 'Player' = None
|
||||
self.room: 'Room' = None
|
||||
|
||||
@@ -93,30 +95,44 @@ class LocalMultiPlayer:
|
||||
def to_dict(self) -> dict:
|
||||
return dict(self.room.to_dict(), **self.user.to_dict())
|
||||
|
||||
@staticmethod
|
||||
def tcp(data: str) -> str:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
||||
sock.connect((Constant.LINK_PLAY_HOST,
|
||||
Constant.LINK_PLAY_TCP_PORT))
|
||||
sock.sendall(bytes(data + "\n", "utf-8"))
|
||||
try:
|
||||
received = str(sock.recv(1024), "utf-8").strip()
|
||||
except socket.timeout:
|
||||
raise Timeout(
|
||||
'Timeout when waiting for data from link play server.', status=400)
|
||||
# print(received)
|
||||
return received
|
||||
|
||||
def data_swap(self, data: tuple) -> tuple:
|
||||
self.conn.send(data)
|
||||
if self.conn.poll(Constant.LINK_PLAY_TIMEOUT):
|
||||
self.data_recv = self.conn.recv()
|
||||
if self.data_recv[0] != 0:
|
||||
raise ArcError('Link Play error.',
|
||||
self.data_recv[0], status=400)
|
||||
else:
|
||||
raise Timeout(
|
||||
'Timeout when waiting for data from local udp server.', status=400)
|
||||
|
||||
received = self.tcp(Constant.LINK_PLAY_AUTHENTICATION +
|
||||
'|' + '|'.join([str(x) for x in data]))
|
||||
|
||||
self.data_recv = received.split('|')
|
||||
if self.data_recv[0] != '0':
|
||||
raise ArcError('Link Play error.',
|
||||
int(self.data_recv[0]), status=400)
|
||||
|
||||
def create_room(self, user: 'Player' = None) -> None:
|
||||
'''创建房间'''
|
||||
if user is not None:
|
||||
self.user = user
|
||||
user.select_user_one_column('name')
|
||||
self.data_swap((1, self.user.name, self.user.song_unlock))
|
||||
self.data_swap((1, self.user.name, b64encode(
|
||||
self.user.song_unlock).decode('utf-8')))
|
||||
self.room = Room()
|
||||
self.room.room_code = self.data_recv[1]
|
||||
self.room.room_id = self.data_recv[2]
|
||||
self.room.room_id = int(self.data_recv[2])
|
||||
self.room.song_unlock = self.user.song_unlock
|
||||
self.user.token = self.data_recv[3]
|
||||
self.user.key = self.data_recv[4]
|
||||
self.user.player_id = self.data_recv[5]
|
||||
self.user.token = int(self.data_recv[3])
|
||||
self.user.key = b64decode(self.data_recv[4])
|
||||
self.user.player_id = int(self.data_recv[5])
|
||||
|
||||
def join_room(self, room: 'Room' = None, user: 'Player' = None) -> None:
|
||||
'''加入房间'''
|
||||
@@ -127,13 +143,13 @@ class LocalMultiPlayer:
|
||||
|
||||
self.user.select_user_one_column('name')
|
||||
self.data_swap(
|
||||
(2, self.user.name, self.user.song_unlock, room.room_code))
|
||||
(2, self.user.name, b64encode(self.user.song_unlock).decode('utf-8'), room.room_code))
|
||||
self.room.room_code = self.data_recv[1]
|
||||
self.room.room_id = self.data_recv[2]
|
||||
self.room.song_unlock = self.data_recv[6]
|
||||
self.user.token = self.data_recv[3]
|
||||
self.user.key = self.data_recv[4]
|
||||
self.user.player_id = self.data_recv[5]
|
||||
self.room.room_id = int(self.data_recv[2])
|
||||
self.room.song_unlock = b64decode(self.data_recv[6])
|
||||
self.user.token = int(self.data_recv[3])
|
||||
self.user.key = b64decode(self.data_recv[4])
|
||||
self.user.player_id = int(self.data_recv[5])
|
||||
|
||||
def update_room(self, user: 'Player' = None) -> None:
|
||||
'''更新房间'''
|
||||
@@ -142,7 +158,7 @@ class LocalMultiPlayer:
|
||||
self.data_swap((3, self.user.token))
|
||||
self.room = Room()
|
||||
self.room.room_code = self.data_recv[1]
|
||||
self.room.room_id = self.data_recv[2]
|
||||
self.room.song_unlock = self.data_recv[5]
|
||||
self.user.key = self.data_recv[3]
|
||||
self.user.player_id = self.data_recv[4]
|
||||
self.room.room_id = int(self.data_recv[2])
|
||||
self.room.song_unlock = b64decode(self.data_recv[5])
|
||||
self.user.key = b64decode(self.data_recv[3])
|
||||
self.user.player_id = int(self.data_recv[4])
|
||||
|
||||
Reference in New Issue
Block a user