import 'package:toolbox/core/extension/numx.dart'; class NetSpeedPart { String device; BigInt bytesIn; BigInt bytesOut; BigInt time; NetSpeedPart(this.device, this.bytesIn, this.bytesOut, this.time); } class NetSpeed { List _old; List _now; NetSpeed(this._old, this._now); List get devices { final devices = []; for (var item in _now) { devices.add(item.device); } return devices; } void update(List newOne) { _old = _now; _now = newOne; } BigInt get timeDiff => _now[0].time - _old[0].time; String speedIn({String? device}) { if (_old[0].device == '' || _now[0].device == '') return '0kb/s'; final idx = deviceIdx(device); final speedInBytesPerSecond = (_now[idx].bytesIn - _old[idx].bytesIn) / timeDiff; return buildStandardOutput(speedInBytesPerSecond); } String speedOut({String? device}) { if (_old[0].device == '' || _now[0].device == '') return '0kb/s'; final idx = deviceIdx(device); final speedOutBytesPerSecond = (_now[idx].bytesOut - _old[idx].bytesOut) / timeDiff; return buildStandardOutput(speedOutBytesPerSecond); } int deviceIdx(String? device) { if (device != null) { for (var item in _now) { if (item.device == device) { return _now.indexOf(item); } } } return 0; } String buildStandardOutput(double speed) => '${speed.convertBytes.toLowerCase()}/s'; } List parseNetSpeed(String raw) { final split = raw.split('\n'); if (split.length < 4) { return []; } final time = BigInt.parse(split[split.length - 1]); final results = []; for (final item in split.sublist(2, split.length - 1)) { final data = item.trim().split(':'); final device = data.first; final bytes = data.last.trim().split(' '); bytes.removeWhere((element) => element == ''); final bytesIn = BigInt.parse(bytes.first); final bytesOut = BigInt.parse(bytes[8]); results.add(NetSpeedPart(device, bytesIn, bytesOut, time)); } return results; }