mirror of
https://github.com/ars3niy/tdlib-purple
synced 2025-08-22 09:57:52 +00:00
tdlib 1.6.6 compatibility: switched to using td_api::chatPosition
This commit is contained in:
parent
9ad9a7ebb1
commit
59b2c0eb76
@ -70,7 +70,7 @@ UserId getUserIdByPrivateChat(const td::td_api::chat &chat)
|
|||||||
|
|
||||||
bool isChatInContactList(const td::td_api::chat &chat, const td::td_api::user *privateChatUser)
|
bool isChatInContactList(const td::td_api::chat &chat, const td::td_api::user *privateChatUser)
|
||||||
{
|
{
|
||||||
return (chat.chat_list_ != nullptr) || (privateChatUser && privateChatUser->is_contact_);
|
return !chat.positions_.empty() || (privateChatUser && privateChatUser->is_contact_);
|
||||||
}
|
}
|
||||||
|
|
||||||
BasicGroupId getBasicGroupId(const td::td_api::chat &chat)
|
BasicGroupId getBasicGroupId(const td::td_api::chat &chat)
|
||||||
@ -437,11 +437,28 @@ void TdAccountData::addChat(TdChatPtr chat)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TdAccountData::updateChatChatList(ChatId chatId, td::td_api::object_ptr<td::td_api::ChatList> list)
|
void TdAccountData::updateChatPosition(ChatId chatId, td::td_api::object_ptr<td::td_api::chatPosition> &&position)
|
||||||
{
|
{
|
||||||
auto it = m_chatInfo.find(chatId);
|
auto it = m_chatInfo.find(chatId);
|
||||||
if (it != m_chatInfo.end())
|
if (position && position->list_ && (it != m_chatInfo.end())) {
|
||||||
it->second.chat->chat_list_ = std::move(list);
|
auto listId = position->list_->get_id();
|
||||||
|
td::td_api::chat &chat = *it->second.chat;
|
||||||
|
if (position->order_ == 0)
|
||||||
|
chat.positions_.erase(
|
||||||
|
std::remove_if(chat.positions_.begin(), chat.positions_.end(),
|
||||||
|
[listId](const td::td_api::object_ptr<td::td_api::chatPosition> &chatPos) {
|
||||||
|
return chatPos && (chatPos->list_->get_id() == listId);
|
||||||
|
}),
|
||||||
|
chat.positions_.end());
|
||||||
|
else {
|
||||||
|
auto pPosition = std::find_if(chat.positions_.begin(), chat.positions_.end(),
|
||||||
|
[listId](const td::td_api::object_ptr<td::td_api::chatPosition> &chatPos) {
|
||||||
|
return chatPos && (chatPos->list_->get_id() == listId);
|
||||||
|
});
|
||||||
|
if (pPosition != chat.positions_.end())
|
||||||
|
*pPosition = std::move(position);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TdAccountData::updateChatTitle(ChatId chatId, const std::string &title)
|
void TdAccountData::updateChatTitle(ChatId chatId, const std::string &title)
|
||||||
@ -461,13 +478,6 @@ void TdAccountData::updateSmallChatPhoto(ChatId chatId, td::td_api::object_ptr<t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TdAccountData::updateChatOrder(ChatId chatId, int64_t order)
|
|
||||||
{
|
|
||||||
auto it = m_chatInfo.find(chatId);
|
|
||||||
if (it != m_chatInfo.end())
|
|
||||||
it->second.chat->order_ = order;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TdAccountData::setContacts(const td::td_api::users &users)
|
void TdAccountData::setContacts(const td::td_api::users &users)
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < users.user_ids_.size(); i++) {
|
for (unsigned i = 0; i < users.user_ids_.size(); i++) {
|
||||||
@ -708,24 +718,6 @@ void TdAccountData::deleteChat(ChatId id)
|
|||||||
m_chatInfo.erase(id);
|
m_chatInfo.erase(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TdAccountData::getSmallestOrderChat(const td::td_api::ChatList &list, ChatId &chatId, int64_t &order)
|
|
||||||
{
|
|
||||||
int64_t minOrder = INT64_MAX;
|
|
||||||
ChatId id = ChatId::invalid;
|
|
||||||
for (const ChatMap::value_type &entry: m_chatInfo) {
|
|
||||||
int64_t order = entry.second.chat->order_;
|
|
||||||
if (entry.second.chat->chat_list_ && (entry.second.chat->chat_list_->get_id() == list.get_id()) &&
|
|
||||||
(order < minOrder))
|
|
||||||
{
|
|
||||||
minOrder = order;
|
|
||||||
id = entry.first;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chatId = id;
|
|
||||||
order = minOrder;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TdAccountData::addExpectedChat(ChatId id)
|
void TdAccountData::addExpectedChat(ChatId id)
|
||||||
{
|
{
|
||||||
if (!isExpectedChat(id))
|
if (!isExpectedChat(id))
|
||||||
|
@ -321,15 +321,13 @@ public:
|
|||||||
void updateSupergroupMembers(SupergroupId groupId, TdChatMembersPtr members);
|
void updateSupergroupMembers(SupergroupId groupId, TdChatMembersPtr members);
|
||||||
|
|
||||||
void addChat(TdChatPtr chat); // Updates existing chat if any
|
void addChat(TdChatPtr chat); // Updates existing chat if any
|
||||||
void updateChatChatList(ChatId chatId, td::td_api::object_ptr<td::td_api::ChatList> list);
|
void updateChatPosition(ChatId chatId, td::td_api::object_ptr<td::td_api::chatPosition> &&position);
|
||||||
void updateChatTitle(ChatId chatId, const std::string &title);
|
void updateChatTitle(ChatId chatId, const std::string &title);
|
||||||
void updateSmallChatPhoto(ChatId chatId, td::td_api::object_ptr<td::td_api::file> photo);
|
void updateSmallChatPhoto(ChatId chatId, td::td_api::object_ptr<td::td_api::file> photo);
|
||||||
void updateChatOrder(ChatId chatId, int64_t order);
|
|
||||||
void setContacts(const td::td_api::users &users);
|
void setContacts(const td::td_api::users &users);
|
||||||
void getContactsWithNoChat(std::vector<UserId> &userIds);
|
void getContactsWithNoChat(std::vector<UserId> &userIds);
|
||||||
void getChats(std::vector<const td::td_api::chat *> &chats) const;
|
void getChats(std::vector<const td::td_api::chat *> &chats) const;
|
||||||
void deleteChat(ChatId id);
|
void deleteChat(ChatId id);
|
||||||
void getSmallestOrderChat(const td::td_api::ChatList &list, ChatId &chatId, int64_t &order);
|
|
||||||
void addExpectedChat(ChatId id);
|
void addExpectedChat(ChatId id);
|
||||||
bool isExpectedChat(ChatId chatId);
|
bool isExpectedChat(ChatId chatId);
|
||||||
void removeExpectedChat(ChatId id);
|
void removeExpectedChat(ChatId id);
|
||||||
|
@ -121,12 +121,7 @@ SecretChatId stringToSecretChatId(const char *s)
|
|||||||
return SecretChatId::invalid;
|
return SecretChatId::invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatId getChatId(const td::td_api::updateChatChatList &update)
|
ChatId getChatId(const td::td_api::updateChatPosition &update)
|
||||||
{
|
|
||||||
return ChatId(update.chat_id_);
|
|
||||||
}
|
|
||||||
|
|
||||||
ChatId getChatId(const td::td_api::updateChatOrder &update)
|
|
||||||
{
|
{
|
||||||
return ChatId(update.chat_id_);
|
return ChatId(update.chat_id_);
|
||||||
}
|
}
|
||||||
|
@ -54,8 +54,7 @@ DEFINE_ID_CLASS(UserId, int64_t)
|
|||||||
|
|
||||||
DEFINE_ID_CLASS(ChatId, int64_t)
|
DEFINE_ID_CLASS(ChatId, int64_t)
|
||||||
friend ChatId getId(const td::td_api::chat &chat);
|
friend ChatId getId(const td::td_api::chat &chat);
|
||||||
friend ChatId getChatId(const td::td_api::updateChatChatList &update);
|
friend ChatId getChatId(const td::td_api::updateChatPosition &update);
|
||||||
friend ChatId getChatId(const td::td_api::updateChatOrder &update);
|
|
||||||
friend ChatId getChatId(const td::td_api::updateChatTitle &update);
|
friend ChatId getChatId(const td::td_api::updateChatTitle &update);
|
||||||
friend ChatId getChatId(const td::td_api::messageForwardOriginChannel &forwardOrigin);
|
friend ChatId getChatId(const td::td_api::messageForwardOriginChannel &forwardOrigin);
|
||||||
friend ChatId getChatId(const td::td_api::message &message);
|
friend ChatId getChatId(const td::td_api::message &message);
|
||||||
@ -110,8 +109,7 @@ UserId getUserId(const td::td_api::importedContacts &contacts, unsigned in
|
|||||||
UserId getUserId(const td::td_api::users &users, unsigned index);
|
UserId getUserId(const td::td_api::users &users, unsigned index);
|
||||||
UserId stringToUserId(const char *s);
|
UserId stringToUserId(const char *s);
|
||||||
|
|
||||||
ChatId getChatId(const td::td_api::updateChatChatList &update);
|
ChatId getChatId(const td::td_api::updateChatPosition &update);
|
||||||
ChatId getChatId(const td::td_api::updateChatOrder &update);
|
|
||||||
ChatId getChatId(const td::td_api::updateChatTitle &update);
|
ChatId getChatId(const td::td_api::updateChatTitle &update);
|
||||||
ChatId getChatId(const td::td_api::messageForwardOriginChannel &forwardOrigin);
|
ChatId getChatId(const td::td_api::messageForwardOriginChannel &forwardOrigin);
|
||||||
ChatId getChatId(const td::td_api::message &message);
|
ChatId getChatId(const td::td_api::message &message);
|
||||||
|
@ -161,21 +161,16 @@ void PurpleTdClient::processUpdate(td::td_api::Object &update)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case td::td_api::updateChatChatList::ID: {
|
case td::td_api::updateChatPosition::ID: {
|
||||||
auto &chatListUpdate = static_cast<td::td_api::updateChatChatList &>(update);
|
auto &chatPositionUpdate = static_cast<td::td_api::updateChatPosition &>(update);
|
||||||
purple_debug_misc(config::pluginId, "Incoming update: update chat list for chat %" G_GINT64_FORMAT "\n",
|
purple_debug_misc(config::pluginId, "Incoming update: update chat position for chat %" G_GINT64_FORMAT "\n",
|
||||||
chatListUpdate.chat_id_);
|
chatPositionUpdate.chat_id_);
|
||||||
m_data.updateChatChatList(getChatId(chatListUpdate), std::move(chatListUpdate.chat_list_));
|
if (chatPositionUpdate.position_)
|
||||||
updateChat(m_data.getChat(getChatId(chatListUpdate)));
|
m_data.updateChatPosition(getChatId(chatPositionUpdate), std::move(chatPositionUpdate.position_));
|
||||||
|
updateChat(m_data.getChat(getChatId(chatPositionUpdate)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case td::td_api::updateChatOrder::ID: {
|
|
||||||
auto &chatOrderUpdate = static_cast<td::td_api::updateChatOrder&>(update);
|
|
||||||
m_data.updateChatOrder(getChatId(chatOrderUpdate), chatOrderUpdate.order_);
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
|
|
||||||
case td::td_api::updateChatTitle::ID: {
|
case td::td_api::updateChatTitle::ID: {
|
||||||
auto &chatTitleUpdate = static_cast<td::td_api::updateChatTitle &>(update);
|
auto &chatTitleUpdate = static_cast<td::td_api::updateChatTitle &>(update);
|
||||||
purple_debug_misc(config::pluginId, "Incoming update: update chat title for chat %" G_GINT64_FORMAT "\n",
|
purple_debug_misc(config::pluginId, "Incoming update: update chat title for chat %" G_GINT64_FORMAT "\n",
|
||||||
@ -649,12 +644,9 @@ void PurpleTdClient::getContactsResponse(uint64_t requestId, td::td_api::object_
|
|||||||
purple_debug_misc(config::pluginId, "getContacts response to request %" G_GUINT64_FORMAT "\n", requestId);
|
purple_debug_misc(config::pluginId, "getContacts response to request %" G_GUINT64_FORMAT "\n", requestId);
|
||||||
if (object && (object->get_id() == td::td_api::users::ID)) {
|
if (object && (object->get_id() == td::td_api::users::ID)) {
|
||||||
m_data.setContacts(*td::move_tl_object_as<td::td_api::users>(object));
|
m_data.setContacts(*td::move_tl_object_as<td::td_api::users>(object));
|
||||||
auto getChatsRequest = td::td_api::make_object<td::td_api::getChats>();
|
auto getChatsRequest = td::td_api::make_object<td::td_api::loadChats>();
|
||||||
getChatsRequest->chat_list_ = td::td_api::make_object<td::td_api::chatListMain>();
|
getChatsRequest->chat_list_ = td::td_api::make_object<td::td_api::chatListMain>();
|
||||||
getChatsRequest->offset_order_ = INT64_MAX;
|
|
||||||
getChatsRequest->offset_chat_id_ = 0;
|
|
||||||
getChatsRequest->limit_ = 200;
|
getChatsRequest->limit_ = 200;
|
||||||
m_lastChatOrderOffset = INT64_MAX;
|
|
||||||
m_transceiver.sendQuery(std::move(getChatsRequest), &PurpleTdClient::getChatsResponse);
|
m_transceiver.sendQuery(std::move(getChatsRequest), &PurpleTdClient::getChatsResponse);
|
||||||
} else
|
} else
|
||||||
notifyAuthError(object);
|
notifyAuthError(object);
|
||||||
@ -663,30 +655,17 @@ void PurpleTdClient::getContactsResponse(uint64_t requestId, td::td_api::object_
|
|||||||
void PurpleTdClient::getChatsResponse(uint64_t requestId, td::td_api::object_ptr<td::td_api::Object> object)
|
void PurpleTdClient::getChatsResponse(uint64_t requestId, td::td_api::object_ptr<td::td_api::Object> object)
|
||||||
{
|
{
|
||||||
purple_debug_misc(config::pluginId, "getChats response to request %" G_GUINT64_FORMAT "\n", requestId);
|
purple_debug_misc(config::pluginId, "getChats response to request %" G_GUINT64_FORMAT "\n", requestId);
|
||||||
if (object && (object->get_id() == td::td_api::chats::ID)) {
|
if (object && (object->get_id() == td::td_api::ok::ID)) {
|
||||||
td::td_api::object_ptr<td::td_api::chats> chats = td::move_tl_object_as<td::td_api::chats>(object);
|
auto getChatsRequest = td::td_api::make_object<td::td_api::loadChats>();
|
||||||
if (chats->chat_ids_.empty()) {
|
getChatsRequest->chat_list_ = td::td_api::make_object<td::td_api::chatListMain>();
|
||||||
|
getChatsRequest->limit_ = 200;
|
||||||
|
m_transceiver.sendQuery(std::move(getChatsRequest), &PurpleTdClient::getChatsResponse);
|
||||||
|
} else {
|
||||||
|
std::string message = getDisplayedError(object);
|
||||||
|
purple_debug_misc(config::pluginId, "Got no more chats: %s\n", message.c_str());
|
||||||
m_data.getContactsWithNoChat(m_usersForNewPrivateChats);
|
m_data.getContactsWithNoChat(m_usersForNewPrivateChats);
|
||||||
requestMissingPrivateChats();
|
requestMissingPrivateChats();
|
||||||
} else {
|
}
|
||||||
auto getChatsRequest = td::td_api::make_object<td::td_api::getChats>();
|
|
||||||
getChatsRequest->chat_list_ = td::td_api::make_object<td::td_api::chatListMain>();
|
|
||||||
ChatId chatId;
|
|
||||||
int64_t chatOrder;
|
|
||||||
m_data.getSmallestOrderChat(*getChatsRequest->chat_list_, chatId, chatOrder);
|
|
||||||
if (chatOrder < m_lastChatOrderOffset) {
|
|
||||||
getChatsRequest->offset_order_ = chatOrder;
|
|
||||||
getChatsRequest->offset_chat_id_ = chatId.value();
|
|
||||||
getChatsRequest->limit_ = 200;
|
|
||||||
m_lastChatOrderOffset = chatOrder;
|
|
||||||
m_transceiver.sendQuery(std::move(getChatsRequest), &PurpleTdClient::getChatsResponse);
|
|
||||||
} else {
|
|
||||||
m_data.getContactsWithNoChat(m_usersForNewPrivateChats);
|
|
||||||
requestMissingPrivateChats();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
notifyAuthError(object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PurpleTdClient::requestMissingPrivateChats()
|
void PurpleTdClient::requestMissingPrivateChats()
|
||||||
@ -972,10 +951,11 @@ void PurpleTdClient::onIncomingMessage(td::td_api::object_ptr<td::td_api::messag
|
|||||||
handleIncomingMessage(m_data, *chat, std::move(message), PendingMessageQueue::Append);
|
handleIncomingMessage(m_data, *chat, std::move(message), PendingMessageQueue::Append);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PurpleTdClient::updateChatLastMessage(const td::td_api::updateChatLastMessage &lastMessage)
|
void PurpleTdClient::updateChatLastMessage(td::td_api::updateChatLastMessage &lastMessage)
|
||||||
{
|
{
|
||||||
ChatId chatId = getChatId(lastMessage);
|
ChatId chatId = getChatId(lastMessage);
|
||||||
m_data.updateChatOrder(chatId, lastMessage.order_);
|
for (auto &chatPosition: lastMessage.positions_)
|
||||||
|
m_data.updateChatPosition(chatId, std::move(chatPosition));
|
||||||
if (lastMessage.last_message_)
|
if (lastMessage.last_message_)
|
||||||
saveChatLastMessage(m_data, chatId, getId(*lastMessage.last_message_));
|
saveChatLastMessage(m_data, chatId, getId(*lastMessage.last_message_));
|
||||||
else {
|
else {
|
||||||
|
@ -90,7 +90,7 @@ private:
|
|||||||
// Login sequence end
|
// Login sequence end
|
||||||
|
|
||||||
void onIncomingMessage(td::td_api::object_ptr<td::td_api::message> message);
|
void onIncomingMessage(td::td_api::object_ptr<td::td_api::message> message);
|
||||||
void updateChatLastMessage(const td::td_api::updateChatLastMessage &lastMessage);
|
void updateChatLastMessage(td::td_api::updateChatLastMessage &lastMessage);
|
||||||
|
|
||||||
void updateUserStatus(UserId userId, td::td_api::object_ptr<td::td_api::UserStatus> status);
|
void updateUserStatus(UserId userId, td::td_api::object_ptr<td::td_api::UserStatus> status);
|
||||||
void updateUser(td::td_api::object_ptr<td::td_api::user> user);
|
void updateUser(td::td_api::object_ptr<td::td_api::user> user);
|
||||||
@ -145,7 +145,6 @@ private:
|
|||||||
std::vector<UserId> m_usersForNewPrivateChats;
|
std::vector<UserId> m_usersForNewPrivateChats;
|
||||||
bool m_chatListReady = false;
|
bool m_chatListReady = false;
|
||||||
bool m_isProxyAdded = false;
|
bool m_isProxyAdded = false;
|
||||||
int64_t m_lastChatOrderOffset = 0;
|
|
||||||
std::vector<PurpleRoomlist *> m_pendingRoomLists;
|
std::vector<PurpleRoomlist *> m_pendingRoomLists;
|
||||||
td::td_api::object_ptr<td::td_api::proxy> m_addedProxy;
|
td::td_api::object_ptr<td::td_api::proxy> m_addedProxy;
|
||||||
td::td_api::object_ptr<td::td_api::proxies> m_proxies;
|
td::td_api::object_ptr<td::td_api::proxies> m_proxies;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user