From 431c1dcded16649c10331b9dc4e57f20067cea0b Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 1 May 2018 13:27:52 +0200 Subject: Add 'add user', 'join channel'. Improve scrolling. Added locks --- src/Channel.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 5 deletions(-) (limited to 'src/Channel.cpp') 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 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(localUser); - assert(onlineUser->databaseUser->getType() == odhtdb::User::Type::LOCAL); - database->addData(databaseNodeInfo, static_cast(onlineUser->databaseUser), odhtdb::DataView((void*)msg.data(), msg.size())); + auto localOnlineUser = static_cast(localUser); + assert(localOnlineUser->databaseUser->getType() == odhtdb::User::Type::LOCAL); + database->addData(databaseNodeInfo, static_cast(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(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(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::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); -- cgit v1.2.3