mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2025-12-14 08:06:23 +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文件解析器'''
|
||||
|
||||
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
|
||||
songs: dict = {} # {song_id: value, ...}
|
||||
@@ -55,7 +55,7 @@ class SonglistParser:
|
||||
# songlist没有,则只限制文件名
|
||||
return file_name in SonglistParser.FILE_NAMES
|
||||
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:
|
||||
return True
|
||||
return False
|
||||
@@ -98,10 +98,15 @@ class SonglistParser:
|
||||
r |= 8
|
||||
|
||||
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
|
||||
elif extra_file['file_name'] == SonglistParser.FILE_NAMES[7]:
|
||||
elif x == SonglistParser.FILE_NAMES[7]:
|
||||
r |= 128
|
||||
elif x == SonglistParser.FILE_NAMES[8]:
|
||||
r |= 256
|
||||
elif x == SonglistParser.FILE_NAMES[9]:
|
||||
r |= 512
|
||||
|
||||
return {song['id']: r}
|
||||
|
||||
@@ -297,7 +302,7 @@ class DownloadList(UserDownload):
|
||||
re['audio']['3'] = {"checksum": x.hash, "url": x.url}
|
||||
else:
|
||||
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:
|
||||
re['additional_files'] = []
|
||||
|
||||
@@ -307,6 +312,7 @@ class DownloadList(UserDownload):
|
||||
else:
|
||||
re['additional_files'].append(
|
||||
{"checksum": x.hash, 'file_name': i})
|
||||
# 有参数 requirement 作用未知
|
||||
else:
|
||||
if 'chart' not in re:
|
||||
re['chart'] = {}
|
||||
|
||||
@@ -16,6 +16,7 @@ logging.basicConfig(format='[%(asctime)s] %(levelname)s in %(module)s: %(message
|
||||
class UDP_handler(socketserver.BaseRequestHandler):
|
||||
def handle(self):
|
||||
client_msg, server = self.request
|
||||
# print(client_msg)
|
||||
try:
|
||||
token = client_msg[:8]
|
||||
iv = client_msg[8:20]
|
||||
|
||||
@@ -43,7 +43,9 @@ def unique_random(dataset, length=8, random_func=None):
|
||||
|
||||
def clear_player(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]
|
||||
|
||||
|
||||
@@ -51,6 +53,7 @@ def clear_room(room):
|
||||
# 清除房间信息
|
||||
room_id = room.room_id
|
||||
room_code = room.room_code
|
||||
logging.info(f'Clean room `{room_code}`')
|
||||
del Store.room_id_dict[room_id]
|
||||
del Store.room_code_dict[room_code]
|
||||
del room
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import logging
|
||||
from time import time
|
||||
|
||||
from .config import Config
|
||||
@@ -44,6 +45,10 @@ class Player:
|
||||
|
||||
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):
|
||||
self.player_name = player_name.encode('ascii')
|
||||
if len(self.player_name) > 16:
|
||||
@@ -133,16 +138,23 @@ class Room:
|
||||
for i in range(4):
|
||||
if self.players[i].player_id == self.host_id:
|
||||
for j in range(1, 4):
|
||||
if self.players[(i + j) % 4].player_id != 0:
|
||||
self.host_id = self.players[(i + j) % 4].player_id
|
||||
player = self.players[(i + j) % 4]
|
||||
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
|
||||
|
||||
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()
|
||||
|
||||
logging.info(
|
||||
f'Player `{player.name}` leaves room `{self.room_code}`')
|
||||
|
||||
self.players[player_index].online = 0
|
||||
self.players[player_index] = Player()
|
||||
self.update_song_unlock()
|
||||
@@ -203,3 +215,10 @@ class Room:
|
||||
|
||||
for i in max_score_i:
|
||||
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
|
||||
|
||||
from .udp_class import Room, bi
|
||||
@@ -44,6 +45,8 @@ class CommandParser:
|
||||
for i in self.room.players:
|
||||
if i.player_id == player_id and i.online == 1:
|
||||
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.room.command_queue.append(self.s.command_10())
|
||||
@@ -189,6 +192,8 @@ class CommandParser:
|
||||
# 将换房主时间提前到此刻
|
||||
self.room.make_round()
|
||||
|
||||
logging.info(f'Room `{self.room.room_code}` starts playing')
|
||||
|
||||
if self.room.state in (4, 5, 6):
|
||||
timestamp = round(time.time() * 1000)
|
||||
self.room.countdown -= timestamp - self.room.timestamp
|
||||
|
||||
Reference in New Issue
Block a user