-
Notifications
You must be signed in to change notification settings - Fork 2k
Expand file tree
/
Copy pathDialogId.cpp
More file actions
187 lines (161 loc) · 5.29 KB
/
DialogId.cpp
File metadata and controls
187 lines (161 loc) · 5.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#include "td/telegram/DialogId.h"
#include "td/utils/algorithm.h"
#include "td/utils/logging.h"
#include <limits>
namespace td {
bool DialogId::is_valid() const {
return get_type() != DialogType::None;
}
DialogType DialogId::get_type() const {
// check that valid ranges are continuous
static_assert(ZERO_CHANNEL_ID + 1 == -ChatId::MAX_CHAT_ID, "");
static_assert(
ZERO_SECRET_CHAT_ID + std::numeric_limits<int32>::max() + 1 == ZERO_CHANNEL_ID - ChannelId::MAX_CHANNEL_ID, "");
if (id < 0) {
if (-ChatId::MAX_CHAT_ID <= id) {
return DialogType::Chat;
}
if (ZERO_CHANNEL_ID - ChannelId::MAX_CHANNEL_ID <= id && id != ZERO_CHANNEL_ID) {
return DialogType::Channel;
}
if (ZERO_SECRET_CHAT_ID + std::numeric_limits<int32>::min() <= id && id != ZERO_SECRET_CHAT_ID) {
return DialogType::SecretChat;
}
} else if (0 < id && id <= UserId::MAX_USER_ID) {
return DialogType::User;
}
return DialogType::None;
}
UserId DialogId::get_user_id() const {
CHECK(get_type() == DialogType::User);
return UserId(id);
}
ChatId DialogId::get_chat_id() const {
CHECK(get_type() == DialogType::Chat);
return ChatId(-id);
}
ChannelId DialogId::get_channel_id() const {
CHECK(get_type() == DialogType::Channel);
return ChannelId(ZERO_CHANNEL_ID - id);
}
SecretChatId DialogId::get_secret_chat_id() const {
CHECK(get_type() == DialogType::SecretChat);
return SecretChatId(static_cast<int32>(id - ZERO_SECRET_CHAT_ID));
}
DialogId::DialogId(UserId user_id) {
if (user_id.is_valid()) {
id = user_id.get();
} else {
id = 0;
}
}
DialogId::DialogId(ChatId chat_id) {
if (chat_id.is_valid()) {
id = -chat_id.get();
} else {
id = 0;
}
}
DialogId::DialogId(ChannelId channel_id) {
if (channel_id.is_valid()) {
id = ZERO_CHANNEL_ID - channel_id.get();
} else {
id = 0;
}
}
DialogId::DialogId(SecretChatId secret_chat_id) {
if (secret_chat_id.is_valid()) {
id = ZERO_SECRET_CHAT_ID + static_cast<int64>(secret_chat_id.get());
} else {
id = 0;
}
}
DialogId::DialogId(const tl_object_ptr<telegram_api::DialogPeer> &dialog_peer) {
CHECK(dialog_peer != nullptr);
switch (dialog_peer->get_id()) {
case telegram_api::dialogPeer::ID:
id = get_peer_id(static_cast<const telegram_api::dialogPeer *>(dialog_peer.get())->peer_);
break;
case telegram_api::dialogPeerFolder::ID:
LOG(ERROR) << "Receive unsupported " << to_string(dialog_peer);
id = 0;
break;
default:
id = 0;
UNREACHABLE();
}
}
DialogId::DialogId(const tl_object_ptr<telegram_api::Peer> &peer) : id(get_peer_id(peer)) {
}
int64 DialogId::get_peer_id(const tl_object_ptr<telegram_api::Peer> &peer) {
CHECK(peer != nullptr);
switch (peer->get_id()) {
case telegram_api::peerUser::ID: {
auto peer_user = static_cast<const telegram_api::peerUser *>(peer.get());
UserId user_id(peer_user->user_id_);
if (!user_id.is_valid()) {
LOG(ERROR) << "Receive invalid " << user_id;
return 0;
}
return user_id.get();
}
case telegram_api::peerChat::ID: {
auto peer_chat = static_cast<const telegram_api::peerChat *>(peer.get());
ChatId chat_id(peer_chat->chat_id_);
if (!chat_id.is_valid()) {
LOG(ERROR) << "Receive invalid " << chat_id;
return 0;
}
return -chat_id.get();
}
case telegram_api::peerChannel::ID: {
auto peer_channel = static_cast<const telegram_api::peerChannel *>(peer.get());
ChannelId channel_id(peer_channel->channel_id_);
if (!channel_id.is_valid()) {
LOG(ERROR) << "Receive invalid " << channel_id;
return 0;
}
return ZERO_CHANNEL_ID - channel_id.get();
}
default:
UNREACHABLE();
return 0;
}
}
DialogId DialogId::get_message_dialog_id(const telegram_api::Message *message_ptr) {
CHECK(message_ptr != nullptr);
switch (message_ptr->get_id()) {
case telegram_api::messageEmpty::ID: {
auto message = static_cast<const telegram_api::messageEmpty *>(message_ptr);
return message->peer_id_ == nullptr ? DialogId() : DialogId(message->peer_id_);
}
case telegram_api::message::ID: {
auto message = static_cast<const telegram_api::message *>(message_ptr);
return DialogId(message->peer_id_);
}
case telegram_api::messageService::ID: {
auto message = static_cast<const telegram_api::messageService *>(message_ptr);
return DialogId(message->peer_id_);
}
default:
UNREACHABLE();
return DialogId();
}
}
DialogId DialogId::get_message_dialog_id(const tl_object_ptr<telegram_api::Message> &message_ptr) {
return get_message_dialog_id(message_ptr.get());
}
vector<DialogId> DialogId::get_dialog_ids(const vector<int64> &chat_ids) {
return transform(chat_ids, [](int64 chat_id) { return DialogId(chat_id); });
}
vector<DialogId> DialogId::remove_secret_chat_dialog_ids(vector<DialogId> dialog_ids) {
td::remove_if(dialog_ids, [](DialogId dialog_id) { return dialog_id.get_type() == DialogType::SecretChat; });
return dialog_ids;
}
} // namespace td