From d647b0cc7efbaab31efe8e21066fc4fa0647a65e Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 24 Nov 2018 19:17:21 +0100 Subject: Add change avatar method --- depends/odhtdb | 2 +- include/dchat/Room.hpp | 13 +++++++++++++ include/dchat/User.hpp | 1 + src/Room.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/depends/odhtdb b/depends/odhtdb index 2021485..4d7a260 160000 --- a/depends/odhtdb +++ b/depends/odhtdb @@ -1 +1 @@ -Subproject commit 2021485e9efb7bb43a3a68f54efa78108a630f4d +Subproject commit 4d7a260b2b0acd329e90753dcc4cc680333a08b5 diff --git a/include/dchat/Room.hpp b/include/dchat/Room.hpp index a39f2f0..9eef4de 100644 --- a/include/dchat/Room.hpp +++ b/include/dchat/Room.hpp @@ -39,6 +39,8 @@ namespace dchat // Returns null if group doesn't exist in room std::shared_ptr getGroupById(const odhtdb::DataView groupId); void setLocalUser(std::shared_ptr user, std::shared_ptr keyPair); + void setAvatarUrl(const std::string &url); + void setNickname(const std::string &nickname); void publishMessage(const std::string &msg); Rooms *rooms; @@ -71,6 +73,15 @@ namespace dchat std::string newNickname; }; + struct UserChangeAvatarRequest + { + std::shared_ptr room; + std::shared_ptr user; + uint32_t timestampSeconds; + bool loadedFromCache; + std::string url; + }; + struct RoomChangeNameRequest { std::shared_ptr room; @@ -103,6 +114,7 @@ namespace dchat using RoomAddUserCallbackFunc = std::function; using RoomAddMessageCallbackFunc = std::function; using UserChangeNicknameCallbackFunc = std::function; + using UserChangeAvatarCallbackFunc = std::function; using ChangeRoomNameCallbackFunc = std::function; using ReceiveInviteUserCallbackFunc = std::function; struct RoomCallbackFuncs @@ -112,6 +124,7 @@ namespace dchat RoomAddUserCallbackFunc addUserCallbackFunc; RoomAddMessageCallbackFunc addMessageCallbackFunc; UserChangeNicknameCallbackFunc userChangeNicknameCallbackFunc; + UserChangeAvatarCallbackFunc userChangeAvatarCallbackFunc; ChangeRoomNameCallbackFunc changeRoomNameCallbackFunc; ReceiveInviteUserCallbackFunc receiveInviteUserCallbackFunc; }; diff --git a/include/dchat/User.hpp b/include/dchat/User.hpp index 245197f..9d22cb3 100644 --- a/include/dchat/User.hpp +++ b/include/dchat/User.hpp @@ -14,6 +14,7 @@ namespace dchat User(const odhtdb::Signature::PublicKey &_publicKey) : publicKey(_publicKey), userdata(nullptr) {} const odhtdb::Signature::PublicKey publicKey; std::string nickname; + std::string avatarUrl; std::vector> groups; void *userdata; }; diff --git a/src/Room.cpp b/src/Room.cpp index 924f2da..a8a8d6a 100644 --- a/src/Room.cpp +++ b/src/Room.cpp @@ -154,6 +154,34 @@ namespace dchat }); } + void Room::setAvatarUrl(const std::string &url) + { + assert(localUser); + assert(publicKeyToKeyPairMap.find(localUser->publicKey) != publicKeyToKeyPairMap.end()); + assert(encryptionKey); + sibs::SafeSerializer serializer; + serializer.add(RoomDataType::CHANGE_AVATAR); + serializer.add((u16)url.size()); + serializer.add((const u8*)url.data(), url.size()); + auto keyPair = publicKeyToKeyPairMap[localUser->publicKey]; + odhtdb::DatabaseNode roomNode(encryptionKey, id); + rooms->database->addData(roomNode, *keyPair, { serializer.getBuffer().data(), serializer.getSize() }); + } + + void Room::setNickname(const std::string &nickname) + { + assert(localUser); + assert(publicKeyToKeyPairMap.find(localUser->publicKey) != publicKeyToKeyPairMap.end()); + assert(encryptionKey); + sibs::SafeSerializer serializer; + serializer.add(RoomDataType::NICKNAME_CHANGE); + serializer.add((u8)nickname.size()); + serializer.add((const u8*)nickname.data(), nickname.size()); + auto keyPair = publicKeyToKeyPairMap[localUser->publicKey]; + odhtdb::DatabaseNode roomNode(encryptionKey, id); + rooms->database->addData(roomNode, *keyPair, { serializer.getBuffer().data(), serializer.getSize() }); + } + void Room::publishMessage(const std::string &msg) { assert(localUser); @@ -291,6 +319,27 @@ namespace dchat } break; } + case RoomDataType::CHANGE_AVATAR: + { + sibs::SafeDeserializer deserializer((const u8*)request.decryptedData.data + 1, request.decryptedData.size - 1); + u16 urlLength = deserializer.extract(); + if(urlLength > 0) + { + std::string url; + url.resize(urlLength); + deserializer.extract((u8*)&url[0], urlLength); + + UserChangeAvatarRequest roomRequest; + roomRequest.room = room; + roomRequest.user = user; + roomRequest.timestampSeconds = timestampSeconds; + roomRequest.loadedFromCache = request.loadedFromCache; + roomRequest.url = std::move(url); + if(callbackFuncs.userChangeAvatarCallbackFunc) + callbackFuncs.userChangeAvatarCallbackFunc(roomRequest); + } + break; + } case RoomDataType::CHANGE_ROOM_NAME: { int userPermissionLevel = database->getUserLowestPermissionLevel(*room->id, user->publicKey); @@ -318,7 +367,10 @@ namespace dchat break; } default: + { + odhtdb::Log::warn("Rooms::addNodeCallbackFunc: Got unexpected room data type %d", roomDataType); break; + } } } catch(std::exception &e) -- cgit v1.2.3