Browse Source

fix(group): always retain own name when updating group peer list

Adds special case for updating our own PK in regeneratePeerList
Format according to format-code.sh

Fixes #5686
reviewable/pr5698/r1
jenli669 6 years ago
parent
commit
c772db3baa
No known key found for this signature in database
GPG Key ID: 8267F9F7C2BF7E5E
  1. 28
      src/model/group.cpp

28
src/model/group.cpp

@ -19,12 +19,12 @@
#include "group.h" #include "group.h"
#include "friend.h" #include "friend.h"
#include "src/friendlist.h" #include "src/core/contactid.h"
#include "src/core/core.h" #include "src/core/core.h"
#include "src/core/coreav.h" #include "src/core/coreav.h"
#include "src/core/contactid.h"
#include "src/core/groupid.h" #include "src/core/groupid.h"
#include "src/core/toxpk.h" #include "src/core/toxpk.h"
#include "src/friendlist.h"
#include "src/persistence/settings.h" #include "src/persistence/settings.h"
#include "src/widget/form/groupchatform.h" #include "src/widget/form/groupchatform.h"
#include "src/widget/groupwidget.h" #include "src/widget/groupwidget.h"
@ -32,7 +32,8 @@
static const int MAX_GROUP_TITLE_LENGTH = 128; static const int MAX_GROUP_TITLE_LENGTH = 128;
Group::Group(int groupId, const GroupId persistentGroupId, const QString& name, bool isAvGroupchat, const QString& selfName) Group::Group(int groupId, const GroupId persistentGroupId, const QString& name, bool isAvGroupchat,
const QString& selfName)
: selfName{selfName} : selfName{selfName}
, title{name} , title{name}
, toxGroupNum(groupId) , toxGroupNum(groupId)
@ -80,12 +81,13 @@ QString Group::getDisplayedName() const
void Group::regeneratePeerList() void Group::regeneratePeerList()
{ {
// NOTE: there's a bit of a race here. Core emits a signal for both groupPeerlistChanged and groupPeerNameChanged // NOTE: there's a bit of a race here. Core emits a signal for both groupPeerlistChanged and
// back-to-back when a peer joins our group. If we get both before we process this slot, core->getGroupPeerNames // groupPeerNameChanged back-to-back when a peer joins our group. If we get both before we
// will contain the new peer name, and we'll ignore the name changed signal, and emit a single userJoined with // process this slot, core->getGroupPeerNames will contain the new peer name, and we'll ignore
// the correct name. But, if we receive the name changed signal a little later, we will emit userJoined before we // the name changed signal, and emit a single userJoined with the correct name. But, if we
// have their username, using just their ToxPk, then shortly after emit another peerNameChanged signal. This can // receive the name changed signal a little later, we will emit userJoined before we have their
// cause double-updated to UI and chatlog, but is unavoidable given the API of toxcore. // username, using just their ToxPk, then shortly after emit another peerNameChanged signal.
// This can cause double-updated to UI and chatlog, but is unavoidable given the API of toxcore.
const Core* core = Core::getInstance(); const Core* core = Core::getInstance();
QStringList peers = core->getGroupPeerNames(toxGroupNum); QStringList peers = core->getGroupPeerNames(toxGroupNum);
const auto oldPeerNames = peerDisplayNames; const auto oldPeerNames = peerDisplayNames;
@ -93,20 +95,22 @@ void Group::regeneratePeerList()
const int nPeers = peers.size(); const int nPeers = peers.size();
for (int i = 0; i < nPeers; ++i) { for (int i = 0; i < nPeers; ++i) {
const auto pk = core->getGroupPeerPk(toxGroupNum, i); const auto pk = core->getGroupPeerPk(toxGroupNum, i);
if (pk == core->getSelfPublicKey())
peerDisplayNames[pk] = core->getUsername();
peerDisplayNames[pk] = FriendList::decideNickname(pk, peers[i]); peerDisplayNames[pk] = FriendList::decideNickname(pk, peers[i]);
} }
for (const auto& pk: oldPeerNames.keys()) { for (const auto& pk : oldPeerNames.keys()) {
if (!peerDisplayNames.contains(pk)) { if (!peerDisplayNames.contains(pk)) {
emit userLeft(pk, oldPeerNames.value(pk)); emit userLeft(pk, oldPeerNames.value(pk));
stopAudioOfDepartedPeers(pk); stopAudioOfDepartedPeers(pk);
} }
} }
for (const auto& pk: peerDisplayNames.keys()) { for (const auto& pk : peerDisplayNames.keys()) {
if (!oldPeerNames.contains(pk)) { if (!oldPeerNames.contains(pk)) {
emit userJoined(pk, peerDisplayNames.value(pk)); emit userJoined(pk, peerDisplayNames.value(pk));
} }
} }
for (const auto& pk: peerDisplayNames.keys()) { for (const auto& pk : peerDisplayNames.keys()) {
if (oldPeerNames.contains(pk) && oldPeerNames.value(pk) != peerDisplayNames.value(pk)) { if (oldPeerNames.contains(pk) && oldPeerNames.value(pk) != peerDisplayNames.value(pk)) {
emit peerNameChanged(pk, oldPeerNames.value(pk), peerDisplayNames.value(pk)); emit peerNameChanged(pk, oldPeerNames.value(pk), peerDisplayNames.value(pk));
} }

Loading…
Cancel
Save