DiscordJoinRequestDialog.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright 2018 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #ifdef USE_DISCORD_PRESENCE
  4. #include "DolphinQt/DiscordJoinRequestDialog.h"
  5. #include <QGridLayout>
  6. #include <QLabel>
  7. #include <QPixmap>
  8. #include <QPushButton>
  9. #include <discord_rpc.h>
  10. #include <fmt/format.h>
  11. #include "Common/HttpRequest.h"
  12. DiscordJoinRequestDialog::DiscordJoinRequestDialog(QWidget* parent, const std::string& id,
  13. const std::string& discord_tag,
  14. const std::string& avatar)
  15. : QDialog(parent), m_user_id(id), m_close_timestamp(std::time(nullptr) + s_max_lifetime_seconds)
  16. {
  17. setWindowTitle(tr("Request to Join Your Party"));
  18. setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  19. QPixmap avatar_pixmap;
  20. if (!avatar.empty())
  21. {
  22. const std::string avatar_endpoint =
  23. fmt::format("https://cdn.discordapp.com/avatars/{}/{}.png", id, avatar);
  24. Common::HttpRequest request;
  25. Common::HttpRequest::Response response = request.Get(avatar_endpoint);
  26. if (response.has_value())
  27. avatar_pixmap.loadFromData(response->data(), static_cast<uint>(response->size()), "png");
  28. }
  29. CreateLayout(discord_tag, avatar_pixmap);
  30. ConnectWidgets();
  31. }
  32. std::time_t DiscordJoinRequestDialog::GetCloseTimestamp() const
  33. {
  34. return m_close_timestamp;
  35. }
  36. void DiscordJoinRequestDialog::CreateLayout(const std::string& discord_tag, const QPixmap& avatar)
  37. {
  38. m_main_layout = new QGridLayout;
  39. m_invite_button = new QPushButton(tr("\u2714 Invite"));
  40. m_decline_button = new QPushButton(tr("\u2716 Decline"));
  41. m_ignore_button = new QPushButton(tr("Ignore"));
  42. QLabel* text =
  43. new QLabel(tr("%1\nwants to join your party.").arg(QString::fromStdString(discord_tag)));
  44. text->setAlignment(Qt::AlignCenter);
  45. if (!avatar.isNull())
  46. {
  47. QLabel* picture = new QLabel();
  48. picture->setPixmap(avatar);
  49. m_main_layout->addWidget(picture, 1, 0, 1, 3, Qt::AlignHCenter);
  50. }
  51. m_main_layout->addWidget(text, 2, 0, 3, 3, Qt::AlignHCenter);
  52. m_main_layout->addWidget(m_invite_button, 8, 0);
  53. m_main_layout->addWidget(m_decline_button, 8, 1);
  54. m_main_layout->addWidget(m_ignore_button, 8, 2);
  55. setLayout(m_main_layout);
  56. }
  57. void DiscordJoinRequestDialog::ConnectWidgets()
  58. {
  59. connect(m_invite_button, &QPushButton::clicked, [this] { Reply(DISCORD_REPLY_YES); });
  60. connect(m_decline_button, &QPushButton::clicked, [this] { Reply(DISCORD_REPLY_NO); });
  61. connect(m_ignore_button, &QPushButton::clicked, [this] { Reply(DISCORD_REPLY_IGNORE); });
  62. connect(this, &QDialog::rejected, [this] { Reply(DISCORD_REPLY_IGNORE); });
  63. }
  64. void DiscordJoinRequestDialog::Reply(int reply)
  65. {
  66. Discord_Respond(m_user_id.c_str(), reply);
  67. close();
  68. }
  69. #endif