ServerCache, Peer Name Updates + Profile Event Updates
continuous-integration/drone/pr Build is passing
Details
continuous-integration/drone/pr Build is passing
Details
This commit is contained in:
parent
564867d245
commit
9a05200af2
|
@ -1,4 +1,5 @@
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'package:cwtch/models/servers.dart';
|
||||||
import 'package:cwtch/notification_manager.dart';
|
import 'package:cwtch/notification_manager.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
@ -49,9 +50,17 @@ class CwtchNotifier {
|
||||||
));
|
));
|
||||||
break;
|
break;
|
||||||
case "GroupCreated":
|
case "GroupCreated":
|
||||||
|
|
||||||
|
// Retrieve Server Status from Cache...
|
||||||
|
String status = "";
|
||||||
|
ServerInfoState? serverInfoState = profileCN.getProfile(data["ProfileOnion"])?.serverList.getServer(data["GroupServer"]);
|
||||||
|
if (serverInfoState != null) {
|
||||||
|
status = serverInfoState.status;
|
||||||
|
}
|
||||||
|
|
||||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) == null) {
|
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) == null) {
|
||||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], data["GroupID"],
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], data["GroupID"],
|
||||||
isInvitation: false, imagePath: data["PicturePath"], nickname: data["GroupName"], server: data["GroupServer"], isGroup: true, lastMessageTime: DateTime.now()));
|
isInvitation: false, imagePath: data["PicturePath"], nickname: data["GroupName"], status: status, server: data["GroupServer"], isGroup: true, lastMessageTime: DateTime.now()));
|
||||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], DateTime.now());
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], DateTime.now());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -175,9 +184,23 @@ class CwtchNotifier {
|
||||||
String inviteJson = new String.fromCharCodes(base64Decode(invite.substring(5)));
|
String inviteJson = new String.fromCharCodes(base64Decode(invite.substring(5)));
|
||||||
dynamic groupInvite = jsonDecode(inviteJson);
|
dynamic groupInvite = jsonDecode(inviteJson);
|
||||||
print("new group invite: $groupInvite");
|
print("new group invite: $groupInvite");
|
||||||
|
|
||||||
|
// Retrieve Server Status from Cache...
|
||||||
|
String status = "";
|
||||||
|
ServerInfoState? serverInfoState = profileCN.getProfile(data["ProfileOnion"])?.serverList.getServer(groupInvite["ServerHost"]);
|
||||||
|
if (serverInfoState != null) {
|
||||||
|
status = serverInfoState.status;
|
||||||
|
}
|
||||||
|
|
||||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(groupInvite["GroupID"]) == null) {
|
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(groupInvite["GroupID"]) == null) {
|
||||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], groupInvite["GroupID"],
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], groupInvite["GroupID"],
|
||||||
isInvitation: true, imagePath: data["PicturePath"], nickname: groupInvite["GroupName"], server: groupInvite["ServerHost"], isGroup: true, lastMessageTime: DateTime.now()));
|
isInvitation: true,
|
||||||
|
imagePath: data["PicturePath"],
|
||||||
|
nickname: groupInvite["GroupName"],
|
||||||
|
server: groupInvite["ServerHost"],
|
||||||
|
status: status,
|
||||||
|
isGroup: true,
|
||||||
|
lastMessageTime: DateTime.now()));
|
||||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(groupInvite["GroupID"], DateTime.now());
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(groupInvite["GroupID"], DateTime.now());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -189,6 +212,8 @@ class CwtchNotifier {
|
||||||
break;
|
break;
|
||||||
case "ServerStateChange":
|
case "ServerStateChange":
|
||||||
print("server state change: $data");
|
print("server state change: $data");
|
||||||
|
// Update the Server Cache
|
||||||
|
profileCN.getProfile(data["ProfileOnion"])?.updateServerStatusCache(data["GroupServer"], data["ConnectionState"]);
|
||||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.contacts.forEach((contact) {
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.contacts.forEach((contact) {
|
||||||
if (contact.isGroup == true && contact.server == data["GroupServer"]) {
|
if (contact.isGroup == true && contact.server == data["GroupServer"]) {
|
||||||
contact.status = data["ConnectionState"];
|
contact.status = data["ConnectionState"];
|
||||||
|
@ -205,6 +230,16 @@ class CwtchNotifier {
|
||||||
print("unhandled set group attribute event: $type $data");
|
print("unhandled set group attribute event: $type $data");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "NewRetValMessageFromPeer":
|
||||||
|
if (data["Path"] == "name") {
|
||||||
|
// Update locally on the UI...
|
||||||
|
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"]) != null) {
|
||||||
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"])!.nickname = data["Data"];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
print("unhandled peer attribute event: $type $data");
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
print("unhandled event: $type $data");
|
print("unhandled event: $type $data");
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,6 @@ class FlwtchState extends State<Flwtch> {
|
||||||
String selectedConversation = "";
|
String selectedConversation = "";
|
||||||
var columns = [1]; // default or 'single column' mode
|
var columns = [1]; // default or 'single column' mode
|
||||||
//var columns = [1, 1, 2];
|
//var columns = [1, 1, 2];
|
||||||
late AppModel appStatus;
|
|
||||||
late ProfileListState profs;
|
late ProfileListState profs;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -69,8 +68,6 @@ class FlwtchState extends State<Flwtch> {
|
||||||
cwtchInit = true;
|
cwtchInit = true;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
appStatus = AppModel(cwtch: cwtch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChangeNotifierProvider<TorStatus> getTorStatusProvider() => ChangeNotifierProvider.value(value: globalTorStatus);
|
ChangeNotifierProvider<TorStatus> getTorStatusProvider() => ChangeNotifierProvider.value(value: globalTorStatus);
|
||||||
|
|
|
@ -190,9 +190,16 @@ class ProfileInfoState extends ChangeNotifier {
|
||||||
// TODO Keys...
|
// TODO Keys...
|
||||||
return ServerInfoState(onion: server["onion"], status: server["status"]);
|
return ServerInfoState(onion: server["onion"], status: server["status"]);
|
||||||
}));
|
}));
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void updateServerStatusCache(String server, String status) {
|
||||||
|
this._servers.updateServerCache(server, status);
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
// Getters and Setters for Online Status
|
// Getters and Setters for Online Status
|
||||||
bool get isOnline => this._online;
|
bool get isOnline => this._online;
|
||||||
set isOnline(bool newValue) {
|
set isOnline(bool newValue) {
|
||||||
|
@ -470,37 +477,3 @@ class MessageState extends ChangeNotifier {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////
|
|
||||||
/// ACN ///
|
|
||||||
/////////////
|
|
||||||
|
|
||||||
class AppModel {
|
|
||||||
final Cwtch cwtch;
|
|
||||||
AppModel({required this.cwtch});
|
|
||||||
|
|
||||||
Stream<String> contactEvents() async* {
|
|
||||||
while (true) {
|
|
||||||
String event = await cwtch.ContactEvents();
|
|
||||||
if (event != "") {
|
|
||||||
print(event);
|
|
||||||
yield event;
|
|
||||||
} else {
|
|
||||||
print("TEST TEST FAIL TEST FAIL 123");
|
|
||||||
await Future.delayed(Duration(seconds: 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Stream<String> torStatus() async* {
|
|
||||||
while (true) {
|
|
||||||
String event = await cwtch.ACNEvents();
|
|
||||||
if (event != "") {
|
|
||||||
yield event;
|
|
||||||
} else {
|
|
||||||
print("TOR TEST TEST FAIL TEST FAIL 123");
|
|
||||||
await Future.delayed(Duration(seconds: 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -14,6 +14,16 @@ class ServerListState extends ChangeNotifier {
|
||||||
return idx >= 0 ? _servers[idx] : null;
|
return idx >= 0 ? _servers[idx] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateServerCache(String onion, String status) {
|
||||||
|
int idx = _servers.indexWhere((element) => element.onion == onion);
|
||||||
|
if (idx >= 0) {
|
||||||
|
_servers[idx] = ServerInfoState(onion: onion, status: status);
|
||||||
|
} else {
|
||||||
|
print("Tried to update server cache without a starting state...this is probably an error");
|
||||||
|
}
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
List<ServerInfoState> get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
List<ServerInfoState> get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,7 +93,8 @@ class _ContactRowState extends State<ContactRow> {
|
||||||
MaterialPageRoute<void>(
|
MaterialPageRoute<void>(
|
||||||
builder: (BuildContext builderContext) {
|
builder: (BuildContext builderContext) {
|
||||||
// assert we have an actual profile...
|
// assert we have an actual profile...
|
||||||
var profile = Provider.of<FlwtchState>(builderContext, listen: false).profs.getProfile(profileOnion)!;
|
// We need to listen for updates to the profile in order to update things like invitation message bubbles.
|
||||||
|
var profile = Provider.of<FlwtchState>(builderContext).profs.getProfile(profileOnion)!;
|
||||||
return MultiProvider(
|
return MultiProvider(
|
||||||
providers: [
|
providers: [
|
||||||
ChangeNotifierProvider.value(value: profile),
|
ChangeNotifierProvider.value(value: profile),
|
||||||
|
|
|
@ -40,6 +40,7 @@ class _MessageListState extends State<MessageList> {
|
||||||
create: (x) => MessageState(
|
create: (x) => MessageState(
|
||||||
context: itemBuilderContext,
|
context: itemBuilderContext,
|
||||||
profileOnion: Provider.of<ProfileInfoState>(outerContext, listen: false).onion,
|
profileOnion: Provider.of<ProfileInfoState>(outerContext, listen: false).onion,
|
||||||
|
// We don't want to listen for updates to the contact handle...
|
||||||
contactHandle: Provider.of<ContactInfoState>(x, listen: false).onion,
|
contactHandle: Provider.of<ContactInfoState>(x, listen: false).onion,
|
||||||
messageIndex: trueIndex,
|
messageIndex: trueIndex,
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
|
||||||
import '../main.dart';
|
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|
||||||
|
|
||||||
class TorStatusLabel extends StatefulWidget {
|
|
||||||
@override
|
|
||||||
_TorStatusState createState() => _TorStatusState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _TorStatusState extends State<TorStatusLabel> {
|
|
||||||
String status = "";
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Builder(
|
|
||||||
builder: (context2) => StreamBuilder<String>(
|
|
||||||
stream: Provider.of<FlwtchState>(context).appStatus.torStatus(),
|
|
||||||
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
|
|
||||||
return Text(
|
|
||||||
snapshot.hasData ? snapshot.data! : AppLocalizations.of(context)!.loadingTor,
|
|
||||||
style: Theme.of(context).textTheme.headline4,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue