~singpolyma/biboumi

04d28f968b227067e77e365d317fc251d3c965f7 — louiz’ 7 years ago 64f341e
Forward the topic authors, handle the author from 333 messages

fix #2
M louloulibs/xmpp/xmpp_component.cpp => louloulibs/xmpp/xmpp_component.cpp +5 -2
@@ 388,11 388,14 @@ void XmppComponent::send_invalid_user_error(const std::string& user_name, const 
  this->send_stanza(message);
}

void XmppComponent::send_topic(const std::string& from, Xmpp::body&& topic, const std::string& to)
void XmppComponent::send_topic(const std::string& from, Xmpp::body&& topic, const std::string& to, const std::string& who)
{
  XmlNode message("message");
  message["to"] = to;
  message["from"] = from + "@" + this->served_hostname;
  if (who.empty())
    message["from"] = from + "@" + this->served_hostname;
  else
    message["from"] = from + "@" + this->served_hostname + "/" + who;
  message["type"] = "groupchat";
  XmlNode subject("subject");
  subject.set_inner(std::get<0>(topic));

M louloulibs/xmpp/xmpp_component.hpp => louloulibs/xmpp/xmpp_component.hpp +1 -1
@@ 124,7 124,7 @@ public:
  /**
   * Send the MUC topic to the user
   */
  void send_topic(const std::string& from, Xmpp::body&& xmpp_topic, const std::string& to);
  void send_topic(const std::string& from, Xmpp::body&& xmpp_topic, const std::string& to, const std::string& who);
  /**
   * Send a (non-private) message to the MUC
   */

M src/bridge/bridge.cpp => src/bridge/bridge.cpp +3 -2
@@ 634,10 634,11 @@ void Bridge::send_user_join(const std::string& hostname,
                             affiliation, role, this->user_jid, self);
}

void Bridge::send_topic(const std::string& hostname, const std::string& chan_name, const std::string& topic)
void Bridge::send_topic(const std::string& hostname, const std::string& chan_name, const std::string& topic, const std::string& who)
{
  const auto encoding = in_encoding_for(*this, {chan_name + '%' + hostname});
  this->xmpp.send_topic(chan_name + utils::empty_if_fixed_server("%" + hostname), this->make_xmpp_body(topic, encoding), this->user_jid);
  this->xmpp.send_topic(chan_name + utils::empty_if_fixed_server(
      "%" + hostname), this->make_xmpp_body(topic, encoding), this->user_jid, who);
}

std::string Bridge::get_own_nick(const Iid& iid)

M src/bridge/bridge.hpp => src/bridge/bridge.hpp +1 -1
@@ 122,7 122,7 @@ public:
  /**
   * Send the topic of the MUC to the user
   */
  void send_topic(const std::string& hostname, const std::string& chan_name, const std::string& topic);
  void send_topic(const std::string& hostname, const std::string& chan_name, const std::string& topic, const std::string& who);
  /**
   * Send a MUC message from some participant
   */

M src/irc/irc_channel.hpp => src/irc/irc_channel.hpp +1 -0
@@ 18,6 18,7 @@ public:

  bool joined;
  std::string topic;
  std::string topic_author;
  void set_self(const std::string& name);
  IrcUser* get_self() const;
  IrcUser* add_user(const std::string& name,

M src/irc/irc_client.cpp => src/irc/irc_client.cpp +14 -2
@@ 55,6 55,8 @@ static const std::unordered_map<std::string,
  {"353", {&IrcClient::set_and_forward_user_list, {4, 0}}},
  {"332", {&IrcClient::on_topic_received, {2, 0}}},
  {"TOPIC", {&IrcClient::on_topic_received, {2, 0}}},
  {"333", {&IrcClient::on_topic_who_time_received, {4, 0}}},
  {"RPL_TOPICWHOTIME", {&IrcClient::on_topic_who_time_received, {4, 0}}},
  {"366", {&IrcClient::on_channel_completely_joined, {2, 0}}},
  {"432", {&IrcClient::on_erroneous_nickname, {2, 0}}},
  {"433", {&IrcClient::on_nickname_conflict, {2, 0}}},


@@ 723,10 725,20 @@ void IrcClient::send_motd(const IrcMessage&)
void IrcClient::on_topic_received(const IrcMessage& message)
{
  const std::string chan_name = utils::tolower(message.arguments[message.arguments.size() - 2]);
  IrcUser author(message.prefix);
  IrcChannel* channel = this->get_channel(chan_name);
  channel->topic = message.arguments[message.arguments.size() - 1];
  channel->topic_author = author.nick;
  if (channel->joined)
    this->bridge.send_topic(this->hostname, chan_name, channel->topic);
    this->bridge.send_topic(this->hostname, chan_name, channel->topic, channel->topic_author);
}

void IrcClient::on_topic_who_time_received(const IrcMessage& message)
{
  IrcUser author(message.arguments[2]);
  const std::string chan_name = utils::tolower(message.arguments[1]);
  IrcChannel* channel = this->get_channel(chan_name);
  channel->topic_author = author.nick;
}

void IrcClient::on_channel_completely_joined(const IrcMessage& message)


@@ 737,7 749,7 @@ void IrcClient::on_channel_completely_joined(const IrcMessage& message)
  this->bridge.send_user_join(this->hostname, chan_name, channel->get_self(),
                               channel->get_self()->get_most_significant_mode(this->sorted_user_modes),
                               true);
  this->bridge.send_topic(this->hostname, chan_name, channel->topic);
  this->bridge.send_topic(this->hostname, chan_name, channel->topic, channel->topic_author);
}

void IrcClient::on_erroneous_nickname(const IrcMessage& message)

M src/irc/irc_client.hpp => src/irc/irc_client.hpp +4 -0
@@ 199,6 199,10 @@ public:
   */
  void on_topic_received(const IrcMessage& message);
  /**
   * Save the topic author in the IrcChannel
   */
  void on_topic_who_time_received(const IrcMessage& message);
  /**
   * Empty the topic
   */
  void on_empty_topic(const IrcMessage& message);

M tests/end_to_end/__main__.py => tests/end_to_end/__main__.py +2 -2
@@ 409,7 409,7 @@ if __name__ == '__main__':
                     # First user sets the topic
                     partial(send_stanza,
                             "<message from='{jid_one}/{resource_one}' to='#foo%{irc_server_one}' type='groupchat'><subject>TOPIC TEST</subject></message>"),
                     partial(expect_stanza, "/message[@from='#foo%{irc_server_one}'][@type='groupchat'][@to='{jid_one}/{resource_one}']/subject[text()='TOPIC TEST']"),
                     partial(expect_stanza, "/message[@from='#foo%{irc_server_one}/{nick_one}'][@type='groupchat'][@to='{jid_one}/{resource_one}']/subject[text()='TOPIC TEST']"),

                     # Second user joins
                     partial(send_stanza,


@@ 426,7 426,7 @@ if __name__ == '__main__':
                             ("/presence[@to='{jid_two}/{resource_one}'][@from='#foo%{irc_server_one}/{nick_two}']/muc_user:x/muc_user:item[@affiliation='none'][@jid='~bobby@localhost'][@role='participant']",
                              "/presence/muc_user:x/muc_user:status[@code='110']")
                             ),
                     partial(expect_stanza, "/message[@from='#foo%{irc_server_one}'][@type='groupchat']/subject[text()='TOPIC TEST']"),
                     partial(expect_stanza, "/message[@from='#foo%{irc_server_one}/{nick_one}'][@type='groupchat']/subject[text()='TOPIC TEST']"),
                 ]),
    )