api_global_privacy.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "api/api_global_privacy.h"
  8. #include "apiwrap.h"
  9. #include "main/main_session.h"
  10. #include "main/main_app_config.h"
  11. namespace Api {
  12. PeerId ParsePaidReactionShownPeer(
  13. not_null<Main::Session*> session,
  14. const MTPPaidReactionPrivacy &value) {
  15. return value.match([&](const MTPDpaidReactionPrivacyDefault &) {
  16. return session->userPeerId();
  17. }, [](const MTPDpaidReactionPrivacyAnonymous &) {
  18. return PeerId();
  19. }, [&](const MTPDpaidReactionPrivacyPeer &data) {
  20. return data.vpeer().match([&](const MTPDinputPeerSelf &) {
  21. return session->userPeerId();
  22. }, [](const MTPDinputPeerUser &data) {
  23. return peerFromUser(data.vuser_id());
  24. }, [](const MTPDinputPeerChat &data) {
  25. return peerFromChat(data.vchat_id());
  26. }, [](const MTPDinputPeerChannel &data) {
  27. return peerFromChannel(data.vchannel_id());
  28. }, [](const MTPDinputPeerUserFromMessage &data) -> PeerId {
  29. Unexpected("From message peer in ParsePaidReactionShownPeer.");
  30. }, [](const MTPDinputPeerChannelFromMessage &data) -> PeerId {
  31. Unexpected("From message peer in ParsePaidReactionShownPeer.");
  32. }, [](const MTPDinputPeerEmpty &) -> PeerId {
  33. Unexpected("Empty peer in ParsePaidReactionShownPeer.");
  34. });
  35. });
  36. }
  37. GlobalPrivacy::GlobalPrivacy(not_null<ApiWrap*> api)
  38. : _session(&api->session())
  39. , _api(&api->instance()) {
  40. }
  41. void GlobalPrivacy::reload(Fn<void()> callback) {
  42. if (callback) {
  43. _callbacks.push_back(std::move(callback));
  44. }
  45. if (_requestId) {
  46. return;
  47. }
  48. _requestId = _api.request(MTPaccount_GetGlobalPrivacySettings(
  49. )).done([=](const MTPGlobalPrivacySettings &result) {
  50. _requestId = 0;
  51. apply(result);
  52. for (const auto &callback : base::take(_callbacks)) {
  53. callback();
  54. }
  55. }).fail([=] {
  56. _requestId = 0;
  57. for (const auto &callback : base::take(_callbacks)) {
  58. callback();
  59. }
  60. }).send();
  61. _session->appConfig().value(
  62. ) | rpl::start_with_next([=] {
  63. _showArchiveAndMute = _session->appConfig().get<bool>(
  64. u"autoarchive_setting_available"_q,
  65. false);
  66. }, _session->lifetime());
  67. }
  68. bool GlobalPrivacy::archiveAndMuteCurrent() const {
  69. return _archiveAndMute.current();
  70. }
  71. rpl::producer<bool> GlobalPrivacy::archiveAndMute() const {
  72. return _archiveAndMute.value();
  73. }
  74. UnarchiveOnNewMessage GlobalPrivacy::unarchiveOnNewMessageCurrent() const {
  75. return _unarchiveOnNewMessage.current();
  76. }
  77. auto GlobalPrivacy::unarchiveOnNewMessage() const
  78. -> rpl::producer<UnarchiveOnNewMessage> {
  79. return _unarchiveOnNewMessage.value();
  80. }
  81. rpl::producer<bool> GlobalPrivacy::showArchiveAndMute() const {
  82. using namespace rpl::mappers;
  83. return rpl::combine(
  84. archiveAndMute(),
  85. _showArchiveAndMute.value(),
  86. _1 || _2);
  87. }
  88. rpl::producer<> GlobalPrivacy::suggestArchiveAndMute() const {
  89. return _session->appConfig().suggestionRequested(
  90. u"AUTOARCHIVE_POPULAR"_q);
  91. }
  92. void GlobalPrivacy::dismissArchiveAndMuteSuggestion() {
  93. _session->appConfig().dismissSuggestion(
  94. u"AUTOARCHIVE_POPULAR"_q);
  95. }
  96. void GlobalPrivacy::updateHideReadTime(bool hide) {
  97. update(
  98. archiveAndMuteCurrent(),
  99. unarchiveOnNewMessageCurrent(),
  100. hide,
  101. newRequirePremiumCurrent(),
  102. newChargeStarsCurrent());
  103. }
  104. bool GlobalPrivacy::hideReadTimeCurrent() const {
  105. return _hideReadTime.current();
  106. }
  107. rpl::producer<bool> GlobalPrivacy::hideReadTime() const {
  108. return _hideReadTime.value();
  109. }
  110. bool GlobalPrivacy::newRequirePremiumCurrent() const {
  111. return _newRequirePremium.current();
  112. }
  113. rpl::producer<bool> GlobalPrivacy::newRequirePremium() const {
  114. return _newRequirePremium.value();
  115. }
  116. int GlobalPrivacy::newChargeStarsCurrent() const {
  117. return _newChargeStars.current();
  118. }
  119. rpl::producer<int> GlobalPrivacy::newChargeStars() const {
  120. return _newChargeStars.value();
  121. }
  122. void GlobalPrivacy::updateMessagesPrivacy(
  123. bool requirePremium,
  124. int chargeStars) {
  125. update(
  126. archiveAndMuteCurrent(),
  127. unarchiveOnNewMessageCurrent(),
  128. hideReadTimeCurrent(),
  129. requirePremium,
  130. chargeStars);
  131. }
  132. void GlobalPrivacy::loadPaidReactionShownPeer() {
  133. if (_paidReactionShownPeerLoaded) {
  134. return;
  135. }
  136. _paidReactionShownPeerLoaded = true;
  137. _api.request(MTPmessages_GetPaidReactionPrivacy(
  138. )).done([=](const MTPUpdates &result) {
  139. _session->api().applyUpdates(result);
  140. }).send();
  141. }
  142. void GlobalPrivacy::updatePaidReactionShownPeer(PeerId shownPeer) {
  143. _paidReactionShownPeer = shownPeer;
  144. }
  145. PeerId GlobalPrivacy::paidReactionShownPeerCurrent() const {
  146. return _paidReactionShownPeer.current();
  147. }
  148. rpl::producer<PeerId> GlobalPrivacy::paidReactionShownPeer() const {
  149. return _paidReactionShownPeer.value();
  150. }
  151. void GlobalPrivacy::updateArchiveAndMute(bool value) {
  152. update(
  153. value,
  154. unarchiveOnNewMessageCurrent(),
  155. hideReadTimeCurrent(),
  156. newRequirePremiumCurrent(),
  157. newChargeStarsCurrent());
  158. }
  159. void GlobalPrivacy::updateUnarchiveOnNewMessage(
  160. UnarchiveOnNewMessage value) {
  161. update(
  162. archiveAndMuteCurrent(),
  163. value,
  164. hideReadTimeCurrent(),
  165. newRequirePremiumCurrent(),
  166. newChargeStarsCurrent());
  167. }
  168. void GlobalPrivacy::update(
  169. bool archiveAndMute,
  170. UnarchiveOnNewMessage unarchiveOnNewMessage,
  171. bool hideReadTime,
  172. bool newRequirePremium,
  173. int newChargeStars) {
  174. using Flag = MTPDglobalPrivacySettings::Flag;
  175. _api.request(_requestId).cancel();
  176. const auto newRequirePremiumAllowed = _session->premium()
  177. || _session->appConfig().newRequirePremiumFree();
  178. const auto flags = Flag()
  179. | (archiveAndMute
  180. ? Flag::f_archive_and_mute_new_noncontact_peers
  181. : Flag())
  182. | (unarchiveOnNewMessage == UnarchiveOnNewMessage::None
  183. ? Flag::f_keep_archived_unmuted
  184. : Flag())
  185. | (unarchiveOnNewMessage != UnarchiveOnNewMessage::AnyUnmuted
  186. ? Flag::f_keep_archived_folders
  187. : Flag())
  188. | (hideReadTime ? Flag::f_hide_read_marks : Flag())
  189. | ((newRequirePremium && newRequirePremiumAllowed)
  190. ? Flag::f_new_noncontact_peers_require_premium
  191. : Flag())
  192. | Flag::f_noncontact_peers_paid_stars;
  193. _requestId = _api.request(MTPaccount_SetGlobalPrivacySettings(
  194. MTP_globalPrivacySettings(
  195. MTP_flags(flags),
  196. MTP_long(newChargeStars))
  197. )).done([=](const MTPGlobalPrivacySettings &result) {
  198. _requestId = 0;
  199. apply(result);
  200. }).fail([=](const MTP::Error &error) {
  201. _requestId = 0;
  202. if (error.type() == u"PREMIUM_ACCOUNT_REQUIRED"_q) {
  203. update(
  204. archiveAndMute,
  205. unarchiveOnNewMessage,
  206. hideReadTime,
  207. false,
  208. 0);
  209. }
  210. }).send();
  211. _archiveAndMute = archiveAndMute;
  212. _unarchiveOnNewMessage = unarchiveOnNewMessage;
  213. _hideReadTime = hideReadTime;
  214. _newRequirePremium = newRequirePremium;
  215. _newChargeStars = newChargeStars;
  216. }
  217. void GlobalPrivacy::apply(const MTPGlobalPrivacySettings &settings) {
  218. const auto &data = settings.data();
  219. _archiveAndMute = data.is_archive_and_mute_new_noncontact_peers();
  220. _unarchiveOnNewMessage = data.is_keep_archived_unmuted()
  221. ? UnarchiveOnNewMessage::None
  222. : data.is_keep_archived_folders()
  223. ? UnarchiveOnNewMessage::NotInFoldersUnmuted
  224. : UnarchiveOnNewMessage::AnyUnmuted;
  225. _hideReadTime = data.is_hide_read_marks();
  226. _newRequirePremium = data.is_new_noncontact_peers_require_premium();
  227. _newChargeStars = data.vnoncontact_peers_paid_stars().value_or_empty();
  228. }
  229. } // namespace Api