From 9d84d5d8e7f61a02c01eef021ea5e8b2f49dcf8f Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 28 Apr 2018 15:31:27 +0200 Subject: Connect channels to database, currently only locally --- src/main.cpp | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 73 insertions(+), 12 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index 52a19b9..6f54820 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,6 +43,24 @@ odhtdb::DatabaseNode createDatabaseNodeFromJoinKey(const string &joinKey) return result; } +void channelAddStoredMessages(Channel *channel, const odhtdb::DatabaseStorageObjectList *nodeStorage) +{ + for(auto nodeStorageAddedObject : nodeStorage->objects) + { + if(nodeStorageAddedObject->decryptedObject.operation == odhtdb::DatabaseOperation::ADD_DATA) + { + User *user = channel->getUserByPublicKey(nodeStorageAddedObject->creatorPublicKey); + if(!user) + { + fprintf(stderr, "Missing user? %s\n", nodeStorageAddedObject->creatorPublicKey.toString().c_str()); + continue; + } + string msg((const char*)nodeStorageAddedObject->decryptedObject.data.data, nodeStorageAddedObject->decryptedObject.data.size); + channel->addLocalMessage(msg, user); + } + } +} + int main(int argc, char **argv) { /* @@ -77,16 +95,18 @@ int main(int argc, char **argv) Cache cache; - Channel channel("latenightshiendjs"); - ChannelSidePanel::addChannel(&channel); - UsersSidePanel::addUser(channel.getLocalUser()); + Channel offlineChannel("Offline"); + ChannelSidePanel::addChannel(&offlineChannel); + UsersSidePanel::setCurrentChannel(&offlineChannel); + + vector channels; odhtdb::Signature::KeyPair *currentUserKeyPair = nullptr; vector localNodeUsers; string currentUserName; string currentUserPassword; - Command::add("login", [¤tUserKeyPair, ¤tUserName, ¤tUserPassword, &localNodeUsers, &database](const vector &args) + Command::add("login", [¤tUserKeyPair, ¤tUserName, ¤tUserPassword, &localNodeUsers, &database, &channels](const vector &args) { if(args.size() != 2) { @@ -99,10 +119,39 @@ int main(int argc, char **argv) odhtdb::Signature::KeyPair keyPair = database.getStorage().decryptLocalEncryptedUser(args[0], args[1]); localNodeUsers = database.getStorage().getLocalNodeUsers(keyPair); + ChannelSidePanel::removeAllChannels(); + for(Channel *channel : channels) + { + delete channel; + } + channels.clear(); + for(auto localNodeUser : localNodeUsers) { - //const odhtdb::DatabaseStorageObjectList *nodeStorage = database.getStorage().getStorage(localNodeUser.nodeHash); - //Channel *channel = new Channel() + auto nodeStorage = database.getStorage().getStorage(localNodeUser.nodeHash); + if(!nodeStorage) continue; + + auto nodeDecryptionKeyResult = database.getStorage().getNodeDecryptionKey(localNodeUser.nodeHash); + if(!nodeDecryptionKeyResult.first) continue; + + User *newLocalUser = new OnlineUser(localNodeUser.localUser); + odhtdb::DatabaseNode databaseNode(nodeDecryptionKeyResult.second, make_shared(localNodeUser.nodeHash)); + Channel *channel = new Channel(nodeStorage->nodeName, databaseNode, newLocalUser, &database); + + auto nodeUserMapByPublicKey = database.getStorage().getNodeUsers(localNodeUser.nodeHash); + for(auto nodeUserIt : *nodeUserMapByPublicKey) + { + if(nodeUserIt.second != localNodeUser.localUser) + { + User *newRemoteUser = new OnlineUser(nodeUserIt.second); + channel->addUser(newRemoteUser); + } + } + + ChannelSidePanel::addChannel(channel); + channels.push_back(channel); + UsersSidePanel::setCurrentChannel(channel); + channelAddStoredMessages(channel, nodeStorage); } printf("Successfully logged into user %s\n", args[0].c_str()); @@ -119,7 +168,7 @@ int main(int argc, char **argv) } }); - Command::add("register", [¤tUserKeyPair, ¤tUserName, ¤tUserPassword, &database](const vector &args) + Command::add("register", [¤tUserKeyPair, ¤tUserName, ¤tUserPassword, &localNodeUsers, &database](const vector &args) { if(args.size() != 2) { @@ -127,6 +176,12 @@ int main(int argc, char **argv) return; } + if(currentUserKeyPair) + { + fprintf(stderr, "You can't register a new account when you are logged in, please logout first\n"); + return; + } + odhtdb::Signature::KeyPair keyPair; if(!database.getStorage().storeLocalUser(args[0], keyPair, args[1])) { @@ -140,12 +195,13 @@ int main(int argc, char **argv) if(currentUserKeyPair) delete currentUserKeyPair; currentUserKeyPair = new odhtdb::Signature::KeyPair(keyPair); + localNodeUsers.clear(); currentUserName = args[0]; currentUserPassword = args[1]; }); - Command::add("cc", [¤tUserKeyPair, ¤tUserName, &database](const vector &args) + Command::add("cc", [¤tUserKeyPair, ¤tUserName, &database, &channels](const vector &args) { if(args.size() != 1) { @@ -161,9 +217,14 @@ int main(int argc, char **argv) auto createResponse = database.create(currentUserName, *currentUserKeyPair, args[0]); database.commit(); - odhtdb::DatabaseNode databaseNode(createResponse->getNodeEncryptionKey(), createResponse->getRequestHash()); - database.seed(databaseNode); printf("Created database '%s', join key: '%s'\n", args[0].c_str(), createChannelJoinKey(createResponse).c_str()); + + User *newLocalUser = new OnlineUser(createResponse->getNodeAdminUser()); + odhtdb::DatabaseNode databaseNode(createResponse->getNodeEncryptionKey(), createResponse->getRequestHash()); + Channel *channel = new Channel(args[0], databaseNode, newLocalUser, &database); + ChannelSidePanel::addChannel(channel); + channels.push_back(channel); + UsersSidePanel::setCurrentChannel(channel); }); Command::add("jc", [¤tUserKeyPair, &database](const vector &args) @@ -210,11 +271,11 @@ int main(int argc, char **argv) sf::View view(viewRect); window.setView(view); } - channel.processEvent(event); + UsersSidePanel::getCurrentChannel()->processEvent(event); } window.clear(sf::Color(40, 40, 40)); - channel.draw(window, cache); + UsersSidePanel::getCurrentChannel()->draw(window, cache); //video.draw(window); window.display(); } -- cgit v1.2.3