~singpolyma/biboumi

bb150d587f080af38a74f2420457f1e0b2606a62 — louiz’ 5 years ago 0180ea7
Redirect welcome NOTICE to their channel, instead of sending a global one

fix #3236
3 files changed, 25 insertions(+), 1 deletions(-)

M CHANGELOG.rst
M src/irc/irc_client.cpp
M tests/end_to_end/__main__.py
M CHANGELOG.rst => CHANGELOG.rst +2 -0
@@ 20,6 20,8 @@ Version 5.0
   IRC server, with simple text files.
 - The IRC channel configuration form is now also available using the MUC
   configuration, in addition to the ad-hoc command.
 - Notices starting with [#channel] are considered as welcome messages coming
   from that channel, instead of private messages.

Version 4.3 - 2017-05-02
========================

M src/irc/irc_client.cpp => src/irc/irc_client.cpp +10 -1
@@ 544,9 544,18 @@ void IrcClient::forward_server_message(const IrcMessage& message)
void IrcClient::on_notice(const IrcMessage& message)
{
  std::string from = message.prefix;
  const std::string to = message.arguments[0];
  std::string to = message.arguments[0];
  const std::string body = message.arguments[1];

  // Handle notices starting with [#channame] as if they were sent to that channel
  if (body.size() > 3 && body[0] == '[')
    {
      const auto chan_prefix = body[1];
      auto end = body.find(']');
      if (this->chantypes.find(chan_prefix) != this->chantypes.end() && end != std::string::npos)
        to = body.substr(1, end - 1);
    }

  if (!body.empty() && body[0] == '\01' && body[body.size() - 1] == '\01')
    // Do not forward the notice to the user if it's a CTCP command
    return ;

M tests/end_to_end/__main__.py => tests/end_to_end/__main__.py +13 -0
@@ 1114,6 1114,19 @@ if __name__ == '__main__':
                             ),
                     partial(expect_stanza, "/message[@from='#bar%{irc_server_one}'][@type='groupchat'][@to='{jid_one}/{resource_one}']/subject[not(text())]"),
                 ]),
        Scenario("notices",
                 [
                     handshake_sequence(),
                     partial(send_stanza,
                             "<presence from='{jid_one}/{resource_one}' to='#foo%{irc_server_one}/{nick_one}' />"),
                     connection_sequence("irc.localhost", '{jid_one}/{resource_one}'),
                     partial(expect_stanza, "/message"),
                     partial(expect_stanza, "/presence"),
                     partial(expect_stanza, "/message"),

                     partial(send_stanza, "<message from='{jid_one}/{resource_one}' to='{irc_server_one}' type='chat'><body>NOTICE {nick_one} :[#foo] Hello in a notice.</body></message>"),
                     partial(expect_stanza, "/message[@from='#foo%{irc_server_one}/{nick_one}'][@type='groupchat']/body[text()='[notice] [#foo] Hello in a notice.']"),
                 ]),
        Scenario("channel_messages",
                 [
                     handshake_sequence(),