data_message_reaction_id.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. #pragma once
  8. #include "base/qt/qt_compare.h"
  9. namespace Data {
  10. struct ReactionId {
  11. std::variant<QString, DocumentId> data;
  12. [[nodiscard]] static QChar PaidTag() {
  13. return '*';
  14. }
  15. [[nodiscard]] static ReactionId Paid() {
  16. return { QString(PaidTag()) };
  17. }
  18. [[nodiscard]] bool empty() const {
  19. const auto emoji = std::get_if<QString>(&data);
  20. return emoji && emoji->isEmpty();
  21. }
  22. [[nodiscard]] bool paid() const {
  23. const auto emoji = std::get_if<QString>(&data);
  24. return emoji
  25. && emoji->size() == 1
  26. && emoji->at(0) == PaidTag();
  27. }
  28. [[nodiscard]] QString emoji() const {
  29. const auto emoji = std::get_if<QString>(&data);
  30. return (emoji && (emoji->size() != 1 || emoji->at(0) != PaidTag()))
  31. ? *emoji
  32. : QString();
  33. }
  34. [[nodiscard]] DocumentId custom() const {
  35. const auto custom = std::get_if<DocumentId>(&data);
  36. return custom ? *custom : DocumentId();
  37. }
  38. explicit operator bool() const {
  39. return !empty();
  40. }
  41. friend inline auto operator<=>(
  42. const ReactionId &,
  43. const ReactionId &) = default;
  44. friend inline bool operator==(
  45. const ReactionId &a,
  46. const ReactionId &b) = default;
  47. };
  48. struct MessageReaction {
  49. ReactionId id;
  50. int count = 0;
  51. bool my = false;
  52. };
  53. [[nodiscard]] QString SearchTagToQuery(const ReactionId &tagId);
  54. [[nodiscard]] ReactionId SearchTagFromQuery(const QString &query);
  55. [[nodiscard]] std::vector<ReactionId> SearchTagsFromQuery(
  56. const QString &query);
  57. struct HashtagWithUsername {
  58. QString hashtag;
  59. QString username;
  60. };
  61. [[nodiscard]] HashtagWithUsername HashtagWithUsernameFromQuery(
  62. QStringView query);
  63. [[nodiscard]] QString ReactionEntityData(const ReactionId &id);
  64. [[nodiscard]] ReactionId ReactionFromMTP(const MTPReaction &reaction);
  65. [[nodiscard]] MTPReaction ReactionToMTP(ReactionId id);
  66. } // namespace Data
  67. Q_DECLARE_METATYPE(Data::ReactionId);