Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions lib/modules/phigros/services/phigros_api_service.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import 'dart:convert';
import 'dart:typed_data';

import 'package:dio/dio.dart';

/// Phigros API 服务
class PhigrosApiService {
static final PhigrosApiService _instance = PhigrosApiService._internal();

factory PhigrosApiService() => _instance;

static PhigrosApiService get instance => _instance;

PhigrosApiService._internal();
Expand All @@ -32,13 +35,16 @@ class PhigrosApiService {
/// 返回用户信息,包括昵称、头像等
Future<PhigrosUserInfo> getUserInfo(String sessionToken) async {
try {
final response = await _dio.get(
final response = await _dio.get<Map<String, dynamic>>(
'/users/me',
options: Options(headers: {'X-LC-Session': sessionToken}),
);

final responseData = response.data;
if (responseData == null) {
throw Exception("获取用户信息失败: 空返回");
}
if (response.statusCode == 200) {
return PhigrosUserInfo.fromJson(response.data);
return PhigrosUserInfo.fromJson(responseData);
} else {
throw Exception('获取用户信息失败: ${response.statusCode}');
}
Expand All @@ -58,14 +64,14 @@ class PhigrosApiService {
/// 返回游戏存档数据
Future<PhigrosGameSave?> getGameSave(String sessionToken) async {
try {
final response = await _dio.get(
final response = await _dio.get<Map<String, dynamic>>(
'/classes/_GameSave',
queryParameters: {'limit': 1},
options: Options(headers: {'X-LC-Session': sessionToken}),
);

if (response.statusCode == 200) {
final results = response.data['results'] as List?;
final results = response.data?['results'] as List?;
if (results != null && results.isNotEmpty) {
return PhigrosGameSave.fromJson(results[0]);
}
Expand Down
41 changes: 24 additions & 17 deletions lib/modules/phigros/services/phigros_resource_api_service.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
import 'dart:convert';

import 'package:dio/dio.dart';
import 'package:rank_hub/models/phigros/song.dart';
import 'package:rank_hub/models/phigros/collection.dart';
import 'package:rank_hub/models/phigros/avatar.dart';
import 'package:rank_hub/models/phigros/chart.dart';
import 'package:rank_hub/models/phigros/collection.dart';
import 'package:rank_hub/models/phigros/song.dart';

/// Phigros 资源 API 服务
class PhigrosResourceApiService {
static final PhigrosResourceApiService _instance =
PhigrosResourceApiService._internal();

factory PhigrosResourceApiService() => _instance;

static PhigrosResourceApiService get instance => _instance;

PhigrosResourceApiService._internal();
Expand All @@ -28,10 +30,11 @@ class PhigrosResourceApiService {
Future<Map<String, Map<String, double>>> fetchDifficulties() async {
try {
print('📥 开始获取定数表...');
final response = await _dio.get('/info/difficulty.tsv');
final response = await _dio.get<String>('/info/difficulty.tsv');
final responseData = response.data;

if (response.statusCode == 200 && response.data != null) {
final lines = (response.data as String).split('\n');
if (response.statusCode == 200 && responseData != null) {
final lines = responseData.split('\n');
final difficulties = <String, Map<String, double>>{};
int invalidLineCount = 0;

Expand Down Expand Up @@ -86,11 +89,12 @@ class PhigrosResourceApiService {
print('📥 开始获取乐曲信息...');

// 同时获取乐曲信息和定数表
final infoResponse = await _dio.get('/info/info.tsv');
final infoResponse = await _dio.get<String>('/info/info.tsv');
final difficulties = await fetchDifficulties();
final infoResponseData = infoResponse.data;

if (infoResponse.statusCode == 200 && infoResponse.data != null) {
final lines = (infoResponse.data as String).split('\n');
if (infoResponse.statusCode == 200 && infoResponseData != null) {
final lines = infoResponseData.split('\n');
final songs = <PhigrosSong>[];
int missingDifficultyCount = 0;

Expand Down Expand Up @@ -170,10 +174,11 @@ class PhigrosResourceApiService {
Future<List<PhigrosCollection>> fetchCollections() async {
try {
print('📥 开始获取收藏品...');
final response = await _dio.get('/info/collection.tsv');
final response = await _dio.get<String>('/info/collection.tsv');
final responseData = response.data;

if (response.statusCode == 200 && response.data != null) {
final lines = (response.data as String).split('\n');
if (response.statusCode == 200 && responseData != null) {
final lines = responseData.split('\n');
final collections = <PhigrosCollection>[];

for (final line in lines) {
Expand All @@ -200,10 +205,11 @@ class PhigrosResourceApiService {
Future<List<PhigrosAvatar>> fetchAvatars() async {
try {
print('📥 开始获取头像列表...');
final response = await _dio.get('/info/avatar.txt');
final response = await _dio.get<String>('/info/avatar.txt');
final responseData = response.data;

if (response.statusCode == 200 && response.data != null) {
final lines = (response.data as String).split('\n');
if (response.statusCode == 200 && responseData != null) {
final lines = responseData.split('\n');
final avatars = <PhigrosAvatar>[];

for (final line in lines) {
Expand Down Expand Up @@ -233,11 +239,12 @@ class PhigrosResourceApiService {
print('📥 开始获取谱面: $songId - $difficulty');
print(' URL: $url');

final response = await _dio.get(url);
final response = await _dio.get<String>(url);
final responseData = response.data;

if (response.statusCode == 200 && response.data != null) {
if (response.statusCode == 200 && responseData != null) {
final chart = PhigrosChart.fromJson(
jsonDecode(response.data) as Map<String, dynamic>,
jsonDecode(responseData) as Map<String, dynamic>,
);
print('✅ 获取谱面完成: ${chart.totalNotes} 个音符');
return chart;
Expand Down
7 changes: 4 additions & 3 deletions lib/modules/phigros/services/taptap_service.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import 'dart:async';
import 'dart:convert';
import 'dart:math';
import 'package:dio/dio.dart';

import 'package:crypto/crypto.dart';
import 'package:dio/dio.dart';

class ShareClient {
final Dio _dio;
Expand Down Expand Up @@ -160,13 +161,13 @@ open.tapapis.cn
) async {
final auth = generateMac(token);

final resp = await _dio.get(
final resp = await _dio.get<Map<String, dynamic>>(
'https://open.tapapis.cn/account/basic-info/v1',
queryParameters: {'client_id': clientId},
options: Options(headers: {...tapHeaders, 'Authorization': auth}),
);

return resp.data['data'];
return resp.data!['data'];
}

Future<String> registerUser(
Expand Down