aboutsummaryrefslogtreecommitdiff
path: root/src/Channel.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-05-01 13:27:52 +0200
committerdec05eba <dec05eba@protonmail.com>2018-05-01 13:28:29 +0200
commit431c1dcded16649c10331b9dc4e57f20067cea0b (patch)
tree3f5327ca81f76ad7c77f36a930d56401a4ec458e /src/Channel.cpp
parent9e576f9fbcbcc4603689b0b1215cf3d526bd9616 (diff)
Add 'add user', 'join channel'. Improve scrolling. Added locks
Diffstat (limited to 'src/Channel.cpp')
-rw-r--r--src/Channel.cpp67
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);