From eb499057595f6045de5a91840ccc6e59d543871a Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 31 Mar 2013 17:12:07 +0000 Subject: - Forward-port -r1791 [improved services support. services may now set a channel topic without joining the channel first] git-svn-id: svn://svn.ircd-hybrid.org/svnroot/ircd-hybrid/trunk@1799 82007160-df01-0410-b94d-b575c5fd34c7 --- modules/m_topic.c | 92 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 68 insertions(+), 24 deletions(-) diff --git a/modules/m_topic.c b/modules/m_topic.c index dc7c109..75b3294 100644 --- a/modules/m_topic.c +++ b/modules/m_topic.c @@ -48,33 +48,21 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { struct Channel *chptr = NULL; - const char *from, *to; - - if (!MyClient(source_p) && IsCapable(source_p->from, CAP_TS6) && HasID(source_p)) - { - from = me.id; - to = source_p->id; - } - else - { - from = me.name; - to = source_p->name; - } if (EmptyString(parv[1])) { sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), - from, to, "TOPIC"); + me.name, source_p->name, "TOPIC"); return; } - if (MyClient(source_p) && !IsFloodDone(source_p)) + if (!IsFloodDone(source_p)) flood_endgrace(source_p); if ((chptr = hash_find_channel(parv[1])) == NULL) { sendto_one(source_p, form_str(ERR_NOSUCHCHANNEL), - from, to, parv[1]); + me.name, source_p->name, parv[1]); return; } @@ -85,8 +73,8 @@ m_topic(struct Client *client_p, struct Client *source_p, if ((ms = find_channel_link(source_p, chptr)) == NULL) { - sendto_one(source_p, form_str(ERR_NOTONCHANNEL), from, - to, parv[1]); + sendto_one(source_p, form_str(ERR_NOTONCHANNEL), me.name, + source_p->name, parv[1]); return; } @@ -97,7 +85,7 @@ m_topic(struct Client *client_p, struct Client *source_p, snprintf(topic_info, sizeof(topic_info), "%s!%s@%s", source_p->name, source_p->username, source_p->host); - set_channel_topic(chptr, parv[2], topic_info, CurrentTime, !!MyClient(source_p)); + set_channel_topic(chptr, parv[2], topic_info, CurrentTime, 1); sendto_server(client_p, CAP_TS6, NOCAPS, ":%s TOPIC %s :%s", @@ -116,7 +104,7 @@ m_topic(struct Client *client_p, struct Client *source_p, } else sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED), - from, to, chptr->chname); + me.name, source_p->name, chptr->chname); } else /* only asking for topic */ { @@ -124,27 +112,83 @@ m_topic(struct Client *client_p, struct Client *source_p, { if (chptr->topic[0] == '\0') sendto_one(source_p, form_str(RPL_NOTOPIC), - from, to, chptr->chname); + me.name, source_p->name, chptr->chname); else { sendto_one(source_p, form_str(RPL_TOPIC), - from, to, + me.name, source_p->name, chptr->chname, chptr->topic); sendto_one(source_p, form_str(RPL_TOPICWHOTIME), - from, to, chptr->chname, + me.name, source_p->name, chptr->chname, chptr->topic_info, chptr->topic_time); } } else sendto_one(source_p, form_str(ERR_NOTONCHANNEL), - from, to, chptr->chname); + me.name, source_p->name, chptr->chname); } } +static void +ms_topic(struct Client *client_p, struct Client *source_p, + int parc, char *parv[]) +{ + struct Channel *chptr = NULL; + const char *from, *to; + char topic_info[USERHOST_REPLYLEN]; + + if (IsCapable(source_p->from, CAP_TS6) && HasID(source_p)) + { + from = me.id; + to = source_p->id; + } + + if (EmptyString(parv[1])) + { + sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), + from, to, "TOPIC"); + return; + } + + if ((chptr = hash_find_channel(parv[1])) == NULL) + { + sendto_one(source_p, form_str(ERR_NOSUCHCHANNEL), + from, to, parv[1]); + return; + } + + if (!IsClient(source_p)) + strlcpy(topic_info, source_p->name, sizeof(topic_info)); + else + snprintf(topic_info, sizeof(topic_info), "%s!%s@%s", source_p->name, + source_p->username, source_p->host); + set_channel_topic(chptr, parv[2], topic_info, CurrentTime, 0); + + sendto_server(client_p, CAP_TS6, NOCAPS, ":%s TOPIC %s :%s", + ID(source_p), chptr->chname, + chptr->topic); + sendto_server(client_p, NOCAPS, CAP_TS6, ":%s TOPIC %s :%s", + source_p->name, chptr->chname, + chptr->topic); + + if (!IsClient(source_p)) + sendto_channel_local(ALL_MEMBERS, 0, chptr, ":%s TOPIC %s :%s", + source_p->name, + chptr->chname, chptr->topic); + + else + sendto_channel_local(ALL_MEMBERS, 0, chptr, ":%s!%s@%s TOPIC %s :%s", + source_p->name, + source_p->username, + source_p->host, + chptr->chname, chptr->topic); +} + + static struct Message topic_msgtab = { "TOPIC", 0, 0, 2, MAXPARA, MFLG_SLOW, 0, - {m_unregistered, m_topic, m_topic, m_ignore, m_topic, m_ignore} + {m_unregistered, m_topic, ms_topic, m_ignore, m_topic, m_ignore} }; static void -- cgit