aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-04-28 15:31:27 +0200
committerdec05eba <dec05eba@protonmail.com>2018-04-28 15:31:33 +0200
commit9d84d5d8e7f61a02c01eef021ea5e8b2f49dcf8f (patch)
treec680f1d77e09d8333299d4098b0093240e138f91 /src/main.cpp
parent3b03f87070d91f63f0dc3c7152723727781dcccf (diff)
Connect channels to database, currently only locally
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp85
1 files changed, 73 insertions, 12 deletions
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<Channel*> channels;
odhtdb::Signature::KeyPair *currentUserKeyPair = nullptr;
vector<odhtdb::NodeLocalUser> localNodeUsers;
string currentUserName;
string currentUserPassword;
- Command::add("login", [&currentUserKeyPair, &currentUserName, &currentUserPassword, &localNodeUsers, &database](const vector<string> &args)
+ Command::add("login", [&currentUserKeyPair, &currentUserName, &currentUserPassword, &localNodeUsers, &database, &channels](const vector<string> &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<odhtdb::Hash>(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", [&currentUserKeyPair, &currentUserName, &currentUserPassword, &database](const vector<string> &args)
+ Command::add("register", [&currentUserKeyPair, &currentUserName, &currentUserPassword, &localNodeUsers, &database](const vector<string> &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", [&currentUserKeyPair, &currentUserName, &database](const vector<string> &args)
+ Command::add("cc", [&currentUserKeyPair, &currentUserName, &database, &channels](const vector<string> &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", [&currentUserKeyPair, &database](const vector<string> &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();
}