X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fm_away.c;h=ef440c19ab37a54009864dd76bdbbcf0cc5c897c;hb=refs%2Fheads%2Fupstream;hp=2ccd5f970d5306eafa99d4a61231192b9bfc2b2b;hpb=ae91ef6320f611af74e70a0db2620c338fbaa7d5;p=ircu2.10.12-pk.git diff --git a/ircd/m_away.c b/ircd/m_away.c index 2ccd5f9..ef440c1 100644 --- a/ircd/m_away.c +++ b/ircd/m_away.c @@ -79,16 +79,12 @@ * note: it is guaranteed that parv[0]..parv[parc-1] are all * non-NULL pointers. */ -#if 0 -/* - * No need to include handlers.h here the signatures must match - * and we don't need to force a rebuild of all the handlers everytime - * we add a new one to the list. --Bleep - */ -#include "handlers.h" -#endif /* 0 */ +#include "config.h" + #include "client.h" #include "ircd.h" +#include "ircd_alloc.h" +#include "ircd_log.h" #include "ircd_reply.h" #include "ircd_string.h" #include "msg.h" @@ -97,35 +93,87 @@ #include "s_user.h" #include "send.h" -#include +/* #include -- Now using assert in ircd_log.h */ +#include /* - * m_away - generic message handler template + * user_set_away - set user away state + * returns 1 if client is away or changed away message, 0 if + * client is removing away status. + * NOTE: this function may modify user and message, so they + * must be mutable. + */ +static int user_set_away(struct User* user, char* message) +{ + char* away; + assert(0 != user); + + away = user->away; + + if (EmptyString(message)) { + /* + * Marking as not away + */ + if (away) { + MyFree(away); + user->away = 0; + } + } + else { + /* + * Marking as away + */ + unsigned int len = strlen(message); + + if (len > AWAYLEN) { + message[AWAYLEN] = '\0'; + len = AWAYLEN; + } + if (away) + MyFree(away); + away = (char*) MyMalloc(len + 1); + assert(0 != away); + + user->away = away; + strcpy(away, message); + } + return (user->away != 0); +} + + +/* + * m_away - generic message handler * - Added 14 Dec 1988 by jto. * * parv[0] = sender prefix * parv[1] = away message + * + * TODO: Throttle aways - many people have a script which resets the away + * message every 10 seconds which really chews the bandwidth. */ int m_away(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { char* away_message = parv[1]; + int was_away = cli_user(sptr)->away != 0; assert(0 != cptr); assert(cptr == sptr); - if (user_set_away(sptr->user, away_message)) { - sendto_serv_butone(cptr, "%s%s " TOK_AWAY " :%s", NumNick(sptr), away_message); - sendto_one(sptr, rpl_str(RPL_NOWAWAY), me.name, parv[0]); + if (user_set_away(cli_user(sptr), away_message)) + { + if (!was_away) + sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, ":%s", away_message); + send_reply(sptr, RPL_NOWAWAY); } else { - sendto_serv_butone(cptr, "%s%s " TOK_AWAY, NumNick(sptr)); - sendto_one(sptr, rpl_str(RPL_UNAWAY), me.name, parv[0]); + sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, ""); + send_reply(sptr, RPL_UNAWAY); } return 0; } /* - * ms_away - server message handler template + * ms_away - server message handler * - Added 14 Dec 1988 by jto. * * parv[0] = sender prefix @@ -141,12 +189,12 @@ int ms_away(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) * servers can't set away */ if (IsServer(sptr)) - return 0; + return protocol_violation(sptr,"Server trying to set itself away"); - if (user_set_away(sptr->user, away_message)) - sendto_serv_butone(cptr, "%s%s " TOK_AWAY " :%s", NumNick(sptr), away_message); + if (user_set_away(cli_user(sptr), away_message)) + sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, ":%s", away_message); else - sendto_serv_butone(cptr, "%s%s " TOK_AWAY, NumNick(sptr)); + sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, ""); return 0; }