diff options
author | dec05eba <dec05eba@protonmail.com> | 2018-05-01 13:27:52 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2018-05-01 13:28:29 +0200 |
commit | 431c1dcded16649c10331b9dc4e57f20067cea0b (patch) | |
tree | 3f5327ca81f76ad7c77f36a930d56401a4ec458e /src/Channel.cpp | |
parent | 9e576f9fbcbcc4603689b0b1215cf3d526bd9616 (diff) |
Add 'add user', 'join channel'. Improve scrolling. Added locks
Diffstat (limited to 'src/Channel.cpp')
-rw-r--r-- | src/Channel.cpp | 67 |
1 files changed, 62 insertions, 5 deletions
diff --git a/src/Channel.cpp b/src/Channel.cpp index 748be49..b922833 100644 --- a/src/Channel.cpp +++ b/src/Channel.cpp @@ -16,7 +16,7 @@ namespace dchat messageBoard(sf::Vector2u(1.0f, 1.0f)), localUser(_localUser ? _localUser : new OfflineUser("You")) { - addUser(localUser); + addUserLocally(localUser); { Message *message = new Message(&systemUser, u8"hello, worldåäö1![emoji](https://discordemoji.com/assets/emoji/playtime.png)"); messageBoard.addMessage(message); @@ -72,6 +72,11 @@ namespace dchat return localUser; } + SystemUser* Channel::getSystemUser() + { + return &systemUser; + } + MessageBoard& Channel::getMessageBoard() { return messageBoard; @@ -95,6 +100,11 @@ namespace dchat return nullptr; } + std::shared_ptr<odhtdb::Hash> Channel::getId() + { + return databaseNodeInfo.getRequestHash(); + } + void Channel::addLocalMessage(const std::string &msg, User *owner, u64 timestampSeconds) { assert(owner); @@ -106,16 +116,16 @@ namespace dchat if(database && localUser->type == User::Type::ONLINE) { addLocalMessage(msg, localUser, database->getSyncedTimestampUtc().seconds); - auto onlineUser = static_cast<OnlineUser*>(localUser); - assert(onlineUser->databaseUser->getType() == odhtdb::User::Type::LOCAL); - database->addData(databaseNodeInfo, static_cast<const odhtdb::LocalUser*>(onlineUser->databaseUser), odhtdb::DataView((void*)msg.data(), msg.size())); + auto localOnlineUser = static_cast<OnlineUser*>(localUser); + assert(localOnlineUser->databaseUser->getType() == odhtdb::User::Type::LOCAL); + database->addData(databaseNodeInfo, static_cast<const odhtdb::LocalUser*>(localOnlineUser->databaseUser), odhtdb::DataView((void*)msg.data(), msg.size())); database->commit(); } else addLocalMessage(msg, localUser, 0); } - void Channel::addUser(User *user) + void Channel::addUserLocally(User *user) { users.push_back(user); if(user->type == User::Type::ONLINE) @@ -125,6 +135,53 @@ namespace dchat } } + bool Channel::addUser(const odhtdb::Signature::PublicKey &userId, const string &groupId) + { + assert(database); + if(!database || localUser->type != User::Type::ONLINE) + return false; + + if(groupId.size() != odhtdb::GROUP_ID_LENGTH) + { + fprintf(stderr, "Group id is wrong size. Expected to be %u bytes, was %u byte(s)\n", odhtdb::GROUP_ID_LENGTH, groupId.size()); + return false; + } + + auto localOnlineUser = static_cast<OnlineUser*>(localUser); + assert(localOnlineUser->databaseUser->getType() == odhtdb::User::Type::LOCAL); + + uint8_t groupIdRaw[odhtdb::GROUP_ID_LENGTH]; + memcpy(groupIdRaw, groupId.data(), groupId.size()); + auto groupToAddUserTo = database->getStorage().getGroupById(*databaseNodeInfo.getRequestHash(), groupIdRaw); + if(!groupToAddUserTo) + { + fprintf(stderr, "Group with id %s does not exist in channel %s\n", groupId.c_str(), databaseNodeInfo.getRequestHash()->toString().c_str()); + return false; + } + database->addUser(databaseNodeInfo, static_cast<const odhtdb::LocalUser*>(localOnlineUser->databaseUser), "noname", userId, groupToAddUserTo); + + auto addedUser = database->getStorage().getUserByPublicKey(*databaseNodeInfo.getRequestHash(), userId); + assert(addedUser); + addUserLocally(new OnlineUser(addedUser)); + return true; + } + + void Channel::replaceLocalUser(User *newLocalUser) + { + for(vector<User*>::iterator it = users.begin(); it != users.end(); ++it) + { + if(*it == localUser) + { + users.erase(it); + delete localUser; + break; + } + } + + localUser = newLocalUser; + users.push_back(newLocalUser); + } + void Channel::processEvent(const sf::Event &event) { chatbar.processEvent(event, this); |