v0.4.3: expose multi-script-ID support in the UI

The backend already supported a comma-separated list of Apps Script IDs
with round-robin dispatch and automatic 10-minute sidelining on quota
errors (429 / 403 / 'quota' in body). But the UI label just said 'Apps
Script ID' (singular), so users didn't realize multiple IDs are
allowed.

- Rename the label to 'Apps Script ID(s)'
- Hover tooltip explaining comma-separated input and quota auto-failover
- Placeholder hint 'id1, id2, id3 …'
- Live count line under the field when 2+ IDs are entered

Requested by a user in Farsi: 'add the ability to set multiple script
IDs; switch to the next when one hits its limit'. The feature existed,
this just surfaces it.
This commit is contained in:
therealaleph
2026-04-21 23:47:23 +03:00
parent ea228d655c
commit d32c857502
4 changed files with 21 additions and 3 deletions
Generated
+1 -1
View File
@@ -1360,7 +1360,7 @@ dependencies = [
[[package]] [[package]]
name = "mhrv-rs" name = "mhrv-rs"
version = "0.4.2" version = "0.4.3"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"bytes", "bytes",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "mhrv-rs" name = "mhrv-rs"
version = "0.4.2" version = "0.4.3"
edition = "2021" edition = "2021"
description = "Rust port of MasterHttpRelayVPN -- DPI bypass via Google Apps Script relay with domain fronting" description = "Rust port of MasterHttpRelayVPN -- DPI bypass via Google Apps Script relay with domain fronting"
license = "MIT" license = "MIT"
Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

+19 -1
View File
@@ -291,11 +291,29 @@ impl eframe::App for App {
.num_columns(2) .num_columns(2)
.spacing([10.0, 6.0]) .spacing([10.0, 6.0])
.show(ui, |ui| { .show(ui, |ui| {
ui.label("Apps Script ID"); ui.label("Apps Script ID(s)")
.on_hover_text(
"One deployment ID, or several separated by commas.\n\
With multiple IDs the proxy round-robins between them and\n\
automatically sidelines any ID that hits its daily quota (429)\n\
or other rate limits for 10 minutes before retrying it."
);
ui.add(egui::TextEdit::singleline(&mut self.form.script_id) ui.add(egui::TextEdit::singleline(&mut self.form.script_id)
.hint_text("id1, id2, id3 …")
.desired_width(f32::INFINITY)); .desired_width(f32::INFINITY));
ui.end_row(); ui.end_row();
let id_count = self.form.script_id
.split(',')
.map(|s| s.trim())
.filter(|s| !s.is_empty())
.count();
if id_count > 1 {
ui.label("");
ui.small(format!("{} IDs — round-robin with auto-failover on quota", id_count));
ui.end_row();
}
ui.label("Auth key"); ui.label("Auth key");
ui.horizontal(|ui| { ui.horizontal(|ui| {
let te = egui::TextEdit::singleline(&mut self.form.auth_key) let te = egui::TextEdit::singleline(&mut self.form.auth_key)