IRCChannel.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "IRCChannel.h"
  7. #include "IRCChannelMemberListModel.h"
  8. #include "IRCClient.h"
  9. IRCChannel::IRCChannel(IRCClient& client, const String& name)
  10. : m_client(client)
  11. , m_name(name)
  12. , m_log(IRCLogBuffer::create())
  13. , m_member_model(IRCChannelMemberListModel::create(*this))
  14. {
  15. m_window = m_client.aid_create_window(this, IRCWindow::Channel, m_name);
  16. m_window->set_log_buffer(*m_log);
  17. }
  18. IRCChannel::~IRCChannel()
  19. {
  20. }
  21. NonnullRefPtr<IRCChannel> IRCChannel::create(IRCClient& client, const String& name)
  22. {
  23. return adopt_ref(*new IRCChannel(client, name));
  24. }
  25. void IRCChannel::add_member(const String& name, char prefix)
  26. {
  27. for (auto& member : m_members) {
  28. if (member.name == name) {
  29. member.prefix = prefix;
  30. return;
  31. }
  32. }
  33. m_members.append({ name, prefix });
  34. m_member_model->invalidate();
  35. }
  36. void IRCChannel::remove_member(const String& name)
  37. {
  38. m_members.remove_first_matching([&](auto& member) { return name == member.name; });
  39. }
  40. void IRCChannel::add_message(char prefix, const String& name, const String& text, Color color)
  41. {
  42. log().add_message(prefix, name, text, color);
  43. window().did_add_message(name, text);
  44. }
  45. void IRCChannel::add_message(const String& text, Color color)
  46. {
  47. log().add_message(text, color);
  48. window().did_add_message();
  49. }
  50. void IRCChannel::say(const String& text)
  51. {
  52. m_client.send_privmsg(m_name, text);
  53. add_message(' ', m_client.nickname(), text);
  54. }
  55. void IRCChannel::handle_join(const String& nick, const String& hostmask)
  56. {
  57. if (nick == m_client.nickname()) {
  58. m_open = true;
  59. return;
  60. }
  61. add_member(nick, (char)0);
  62. m_member_model->invalidate();
  63. if (m_client.show_join_part_messages())
  64. add_message(String::formatted("*** {} [{}] has joined {}", nick, hostmask, m_name), Color::MidGreen);
  65. }
  66. void IRCChannel::handle_part(const String& nick, const String& hostmask)
  67. {
  68. if (nick == m_client.nickname()) {
  69. m_open = false;
  70. m_members.clear();
  71. m_client.did_part_from_channel({}, *this);
  72. } else {
  73. remove_member(nick);
  74. }
  75. m_member_model->invalidate();
  76. if (m_client.show_join_part_messages())
  77. add_message(String::formatted("*** {} [{}] has parted from {}", nick, hostmask, m_name), Color::MidGreen);
  78. }
  79. void IRCChannel::handle_quit(const String& nick, const String& hostmask, const String& message)
  80. {
  81. if (nick == m_client.nickname()) {
  82. m_open = false;
  83. m_members.clear();
  84. m_client.did_part_from_channel({}, *this);
  85. } else {
  86. remove_member(nick);
  87. }
  88. m_member_model->invalidate();
  89. add_message(String::formatted("*** {} [{}] has quit ({})", nick, hostmask, message), Color::MidGreen);
  90. }
  91. void IRCChannel::handle_topic(const String& nick, const String& topic)
  92. {
  93. if (nick.is_null())
  94. add_message(String::formatted("*** Topic is \"{}\"", topic), Color::MidBlue);
  95. else
  96. add_message(String::formatted("*** {} set topic to \"{}\"", nick, topic), Color::MidBlue);
  97. }
  98. void IRCChannel::notify_nick_changed(const String& old_nick, const String& new_nick)
  99. {
  100. for (auto& member : m_members) {
  101. if (member.name == old_nick) {
  102. member.name = new_nick;
  103. m_member_model->invalidate();
  104. if (m_client.show_nick_change_messages())
  105. add_message(String::formatted("~ {} changed nickname to {}", old_nick, new_nick), Color::MidMagenta);
  106. return;
  107. }
  108. }
  109. }