Files
FlClash/lib/common/compute.dart
T

111 lines
3.1 KiB
Dart
Raw Normal View History

2025-12-16 11:23:09 +08:00
import 'package:fl_clash/common/common.dart';
2025-07-31 17:09:18 +08:00
import 'package:fl_clash/enum/enum.dart';
import 'package:fl_clash/models/models.dart';
List<Group> computeSort({
required List<Group> groups,
required ProxiesSortType sortType,
required DelayMap delayMap,
2025-10-14 15:13:52 +08:00
required Map<String, String> selectedMap,
2025-07-31 17:09:18 +08:00
required String defaultTestUrl,
}) {
2025-12-16 11:23:09 +08:00
List<Proxy> sortOfDelay({
required List<Group> groups,
required List<Proxy> proxies,
required DelayMap delayMap,
required Map<String, String> selectedMap,
required String testUrl,
}) {
return List.from(proxies)..sort((a, b) {
final aDelayState = computeProxyDelayState(
proxyName: a.name,
testUrl: testUrl,
groups: groups,
selectedMap: selectedMap,
delayMap: delayMap,
);
final bDelayState = computeProxyDelayState(
proxyName: b.name,
testUrl: testUrl,
groups: groups,
selectedMap: selectedMap,
delayMap: delayMap,
);
return aDelayState.compareTo(bDelayState);
});
}
List<Proxy> sortOfName(List<Proxy> proxies) {
return List.of(proxies)..sort((a, b) => a.name.compareTo(b.name));
}
2025-07-31 17:09:18 +08:00
return groups.map((group) {
final proxies = group.all;
final newProxies = switch (sortType) {
ProxiesSortType.none => proxies,
2025-12-16 11:23:09 +08:00
ProxiesSortType.delay => sortOfDelay(
2025-07-31 17:09:18 +08:00
groups: groups,
proxies: proxies,
delayMap: delayMap,
selectedMap: selectedMap,
2025-12-16 11:23:09 +08:00
testUrl: group.testUrl.takeFirstValid([defaultTestUrl]),
2025-07-31 17:09:18 +08:00
),
2025-12-16 11:23:09 +08:00
ProxiesSortType.name => sortOfName(proxies),
2025-07-31 17:09:18 +08:00
};
return group.copyWith(all: newProxies);
}).toList();
}
2025-12-16 11:23:09 +08:00
SelectedProxyState getRealSelectedProxyState(
2025-07-31 17:09:18 +08:00
SelectedProxyState state, {
required List<Group> groups,
2025-10-14 15:13:52 +08:00
required Map<String, String> selectedMap,
2025-07-31 17:09:18 +08:00
}) {
if (state.proxyName.isEmpty) return state;
final index = groups.indexWhere((element) => element.name == state.proxyName);
final newState = state.copyWith(group: true);
if (index == -1) return newState;
final group = groups[index];
final currentSelectedName = group.getCurrentSelectedName(
selectedMap[newState.proxyName] ?? '',
);
if (currentSelectedName.isEmpty) {
return newState;
}
2025-12-16 11:23:09 +08:00
return getRealSelectedProxyState(
2025-07-31 17:09:18 +08:00
newState.copyWith(proxyName: currentSelectedName, testUrl: group.testUrl),
groups: groups,
selectedMap: selectedMap,
);
}
2025-12-16 11:23:09 +08:00
SelectedProxyState computeRealSelectedProxyState(
String proxyName, {
2025-07-31 17:09:18 +08:00
required List<Group> groups,
2025-10-14 15:13:52 +08:00
required Map<String, String> selectedMap,
2025-07-31 17:09:18 +08:00
}) {
2025-12-16 11:23:09 +08:00
return getRealSelectedProxyState(
SelectedProxyState(proxyName: proxyName),
groups: groups,
selectedMap: selectedMap,
);
2025-07-31 17:09:18 +08:00
}
2025-12-16 11:23:09 +08:00
DelayState computeProxyDelayState({
required String proxyName,
required String testUrl,
required List<Group> groups,
required Map<String, String> selectedMap,
required DelayMap delayMap,
}) {
final state = computeRealSelectedProxyState(
proxyName,
groups: groups,
selectedMap: selectedMap,
);
final currentDelayMap =
delayMap[state.testUrl.takeFirstValid([testUrl])] ?? {};
final delay = currentDelayMap[state.proxyName];
return DelayState(delay: delay ?? 0, group: state.group);
2025-07-31 17:09:18 +08:00
}