mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 23:34:24 +01:00
new: server tag
This commit is contained in:
@@ -16,6 +16,8 @@ class ServerPrivateInfo {
|
||||
late String pwd;
|
||||
@HiveField(5)
|
||||
String? pubKeyId;
|
||||
@HiveField(6)
|
||||
List<String>? tags;
|
||||
|
||||
late String id;
|
||||
|
||||
@@ -26,6 +28,7 @@ class ServerPrivateInfo {
|
||||
required this.user,
|
||||
required this.pwd,
|
||||
this.pubKeyId,
|
||||
this.tags,
|
||||
}) : id = '$user@$ip:$port';
|
||||
|
||||
ServerPrivateInfo.fromJson(Map<String, dynamic> json) {
|
||||
@@ -36,6 +39,7 @@ class ServerPrivateInfo {
|
||||
pwd = json["authorization"].toString();
|
||||
pubKeyId = json["pubKeyId"]?.toString();
|
||||
id = '$user@$ip:$port';
|
||||
tags = json["tags"]?.cast<String>();
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
@@ -46,6 +50,11 @@ class ServerPrivateInfo {
|
||||
data["user"] = user;
|
||||
data["authorization"] = pwd;
|
||||
data["pubKeyId"] = pubKeyId;
|
||||
data["tags"] = tags;
|
||||
return data;
|
||||
}
|
||||
|
||||
bool shouldReconnect(ServerPrivateInfo old) {
|
||||
return id != id || pwd != old.pwd || pubKeyId != old.pubKeyId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,13 +23,14 @@ class ServerPrivateInfoAdapter extends TypeAdapter<ServerPrivateInfo> {
|
||||
user: fields[3] as String,
|
||||
pwd: fields[4] as String,
|
||||
pubKeyId: fields[5] as String?,
|
||||
tags: (fields[6] as List?)?.cast<String>(),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, ServerPrivateInfo obj) {
|
||||
writer
|
||||
..writeByte(6)
|
||||
..writeByte(7)
|
||||
..writeByte(0)
|
||||
..write(obj.name)
|
||||
..writeByte(1)
|
||||
@@ -41,7 +42,9 @@ class ServerPrivateInfoAdapter extends TypeAdapter<ServerPrivateInfo> {
|
||||
..writeByte(4)
|
||||
..write(obj.pwd)
|
||||
..writeByte(5)
|
||||
..write(obj.pubKeyId);
|
||||
..write(obj.pubKeyId)
|
||||
..writeByte(6)
|
||||
..write(obj.tags);
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -8,20 +8,16 @@ class Snippet {
|
||||
late String name;
|
||||
@HiveField(1)
|
||||
late String script;
|
||||
@HiveField(2)
|
||||
List<String>? tags;
|
||||
Snippet(this.name, this.script, {this.tags});
|
||||
Snippet(this.name, this.script);
|
||||
|
||||
Snippet.fromJson(Map<String, dynamic> json) {
|
||||
name = json['name'].toString();
|
||||
script = json['script'].toString();
|
||||
tags = json['tags'].cast<String>();
|
||||
}
|
||||
Map<String, dynamic> toJson() {
|
||||
final data = <String, dynamic>{};
|
||||
data['name'] = name;
|
||||
data['script'] = script;
|
||||
data['tags'] = tags;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,20 +19,17 @@ class SnippetAdapter extends TypeAdapter<Snippet> {
|
||||
return Snippet(
|
||||
fields[0] as String,
|
||||
fields[1] as String,
|
||||
tags: (fields[2] as List?)?.cast<String>(),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, Snippet obj) {
|
||||
writer
|
||||
..writeByte(3)
|
||||
..writeByte(2)
|
||||
..writeByte(0)
|
||||
..write(obj.name)
|
||||
..writeByte(1)
|
||||
..write(obj.script)
|
||||
..writeByte(2)
|
||||
..write(obj.tags);
|
||||
..write(obj.script);
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -23,7 +23,10 @@ typedef ServersMap = Map<String, Server>;
|
||||
class ServerProvider extends BusyProvider {
|
||||
final ServersMap _servers = {};
|
||||
ServersMap get servers => _servers;
|
||||
final StringOrder serverOrder = [];
|
||||
final StringOrder _serverOrder = [];
|
||||
StringOrder get serverOrder => _serverOrder;
|
||||
final List<String> _tags = [];
|
||||
List<String> get tags => _tags;
|
||||
|
||||
final _limiter = TryLimiter();
|
||||
|
||||
@@ -42,23 +45,38 @@ class ServerProvider extends BusyProvider {
|
||||
}
|
||||
final serverOrder_ = _settingStore.serverOrder.fetch();
|
||||
if (serverOrder_ != null) {
|
||||
serverOrder.addAll(serverOrder_.toSet());
|
||||
if (serverOrder.length != infos.length) {
|
||||
_serverOrder.addAll(serverOrder_.toSet());
|
||||
if (_serverOrder.length != infos.length) {
|
||||
final missed = infos
|
||||
.where(
|
||||
(e) => !serverOrder.contains(e.id),
|
||||
(e) => !_serverOrder.contains(e.id),
|
||||
)
|
||||
.map((e) => e.id);
|
||||
serverOrder.addAll(missed);
|
||||
_serverOrder.addAll(missed);
|
||||
}
|
||||
} else {
|
||||
serverOrder.addAll(_servers.keys);
|
||||
_serverOrder.addAll(_servers.keys);
|
||||
}
|
||||
_settingStore.serverOrder.put(serverOrder);
|
||||
_settingStore.serverOrder.put(_serverOrder);
|
||||
_updateTags();
|
||||
setBusyState(false);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void _updateTags() {
|
||||
_tags.clear();
|
||||
for (final s in _servers.values) {
|
||||
if (s.spi.tags == null) continue;
|
||||
for (final t in s.spi.tags!) {
|
||||
if (!_tags.contains(t)) {
|
||||
_tags.add(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
_tags.sort();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Server genServer(ServerPrivateInfo spi) {
|
||||
return Server(spi, initStatus, null, ServerState.disconnected);
|
||||
}
|
||||
@@ -81,8 +99,7 @@ class ServerProvider extends BusyProvider {
|
||||
}
|
||||
|
||||
Future<void> startAutoRefresh() async {
|
||||
final duration =
|
||||
locator<SettingStore>().serverStatusUpdateInterval.fetch()!;
|
||||
final duration = _settingStore.serverStatusUpdateInterval.fetch()!;
|
||||
if (duration == 0) return;
|
||||
stopAutoRefresh();
|
||||
_timer = Timer.periodic(Duration(seconds: duration), (_) async {
|
||||
@@ -126,15 +143,17 @@ class ServerProvider extends BusyProvider {
|
||||
_servers[spi.id] = genServer(spi);
|
||||
notifyListeners();
|
||||
_serverStore.put(spi);
|
||||
serverOrder.add(spi.id);
|
||||
_settingStore.serverOrder.put(serverOrder);
|
||||
_serverOrder.add(spi.id);
|
||||
_settingStore.serverOrder.put(_serverOrder);
|
||||
_updateTags();
|
||||
refreshData(spi: spi);
|
||||
}
|
||||
|
||||
void delServer(String id) {
|
||||
_servers.remove(id);
|
||||
serverOrder.remove(id);
|
||||
_settingStore.serverOrder.put(serverOrder);
|
||||
_serverOrder.remove(id);
|
||||
_settingStore.serverOrder.put(_serverOrder);
|
||||
_updateTags();
|
||||
notifyListeners();
|
||||
_serverStore.delete(id);
|
||||
}
|
||||
@@ -143,13 +162,27 @@ class ServerProvider extends BusyProvider {
|
||||
ServerPrivateInfo old,
|
||||
ServerPrivateInfo newSpi,
|
||||
) async {
|
||||
_servers.remove(old.id);
|
||||
_serverStore.update(old, newSpi);
|
||||
_servers[newSpi.id] = genServer(newSpi);
|
||||
_servers[newSpi.id]?.client = await genClient(newSpi);
|
||||
serverOrder.update(old.id, newSpi.id);
|
||||
_settingStore.serverOrder.put(serverOrder);
|
||||
await refreshData(spi: newSpi);
|
||||
if (old != newSpi) {
|
||||
_serverStore.update(old, newSpi);
|
||||
_servers[old.id]?.spi = newSpi;
|
||||
|
||||
if (newSpi.id != old.id) {
|
||||
_servers[newSpi.id] = _servers[old.id]!;
|
||||
_servers[newSpi.id]?.spi = newSpi;
|
||||
_servers.remove(old.id);
|
||||
_serverOrder.update(old.id, newSpi.id);
|
||||
_settingStore.serverOrder.put(_serverOrder);
|
||||
}
|
||||
|
||||
// Only reconnect if neccessary
|
||||
if (newSpi.shouldReconnect(old)) {
|
||||
_servers[newSpi.id]?.client = await genClient(newSpi);
|
||||
refreshData(spi: newSpi);
|
||||
}
|
||||
|
||||
// Only update if [spi.tags] changed
|
||||
_updateTags();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _getData(ServerPrivateInfo spi) async {
|
||||
|
||||
Reference in New Issue
Block a user