summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/td/telegram/DialogId.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/td/telegram/DialogId.cpp')
-rw-r--r--protocols/Telegram/tdlib/td/td/telegram/DialogId.cpp153
1 files changed, 153 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/td/telegram/DialogId.cpp b/protocols/Telegram/tdlib/td/td/telegram/DialogId.cpp
new file mode 100644
index 0000000000..7ea818599c
--- /dev/null
+++ b/protocols/Telegram/tdlib/td/td/telegram/DialogId.cpp
@@ -0,0 +1,153 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+//
+// 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/telegram/telegram_api.h"
+
+#include "td/utils/logging.h"
+
+namespace td {
+
+bool DialogId::is_valid() const {
+ switch (get_type()) {
+ case DialogType::User: {
+ return get_user_id().is_valid();
+ }
+ case DialogType::Chat: {
+ return get_chat_id().is_valid();
+ }
+ case DialogType::Channel: {
+ return get_channel_id().is_valid();
+ }
+ case DialogType::SecretChat: {
+ return get_secret_chat_id().is_valid();
+ }
+ case DialogType::None:
+ return false;
+ default:
+ UNREACHABLE();
+ return false;
+ }
+}
+
+DialogType DialogId::get_type() const {
+ if (id < 0) {
+ if (MIN_CHAT_ID <= id) {
+ return DialogType::Chat;
+ }
+ if (MIN_CHANNEL_ID <= id && id < MAX_CHANNEL_ID) {
+ return DialogType::Channel;
+ }
+ if (MIN_SECRET_ID <= id && id < MAX_SECRET_ID) {
+ return DialogType::SecretChat;
+ }
+ } else if (0 < id && id <= MAX_USER_ID) {
+ return DialogType::User;
+ }
+ return DialogType::None;
+}
+
+UserId DialogId::get_user_id() const {
+ CHECK(get_type() == DialogType::User);
+ return UserId(static_cast<int32>(id));
+}
+
+ChatId DialogId::get_chat_id() const {
+ CHECK(get_type() == DialogType::Chat);
+ return ChatId(static_cast<int32>(-id));
+}
+
+SecretChatId DialogId::get_secret_chat_id() const {
+ CHECK(get_type() == DialogType::SecretChat);
+ return SecretChatId(static_cast<int32>(id - ZERO_SECRET_ID));
+}
+
+ChannelId DialogId::get_channel_id() const {
+ CHECK(get_type() == DialogType::Channel);
+ return ChannelId(static_cast<int32>(MAX_CHANNEL_ID - id));
+}
+
+DialogId::DialogId(UserId user_id) {
+ if (user_id.is_valid()) {
+ id = static_cast<int64>(user_id.get());
+ } else {
+ id = 0;
+ }
+}
+
+DialogId::DialogId(ChatId chat_id) {
+ if (chat_id.is_valid()) {
+ id = -static_cast<int64>(chat_id.get());
+ } else {
+ id = 0;
+ }
+}
+
+DialogId::DialogId(ChannelId channel_id) {
+ if (channel_id.is_valid()) {
+ id = MAX_CHANNEL_ID - static_cast<int64>(channel_id.get());
+ } else {
+ id = 0;
+ }
+}
+
+DialogId::DialogId(SecretChatId chat_id) {
+ if (chat_id.is_valid()) {
+ id = ZERO_SECRET_ID + static_cast<int64>(chat_id.get());
+ } else {
+ id = 0;
+ }
+}
+
+DialogId::DialogId(const tl_object_ptr<telegram_api::dialogPeer> &dialog_peer) {
+ id = get_peer_id(dialog_peer->peer_);
+}
+
+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 static_cast<int64>(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 -static_cast<int64>(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 MAX_CHANNEL_ID - static_cast<int64>(channel_id.get());
+ }
+ default:
+ UNREACHABLE();
+ return 0;
+ }
+}
+
+} // namespace td