mirror of
https://github.com/TriM-Organization/Musicreater.git
synced 2026-04-29 20:55:54 +00:00
177 lines
5.0 KiB
Python
177 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
音·创 v3 内置的 指令生成插件的进度条相关内容
|
|
"""
|
|
|
|
"""
|
|
版权所有 © 2026 金羿、玉衡Alioth
|
|
Copyright © 2026 Eilles, YuhengAlioth
|
|
|
|
开源相关声明请见 仓库根目录下的 License.md
|
|
Terms & Conditions: License.md in the root directory
|
|
"""
|
|
|
|
# 睿乐组织 开发交流群 861684859
|
|
# Email TriM-Organization@hotmail.com
|
|
# 若需转载或借鉴 许可声明请查看仓库目录下的 License.md
|
|
|
|
|
|
from dataclasses import dataclass
|
|
from typing import BinaryIO, Optional, Dict, List, Callable, Tuple, Mapping
|
|
|
|
|
|
# 这个类也有很大的优化空间a
|
|
@dataclass(init=False)
|
|
class ProgressBarStyle:
|
|
"""进度条样式类"""
|
|
|
|
style_base_string: str
|
|
"""基础样式"""
|
|
|
|
progress_toplay: str
|
|
"""未播放之样式"""
|
|
|
|
progress_played: str
|
|
"""已播放之样式"""
|
|
|
|
is_animate_autoloop: bool
|
|
"""所示动画是否循环"""
|
|
|
|
animate_circle: Dict[str, Dict[int, str]]
|
|
"""定义动画样式"""
|
|
|
|
def __init__(
|
|
self,
|
|
base_string: str = "【%%N】%A%▶ %%s/%^s (%%t|%^t) \n"
|
|
"[§e_________________________§r] %%%",
|
|
to_play_style: str = "§7=",
|
|
played_style: str = "=",
|
|
animate_loop: bool = True,
|
|
animate_circle: Dict[str, Dict[int, str]] = {
|
|
"%A%": {5: "-", 10: "\\\\", 15: "|", 20: "/"}
|
|
},
|
|
):
|
|
"""
|
|
用于存储进度条样式的类,标识符替换顺序如下表
|
|
|
|
| 标识符 | 指定的可变量 |
|
|
|---------|----------------|
|
|
| `%%N` | 乐曲名(即传入的文件名)|
|
|
| `%%s` | 当前计分板值 |
|
|
| `%^s` | 计分板最大值 |
|
|
| `%%t` | 当前播放时间 |
|
|
| `%^t` | 曲目总时长 |
|
|
| `%%%` | 当前进度比率 |
|
|
| `_` | 用以表示进度条占位|
|
|
| `%*%` | 指定*的动画内容 |
|
|
|
|
Parameters
|
|
------------
|
|
base_string: str
|
|
基础样式,用以定义进度条整体
|
|
to_play_style: str
|
|
进度条样式:尚未播放的样子
|
|
played_style: str
|
|
已经播放的样子
|
|
|
|
Returns
|
|
---------
|
|
ProgressBarStyle 类
|
|
"""
|
|
|
|
self.style_base_string = base_string
|
|
self.progress_toplay = to_play_style
|
|
self.progress_played = played_style
|
|
self.is_animate_autoloop = animate_loop
|
|
self.animate_circle = animate_circle
|
|
|
|
def set_base_style(self, value: str):
|
|
"""设置基础样式"""
|
|
self.style_base_string = value
|
|
|
|
def set_to_play_style(self, value: str):
|
|
"""设置未播放之样式"""
|
|
self.progress_toplay = value
|
|
|
|
def set_played_style(self, value: str):
|
|
"""设置已播放之样式"""
|
|
self.progress_played = value
|
|
|
|
def copy(self):
|
|
return ProgressBarStyle(
|
|
self.style_base_string,
|
|
self.progress_toplay,
|
|
self.progress_played,
|
|
self.is_animate_autoloop,
|
|
self.animate_circle,
|
|
)
|
|
|
|
def play_output(
|
|
self,
|
|
played_ticks: int,
|
|
total_ticks: int,
|
|
music_name: str = "无题",
|
|
) -> str:
|
|
"""
|
|
直接依照此格式输出一个进度条
|
|
|
|
Parameters
|
|
------------
|
|
played_delays: int
|
|
当前播放进度积分值
|
|
total_delays: int
|
|
乐器总延迟数(计分板值)
|
|
music_name: str
|
|
曲名
|
|
|
|
Returns
|
|
---------
|
|
str
|
|
进度条字符串
|
|
"""
|
|
|
|
alpha_string = (
|
|
self.style_base_string.replace("%%N", music_name)
|
|
.replace("%%s", str(played_ticks))
|
|
.replace("%^s", str(total_ticks))
|
|
.replace("%%t", mctick2timestr(played_ticks))
|
|
.replace("%^t", mctick2timestr(total_ticks))
|
|
.replace(
|
|
"%%%",
|
|
"{:0>5.2f}%".format(int(10000 * played_ticks / total_ticks) / 100),
|
|
)
|
|
.replace(
|
|
"_",
|
|
self.progress_played,
|
|
(played_ticks * self.style_base_string.count("_") // total_ticks) + 1,
|
|
)
|
|
.replace("_", self.progress_toplay)
|
|
)
|
|
|
|
for key, animate_dict in self.animate_circle.items():
|
|
max_animate_tick = max(animate_dict.keys())
|
|
if self.is_animate_autoloop:
|
|
animate_time_key = 0
|
|
for time_key in animate_dict.keys():
|
|
animate_time_key = time_key
|
|
if time_key > played_ticks % max_animate_tick:
|
|
break
|
|
else:
|
|
animate_time_key = max_animate_tick
|
|
alpha_string = alpha_string.replace(key, animate_dict[animate_time_key])
|
|
return alpha_string
|
|
|
|
|
|
def mctick2timestr(mc_tick: int) -> str:
|
|
"""
|
|
将《我的世界》的游戏刻计转为表示时间的字符串
|
|
"""
|
|
return "{:0>2d}:{:0>2d}".format(mc_tick // 1200, (mc_tick // 20) % 60)
|
|
|
|
|
|
DEFAULT_PROGRESSBAR_STYLE = ProgressBarStyle()
|
|
"""
|
|
默认的进度条样式
|
|
"""
|