2
0
mirror of https://github.com/ars3niy/tdlib-purple synced 2025-08-22 09:57:52 +00:00

tdlib 1.7.4 compatibility: chat members can be not only users but also chats

Ignore non-user members: they are only possible in supergroups and then only
as Left or Banned.
This commit is contained in:
Arseniy Lartsev 2021-12-06 19:56:53 +01:00 committed by Arseniy Lartsev
parent b2432c3cae
commit 121c3dbddf
8 changed files with 62 additions and 30 deletions

View File

@ -111,6 +111,19 @@ bool isGroupMember(const td::td_api::object_ptr<td::td_api::ChatMemberStatus> &s
return true;
}
bool isSameUser(const td::td_api::MessageSender &member1, const td::td_api::MessageSender &member2)
{
if ((member1.get_id() == td::td_api::messageSenderUser::ID) &&
(member2.get_id() == td::td_api::messageSenderUser::ID))
{
const td::td_api::messageSenderUser &user1 = static_cast<const td::td_api::messageSenderUser &>(member1);
const td::td_api::messageSenderUser &user2 = static_cast<const td::td_api::messageSenderUser &>(member2);
return (user1.user_id_ == user2.user_id_);
}
return false;
}
static std::string makeDisplayName(const td::td_api::user &user)
{
std::string result = makeBasicDisplayName(user);

View File

@ -32,6 +32,7 @@ BasicGroupId getBasicGroupId(const td::td_api::chat &chat);
SupergroupId getSupergroupId(const td::td_api::chat &chat);
SecretChatId getSecretChatId(const td::td_api::chat &chat);
bool isGroupMember(const td::td_api::object_ptr<td::td_api::ChatMemberStatus> &status);
bool isSameUser(const td::td_api::MessageSender &member1, const td::td_api::MessageSender &member2);
enum {
CHAT_HISTORY_REQUEST_LIMIT = 50,

View File

@ -45,7 +45,11 @@ UserId getUserId(const td::td_api::chatTypePrivate &privType)
UserId getUserId(const td::td_api::chatMember &member)
{
return UserId(member.user_id_);
if (member.member_id_ && (member.member_id_->get_id() == td::td_api::messageSenderUser::ID)) {
const td::td_api::messageSenderUser &userInfo = static_cast<const td::td_api::messageSenderUser &>(*member.member_id_);
return UserId(userInfo.user_id_);
}
return UserId::invalid;
}
UserId getUserId(const td::td_api::call &call)

View File

@ -794,15 +794,16 @@ void PurpleTdClient::supergroupAdministratorsResponse(uint64_t requestId, td::td
if (object && (object->get_id() == td::td_api::chatMembers::ID)) {
td::td_api::object_ptr<td::td_api::chatMembers> newMembers =
td::move_tl_object_as<td::td_api::chatMembers>(object);
for (auto &pMember: newMembers->members_) {
if (! pMember) continue;
int32_t userId = pMember->user_id_;
for (auto &pNewMember: newMembers->members_) {
if (! pNewMember || !pNewMember->member_id_) continue;
const td::td_api::MessageSender *pNewMemberInfo = pNewMember->member_id_.get();
if (std::find_if(members->members_.begin(), members->members_.end(),
[userId](const td::td_api::object_ptr<td::td_api::chatMember> &pMember) {
return (pMember && (pMember->user_id_ == userId));
[pNewMemberInfo](const td::td_api::object_ptr<td::td_api::chatMember> &pExistingMember) {
return pExistingMember && pExistingMember->member_id_ &&
isSameUser(*pExistingMember->member_id_, *pNewMemberInfo);
}) == members->members_.end())
{
members->members_.push_back(std::move(pMember));
members->members_.push_back(std::move(pNewMember));
}
}
}

View File

@ -180,21 +180,21 @@ TEST_F(GroupChatTest, ExistingBasicGroupReceiveMessageAtLogin_WithMemberList_Rem
prpl.discardEvents();
std::vector<object_ptr<chatMember>> members;
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[0],
userIds[1],
0,
make_object<chatMemberStatusMember>(),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[1],
userIds[1],
0,
make_object<chatMemberStatusCreator>("", true),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
selfId,
userIds[1],
0,
@ -307,21 +307,21 @@ TEST_F(GroupChatTest, SendMessageWithMemberList)
constexpr int purpleChatId = 1;
std::vector<object_ptr<chatMember>> members;
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[0],
userIds[1],
0,
make_object<chatMemberStatusMember>(),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[1],
userIds[1],
0,
make_object<chatMemberStatusCreator>("", true),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
selfId,
userIds[1],
0,
@ -485,21 +485,21 @@ TEST_F(GroupChatTest, JoinBasicGroupByInviteLink)
tgl.update(standardUpdateUser(0));
tgl.update(standardUpdateUser(1));
std::vector<object_ptr<chatMember>> members;
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[0],
userIds[1],
0,
make_object<chatMemberStatusMember>(),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[1],
userIds[1],
0,
make_object<chatMemberStatusCreator>("", true),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
selfId,
userIds[1],
0,
@ -736,21 +736,21 @@ TEST_F(GroupChatTest, UsersWithSameName)
constexpr int purpleChatId = 1;
std::vector<object_ptr<chatMember>> members;
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[0],
userIds[1],
0,
make_object<chatMemberStatusMember>(),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[1],
userIds[1],
0,
make_object<chatMemberStatusCreator>("", true),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
selfId,
userIds[1],
0,
@ -835,21 +835,21 @@ TEST_F(GroupChatTest, GroupChatWithDeletedUser_WriteToNonContact)
deletedUser->type_ = make_object<userTypeDeleted>();
std::vector<object_ptr<chatMember>> members;
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[0],
userIds[0],
0,
make_object<chatMemberStatusCreator>("", true),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
userIds[1], // Deleted user
userIds[0],
0,
make_object<chatMemberStatusMember>(),
nullptr
));
members.push_back(make_object<chatMember>(
members.push_back(makeChatMember(
selfId,
userIds[0],
0,
@ -1574,3 +1574,5 @@ TEST_F(GroupChatTest, RejoinAtStartupBeforeUpdateNewChat_ChatListNullFirst)
);
tgl.verifyRequest(getBasicGroupFullInfo(groupId));
}
Test non-user member

View File

@ -81,14 +81,14 @@ TEST_F(SupergroupTest, AddSupergroupChatAtLogin_WithMemberList_OpenChatAfterFull
fullInfo->description_ = "Description";
auto members = make_object<chatMembers>();
members->members_.push_back(make_object<chatMember>(
members->members_.push_back(makeChatMember(
userIds[1],
userIds[1],
0,
make_object<chatMemberStatusCreator>("", true),
nullptr
));
members->members_.push_back(make_object<chatMember>(
members->members_.push_back(makeChatMember(
selfId,
userIds[1],
0,
@ -98,14 +98,14 @@ TEST_F(SupergroupTest, AddSupergroupChatAtLogin_WithMemberList_OpenChatAfterFull
members->members_.push_back(nullptr);
auto admins = make_object<chatMembers>();
admins->members_.push_back(make_object<chatMember>(
admins->members_.push_back(makeChatMember(
userIds[0],
userIds[1],
0,
make_object<chatMemberStatusAdministrator>(),
nullptr
));
admins->members_.push_back(make_object<chatMember>(
admins->members_.push_back(makeChatMember(
userIds[1],
userIds[1],
0,
@ -203,14 +203,14 @@ TEST_F(SupergroupTest, ExistingSupergroupReceiveMessageAtLogin_WithMemberList_Op
fullInfo->description_ = "Description";
auto members = make_object<chatMembers>();
members->members_.push_back(make_object<chatMember>(
members->members_.push_back(makeChatMember(
userIds[1],
userIds[1],
0,
make_object<chatMemberStatusCreator>("", true),
nullptr
));
members->members_.push_back(make_object<chatMember>(
members->members_.push_back(makeChatMember(
selfId,
userIds[1],
0,
@ -220,14 +220,14 @@ TEST_F(SupergroupTest, ExistingSupergroupReceiveMessageAtLogin_WithMemberList_Op
members->members_.push_back(nullptr);
auto admins = make_object<chatMembers>();
admins->members_.push_back(make_object<chatMember>(
admins->members_.push_back(makeChatMember(
userIds[0],
userIds[1],
0,
make_object<chatMemberStatusAdministrator>(),
nullptr
));
admins->members_.push_back(make_object<chatMember>(
admins->members_.push_back(makeChatMember(
userIds[1],
userIds[1],
0,
@ -634,3 +634,5 @@ TEST_F(SupergroupTest, ReceiveChannelPost)
);
}
Test non-user member

View File

@ -714,5 +714,12 @@ object_ptr<photo> makePhotoUploading(int32_t fileId, unsigned size, unsigned upl
return make_object<photo>(false, nullptr, std::move(sizes));
}
object_ptr<chatMember> makeChatMember(int32_t userId, int32_t inviteUserId, time_t joinTime,
object_ptr<ChatMemberStatus> &&memberStatus, const void *)
{
return make_object<chatMember>(make_object<messageSenderUser>(userId),
inviteUserId, joinTime, std::move(memberStatus));
}
}
}

View File

@ -73,6 +73,8 @@ object_ptr<photo> makePhotoLocal(int32_t fileId, unsigned size, const std::strin
unsigned width, unsigned height);
object_ptr<photo> makePhotoUploading(int32_t fileId, unsigned size, unsigned uploaded, const std::string &path,
unsigned width, unsigned height);
object_ptr<chatMember> makeChatMember(int32_t userId, int32_t inviteUserId, time_t joinTime,
object_ptr<ChatMemberStatus> &&memberStatus, const void *);
}
}