nonebot-plugin-osubot 6.23.0__py3-none-any.whl → 6.24.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nonebot-plugin-osubot might be problematic. Click here for more details.

Files changed (43) hide show
  1. nonebot_plugin_osubot/api.py +8 -5
  2. nonebot_plugin_osubot/draw/bmap.py +20 -22
  3. nonebot_plugin_osubot/draw/bp.py +1 -1
  4. nonebot_plugin_osubot/draw/echarts.py +8 -1
  5. nonebot_plugin_osubot/draw/info.py +2 -0
  6. nonebot_plugin_osubot/draw/map.py +7 -3
  7. nonebot_plugin_osubot/draw/score.py +4 -4
  8. nonebot_plugin_osubot/draw/taiko_preview.py +14 -13
  9. nonebot_plugin_osubot/draw/templates/bpa_chart.html +1 -1
  10. nonebot_plugin_osubot/file.py +1 -12
  11. nonebot_plugin_osubot/mania/__init__.py +9 -10
  12. nonebot_plugin_osubot/matcher/bp_analyze.py +14 -9
  13. nonebot_plugin_osubot/matcher/guess.py +3 -3
  14. nonebot_plugin_osubot/matcher/map_convert.py +12 -7
  15. nonebot_plugin_osubot/matcher/medal.py +1 -1
  16. nonebot_plugin_osubot/matcher/preview.py +3 -3
  17. nonebot_plugin_osubot/matcher/recommend.py +7 -12
  18. nonebot_plugin_osubot/osufile/mods/AP.png +0 -0
  19. nonebot_plugin_osubot/osufile/mods/CL.png +0 -0
  20. nonebot_plugin_osubot/osufile/mods/DT.png +0 -0
  21. nonebot_plugin_osubot/osufile/mods/EZ.png +0 -0
  22. nonebot_plugin_osubot/osufile/mods/FI.png +0 -0
  23. nonebot_plugin_osubot/osufile/mods/FL.png +0 -0
  24. nonebot_plugin_osubot/osufile/mods/HD.png +0 -0
  25. nonebot_plugin_osubot/osufile/mods/HR.png +0 -0
  26. nonebot_plugin_osubot/osufile/mods/HT.png +0 -0
  27. nonebot_plugin_osubot/osufile/mods/MR.png +0 -0
  28. nonebot_plugin_osubot/osufile/mods/NC.png +0 -0
  29. nonebot_plugin_osubot/osufile/mods/NF.png +0 -0
  30. nonebot_plugin_osubot/osufile/mods/PF.png +0 -0
  31. nonebot_plugin_osubot/osufile/mods/RX.png +0 -0
  32. nonebot_plugin_osubot/osufile/mods/SD.png +0 -0
  33. nonebot_plugin_osubot/osufile/mods/SO.png +0 -0
  34. nonebot_plugin_osubot/osufile/mods/TD.png +0 -0
  35. nonebot_plugin_osubot/osufile/mods/V2.png +0 -0
  36. nonebot_plugin_osubot/schema/__init__.py +0 -2
  37. nonebot_plugin_osubot/schema/beatmapsets.py +42 -0
  38. nonebot_plugin_osubot/schema/score.py +1 -0
  39. {nonebot_plugin_osubot-6.23.0.dist-info → nonebot_plugin_osubot-6.24.0.dist-info}/METADATA +1 -1
  40. {nonebot_plugin_osubot-6.23.0.dist-info → nonebot_plugin_osubot-6.24.0.dist-info}/RECORD +41 -42
  41. nonebot_plugin_osubot/draw/templates/t.html +0 -58
  42. nonebot_plugin_osubot/schema/sayo_beatmap.py +0 -59
  43. {nonebot_plugin_osubot-6.23.0.dist-info → nonebot_plugin_osubot-6.24.0.dist-info}/WHEEL +0 -0
@@ -11,19 +11,19 @@ from nonebot import get_plugin_config
11
11
  from httpx import Response
12
12
 
13
13
  from .network.manager import network_manager
14
+ from .schema.beatmapsets import BeatmapSets
14
15
  from .utils import FGM
15
16
  from .config import Config
16
17
  from .mods import get_mods
17
18
  from .network import auto_retry
18
19
  from .exceptions import NetworkError
19
20
  from .network.first_response import get_first_response
20
- from .schema import User, NewScore, SayoBeatmap, RecommendData
21
+ from .schema import User, NewScore, RecommendData
21
22
  from .schema.score import UnifiedScore, NewStatistics, UnifiedBeatmap
22
23
  from .schema.ppysb import InfoResponse, ScoresResponse, V2ScoresResponse
23
24
  from .schema.user import Level, GradeCounts, UnifiedUser, UserStatistics
24
25
 
25
26
  api = "https://osu.ppy.sh/api/v2"
26
- sayoapi = "https://api.sayobot.cn"
27
27
  cache = ExpiringDict(max_len=1, max_age_seconds=86400)
28
28
  plugin_config = get_plugin_config(Config)
29
29
 
@@ -122,6 +122,7 @@ async def fetch_score_batch(
122
122
  hp=i.beatmap.drain,
123
123
  od=i.beatmap.accuracy,
124
124
  stars=i.beatmap.difficulty_rating,
125
+ convert=i.beatmap.convert,
125
126
  ),
126
127
  beatmapset=i.beatmapset,
127
128
  )
@@ -189,6 +190,7 @@ async def get_user_scores(
189
190
  ended_at=datetime.strptime(i.play_time, "%Y-%m-%dT%H:%M:%S") + timedelta(hours=8),
190
191
  max_combo=i.max_combo,
191
192
  passed=True,
193
+ pp=i.pp,
192
194
  statistics=NewStatistics(
193
195
  miss=i.nmiss,
194
196
  perfect=i.ngeki,
@@ -412,9 +414,10 @@ async def get_random_bg() -> Optional[bytes]:
412
414
  return res.content
413
415
 
414
416
 
415
- async def get_sayo_map_info(sid, t=0) -> SayoBeatmap:
416
- res = await safe_async_get(f"https://api.sayobot.cn/v2/beatmapinfo?K={sid}&T={t}")
417
- return SayoBeatmap(**res.json())
417
+ async def get_beatmapsets_info(sid) -> BeatmapSets:
418
+ url = f"https://osu.ppy.sh/api/v2/beatmapsets/{sid}"
419
+ res = await make_request(url, await get_headers(), "未查询到该谱面集(Setid)信息")
420
+ return BeatmapSets(**res)
418
421
 
419
422
 
420
423
  async def get_map_bg(mapid, sid, bg_name) -> BytesIO:
@@ -4,25 +4,20 @@ from datetime import datetime, timedelta
4
4
  from PIL import ImageDraw, ImageFilter, ImageEnhance
5
5
 
6
6
  from ..file import get_projectimg
7
- from ..api import get_sayo_map_info
8
- from ..exceptions import NetworkError
7
+ from ..api import get_beatmapsets_info
9
8
  from .utils import crop_bg, stars_diff, calc_songlen
10
- from .static import Image, BarImg, IconLs, Torus_SemiBold_20, Torus_SemiBold_40, Torus_SemiBold_50, extra_30
9
+ from .static import Image, BarImg, IconLs, Torus_SemiBold_20, Torus_SemiBold_40, Torus_SemiBold_50, extra_30, Stars
11
10
 
12
11
 
13
12
  async def draw_bmap_info(mapid) -> BytesIO:
14
- sayo_info = await get_sayo_map_info(mapid)
15
- if sayo_info.status == -1:
16
- raise NetworkError("在sayobot未查询到该地图")
17
- data = sayo_info.data
18
-
13
+ data = await get_beatmapsets_info(mapid)
19
14
  coverurl = f"https://assets.ppy.sh/beatmaps/{mapid}/covers/cover@2x.jpg"
20
15
  cover = await get_projectimg(coverurl)
21
16
  # 新建
22
- if len(data.bid_data) > 20:
17
+ if len(data.beatmaps) > 20:
23
18
  im_h = 400 + 102 * 20
24
19
  else:
25
- im_h = 400 + 102 * (len(data.bid_data) - 1)
20
+ im_h = 400 + 102 * (len(data.beatmaps) - 1)
26
21
  im = Image.new("RGBA", (1200, im_h), (31, 41, 46, 255))
27
22
  draw = ImageDraw.Draw(im)
28
23
  # 背景
@@ -37,35 +32,36 @@ async def draw_bmap_info(mapid) -> BytesIO:
37
32
  # mapper
38
33
  draw.text((25, 105), f"谱面作者: {data.creator}", font=Torus_SemiBold_20, anchor="lt")
39
34
  # rank时间
40
- if data.approved_date == -1:
35
+ if not data.ranked_date:
41
36
  approved_date = "谱面状态可能非ranked"
42
37
  else:
43
- datearray = datetime.utcfromtimestamp(data.approved_date)
38
+ datearray = datetime.fromisoformat(data.ranked_date.replace("Z", ""))
44
39
  approved_date = (datearray + timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S")
45
40
  draw.text((25, 140), f"上架时间: {approved_date}", font=Torus_SemiBold_20, anchor="lt")
46
41
  # 来源
47
- draw.text((25, 175), f"Source: {data.source}", font=Torus_SemiBold_20, anchor="lt")
42
+ if data.source:
43
+ draw.text((25, 175), f"Source: {data.source}", font=Torus_SemiBold_20, anchor="lt")
48
44
  # bpm
49
45
  draw.text((1150, 105), f"BPM: {data.bpm}", font=Torus_SemiBold_20, anchor="rt")
50
46
  # 曲长
51
- music_len = calc_songlen(data.bid_data[0].length)
47
+ music_len = calc_songlen(data.beatmaps[0].total_length)
52
48
  draw.text((1150, 140), f"length: {music_len}", font=Torus_SemiBold_20, anchor="rt")
53
49
  # Setid
54
50
  draw.text((1150, 35), f"Setid: {mapid}", font=Torus_SemiBold_20, anchor="rt")
55
- gmap = sorted(data.bid_data, key=lambda k: k.star, reverse=False)
51
+ gmap = sorted(data.beatmaps, key=lambda k: k.difficulty_rating, reverse=False)
56
52
  for num, cmap in enumerate(gmap):
57
53
  if num < 20:
58
54
  h_num = 102 * num
59
55
  # 难度
60
- draw.text((20, 320 + h_num), IconLs[cmap.mode], font=extra_30, anchor="lt")
56
+ draw.text((20, 320 + h_num), IconLs[cmap.mode_int], font=extra_30, anchor="lt")
61
57
  # 星星
62
- stars_bg = stars_diff(cmap.star)
58
+ stars_bg = stars_diff(cmap.difficulty_rating, Stars)
63
59
  stars_img = stars_bg.resize((80, 30))
64
60
  im.alpha_composite(stars_img, (60, 320 + h_num))
65
61
  # diff
66
62
  im.alpha_composite(BarImg, (10, 365 + h_num))
67
63
  gc = ["CS", "HP", "OD", "AR"]
68
- for index, i in enumerate((cmap.CS, cmap.HP, cmap.OD, cmap.AR)):
64
+ for index, i in enumerate((cmap.cs, cmap.drain, cmap.accuracy, cmap.ar)):
69
65
  diff_len = int(200 * i / 10) if i <= 10 else 200
70
66
  diff_bg = Image.new("RGBA", (diff_len, 12), (255, 255, 255, 255))
71
67
  im.alpha_composite(diff_bg, (50 + 300 * index, 365 + h_num))
@@ -90,11 +86,13 @@ async def draw_bmap_info(mapid) -> BytesIO:
90
86
  anchor="lm",
91
87
  )
92
88
  # 难度
93
- if cmap.star < 6.5:
89
+ if cmap.difficulty_rating < 6.5:
94
90
  color = (0, 0, 0, 255)
95
91
  else:
96
92
  color = (255, 217, 102, 255)
97
- draw.text((65, 335 + h_num), f"★{cmap.star:.2f}", font=Torus_SemiBold_20, anchor="lm", fill=color)
93
+ draw.text(
94
+ (65, 335 + h_num), f"★{cmap.difficulty_rating:.2f}", font=Torus_SemiBold_20, anchor="lm", fill=color
95
+ )
98
96
  # version
99
97
  draw.text(
100
98
  (150, 335 + h_num),
@@ -105,14 +103,14 @@ async def draw_bmap_info(mapid) -> BytesIO:
105
103
  # mapid
106
104
  draw.text(
107
105
  (1150, 328 + h_num),
108
- f"Mapid: {cmap.bid}",
106
+ f"Mapid: {cmap.id}",
109
107
  font=Torus_SemiBold_20,
110
108
  anchor="rm",
111
109
  )
112
110
  # maxcb
113
111
  draw.text(
114
112
  (700, 328 + h_num),
115
- f"Max Combo: {cmap.maxcombo}",
113
+ f"Max Combo: {cmap.max_combo or 0}",
116
114
  font=Torus_SemiBold_20,
117
115
  anchor="lm",
118
116
  )
@@ -48,7 +48,7 @@ async def draw_bp(
48
48
  # 判断是否开启lazer模式
49
49
  if is_lazer:
50
50
  score_info.legacy_total_score = score_info.total_score
51
- if score_info.ruleset_id == 3 and not is_lazer:
51
+ if score_info.ruleset_id == 3 and not is_lazer and source != "ppysb":
52
52
  score_info.accuracy = cal_legacy_acc(score_info.statistics)
53
53
  if not is_lazer:
54
54
  is_hidden = any(i in score_info.mods for i in (Mod(acronym="HD"), Mod(acronym="FL"), Mod(acronym="FI")))
@@ -20,7 +20,14 @@ async def draw_bpa_plot(name, pp_ls, length_ls, mod_pp_ls, mapper_pp_ls) -> byte
20
20
  pic = await template_to_pic(
21
21
  template_path,
22
22
  template_name,
23
- {"name": name, "pp_ls": pp_ls, "length_ls": length_ls, "mod_pp_ls": mod_pp_ls, "mapper_pp_ls": mapper_pp_ls},
23
+ {
24
+ "name": name,
25
+ "pp_ls": pp_ls,
26
+ "length_ls": length_ls,
27
+ "mod_pp_ls": mod_pp_ls,
28
+ "mapper_pp_ls": mapper_pp_ls,
29
+ "length": len(pp_ls),
30
+ },
24
31
  )
25
32
  return pic
26
33
 
@@ -221,7 +221,9 @@ async def draw_info(uid: Union[int, str], mode: str, day: int, source: str) -> B
221
221
  # 总命中
222
222
  op, value = info_calc(statistics.total_hits, n_count)
223
223
  t_count = f"{statistics.total_hits:,}({op}{value:,})" if value != 0 else f"{statistics.total_hits:,}"
224
+ avg_hit = 0 if statistics.play_count == 0 else statistics.total_hits // statistics.play_count
224
225
  draw.text((935, 1175), t_count, font=Torus_Regular_40, anchor="rt")
226
+ draw.text((250, 945), f"(avg.{avg_hit:,})", font=Torus_Regular_25, anchor="lt")
225
227
  # 游玩时间
226
228
  sec = timedelta(seconds=statistics.play_time)
227
229
  d_time = datetime(1, 1, 1) + sec
@@ -23,6 +23,7 @@ from .static import (
23
23
  Torus_SemiBold_25,
24
24
  osufile,
25
25
  extra_30,
26
+ Stars,
26
27
  )
27
28
 
28
29
 
@@ -68,7 +69,7 @@ async def draw_map_info(mapid: int, mods: list[str], is_lazer) -> BytesIO:
68
69
  # 模式
69
70
  draw.text((50, 65), IconLs[FGM[mapinfo.mode]], font=extra_30, anchor="lt")
70
71
  # 难度星星
71
- stars_bg = stars_diff(ss_pp_info.difficulty.stars)
72
+ stars_bg = stars_diff(ss_pp_info.difficulty.stars, Stars)
72
73
  stars_img = stars_bg.resize((80, 30))
73
74
  im.alpha_composite(stars_img, (90, 65))
74
75
  if ss_pp_info.difficulty.stars < 6.5:
@@ -155,8 +156,11 @@ async def draw_map_info(mapid: int, mods: list[str], is_lazer) -> BytesIO:
155
156
  if mods:
156
157
  for mods_num, s_mods in enumerate(mods):
157
158
  mods_bg = osufile / "mods" / f"{s_mods.acronym}.png"
158
- mods_img = Image.open(mods_bg).convert("RGBA")
159
- im.alpha_composite(mods_img, (700 + 50 * mods_num, 295))
159
+ try:
160
+ mods_img = Image.open(mods_bg).convert("RGBA")
161
+ im.alpha_composite(mods_img, (700 + 50 * mods_num, 295))
162
+ except FileNotFoundError:
163
+ pass
160
164
  # mapper
161
165
  icon_url = f"https://a.ppy.sh/{mapinfo.user_id}"
162
166
  user_icon = await get_projectimg(icon_url)
@@ -107,7 +107,7 @@ async def draw_score(
107
107
  map_json = await task2
108
108
  # 判断是否开启lazer模式
109
109
  if source == "osu":
110
- score = cal_score_info(is_lazer, score)
110
+ score = cal_score_info(is_lazer, score, source)
111
111
  return await draw_score_pic(score, info, map_json, "", is_lazer, source)
112
112
 
113
113
 
@@ -180,7 +180,7 @@ async def get_score_data(
180
180
  user_path.mkdir(parents=True, exist_ok=True)
181
181
  # 判断是否开启lazer模式
182
182
  if source == "osu":
183
- score = cal_score_info(is_lazer, score)
183
+ score = cal_score_info(is_lazer, score, source)
184
184
  return await draw_score_pic(score, info, map_json, grank, is_lazer, source)
185
185
 
186
186
 
@@ -795,10 +795,10 @@ def cal_legacy_rank(score_info: UnifiedScore, is_hidden: bool):
795
795
  return "N/A"
796
796
 
797
797
 
798
- def cal_score_info(is_lazer: bool, score_info: UnifiedScore) -> UnifiedScore:
798
+ def cal_score_info(is_lazer: bool, score_info: UnifiedScore, source: str = "osu") -> UnifiedScore:
799
799
  if is_lazer:
800
800
  score_info.legacy_total_score = score_info.total_score
801
- if score_info.ruleset_id == 3 and not is_lazer:
801
+ if score_info.ruleset_id == 3 and not is_lazer and source != "ppysb":
802
802
  score_info.accuracy = cal_legacy_acc(score_info.statistics)
803
803
  if not is_lazer:
804
804
  is_hidden = any(i in score_info.mods for i in (Mod(acronym="HD"), Mod(acronym="FL"), Mod(acronym="FI")))
@@ -4,7 +4,7 @@ from pathlib import Path
4
4
 
5
5
  from PIL import Image, ImageDraw
6
6
 
7
- from .static import Torus_Regular_8, Torus_Regular_15, Torus_Regular_20, Torus_Regular_25, Torus_Regular_30
7
+ from .static import Torus_Regular_8, Torus_Regular_15
8
8
 
9
9
  HIT_DON = 0x00
10
10
  HIT_KAT = 0x01
@@ -35,20 +35,21 @@ def map_to_image(map_data) -> BytesIO:
35
35
  img = Image.new(mode="RGB", size=(3000, 30000), color=0x121212)
36
36
  draw = ImageDraw.Draw(img)
37
37
 
38
- title_font = Torus_Regular_30
39
- semi_font = Torus_Regular_25
40
- reg_font = Torus_Regular_20
38
+ # title_font = Torus_Regular_30
39
+ # semi_font = Torus_Regular_25
40
+ # reg_font = Torus_Regular_20
41
41
  small_font = Torus_Regular_15
42
42
  tiny_font = Torus_Regular_8
43
43
 
44
- draw.text(
45
- (LEFT_MARGIN, 40),
46
- map_data.artist + " - " + map_data.title + " [" + map_data.diff + "]",
47
- font=title_font,
48
- fill="#FFF",
49
- )
50
- draw.text((LEFT_MARGIN, 90), "by " + map_data.creator, font=semi_font, fill="#CCC")
51
- draw.text((LEFT_MARGIN, 135), "HP = " + str(map_data.hp) + " OD = " + str(map_data.od), font=reg_font, fill="#AAA")
44
+ # draw.text(
45
+ # (LEFT_MARGIN, 40),
46
+ # map_data.artist + " - " + map_data.title + " [" + map_data.diff + "]",
47
+ # font=title_font,
48
+ # fill="#FFF",
49
+ # )
50
+ # draw.text((LEFT_MARGIN, 90), "by " + map_data.creator, font=semi_font, fill="#CCC")
51
+ # draw.text((LEFT_MARGIN, 135), "HP = " + str(map_data.hp) +
52
+ # " OD = " + str(map_data.od), font=reg_font, fill="#AAA")
52
53
 
53
54
  max_meter = 0
54
55
  timing_sections = [] # (start, beat_ms, meter, [list of hit_object])
@@ -67,7 +68,7 @@ def map_to_image(map_data) -> BytesIO:
67
68
  (map_data.timing_points[i][0], map_data.timing_points[i][1], map_data.timing_points[i][2], current_list)
68
69
  )
69
70
 
70
- y_start = 200
71
+ y_start = 40
71
72
  max_x = 0
72
73
  max_y = 0
73
74
  bar_number = 1
@@ -43,7 +43,7 @@
43
43
  xAxis: [
44
44
  {
45
45
  type: 'category',
46
- data: Array.from({ length: 200 }, (_, i) => i),
46
+ data: Array.from({ length: {{length}} }, (_, i) => i),
47
47
  axisLabel: {
48
48
  interval: 9
49
49
  }
@@ -47,18 +47,6 @@ async def download_map(setid: int) -> Optional[Path]:
47
47
  return filepath
48
48
 
49
49
 
50
- async def download_tmp_osu(map_id):
51
- url = f"https://osu.ppy.sh/osu/{map_id}"
52
- logger.info(f"开始下载谱面: <{map_id}>")
53
- req = await safe_async_get(url)
54
- filename = f"{map_id}.osu"
55
- filepath = map_path / filename
56
- chunk = req.read()
57
- with open(filepath, "wb") as f:
58
- f.write(chunk)
59
- return filepath
60
-
61
-
62
50
  @auto_retry
63
51
  async def download_osu(set_id, map_id):
64
52
  url = [
@@ -71,6 +59,7 @@ async def download_osu(set_id, map_id):
71
59
  if req := await get_first_response(url):
72
60
  filename = f"{map_id}.osu"
73
61
  filepath = map_path / str(set_id) / filename
62
+ filepath.parent.mkdir(parents=True, exist_ok=True)
74
63
  with open(filepath, "wb") as f:
75
64
  f.write(req)
76
65
  return filepath
@@ -25,7 +25,7 @@ from reamber.algorithms.playField.parts import (
25
25
  )
26
26
 
27
27
  from ..file import download_map
28
- from ..schema import SayoBeatmap
28
+ from ..schema.beatmapsets import BeatmapSets
29
29
 
30
30
  osu_path = Path() / "data" / "osu"
31
31
  if not osu_path.exists():
@@ -39,7 +39,7 @@ class Options:
39
39
  od: Optional[float]
40
40
  set: Optional[int]
41
41
  map: Optional[int] = None
42
- sayo_info: Optional[SayoBeatmap] = None
42
+ beatmapsets: Optional[BeatmapSets] = None
43
43
  nsv: bool = False
44
44
  nln: bool = False
45
45
  fln: bool = False
@@ -89,15 +89,14 @@ async def convert_mania_map(options: Options) -> Optional[Path]:
89
89
  with ZipFile(osz_file.absolute()) as my_zip:
90
90
  my_zip.extractall(path)
91
91
  os.remove(osz_file)
92
- if options.sayo_info:
93
- for i in options.sayo_info.data.bid_data:
94
- if i.bid == options.map:
95
- audio_file_name = i.audio
96
- audio_name = audio_file_name[:-4]
97
- audio_type = audio_file_name[-4:]
92
+ if options.beatmapsets:
93
+ for file in path.rglob("*.osu"):
94
+ osu = OsuMap.read_file(str(file.absolute()))
95
+ if osu.beatmap_id == options.map:
96
+ audio_file_name = osu.audio_file_name
97
+ audio_name = osu.audio_file_name[:-4]
98
+ audio_type = osu.audio_file_name[-4:]
98
99
  break
99
- else:
100
- raise Exception("小夜api有问题啊")
101
100
  if options.rate:
102
101
  if options.rate > 10:
103
102
  options.rate = 10
@@ -34,12 +34,16 @@ async def _(event: Event, state: T_State):
34
34
  uid = state["user"]
35
35
  lazer_mode = "lazer模式下" if state["is_lazer"] else "stable模式下"
36
36
  try:
37
- score_ls = await get_user_scores(uid, NGM[state["mode"]], "best", legacy_only=not state["is_lazer"])
37
+ score_ls = await get_user_scores(
38
+ uid, NGM[state["mode"]], "best", state["source"], legacy_only=not state["is_lazer"]
39
+ )
38
40
  except NetworkError as e:
39
41
  await UniMessage.text(
40
42
  f"在查找用户:{state['username']} {NGM[state['mode']]}模式 {lazer_mode}时 {str(e)}"
41
43
  ).finish(reply_to=True)
42
44
  for score in score_ls:
45
+ if not state["is_lazer"] or state["source"] == "ppysb":
46
+ score.mods = [mod for mod in score.mods if mod.acronym != "CL"]
43
47
  for mod in score.mods:
44
48
  if mod.acronym == "DT" or mod.acronym == "NC":
45
49
  score.beatmap.total_length /= 1.5
@@ -89,14 +93,15 @@ async def _(event: Event, state: T_State):
89
93
  pp_data.append({"name": mod, "value": round(pp, 2)})
90
94
  mapper_pp = defaultdict(int)
91
95
  for num, i in enumerate(score_ls):
92
- mapper_pp[i.beatmap.user_id] += i.pp * 0.95**num
93
- mapper_pp = sorted(mapper_pp.items(), key=lambda x: x[1], reverse=True)
94
- mapper_pp = mapper_pp[:9]
95
- users = await get_users([i[0] for i in mapper_pp])
96
- user_dic = {i.id: i.username for i in users}
97
- mapper_pp_data = []
98
- for mapper, pp in mapper_pp:
99
- mapper_pp_data.append({"name": user_dic.get(mapper, ""), "value": round(pp, 2)})
96
+ key = i.beatmap.creator if state["source"] == "ppysb" else i.beatmap.user_id
97
+ mapper_pp[key] += i.pp * 0.95**num
98
+ mapper_pp = sorted(mapper_pp.items(), key=lambda x: x[1], reverse=True)[:9]
99
+ if state["source"] == "ppysb":
100
+ mapper_pp_data = [{"name": mapper, "value": round(pp, 2)} for mapper, pp in mapper_pp]
101
+ else:
102
+ users = await get_users([i[0] for i in mapper_pp])
103
+ user_dic = {i.id: i.username for i in users}
104
+ mapper_pp_data = [{"name": user_dic.get(mapper, ""), "value": round(pp, 2)} for mapper, pp in mapper_pp]
100
105
  if len(mapper_pp_data) > 20:
101
106
  mapper_pp_data = mapper_pp_data[:20]
102
107
  name = f"{state['username']} {NGM[state['mode']]} 模式 "
@@ -26,7 +26,7 @@ from ..exceptions import NetworkError
26
26
  from ..database.models import UserData
27
27
  from ..mania import generate_preview_pic
28
28
  from ..api import safe_async_get, get_user_scores
29
- from ..file import map_path, download_tmp_osu
29
+ from ..file import map_path, download_osu
30
30
  from ..draw.catch_preview import draw_cath_preview
31
31
 
32
32
  games: dict[str, NewScore] = {}
@@ -470,10 +470,10 @@ async def _(
470
470
  chart_games[session_id] = selected_score
471
471
  chart_set_timeout(matcher, session_id)
472
472
  if mode == "3":
473
- osu = await download_tmp_osu(selected_score.beatmap.id)
473
+ osu = await download_osu(selected_score.beatmapset.id, selected_score.beatmap.id)
474
474
  pic = await generate_preview_pic(osu)
475
475
  elif mode == "1":
476
- osu = await download_tmp_osu(selected_score.beatmap.id)
476
+ osu = await download_osu(selected_score.beatmapset.id, selected_score.beatmap.id)
477
477
  beatmap = parse_map(osu)
478
478
  pic = map_to_image(beatmap)
479
479
  else:
@@ -7,8 +7,9 @@ from nonebot import on_command, on_shell_command
7
7
  from nonebot.exception import ParserExit, ActionFailed
8
8
  from nonebot.params import CommandArg, ShellCommandArgv
9
9
 
10
- from ..api import get_sayo_map_info
10
+ from ..api import get_beatmapsets_info, osu_api
11
11
  from ..mania import Options, convert_mania_map
12
+ from ..schema import Beatmap
12
13
 
13
14
  parser = ArgumentParser("convert", description="变换mania谱面")
14
15
  parser.add_argument("--set", type=int, help="要转换的谱面的setid")
@@ -37,9 +38,11 @@ async def _(argv: list[str] = ShellCommandArgv()):
37
38
  return
38
39
  options = Options(**vars(args))
39
40
  if options.map:
40
- sayo_map_info = await get_sayo_map_info(options.map, 1)
41
- options.set = sayo_map_info.data.sid
42
- options.sayo_info = sayo_map_info
41
+ map_data = await osu_api("map", options.map)
42
+ mapinfo = Beatmap(**map_data)
43
+ beatmapsets_info = await get_beatmapsets_info(mapinfo.beatmapset_id)
44
+ options.set = mapinfo.beatmapset_id
45
+ options.beatmapsets = beatmapsets_info
43
46
  if not options.set:
44
47
  await UniMessage.text("请提供需要转换的谱面setid").finish(reply_to=True)
45
48
  if options.nln and options.fln:
@@ -85,9 +88,11 @@ async def _(msg: Message = CommandArg()):
85
88
  args = parser.parse_args(argv)
86
89
  options = Options(**vars(args))
87
90
  if options.map:
88
- sayo_map_info = await get_sayo_map_info(options.map, 1)
89
- options.set = sayo_map_info.data.sid
90
- options.sayo_info = sayo_map_info
91
+ map_data = await osu_api("map", options.map)
92
+ mapinfo = Beatmap(**map_data)
93
+ beatmapsets_info = await get_beatmapsets_info(mapinfo.beatmapset_id)
94
+ options.set = mapinfo.beatmapset_id
95
+ options.beatmapsets = beatmapsets_info
91
96
  osz_path = await convert_mania_map(options)
92
97
  if not osz_path:
93
98
  await UniMessage.text("未找到该地图,请检查是否搞混了mapID与setID").finish(reply_to=True)
@@ -69,6 +69,6 @@ async def _(msg: Message = CommandArg()):
69
69
  for beatmap in medal_data["beatmaps"]:
70
70
  msg += (
71
71
  f"{beatmap['SongTitle']} [{beatmap['DifficultyName']}]\n{beatmap['Difficulty']}⭐\n"
72
- + f"https://osu.ppy.sh/b/{beatmap['BeatmapID']}"
72
+ + f"https://osu.ppy.sh/b/{beatmap['BeatmapID']}\n"
73
73
  )
74
74
  await msg.send()
@@ -5,7 +5,7 @@ from nonebot_plugin_alconna import UniMessage
5
5
  from ..utils import NGM
6
6
  from ..api import osu_api
7
7
  from .utils import split_msg
8
- from ..file import download_tmp_osu
8
+ from ..file import download_osu
9
9
  from ..exceptions import NetworkError
10
10
  from ..mania import generate_preview_pic
11
11
  from ..draw.catch_preview import draw_cath_preview
@@ -24,7 +24,7 @@ async def _(state: T_State):
24
24
  except NetworkError as e:
25
25
  await UniMessage.text(f"查找map_id:{osu_id} 信息时 {str(e)}").finish(reply_to=True)
26
26
  if state["mode"] == "3":
27
- osu = await download_tmp_osu(osu_id)
27
+ osu = await download_osu(data["beatmapset_id"], int(osu_id))
28
28
  if state["_prefix"]["command"][0] == "完整预览":
29
29
  pic = await generate_preview_pic(osu, True)
30
30
  else:
@@ -34,7 +34,7 @@ async def _(state: T_State):
34
34
  pic = await draw_cath_preview(int(osu_id), data["beatmapset_id"], state["mods"])
35
35
  await UniMessage.image(raw=pic).finish(reply_to=True)
36
36
  elif state["mode"] == "1":
37
- osu = await download_tmp_osu(osu_id)
37
+ osu = await download_osu(data["beatmapset_id"], int(osu_id))
38
38
  beatmap = parse_map(osu)
39
39
  pic = map_to_image(beatmap)
40
40
  await UniMessage.image(raw=pic).finish(reply_to=True)
@@ -2,14 +2,14 @@ import re
2
2
  from random import shuffle
3
3
 
4
4
  from nonebot import on_command
5
- from nonebot.log import logger
6
5
  from nonebot.typing import T_State
7
6
  from expiringdict import ExpiringDict
8
7
  from nonebot.internal.matcher import Matcher
9
8
  from nonebot_plugin_alconna import UniMessage
10
9
 
11
10
  from .utils import split_msg
12
- from ..api import get_recommend, update_recommend, get_sayo_map_info
11
+ from ..api import get_recommend, update_recommend, osu_api
12
+ from ..schema import Beatmap
13
13
 
14
14
  recommend = on_command("推荐", priority=11, block=True, aliases={"recommend", "推荐铺面", "推荐谱面"})
15
15
  recommend_cache = ExpiringDict(1000, 60 * 60 * 12)
@@ -41,23 +41,18 @@ async def handle_recommend(state: T_State, matcher: type[Matcher]):
41
41
  break
42
42
  else:
43
43
  await matcher.finish("今天已经没有可以推荐的图啦,明天再来吧")
44
+ return None
44
45
  bid = int(re.findall("https://osu.ppy.sh/beatmaps/(.*)", recommend_map.mapLink)[0])
45
- map_info = await get_sayo_map_info(bid, 1)
46
- sid = map_info.data.sid
47
- for i in map_info.data.bid_data:
48
- if i.bid == bid:
49
- bg = i.bg
50
- break
51
- else:
52
- bg = ""
53
- logger.error(f"出现问题: 有问题的是{bid}, {sid}")
46
+ map_data = await osu_api("map", bid)
47
+ map_info = Beatmap(**map_data)
48
+ sid = map_info.beatmapset_id
54
49
  s = (
55
50
  f"推荐的铺面是{recommend_map.mapName} ⭐{round(recommend_map.difficulty, 2)}\n{''.join(recommend_map.mod)}\n"
56
51
  f"预计pp为{round(recommend_map.predictPP, 2)}\n提升概率为{round(recommend_map.passPercent * 100, 2)}%\n"
57
52
  f"{recommend_map.mapLink}\nhttps://kitsu.moe/api/d/{sid}\n"
58
53
  f"https://txy1.sayobot.cn/beatmaps/download/novideo/{sid}"
59
54
  )
60
- pic_url = f"https://dl.sayobot.cn/beatmaps/files/{sid}/{bg}"
55
+ pic_url = f"https://osu.direct/api/media/background/{bid}"
61
56
  return pic_url, s
62
57
 
63
58
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,7 +1,6 @@
1
1
  from .user import User, Badge
2
2
  from .match import Game, Match
3
3
  from .alphaosu import RecommendData
4
- from .sayo_beatmap import SayoBeatmap
5
4
  from .score import Score, NewScore, BeatmapUserScore
6
5
  from .beatmap import Beatmap, Beatmapset, SeasonalBackgrounds
7
6
 
@@ -14,7 +13,6 @@ __all__ = [
14
13
  "Beatmap",
15
14
  "Beatmapset",
16
15
  "SeasonalBackgrounds",
17
- "SayoBeatmap",
18
16
  "RecommendData",
19
17
  "Match",
20
18
  "Game",
@@ -0,0 +1,42 @@
1
+ from typing import Optional
2
+ from .basemodel import Base
3
+
4
+
5
+ class BidData(Base):
6
+ id: int
7
+ mode_int: int
8
+ version: str
9
+ total_length: int
10
+ cs: float
11
+ ar: float
12
+ accuracy: float
13
+ drain: float
14
+ difficulty_rating: float
15
+ count_circles: int
16
+ count_sliders: int
17
+ count_spinners: int
18
+ max_combo: Optional[int] = None
19
+ playcount: int
20
+ passcount: int
21
+
22
+
23
+ class BeatmapSets(Base):
24
+ id: int
25
+ ranked: int
26
+ title: str
27
+ artist: str
28
+ title_unicode: str
29
+ artist_unicode: str
30
+ creator: str
31
+ user_id: int
32
+ source: str
33
+ last_updated: str
34
+ ranked_date: Optional[str]
35
+ bpm: float
36
+ favourite_count: int
37
+ video: bool
38
+ storyboard: bool
39
+ tags: str
40
+ language_id: int
41
+ genre_id: int
42
+ beatmaps: list[BidData]
@@ -114,6 +114,7 @@ class UnifiedBeatmap(Base):
114
114
  hp: float
115
115
  stars: float
116
116
  user_id: Optional[int] = None
117
+ convert: Optional[bool] = False
117
118
 
118
119
 
119
120
  class UnifiedScore(Base):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nonebot-plugin-osubot
3
- Version: 6.23.0
3
+ Version: 6.24.0
4
4
  Summary: OSUbot in NoneBot2
5
5
  License: AGPL-3.0
6
6
  Author-email: yaowan233 <572473053@qq.com>
@@ -1,5 +1,5 @@
1
1
  nonebot_plugin_osubot/__init__.py,sha256=Q-mTTnOIdKiKG6JrVm-kqpPrAhOP9lWyiKHNRqA7gpc,1478
2
- nonebot_plugin_osubot/api.py,sha256=8NnLtAFR4-ING4Ja6vR5TfU1VDXOitp0aczGmZBPl54,16400
2
+ nonebot_plugin_osubot/api.py,sha256=3jJbgJdL1sJ_FcbTqJQxRPLlJueaUXhH0REfy8Ff-ps,16521
3
3
  nonebot_plugin_osubot/beatmap_stats_moder.py,sha256=mNNTufc-gvO4NdYa3TnealSZI4-LBoiTlb599SeLBck,2915
4
4
  nonebot_plugin_osubot/config.py,sha256=Ub2s5Ny09-d1ZwT6x8cirB6zWy0brtO-oZV3W0qEM5Q,311
5
5
  nonebot_plugin_osubot/data/osu/1849145.osz,sha256=enbHOvDu6ZkvQBM7gtvgZBY-r0a7z87pG62Xm9hXUSI,6933013
@@ -7,8 +7,8 @@ nonebot_plugin_osubot/data/osu/1849145.zip,sha256=k957Du9QVliv1rt6ku3sKDoTIOeyJk
7
7
  nonebot_plugin_osubot/database/__init__.py,sha256=7CDo9xU_DGLQ6uTj_mU_Px92phg_DMU5mP6WvgOxFLY,101
8
8
  nonebot_plugin_osubot/database/models.py,sha256=VF_MxR70eRbiIHtqWjpE_Vea4xR38X0RJiQIO96mjsY,1595
9
9
  nonebot_plugin_osubot/draw/__init__.py,sha256=dRELA2Vi4gTe8v48q0iHXLDOEj7Unk-_ChDXJp3qkhg,265
10
- nonebot_plugin_osubot/draw/bmap.py,sha256=GzEiUEkcwdX6ixZ-qmM8TQQf0imD8taur3eX4lJ5wVg,5128
11
- nonebot_plugin_osubot/draw/bp.py,sha256=EffKW5HcbqQheGRzr8VAU5q6OJ1je21XxVJ2JTmPL9E,8948
10
+ nonebot_plugin_osubot/draw/bmap.py,sha256=AfOCYVFPtjrrUaqTi-zfl5c3_lCQvIF1XoV31H5a4ko,5123
11
+ nonebot_plugin_osubot/draw/bp.py,sha256=Ma-it9MFYcHiIigb5_ZzG8p7wlL7-hh3sQKgB412jfo,8970
12
12
  nonebot_plugin_osubot/draw/catch_preview.py,sha256=uSYoTqfdxRy4anpH9Uhj8NntPo008pzw1t6xRMTBBkI,1397
13
13
  nonebot_plugin_osubot/draw/catch_preview_templates/css/style.css,sha256=2I1VwycLhKJMxwjHj19zAV6MBkFMLu_qLunpoiRlGlM,3919
14
14
  nonebot_plugin_osubot/draw/catch_preview_templates/js/beatmap/beatmap.js,sha256=xh6RUz3D40-HJHu0KGqac_eAIHGoAR12bF58V9ft7iQ,5784
@@ -39,46 +39,45 @@ nonebot_plugin_osubot/draw/catch_preview_templates/js/util.js,sha256=XveUlX-d0vr
39
39
  nonebot_plugin_osubot/draw/catch_preview_templates/js/viewbox.js,sha256=RPsUyoKNAQub2n7oUGwWyFppZu0iVuy6DD5gggQZS3E,1641
40
40
  nonebot_plugin_osubot/draw/catch_preview_templates/js/zip.min.js,sha256=pQmrVxuGCMeLS-XS3QsVhzjwap28fr9Ya083uPlg1sM,86405
41
41
  nonebot_plugin_osubot/draw/catch_preview_templates/pic.html,sha256=jwPxxyYFLGpbD29h8u_j3LBY33ya7BS2R_t95EldAmk,3092
42
- nonebot_plugin_osubot/draw/echarts.py,sha256=OzL_397yWrDAIXsEWf72hAiqdIUBz1D182cli6ORD6s,1037
43
- nonebot_plugin_osubot/draw/info.py,sha256=i2YcJmSdTpwhZl_nDe7GJv4jQTB8_9oBfpq2Zw2hwo0,11162
44
- nonebot_plugin_osubot/draw/map.py,sha256=4M8xRd0dIbC5g1s8I4eTZ3vRglM6r_TSznFOZ62K2wk,8654
42
+ nonebot_plugin_osubot/draw/echarts.py,sha256=0fmfxKdnGUe7FKKb_7kS6Qj_PyrUZHUam7altC0WyKg,1142
43
+ nonebot_plugin_osubot/draw/info.py,sha256=SkrkE-kWJmdQIZ8oKJocRf6hTrJZy-qwE3xUvz5lJpk,11344
44
+ nonebot_plugin_osubot/draw/map.py,sha256=Oo1s5YuNxWzNVMBIASk0gO0ISATS-pQBPg68NcbpF74,8756
45
45
  nonebot_plugin_osubot/draw/match_history.py,sha256=GBJl6lAA27U7NSMC2isEzD_YsoIPAeG6ijDu7Oflcl0,997
46
46
  nonebot_plugin_osubot/draw/rating.py,sha256=pA7mGLI4IujmYB6kQf_tSkR7mZGpUAVLRLyaAsZhqTM,20397
47
- nonebot_plugin_osubot/draw/score.py,sha256=65XjTD5nZ3lJt6yvlv2DWcpu14IKFkqWmD88Q0RnuvQ,29218
47
+ nonebot_plugin_osubot/draw/score.py,sha256=cUD8zpdf8e43Du9Z_A6T3HIP3IxtgSF3wheaNwMBWWk,29277
48
48
  nonebot_plugin_osubot/draw/static.py,sha256=wdlzNO3xyiauKiMLr_h-B9uAsFU7fX_Y-fOusYKZP3k,4132
49
- nonebot_plugin_osubot/draw/taiko_preview.py,sha256=tqhuHSdxUJEuXqKHMJDeSLdusuJhSnMMiaG5FbUnaJw,11441
50
- nonebot_plugin_osubot/draw/templates/bpa_chart.html,sha256=R-fO46HtmC4y3brMFGz6MQkna8ke7WGHVIgUnvcY248,7012
49
+ nonebot_plugin_osubot/draw/taiko_preview.py,sha256=X2hzWewMfH_0wFLBBtAALrXwT55pdytIu7215p0Gfws,11414
50
+ nonebot_plugin_osubot/draw/templates/bpa_chart.html,sha256=J0YbxM2_iGHIgLKs6qBbL-wdmNJ4Fc4FAQcc22RDuD8,7019
51
51
  nonebot_plugin_osubot/draw/templates/echarts.min.js,sha256=IF32ooP8NPIzQg_fs7lVHpwG92JcCPE1TZAEyFSgGZU,1022939
52
52
  nonebot_plugin_osubot/draw/templates/mod_chart.html,sha256=Iz71KM5v9z_Rt2vqJ5WIZumRIHgDfcGIUmWGvVGZ-nQ,1508
53
53
  nonebot_plugin_osubot/draw/templates/pp_rank_line_chart.html,sha256=Gyf-GR8ZBlWQTks0TlB3M8EWUBMVwiUaesFAmDISxLo,1417
54
- nonebot_plugin_osubot/draw/templates/t.html,sha256=_A4c7lR3zfjIWoeR38jBMtuUCA6SFEYNZWPAkbNfHPk,10597
55
54
  nonebot_plugin_osubot/draw/utils.py,sha256=6QDbByPQZCxI0k_i5MsExyWZ-sHgJUw6nEWLv85IgLY,15826
56
55
  nonebot_plugin_osubot/exceptions.py,sha256=N_FsEk-9Eu2QnuznhdfWn6OoyA1HH73Q7bUaY89gVi0,40
57
- nonebot_plugin_osubot/file.py,sha256=GhG54EdVsxFf8_8GZOPh4YGvw9iw5bAX9JFz4Mg4kMg,4379
56
+ nonebot_plugin_osubot/file.py,sha256=kfnaf68q0Au54YMUqhD2nYnusEsHqjxJKy2LqPA8urI,4104
58
57
  nonebot_plugin_osubot/info/__init__.py,sha256=I7YlMQiuHExEeJWqyzZb2I-Vl2uql3Py2LdhSH2Z9N0,136
59
58
  nonebot_plugin_osubot/info/bg.py,sha256=Icua4bS38k0c-WbLUjhfS4IXOF83bgyu_oa2HwX4ZEQ,1541
60
59
  nonebot_plugin_osubot/info/bind.py,sha256=b2ua625hbYym7rpb-kLBB-VDP5YWFdmT5RweM58ggWw,4934
61
- nonebot_plugin_osubot/mania/__init__.py,sha256=XRPn563jDJiPohFekcoFFCqCJYznb-6uORneioZv4xI,5534
60
+ nonebot_plugin_osubot/mania/__init__.py,sha256=t5-24nd2FiZTKvMFvNg8ZV9Lp_OFSHjhj_gWUV3s1es,5560
62
61
  nonebot_plugin_osubot/matcher/__init__.py,sha256=yID7QcdQF6_Mouwbej3JwYUBbKSU3VQdrjq6B1Fz9P8,1331
63
62
  nonebot_plugin_osubot/matcher/bind.py,sha256=QQJc2S7XFo5tu4CPloIET6fKaeiQixgb8M7QvULV6E0,2834
64
63
  nonebot_plugin_osubot/matcher/bp.py,sha256=GidJfuZ9lJ7LwMq126DDOwMksNUOz4Bkab83OlKg8t8,3983
65
- nonebot_plugin_osubot/matcher/bp_analyze.py,sha256=L2ccAi7TQvpD036DyA27D8wuiqBBkcfLT0ldk_Apv8w,3820
64
+ nonebot_plugin_osubot/matcher/bp_analyze.py,sha256=xi40HVOcTvmHWR4WNLm706126CulfpV5UP0500FNiD8,4159
66
65
  nonebot_plugin_osubot/matcher/getbg.py,sha256=Ar2yIST556MYRxzuXCLSDAMAmESRENN1fCty-kdH7PI,699
67
- nonebot_plugin_osubot/matcher/guess.py,sha256=QmD-a88pnPfSSBAvSpD2tlHDGMRpYWqtxfNuLsHuBYM,24144
66
+ nonebot_plugin_osubot/matcher/guess.py,sha256=Bv4Rt11eB65hdsPu6KhCjmEP1AacFUwA0uu5AytNB68,24192
68
67
  nonebot_plugin_osubot/matcher/history.py,sha256=ZYkVJHdXuVJmhovRhwxFdqNp0o2uJJOACAZhhutyS3w,1577
69
68
  nonebot_plugin_osubot/matcher/info.py,sha256=8CJHTOMTx_nzJ4ZwXo6ZfBwCuO3DtLprRX7jnMtPilk,858
70
69
  nonebot_plugin_osubot/matcher/map.py,sha256=sFpOoFv63y-NOkCJhE6aW0DRYDl_8SoQOPsdq50QxT0,1404
71
- nonebot_plugin_osubot/matcher/map_convert.py,sha256=YfR-_u5F_GCdn2mv9ZvMEpfxTc63f9nmihIUdu54eN8,5716
70
+ nonebot_plugin_osubot/matcher/map_convert.py,sha256=Q3oNK8NvOUE56mOXQ0PvRQkZZ0nLbtFrAp9wxqw-7Ak,5973
72
71
  nonebot_plugin_osubot/matcher/match.py,sha256=uyrm8I_WgHK2ya1q46AUxNk_cQiKKh7GKlUzrrG1o7w,472
73
- nonebot_plugin_osubot/matcher/medal.py,sha256=OlJTwBvh0kGx_KWhjksozI910c8QdaVFBgtnwqLVyLU,2965
72
+ nonebot_plugin_osubot/matcher/medal.py,sha256=LZf8hlXGHy8mdK2l97SsYCChfYYovEDBGNbUPO3AOsw,2967
74
73
  nonebot_plugin_osubot/matcher/mu.py,sha256=l3Ebz47o46EvN2nvo9-zzQI4CTaLMcd5XW0qljqSGIM,445
75
74
  nonebot_plugin_osubot/matcher/osu_help.py,sha256=64rOkYEOETvU8AF__0xLZjVRs3cTac0D1XEultPK_kM,728
76
75
  nonebot_plugin_osubot/matcher/osudl.py,sha256=yLEblYnLprTf2T00FiRWJ8CuCd0IHyUY9Ka68yAKOXo,872
77
76
  nonebot_plugin_osubot/matcher/pr.py,sha256=xGjQvEJHmIZkq9luu8TtbjBB8FykGI4Wzi_-eXghOjQ,4951
78
- nonebot_plugin_osubot/matcher/preview.py,sha256=n9wgdNG9SF_JQ78nShTsTElJkBDJQr67DRc8Q9sVcCo,1896
77
+ nonebot_plugin_osubot/matcher/preview.py,sha256=olEvSgdIzqSpNH-PjOeu48iiX-TeRJqptOeQqrIo6b4,1940
79
78
  nonebot_plugin_osubot/matcher/rank.py,sha256=sFEim3cR_vswzLmbagjqy-ypolcprAxQpawiSEcFqEI,3619
80
79
  nonebot_plugin_osubot/matcher/rating.py,sha256=JY1Q1ELU3Y1FhQ7kVWVkgVsYEVxkAcxjsoMcwC_u234,450
81
- nonebot_plugin_osubot/matcher/recommend.py,sha256=1LcjACkiPdZV0VqXbZx-oTytKr8lYxg1q0zZuXowWTc,2678
80
+ nonebot_plugin_osubot/matcher/recommend.py,sha256=DChL83UNSi_XDHUm1ksPwUgQE12PI_EHaxXkJQoZ5Oc,2521
82
81
  nonebot_plugin_osubot/matcher/score.py,sha256=Nk6dpDlszKJKdboTSQRBf-wMGioHIPqKSVWrnT0Xbns,1212
83
82
  nonebot_plugin_osubot/matcher/update.py,sha256=MHpxoJmU0hKW82XuM9YpyCxUUjjiNKwejnRgYwueR4Q,3168
84
83
  nonebot_plugin_osubot/matcher/update_mode.py,sha256=0Wy6Y1-rN7XcqBZyo37mYFdixq-4HxCwZftUaiYhZqE,1602
@@ -358,24 +357,24 @@ nonebot_plugin_osubot/osufile/mods/6K.png,sha256=umRQwUCqGtRxL1J0OK4fEfPgda-sKTy
358
357
  nonebot_plugin_osubot/osufile/mods/7K.png,sha256=zkeacf2WSDywv0zt4QCVTa4A54wbLI5_APvQZhnd0qY,970
359
358
  nonebot_plugin_osubot/osufile/mods/8K.png,sha256=-NFuLd08N-7NiDV-blOprSP56Xx5kLBusmyvYVPdXKE,1045
360
359
  nonebot_plugin_osubot/osufile/mods/9K.png,sha256=jMgg_a16eRrVV-a8wx4cTHyD9BozUzwibOhNIG4dQ-Y,1368
361
- nonebot_plugin_osubot/osufile/mods/AP.png,sha256=9qH_KtcpqmMquU0PxIgCX1MG01Vo4MXSFibuE-8_Td8,1777
362
- nonebot_plugin_osubot/osufile/mods/CL.png,sha256=Mqsi9M0w7ouhN31o6alizwnOUCy8CVJw49RllH6zf74,2466
363
- nonebot_plugin_osubot/osufile/mods/DT.png,sha256=AoH8eGUdM9d0UF9Y-YIXlXp5FBHMCLMwxaFiHNPmDIo,1531
364
- nonebot_plugin_osubot/osufile/mods/EZ.png,sha256=TQYpPexTrYpNSVq5QyuiFeQeN7v720_uZLipHYVKDL0,1411
365
- nonebot_plugin_osubot/osufile/mods/FI.png,sha256=jNX9pJeJIL8VlHXEBNNqKJUw_CabIm9jRU2TgwmyLzw,978
366
- nonebot_plugin_osubot/osufile/mods/FL.png,sha256=Kv4lCJ8kYDW2xq6xAwrEJlPL2V7DvqbBcKcgWK_WPRQ,1111
367
- nonebot_plugin_osubot/osufile/mods/HD.png,sha256=BIYpJhBrdGOuW03EQHq0r1Jz_fLuMx1ezEA1I6OojFk,1722
368
- nonebot_plugin_osubot/osufile/mods/HR.png,sha256=ThRdj6BtUsCUFKgFvdQZtJ0o4kL3rKkMUBT9_LBbrNw,1386
369
- nonebot_plugin_osubot/osufile/mods/HT.png,sha256=ha0iFzpa9V8u8g_439xNHJlKPDIiUGBkDRYKILKnHL4,1381
370
- nonebot_plugin_osubot/osufile/mods/MR.png,sha256=7fXVrXPOMhh0ek1gQy7TKvgMKN2G-p0MFQB5iKUtXZ0,1151
371
- nonebot_plugin_osubot/osufile/mods/NC.png,sha256=94xR0FyljJQO5QubrJVfWaJwNCIOjWstb6CSUP5IkSE,1386
372
- nonebot_plugin_osubot/osufile/mods/NF.png,sha256=frjuacyqTldRXYczCzFzcVQ7LLkw-7KTnHcVHvGajaY,1222
373
- nonebot_plugin_osubot/osufile/mods/PF.png,sha256=J3Cl59CJf04xAergY-ofVTJKahivEO0JFN7v6KH4v0E,1110
374
- nonebot_plugin_osubot/osufile/mods/RX.png,sha256=gc8cWpFv3HZF0GaQN7Kp0Y9T8mlMgz3wY6rymzzkWh4,1519
375
- nonebot_plugin_osubot/osufile/mods/SD.png,sha256=JptCZkXv8kOpIksYimWdC7hRJXShL7NMwY7DiUZuKBQ,1291
376
- nonebot_plugin_osubot/osufile/mods/SO.png,sha256=qKPoP-LXNU3nSVn8e7z2d6LddFOG-v4gbBEUOb6BtXU,1493
377
- nonebot_plugin_osubot/osufile/mods/TD.png,sha256=ZAprUMXNcqs_tXPF0HU34qa_NUZo6U-NemMjVxBOk10,1309
378
- nonebot_plugin_osubot/osufile/mods/V2.png,sha256=Y3ju7KMECnGiECRM1MnZUuuwQqbflkdz6I7XjCCTw2E,1354
360
+ nonebot_plugin_osubot/osufile/mods/AP.png,sha256=Fr1ip8Mxp-4FGInKRNSaEh-UOjjwBmFOn622P3bh7Js,1777
361
+ nonebot_plugin_osubot/osufile/mods/CL.png,sha256=d6umxTJ9Ukxr6qpuK0C_K49eDXpIupk_gLvmCyLulcQ,1595
362
+ nonebot_plugin_osubot/osufile/mods/DT.png,sha256=SKG0ueXlp1LkNBN7jYZLqFgFgAellleag_OTmCq7u_Q,1621
363
+ nonebot_plugin_osubot/osufile/mods/EZ.png,sha256=2v8urESIhNVuYHwfpw2DHjC2VuvuOo_fd0QIV6YpWSY,1303
364
+ nonebot_plugin_osubot/osufile/mods/FI.png,sha256=NPBvNd12oE4zrXtqfmK6swxJ-qe5Ao38edBldzCDnfM,1249
365
+ nonebot_plugin_osubot/osufile/mods/FL.png,sha256=CKx3ITzByhbJ4uDNoZ6c7RpjNcJlicI879pTVTLxvRY,1288
366
+ nonebot_plugin_osubot/osufile/mods/HD.png,sha256=67aJOk_HMuRpwRVu3bTsGOxRAGaMj218YYoQSYxw-RA,2159
367
+ nonebot_plugin_osubot/osufile/mods/HR.png,sha256=OwDFQTPbQIIwxymwGgyoGCS3RTkzPt0tdtk4238CnHc,1389
368
+ nonebot_plugin_osubot/osufile/mods/HT.png,sha256=I7E8Y87rtfsKzto_clVf4GiIu7CHYrP7FGmeZi89oKU,1404
369
+ nonebot_plugin_osubot/osufile/mods/MR.png,sha256=ksEwedL_bEBm34VIBt9IDfBFuB20VBn3C3F4sfyrhTs,1290
370
+ nonebot_plugin_osubot/osufile/mods/NC.png,sha256=CWo_Xkdmgsp1YOi-TamevcNdpYgq_1lAVDXZ5cGFqEQ,1365
371
+ nonebot_plugin_osubot/osufile/mods/NF.png,sha256=7C6rZp7ZbAo1SUC3uHUrd73OY_2Mn7KpofCM4SmGBG0,1634
372
+ nonebot_plugin_osubot/osufile/mods/PF.png,sha256=XbJt5JnqRUktT0kLXkCn6Iv9sLj1TFycQRsOmGnJjRE,1304
373
+ nonebot_plugin_osubot/osufile/mods/RX.png,sha256=tc6MTF1oDcji1P_wuEZjGORa4Ah3GaCQLM9ABatNg00,1265
374
+ nonebot_plugin_osubot/osufile/mods/SD.png,sha256=FQaNUkSCt92kAeEo5GVG4neWMN0TUdC637g8FMWbjuw,1695
375
+ nonebot_plugin_osubot/osufile/mods/SO.png,sha256=Fiz7A8x0MklH9PUsMz9vX9GYOp1p7o9pCcdhsZSmEkI,1512
376
+ nonebot_plugin_osubot/osufile/mods/TD.png,sha256=rWej0qHVNPxQJOztx_AYacYhJHnFlddO8X3xGwSLReQ,1498
377
+ nonebot_plugin_osubot/osufile/mods/V2.png,sha256=pyXx83YcJaimJL6i3DfrX8XdJ_3UmL8RgtP6ua0v7wM,1205
379
378
  nonebot_plugin_osubot/osufile/pfm_ctb.png,sha256=9JJu8J1gR_nQhb1EWOuJUOjNitYK_gcH6MRGiYtvsGI,53451
380
379
  nonebot_plugin_osubot/osufile/pfm_mania.png,sha256=PKlAezcKALo0UMnrYvTCL3pd-oJNEU76qLVPhfDLFdk,52208
381
380
  nonebot_plugin_osubot/osufile/pfm_std.png,sha256=ts7e7IUeoalLuw0Pww0X3trXUpZwnWRsOqdQ1RzcdFM,57032
@@ -398,16 +397,16 @@ nonebot_plugin_osubot/osufile/work/stars.png,sha256=zifMmxxjOGzSZAm1tr-3ky_yy18p
398
397
  nonebot_plugin_osubot/osufile/work/stars_expertplus.png,sha256=cmfpErs-flPxHEhVmS9H8vy8H7mrChvV_Q4A77oSVFY,517
399
398
  nonebot_plugin_osubot/osufile/work/suppoter.png,sha256=4V4eNhB8_8KIXsQ1jzFyHUkicKPb5LPehoIcri4h8E4,16061
400
399
  nonebot_plugin_osubot/pp.py,sha256=PSWGLWERr4vVtE9H5D2EBm-_hM5HOU3PQvv1cC4rqmQ,3175
401
- nonebot_plugin_osubot/schema/__init__.py,sha256=io5BqRRNeBUSWPw5VXQav_TMrDN4dsTVpoMzrU9lTCA,468
400
+ nonebot_plugin_osubot/schema/__init__.py,sha256=iC4BTSW_uPyH5-1xk3ByYa5kCicnOFWqxhuTmQKn2ik,411
402
401
  nonebot_plugin_osubot/schema/alphaosu.py,sha256=7cJLIwl4X-dshYsXMi8hHgcp7Ly6BiI3pqwXENhMaX0,693
403
402
  nonebot_plugin_osubot/schema/basemodel.py,sha256=aZI1rdOHx-kmMXohazq1s5tYdtR-2WRzfYQATmWd6a4,99
404
403
  nonebot_plugin_osubot/schema/beatmap.py,sha256=UnobfZEHq1V2HG-A4j3BECubO-dB1JzTMA2_QIXttNM,1960
404
+ nonebot_plugin_osubot/schema/beatmapsets.py,sha256=rEbkmZHYXqmRtg9CyV0hzxc5kZFGm9OWoOv_laYripQ,780
405
405
  nonebot_plugin_osubot/schema/match.py,sha256=lR3pGNVR9K_5GZAdOLG6Ki-W3fwJvgMlNhYOzKNE3lg,494
406
406
  nonebot_plugin_osubot/schema/ppysb/__init__.py,sha256=JK2Z4n44gUJPVKdETMJYJ5uIw-4a8T50y6j5n-YrlYM,1375
407
- nonebot_plugin_osubot/schema/sayo_beatmap.py,sha256=lS1PQZ-HvHl0VhkzlI0-pNLeJrLYWVqmKAo6xZr5I2U,959
408
- nonebot_plugin_osubot/schema/score.py,sha256=gxF_RVSUOyj7EF_q3XeHhNj5qg19MW-B1aePjnTmi08,3233
407
+ nonebot_plugin_osubot/schema/score.py,sha256=o32jKDESzFwOFPZnzjKqxNIj0MPUL9mFvBqgaZARHac,3269
409
408
  nonebot_plugin_osubot/schema/user.py,sha256=sxNmqymG_kIVuGuzfchSv9UML6NPG70cqo2_h5xDIpM,2250
410
409
  nonebot_plugin_osubot/utils/__init__.py,sha256=pyv8XxBcCOeQVDj1E4dgvktzcefgQXfKBlarsYGx1sg,815
411
- nonebot_plugin_osubot-6.23.0.dist-info/WHEEL,sha256=B19PGBCYhWaz2p_UjAoRVh767nYQfk14Sn4TpIZ-nfU,87
412
- nonebot_plugin_osubot-6.23.0.dist-info/METADATA,sha256=XK7OxlxWEiM1vCKm4_4A8u6vRMh6ZQXl-OrdF9zxq8A,4476
413
- nonebot_plugin_osubot-6.23.0.dist-info/RECORD,,
410
+ nonebot_plugin_osubot-6.24.0.dist-info/WHEEL,sha256=B19PGBCYhWaz2p_UjAoRVh767nYQfk14Sn4TpIZ-nfU,87
411
+ nonebot_plugin_osubot-6.24.0.dist-info/METADATA,sha256=wNBfSWq-1OB76NivPUP2ZuXxJlbILx1enIhGNnngGDs,4476
412
+ nonebot_plugin_osubot-6.24.0.dist-info/RECORD,,
@@ -1,58 +0,0 @@
1
- <head>
2
- <meta charset="UTF-8">
3
- <title>Awesome-pyecharts</title>
4
- <script type="text/javascript" src="./echarts.min.js"></script>
5
- </head>
6
- <body >
7
- <div id="1" class="chart-container" style="width:900px; height:500px; "></div>
8
- <script>
9
- const chart = echarts.init(
10
- document.getElementById('1'), 'white', {renderer: 'canvas'}
11
- );
12
- const option = {
13
- "animation": false,
14
- title: {
15
- text: 'title',
16
- left: 'center' // 标题水平居中
17
- },
18
- xAxis: {
19
- type: 'category',
20
- data: ['2023-09-10', '2023-09-11', '2023-09-12', '2023-09-13', '2023-09-14', '2023-09-15', '2023-09-16', '2023-09-17', '2023-09-18', '2023-09-19', '2023-09-20', '2023-09-21', '2023-09-22', '2023-09-23', '2023-09-24', '2023-09-25', '2023-09-26', '2023-09-27', '2023-09-28', '2023-09-29', '2023-09-30', '2023-10-01', '2023-10-02', '2023-10-03', '2023-10-04', '2023-10-05', '2023-10-06', '2023-10-07', '2023-10-08', '2023-10-09', '2023-10-10', '2023-10-11', '2023-10-12', '2023-10-13', '2023-10-14', '2023-10-15', '2023-10-16', '2023-10-17', '2023-10-18', '2023-10-19', '2023-10-20', '2023-10-21', '2023-10-22', '2023-10-23', '2023-10-24', '2023-10-25', '2023-10-26', '2023-11-04', '2023-11-05', '2023-11-06', '2023-11-07', '2023-11-08', '2023-11-09', '2023-11-10', '2023-11-11', '2023-11-14', '2023-11-15', '2023-11-16', '2023-11-17', '2023-11-18', '2023-11-19', '2023-11-21', '2023-11-22', '2023-11-23', '2023-11-24', '2023-11-25', '2023-11-26', '2023-11-27', '2023-11-28', '2023-11-29', '2023-11-30', '2023-12-01', '2023-12-02', '2023-12-03', '2023-12-04', '2023-12-05', '2023-12-06', '2023-12-07', '2023-12-08', '2023-12-10', '2023-12-11', '2023-12-13', '2023-12-14', '2023-12-15', '2023-12-16', '2023-12-17', '2023-12-18', '2023-12-19', '2023-12-20', '2023-12-21', '2023-12-22', '2023-12-23', '2023-12-24', '2023-12-25', '2023-12-26', '2023-12-27', '2023-12-28', '2023-12-29', '2023-12-30', '2023-12-31', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08', '2024-01-09', '2024-01-10', '2024-01-12', '2024-01-13', '2024-01-14', '2024-01-15', '2024-01-16', '2024-01-17', '2024-01-18', '2024-01-19', '2024-01-20', '2024-01-21', '2024-01-23', '2024-01-24', '2024-01-25', '2024-01-26', '2024-01-27', '2024-01-28', '2024-01-29', '2024-01-30', '2024-01-31', '2024-02-01', '2024-02-02', '2024-02-03', '2024-02-04', '2024-02-05', '2024-02-06', '2024-02-07', '2024-02-08', '2024-02-09', '2024-02-10', '2024-02-11', '2024-02-12', '2024-02-13', '2024-02-14', '2024-02-15', '2024-02-16', '2024-02-17', '2024-02-18', '2024-02-19', '2024-02-20', '2024-02-21', '2024-02-22', '2024-02-23', '2024-02-24', '2024-02-25', '2024-02-26', '2024-02-27', '2024-02-28', '2024-03-01', '2024-03-03', '2024-03-03', '2024-03-04', '2024-03-05', '2024-03-06', '2024-03-07', '2024-03-08', '2024-03-09', '2024-03-10', '2024-03-11', '2024-03-12', '2024-03-13', '2024-03-14', '2024-03-15', '2024-03-16', '2024-03-17', '2024-03-18', '2024-03-19', '2024-03-20', '2024-03-21', '2024-03-22', '2024-03-23', '2024-03-24', '2024-03-25', '2024-03-26', '2024-03-27', '2024-03-28', '2024-03-29', '2024-03-30', '2024-03-31', '2024-04-01', '2024-04-02', '2024-04-03', '2024-04-04', '2024-04-05', '2024-04-06', '2024-04-07', '2024-04-08', '2024-04-09', '2024-04-10', '2024-04-11', '2024-04-12', '2024-04-13', '2024-04-14', '2024-04-15', '2024-04-17', '2024-04-18', '2024-04-19', '2024-04-20', '2024-04-21', '2024-04-22', '2024-04-23', '2024-04-25', '2024-04-26', '2024-04-27', '2024-04-28', '2024-04-29', '2024-04-30', '2024-05-01', '2024-05-02', '2024-05-03', '2024-05-04', '2024-05-05', '2024-05-06', '2024-05-07', '2024-05-08', '2024-05-09', '2024-05-10', '2024-05-11', '2024-05-12', '2024-05-13', '2024-05-14', '2024-05-15', '2024-05-16', '2024-05-17', '2024-05-18', '2024-05-19', '2024-05-20', '2024-05-21', '2024-05-22', '2024-05-23', '2024-05-24', '2024-05-25', '2024-05-26', '2024-05-27', '2024-05-28', '2024-05-29', '2024-06-08', '2024-06-09', '2024-06-10', '2024-06-11', '2024-06-12', '2024-06-13', '2024-06-14', '2024-06-15', '2024-06-16', '2024-06-17', '2024-06-18', '2024-06-19', '2024-06-20', '2024-06-21', '2024-06-22', '2024-06-23', '2024-06-24', '2024-06-25', '2024-06-26', '2024-06-27', '2024-06-28', '2024-06-29', '2024-06-30', '2024-07-01', '2024-07-02', '2024-07-03', '2024-07-04', '2024-07-05', '2024-07-06', '2024-07-07', '2024-07-08', '2024-07-09', '2024-07-10', '2024-07-11', '2024-07-12', '2024-07-13', '2024-07-14', '2024-07-15', '2024-07-16', '2024-07-17', '2024-07-18', '2024-07-19', '2024-07-20', '2024-07-21', '2024-07-22', '2024-07-23', '2024-07-24', '2024-07-25', '2024-07-26', '2024-07-27', '2024-07-28', '2024-07-29', '2024-07-30', '2024-07-31', '2024-08-01', '2024-08-02', '2024-08-03', '2024-08-04', '2024-08-05', '2024-08-06', '2024-08-07', '2024-08-08', '2024-08-09', '2024-08-10', '2024-08-11', '2024-08-12', '2024-08-13', '2024-08-14', '2024-08-15', '2024-08-16', '2024-08-17', '2024-08-18', '2024-08-19', '2024-08-20', '2024-08-21', '2024-08-23', '2024-08-25', '2024-08-26', '2024-08-27', '2024-08-28', '2024-08-29', '2024-08-30']
21
- },
22
- yAxis: [{
23
- type: 'value',
24
- scale: true,
25
- name: 'pp'
26
- },
27
- {
28
- type: 'value',
29
- scale: true,
30
- alignTicks: true,
31
- inverse: true,
32
- nameLocation: 'start',
33
- name: 'rank'
34
- }],
35
- legend: {
36
- top: 30,
37
- left: 'center',
38
- data: ['pp', 'rank']
39
- },
40
- series: [
41
- {
42
- name: 'pp',
43
- type: 'line',
44
- data: [35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 35.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 63.0, 65.0, 65.0, 65.0, 65.0, 65.0, 65.0, 65.0, 65.0, 217.0, 279.0, 502.0, 502.0, 502.0, 502.0, 502.0, 594.0, 645.0, 675.0, 711.0, 711.0, 734.0, 734.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 760.0, 773.0, 773.0, 773.0, 780.0, 780.0, 780.0, 780.0, 780.0, 786.0, 786.0, 786.0, 786.0, 786.0, 846.0, 846.0, 846.0, 846.0, 846.0, 846.0, 846.0, 846.0, 846.0, 846.0, 846.0, 884.0, 884.0, 884.0, 884.0, 884.0, 884.0, 884.0, 884.0, 884.0, 884.0, 901.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0, 918.0],
45
- yAxisIndex: 0,
46
- connectNulls: true
47
- },
48
- {
49
- name: 'rank',
50
- type: 'line',
51
- data: [597621, 598017, 598412, 598767, 599153, 599495, 599903, 600412, 600872, 601316, 601679, 602046, 602400, 602790, 603231, 603760, 604147, 604497, 604820, 605196, 605577, 606022, 606488, 606853, 607191, 607557, 607913, 608261, 608681, 609189, 609639, 610012, 610323, 610642, 610970, 611454, 611952, 612305, 612572, 612889, 613222, 613566, 614023, 614580, 614970, 615316, 615640, 618935, 619325, 619730, 620037, 620351, 620701, 621013, 621284, 622414, 622694, 622977, 623326, 623619, 623980, 624757, 625055, 625356, 625664, 625971, 626366, 626791, 627138, 627423, 627712, 628022, 628337, 628720, 629199, 629589, 629898, 630255, 630600, 631390, 631936, 633019, 633590, 634155, 634735, 635357, 636031, 636623, 637181, 637746, 638261, 638809, 638605, 639212, 639770, 640255, 640827, 641344, 641896, 642430, 643496, 643933, 644375, 644850, 644850, 645880, 646435, 646927, 647343, 648158, 648600, 649131, 649686, 650155, 650600, 651045, 651475, 651957, 652499, 653539, 653971, 654374, 654812, 655251, 655682, 656172, 656601, 657000, 657822, 658591, 659287, 660112, 660941, 661668, 662235, 662789, 663393, 664001, 664666, 665370, 666053, 666615, 667178, 667714, 668259, 668887, 669565, 670199, 670736, 671250, 671776, 672296, 672932, 672932, 674074, 674503, 675478, 676604, 676604, 677239, 677775, 678202, 678720, 679203, 679741, 680402, 681106, 681673, 682155, 682631, 683145, 683670, 684280, 684917, 685457, 685457, 701150, 701651, 702135, 702795, 703522, 704087, 704631, 705183, 705739, 706353, 707034, 707670, 708247, 708749, 709234, 709779, 710305, 710950, 711583, 712212, 712710, 713224, 713735, 714246, 714922, 715662, 716697, 717180, 717673, 718171, 718757, 719415, 719919, 720831, 721296, 721774, 722332, 722973, 723572, 724099, 724663, 725187, 725693, 726334, 726995, 727524, 722529, 723092, 723640, 724227, 724924, 725686, 726264, 726868, 517992, 473344, 364793, 365036, 365375, 365644, 365934, 333701, 317654, 309231, 299124, 299380, 293440, 293604, 288836, 289058, 289313, 289520, 289718, 289897, 290101, 290283, 290491, 290714, 290904, 291090, 291279, 291481, 291701, 288439, 288649, 288876, 287321, 287500, 287716, 287924, 288139, 286780, 286979, 287181, 287349, 287536, 272991, 273177, 273370, 273535, 273713, 273880, 274026, 274197, 274394, 274601, 274776, 266252, 266401, 266549, 266721, 266909, 267071, 267252, 267425, 267610, 267803, 264244, 260838, 261041, 261208, 261373, 261565, 261748, 261950, 262150, 262353, 262457, 262622, 262785, 262954, 263153, 263354, 263533, 263696, 263858, 264027, 264196, 264371, 264534, 264743, 264946, 265108, 265452, 265827, 266022, 266220, 266373, 266559, 266726],
52
- yAxisIndex: 1,
53
- connectNulls: true
54
- }
55
- ]};
56
- chart.setOption(option);
57
- </script>
58
- </body>
@@ -1,59 +0,0 @@
1
- from typing import Optional
2
-
3
- from .basemodel import Base
4
-
5
-
6
- class BidData(Base):
7
- bid: int
8
- mode: int
9
- version: str
10
- length: int
11
- CS: float
12
- AR: float
13
- OD: float
14
- HP: float
15
- star: float
16
- aim: float
17
- speed: float
18
- hit300window: float
19
- pp: float
20
- pp_aim: float
21
- pp_speed: float
22
- pp_acc: float
23
- circles: int
24
- sliders: int
25
- spinners: int
26
- maxcombo: int
27
- playcount: int
28
- passcount: int
29
- bg: str
30
- audio: str
31
-
32
-
33
- class MapInfo(Base):
34
- sid: int
35
- local_update: int
36
- bids_amount: int
37
- approved: int
38
- title: str
39
- artist: str
40
- titleU: str
41
- artistU: str
42
- creator: str
43
- creator_id: int
44
- source: str
45
- last_update: int
46
- approved_date: int
47
- bpm: float
48
- favourite_count: int
49
- video: int
50
- storyboard: int
51
- tags: str
52
- language: int
53
- genre: int
54
- bid_data: list[BidData]
55
-
56
-
57
- class SayoBeatmap(Base):
58
- status: int
59
- data: Optional[MapInfo] = None