mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2026-02-15 04:47:32 +08:00
[Enhance] Link Play log & video download
- Add support for downloading `video_720.mp4` & `video_1080.mp4` - More detailed log for Link Play #135
This commit is contained in:
@@ -25,7 +25,7 @@ class SonglistParser:
|
|||||||
'''songlist文件解析器'''
|
'''songlist文件解析器'''
|
||||||
|
|
||||||
FILE_NAMES = ['0.aff', '1.aff', '2.aff', '3.aff',
|
FILE_NAMES = ['0.aff', '1.aff', '2.aff', '3.aff',
|
||||||
'base.ogg', '3.ogg', 'video.mp4', 'video_audio.ogg']
|
'base.ogg', '3.ogg', 'video.mp4', 'video_audio.ogg', 'video_720.mp4', 'video_1080.mp4']
|
||||||
|
|
||||||
has_songlist = False
|
has_songlist = False
|
||||||
songs: dict = {} # {song_id: value, ...}
|
songs: dict = {} # {song_id: value, ...}
|
||||||
@@ -55,7 +55,7 @@ class SonglistParser:
|
|||||||
# songlist没有,则只限制文件名
|
# songlist没有,则只限制文件名
|
||||||
return file_name in SonglistParser.FILE_NAMES
|
return file_name in SonglistParser.FILE_NAMES
|
||||||
rule = SonglistParser.songs[song_id]
|
rule = SonglistParser.songs[song_id]
|
||||||
for i in range(8):
|
for i in range(10):
|
||||||
if file_name == SonglistParser.FILE_NAMES[i] and rule & (1 << i) != 0:
|
if file_name == SonglistParser.FILE_NAMES[i] and rule & (1 << i) != 0:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
@@ -98,10 +98,15 @@ class SonglistParser:
|
|||||||
r |= 8
|
r |= 8
|
||||||
|
|
||||||
for extra_file in song.get('additional_files', []):
|
for extra_file in song.get('additional_files', []):
|
||||||
if extra_file['file_name'] == SonglistParser.FILE_NAMES[6]:
|
x = extra_file['file_name']
|
||||||
|
if x == SonglistParser.FILE_NAMES[6]:
|
||||||
r |= 64
|
r |= 64
|
||||||
elif extra_file['file_name'] == SonglistParser.FILE_NAMES[7]:
|
elif x == SonglistParser.FILE_NAMES[7]:
|
||||||
r |= 128
|
r |= 128
|
||||||
|
elif x == SonglistParser.FILE_NAMES[8]:
|
||||||
|
r |= 256
|
||||||
|
elif x == SonglistParser.FILE_NAMES[9]:
|
||||||
|
r |= 512
|
||||||
|
|
||||||
return {song['id']: r}
|
return {song['id']: r}
|
||||||
|
|
||||||
@@ -297,7 +302,7 @@ class DownloadList(UserDownload):
|
|||||||
re['audio']['3'] = {"checksum": x.hash, "url": x.url}
|
re['audio']['3'] = {"checksum": x.hash, "url": x.url}
|
||||||
else:
|
else:
|
||||||
re['audio']['3'] = {"checksum": x.hash}
|
re['audio']['3'] = {"checksum": x.hash}
|
||||||
elif i in ('video.mp4', 'video_audio.ogg'):
|
elif i in ('video.mp4', 'video_audio.ogg', 'video_720.mp4', 'video_1080.mp4'):
|
||||||
if 'additional_files' not in re:
|
if 'additional_files' not in re:
|
||||||
re['additional_files'] = []
|
re['additional_files'] = []
|
||||||
|
|
||||||
@@ -307,6 +312,7 @@ class DownloadList(UserDownload):
|
|||||||
else:
|
else:
|
||||||
re['additional_files'].append(
|
re['additional_files'].append(
|
||||||
{"checksum": x.hash, 'file_name': i})
|
{"checksum": x.hash, 'file_name': i})
|
||||||
|
# 有参数 requirement 作用未知
|
||||||
else:
|
else:
|
||||||
if 'chart' not in re:
|
if 'chart' not in re:
|
||||||
re['chart'] = {}
|
re['chart'] = {}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ logging.basicConfig(format='[%(asctime)s] %(levelname)s in %(module)s: %(message
|
|||||||
class UDP_handler(socketserver.BaseRequestHandler):
|
class UDP_handler(socketserver.BaseRequestHandler):
|
||||||
def handle(self):
|
def handle(self):
|
||||||
client_msg, server = self.request
|
client_msg, server = self.request
|
||||||
|
# print(client_msg)
|
||||||
try:
|
try:
|
||||||
token = client_msg[:8]
|
token = client_msg[:8]
|
||||||
iv = client_msg[8:20]
|
iv = client_msg[8:20]
|
||||||
|
|||||||
@@ -43,7 +43,9 @@ def unique_random(dataset, length=8, random_func=None):
|
|||||||
|
|
||||||
def clear_player(token):
|
def clear_player(token):
|
||||||
# 清除玩家信息和token
|
# 清除玩家信息和token
|
||||||
del Store.player_dict[Store.link_play_data[token]['player_id']]
|
player_id = Store.link_play_data[token]['player_id']
|
||||||
|
logging.info(f'Clean player `{Store.player_dict[player_id].name}`')
|
||||||
|
del Store.player_dict[player_id]
|
||||||
del Store.link_play_data[token]
|
del Store.link_play_data[token]
|
||||||
|
|
||||||
|
|
||||||
@@ -51,6 +53,7 @@ def clear_room(room):
|
|||||||
# 清除房间信息
|
# 清除房间信息
|
||||||
room_id = room.room_id
|
room_id = room.room_id
|
||||||
room_code = room.room_code
|
room_code = room.room_code
|
||||||
|
logging.info(f'Clean room `{room_code}`')
|
||||||
del Store.room_id_dict[room_id]
|
del Store.room_id_dict[room_id]
|
||||||
del Store.room_code_dict[room_code]
|
del Store.room_code_dict[room_code]
|
||||||
del room
|
del room
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import logging
|
||||||
from time import time
|
from time import time
|
||||||
|
|
||||||
from .config import Config
|
from .config import Config
|
||||||
@@ -44,6 +45,10 @@ class Player:
|
|||||||
|
|
||||||
self.start_command_num = 0
|
self.start_command_num = 0
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self) -> str:
|
||||||
|
return self.player_name.decode('ascii').rstrip('\x00')
|
||||||
|
|
||||||
def set_player_name(self, player_name: str):
|
def set_player_name(self, player_name: str):
|
||||||
self.player_name = player_name.encode('ascii')
|
self.player_name = player_name.encode('ascii')
|
||||||
if len(self.player_name) > 16:
|
if len(self.player_name) > 16:
|
||||||
@@ -133,16 +138,23 @@ class Room:
|
|||||||
for i in range(4):
|
for i in range(4):
|
||||||
if self.players[i].player_id == self.host_id:
|
if self.players[i].player_id == self.host_id:
|
||||||
for j in range(1, 4):
|
for j in range(1, 4):
|
||||||
if self.players[(i + j) % 4].player_id != 0:
|
player = self.players[(i + j) % 4]
|
||||||
self.host_id = self.players[(i + j) % 4].player_id
|
if player.player_id != 0:
|
||||||
|
self.host_id = player.player_id
|
||||||
|
logging.info(
|
||||||
|
f'Player `{player.name}` becomes the host of room `{self.room_code}`')
|
||||||
break
|
break
|
||||||
break
|
break
|
||||||
|
|
||||||
def delete_player(self, player_index: int):
|
def delete_player(self, player_index: int):
|
||||||
# 删除某个玩家
|
# 删除某个玩家
|
||||||
if self.players[player_index].player_id == self.host_id:
|
player = self.players[player_index]
|
||||||
|
if player.player_id == self.host_id:
|
||||||
self.make_round()
|
self.make_round()
|
||||||
|
|
||||||
|
logging.info(
|
||||||
|
f'Player `{player.name}` leaves room `{self.room_code}`')
|
||||||
|
|
||||||
self.players[player_index].online = 0
|
self.players[player_index].online = 0
|
||||||
self.players[player_index] = Player()
|
self.players[player_index] = Player()
|
||||||
self.update_song_unlock()
|
self.update_song_unlock()
|
||||||
@@ -203,3 +215,10 @@ class Room:
|
|||||||
|
|
||||||
for i in max_score_i:
|
for i in max_score_i:
|
||||||
self.players[i].best_player_flag = 1
|
self.players[i].best_player_flag = 1
|
||||||
|
|
||||||
|
logging.info(
|
||||||
|
f'Room `{self.room_code}` finishes song `{self.song_idx}`')
|
||||||
|
for i in self.players:
|
||||||
|
if i.player_id != 0:
|
||||||
|
logging.info(
|
||||||
|
f'- Player `{i.name}` - Score: {i.last_score} Cleartype: {i.last_cleartype} Difficulty: {i.last_difficulty}')
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import logging
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from .udp_class import Room, bi
|
from .udp_class import Room, bi
|
||||||
@@ -44,6 +45,8 @@ class CommandParser:
|
|||||||
for i in self.room.players:
|
for i in self.room.players:
|
||||||
if i.player_id == player_id and i.online == 1:
|
if i.player_id == player_id and i.online == 1:
|
||||||
self.room.host_id = player_id
|
self.room.host_id = player_id
|
||||||
|
logging.info(
|
||||||
|
f'Player `{i.name}` becomes the host of room `{self.room.room_code}`')
|
||||||
|
|
||||||
self.s.random_code = self.command[16:24]
|
self.s.random_code = self.command[16:24]
|
||||||
self.room.command_queue.append(self.s.command_10())
|
self.room.command_queue.append(self.s.command_10())
|
||||||
@@ -189,6 +192,8 @@ class CommandParser:
|
|||||||
# 将换房主时间提前到此刻
|
# 将换房主时间提前到此刻
|
||||||
self.room.make_round()
|
self.room.make_round()
|
||||||
|
|
||||||
|
logging.info(f'Room `{self.room.room_code}` starts playing')
|
||||||
|
|
||||||
if self.room.state in (4, 5, 6):
|
if self.room.state in (4, 5, 6):
|
||||||
timestamp = round(time.time() * 1000)
|
timestamp = round(time.time() * 1000)
|
||||||
self.room.countdown -= timestamp - self.room.timestamp
|
self.room.countdown -= timestamp - self.room.timestamp
|
||||||
|
|||||||
Reference in New Issue
Block a user