From cabed6def3d4b83b3c10de098bb0defa684583de Mon Sep 17 00:00:00 2001 From: Monsterovich Date: Sat, 22 Dec 2018 02:38:21 +0200 Subject: [PATCH] feat(core): print a chat log entry when a user joins/leaves the group chat --- src/widget/form/groupchatform.cpp | 52 +++++++++++++++++++++++++++++++ src/widget/form/groupchatform.h | 1 + 2 files changed, 53 insertions(+) diff --git a/src/widget/form/groupchatform.cpp b/src/widget/form/groupchatform.cpp index 2b521c581..b75498150 100644 --- a/src/widget/form/groupchatform.cpp +++ b/src/widget/form/groupchatform.cpp @@ -44,6 +44,9 @@ #include #include +QMap > groups; +QMap > firstTime; + namespace { const auto LABEL_PEER_TYPE_OUR = QVariant(QStringLiteral("our")); @@ -136,6 +139,8 @@ GroupChatForm::GroupChatForm(Group* chatGroup) GroupChatForm::~GroupChatForm() { + groups[group->getId()].clear(); + firstTime[group->getId()].clear(); Translator::unregister(this); } @@ -176,6 +181,7 @@ void GroupChatForm::onUserListChanged() { updateUserCount(); updateUserNames(); + sendJoinLeaveMessages(); // Enable or disable call button const int peersCount = group->getPeersCount(); @@ -307,6 +313,52 @@ void GroupChatForm::updateUserNames() } } +void GroupChatForm::sendJoinLeaveMessages() +{ + const auto peers = group->getPeerList(); + + // no need to do anything without any peers + if (peers.isEmpty()) { + return; + } + + // generate user list from the current group if it's empty + if (!groups.contains(group->getId())) + { + groups[group->getId()] = group->getPeerList(); + return; + } + + auto ¤t = groups[group->getId()]; + auto &ft = firstTime[group->getId()]; + // user joins + for (const auto& peerPk : peers.keys()) { + const QString name = peers.value(peerPk); + // ignore weird issue: when user joins the group, the name is empty, then it's renamed to normal nickname (why?) + // so, just ignore the first insertion + if (!ft.value(peerPk, false)) + { + ft[peerPk] = true; + continue; + } + if (!current.contains(peerPk)) + { + current.insert(peerPk, name); + addSystemInfoMessage(tr("%1 has joined the group").arg(name), ChatMessage::INFO, QDateTime()); + } + } + // user leaves + for (const auto& peerPk : current.keys()) { + const QString name = current.value(peerPk); + if (!peers.contains(peerPk)) + { + current.remove(peerPk); + ft.remove(peerPk); + addSystemInfoMessage(tr("%1 has left the group").arg(name), ChatMessage::INFO, QDateTime()); + } + } +} + void GroupChatForm::peerAudioPlaying(ToxPk peerPk) { peerLabels[peerPk]->setProperty("playingAudio", LABEL_PEER_PLAYING_AUDIO); diff --git a/src/widget/form/groupchatform.h b/src/widget/form/groupchatform.h index 63c1c6e3b..af165e4c7 100644 --- a/src/widget/form/groupchatform.h +++ b/src/widget/form/groupchatform.h @@ -67,6 +67,7 @@ private: void retranslateUi(); void updateUserCount(); void updateUserNames(); + void sendJoinLeaveMessages(); private: Group* group;