X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/4562c604897f18f08e1bee993d455d9c1774f9ad..b2c208be091670e3c5259eba77187bae6ac6eece:/modules/m_away.c diff --git a/modules/m_away.c b/modules/m_away.c index cd4c89bd..5a0fdced 100644 --- a/modules/m_away.c +++ b/modules/m_away.c @@ -37,7 +37,6 @@ #include "s_serv.h" #include "packet.h" - static int m_away(struct Client *, struct Client *, int, const char **); struct Message away_msgtab = { @@ -64,13 +63,13 @@ DECLARE_MODULE_AV1(away, NULL, NULL, away_clist, NULL, NULL, "$Revision: 3370 $" /* ** m_away -** parv[0] = sender prefix ** parv[1] = away message */ static int m_away(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { - if(MyClient(source_p) && !IsFloodDone(source_p)) + if(MyClient(source_p) && source_p->localClient->next_away && + !IsFloodDone(source_p)) flood_endgrace(source_p); if(!IsClient(source_p)) @@ -84,32 +83,52 @@ m_away(struct Client *client_p, struct Client *source_p, int parc, const char *p /* we now send this only if they were away before --is */ sendto_server(client_p, NULL, CAP_TS6, NOCAPS, ":%s AWAY", use_id(source_p)); - sendto_server(client_p, NULL, NOCAPS, CAP_TS6, - ":%s AWAY", source_p->name); free_away(source_p); + + sendto_common_channels_local_butone(source_p, CLICAP_AWAY_NOTIFY, ":%s!%s@%s AWAY", + source_p->name, source_p->username, source_p->host); } if(MyConnect(source_p)) - sendto_one(source_p, form_str(RPL_UNAWAY), - me.name, source_p->name); + sendto_one_numeric(source_p, RPL_UNAWAY, form_str(RPL_UNAWAY)); return 0; } + /* Rate limit this because it is sent to common channels. */ + if (MyClient(source_p)) + { + if(!IsOper(source_p) && + source_p->localClient->next_away > rb_current_time()) + { + sendto_one(source_p, form_str(RPL_LOAD2HI), + me.name, source_p->name, "AWAY"); + return 0; + } + if(source_p->localClient->next_away < rb_current_time() - + ConfigFileEntry.away_interval) + source_p->localClient->next_away = rb_current_time(); + else + source_p->localClient->next_away = rb_current_time() + + ConfigFileEntry.away_interval; + } if(source_p->user->away == NULL) - { allocate_away(source_p); + if(strncmp(source_p->user->away, parv[1], AWAYLEN - 1)) + { rb_strlcpy(source_p->user->away, parv[1], AWAYLEN); sendto_server(client_p, NULL, CAP_TS6, NOCAPS, ":%s AWAY :%s", use_id(source_p), source_p->user->away); - sendto_server(client_p, NULL, NOCAPS, CAP_TS6, - ":%s AWAY :%s", source_p->name, source_p->user->away); - - } else { - rb_strlcpy(source_p->user->away, parv[1], AWAYLEN); + sendto_common_channels_local_butone(source_p, + CLICAP_AWAY_NOTIFY, + ":%s!%s@%s AWAY :%s", + source_p->name, + source_p->username, + source_p->host, + source_p->user->away); } - + if(MyConnect(source_p)) - sendto_one(source_p, form_str(RPL_NOWAWAY), me.name, source_p->name); + sendto_one_numeric(source_p, RPL_NOWAWAY, form_str(RPL_NOWAWAY)); return 0; }