* 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"
#include "s_user.h"
#include "send.h"
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
+#include <string.h>
+
+/*
+ * 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 template
+ * 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)) {
- sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, ":%s", away_message);
+ 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 {
}
/*
- * ms_away - server message handler template
+ * ms_away - server message handler
* - Added 14 Dec 1988 by jto.
*
* parv[0] = sender prefix
* 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))
+ if (user_set_away(cli_user(sptr), away_message))
sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, ":%s", away_message);
else
sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, "");