From f53298a90117f227596a913b4b5a2abf439fc252 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Tue, 11 May 2004 02:28:12 +0000 Subject: [PATCH] Forward port of asuka-topicburst.patch from Quakenet's "Asuka" patch set. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1041 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- ChangeLog | 18 ++++++++++++++++++ include/ircd_features.h | 1 + ircd/channel.c | 3 +++ ircd/ircd_features.c | 1 + ircd/m_topic.c | 32 +++++++++++++++++++++++++------- 5 files changed, 48 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index bf0cc26..bf3da83 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2004-05-10 Michael Poole + + Forward port of asuka-topicburst.patch from Quakenet's "Asuka" + patch set. + + * include/ircd_features.h (FEAT_TOPIC_BURST): Add new feature. + + * ircd/channel.c (send_channel_modes): If F:TOPIC_BURST:TRUE, + also send a TOPIC to the peer. + + * ircd/ircd_features.c (FEAT_TOPIC_BURST): Add new boolean + feature, defaulting to FALSE. + + * ircd/m_topic.c (do_settopic): Add argument for topic timestamp, + and allow F:HIS_BANWHO to hide the originator of the topic. + (ms_topic): Parse optional timestamp arguments to TOPIC, and use + them to decide whether to ignore the topic. + 2004-05-10 Michael Poole Forward port of delayed-join.patch from Quakenet's "Asuka" patch diff --git a/include/ircd_features.h b/include/ircd_features.h index e480b5b..8f9606a 100644 --- a/include/ircd_features.h +++ b/include/ircd_features.h @@ -50,6 +50,7 @@ enum Feature { FEAT_CONNEXIT_NOTICES, FEAT_OPLEVELS, FEAT_LOCAL_CHANNELS, + FEAT_TOPIC_BURST, /* features that probably should not be touched */ FEAT_KILLCHASETIMELIMIT, diff --git a/ircd/channel.c b/ircd/channel.c index 00e4fd9..9e7c258 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -1017,6 +1017,9 @@ void send_channel_modes(struct Client *cptr, struct Channel *chptr) that didn't fit (full==1) */ if (opped_members) MyFree(opped_members); + if (feature_bool(FEAT_TOPIC_BURST) && (chptr->topic[0] != '\0')) + sendcmdto_one(&me, CMD_TOPIC, cptr, "%H %Tu %Tu :%s", chptr, + chptr->creationtime, chptr->topic_time, chptr->topic); } /* diff --git a/ircd/ircd_features.c b/ircd/ircd_features.c index ff5abae..dbdaa04 100644 --- a/ircd/ircd_features.c +++ b/ircd/ircd_features.c @@ -256,6 +256,7 @@ static struct FeatureDesc { F_B(CONNEXIT_NOTICES, 0, 0, 0), F_B(OPLEVELS, 0, 1, 0), F_B(LOCAL_CHANNELS, 0, 1, 0), + F_B(TOPIC_BURST, 0, 0, 0), /* features that probably should not be touched */ F_I(KILLCHASETIMELIMIT, 0, 30, 0), diff --git a/ircd/m_topic.c b/ircd/m_topic.c index 83e89f2..71979f2 100644 --- a/ircd/m_topic.c +++ b/ircd/m_topic.c @@ -85,6 +85,7 @@ #include "client.h" #include "hash.h" #include "ircd.h" +#include "ircd_features.h" #include "ircd_reply.h" #include "ircd_string.h" #include "msg.h" @@ -93,12 +94,19 @@ #include "send.h" #include +#include /* for atoi() */ static void do_settopic(struct Client *sptr, struct Client *cptr, - struct Channel *chptr,char *topic) + struct Channel *chptr, char *topic, time_t ts) { struct Membership *member; + struct Client *from; int newtopic; + + if (feature_bool(FEAT_HIS_BANWHO) && IsServer(sptr)) + from = &me; + else + from = sptr; member = find_channel_member(sptr, chptr); /* if +n and not @'d, return an error and ignore the topic */ if ((chptr->mode.mode & MODE_TOPICLIMIT) != 0 && (!member || !IsChanOp(member))) @@ -115,12 +123,12 @@ static void do_settopic(struct Client *sptr, struct Client *cptr, newtopic=ircd_strncmp(chptr->topic,topic,TOPICLEN)!=0; /* setting a topic */ ircd_strncpy(chptr->topic, topic, TOPICLEN); - ircd_strncpy(chptr->topic_nick, cli_name(sptr), NICKLEN); - chptr->topic_time = CurrentTime; + ircd_strncpy(chptr->topic_nick, cli_name(from), NICKLEN); + chptr->topic_time = ts ? ts : TStime(); /* Fixed in 2.10.11: Don't propergate local topics */ if (!IsLocalChannel(chptr->chname)) - sendcmdto_serv_butone(sptr, CMD_TOPIC, cptr, "%H :%s", chptr, - chptr->topic); + sendcmdto_serv_butone(sptr, CMD_TOPIC, cptr, "%H %Tu %Tu :%s", chptr, + chptr->creationtime, chptr->topic_time, chptr->topic); if (newtopic) sendcmdto_channel_butserv_butone(sptr, CMD_TOPIC, chptr, NULL, "%H :%s", chptr, chptr->topic); @@ -179,7 +187,7 @@ int m_topic(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) } } else - do_settopic(sptr,cptr,chptr,topic); + do_settopic(sptr,cptr,chptr,topic,0); } return 0; } @@ -189,12 +197,15 @@ int m_topic(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) * * parv[0] = sender prefix * parv[1] = channel + * parv[2] = channel timestamp (optional) + * parv[3] = topic timestamp (optional) * parv[parc - 1] = topic */ int ms_topic(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { struct Channel *chptr; char *topic = 0, *name, *p = 0; + time_t ts = 0; if (parc < 3) return need_more_params(sptr, "TOPIC"); @@ -218,7 +229,14 @@ int ms_topic(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) continue; } - do_settopic(sptr,cptr,chptr,topic); + /* If existing channel is older or has newer topic, ignore */ + if (parc > 3 && (ts = atoi(parv[2])) && chptr->creationtime < ts) + continue; + + if (parc > 4 && (ts = atoi(parv[3])) && chptr->topic_time > ts) + continue; + + do_settopic(sptr,cptr,chptr,topic, ts); } return 0; } -- 2.20.1