Skip to content
Merged
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
22 changes: 22 additions & 0 deletions src/api/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,14 @@ impl UsageData {
UsageData::Packy(data) => data.credit_limit,
}
}

/// 判断是否只有 FREE 套餐(仅 88code 支持)
pub fn has_only_free(&self) -> bool {
match self {
UsageData::Code88(data) => data.has_only_free(),
UsageData::Packy(_) => false, // Packy 不支持
}
}
}

impl Code88UsageData {
Expand Down Expand Up @@ -206,6 +214,20 @@ impl Code88UsageData {
pub fn is_exhausted(&self) -> bool {
self.current_credits <= 0.0
}

/// 判断是否只有 FREE 套餐(没有 PLUS/PRO/MAX)
/// 用于判断是否应该显示 PAYGO
pub fn has_only_free(&self) -> bool {
// 检查 subscriptionEntityList 中是否有 PLUS/PRO/MAX 套餐
// 排除 FREE 和 PAYGO
!self.subscription_entity_list.iter().any(|s| {
if !s.is_active {
return false;
}
let name = s.subscription_name.to_uppercase();
name != "FREE" && name != "PAYGO"
})
}
}

impl PackyUsageData {
Expand Down
30 changes: 30 additions & 0 deletions src/core/segments/byebyecode_usage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,36 @@ pub fn collect(config: &Config, input: &InputData) -> Option<SegmentData> {
metadata.insert("service".to_string(), service_name.to_string());
metadata.insert("dynamic_icon".to_string(), service_name.to_string());

// 对于 88code:如果只有 FREE 套餐(没有 PLUS/PRO/MAX),检查是否有 PAYGO 可用
// 场景:用户只有 FREE + PAYGO,没有 PLUS
// Usage API 不返回 PAYGO,所以 fallback 到 FREE 数据,但 CC 不使用 FREE 额度
if service_name == "88code" && usage.has_only_free() {
let model_id = &input.model.id;
let subscriptions = fetch_subscriptions_sync(&api_key, &subscription_url, Some(model_id));

if let Some(subs) = subscriptions {
// 查找有余额的 PAYGO 套餐
let paygo = subs
.iter()
.filter(|s| s.is_active)
.filter(|s| s.plan_name.to_uppercase() == "PAYGO")
.find(|s| s.current_credits > 0.0);

if let Some(paygo_sub) = paygo {
// 显示 PAYGO 剩余额度(蓝色)
let paygo_color = "\x1b[38;5;39m"; // 蓝色
return Some(SegmentData {
primary: format!(
"{}PAYGO{} ${:.2}",
paygo_color, RESET, paygo_sub.current_credits
),
secondary: String::new(),
metadata,
});
}
}
}

// 检查额度是否用完(包括超额使用)
if usage.is_exhausted() {
// 实时获取订阅信息,传入 model 以获取正确的套餐
Expand Down