]> jfr.im git - irc/quakenet/newserv.git/commitdiff
NICK: Add "away" functionality.
authorsplidge <redacted>
Thu, 3 Dec 2009 17:13:42 +0000 (17:13 +0000)
committersplidge <redacted>
Thu, 3 Dec 2009 17:13:42 +0000 (17:13 +0000)
- New member of nick structure
  + Code to initialize in localuser / nick modules
- Handler for "A" token to update value
  + Code to register it
- Added to control's "WHOIS" command
- Added newsearch term

control/control.c
irc/irc_config.h
localuser/localuser.c
newsearch/newsearch.c
newsearch/newsearch.h
newsearch/ns-away.c [new file with mode: 0644]
nick/nick.c
nick/nick.h
nick/nickhandlers.c

index d29f93876f6cf46f134ea9d3827257be6a0f64fd..43e584be4bc88211fe88539b02dd20c6c69973e1 100644 (file)
@@ -267,6 +267,10 @@ int controlwhois(void *sender, int cargc, char **cargv) {
     }
   }
 
+  if (target->away) {
+    controlreply((nick *)sender, "Away      : %s",target->away->content);
+  }
+
   hooknick=(nick *)sender;
   registerhook(HOOK_CONTROL_WHOISREPLY,&handlewhois);
   triggerhook(HOOK_CONTROL_WHOISREQUEST,target);
index 4d8202d05b24436bdb9ee7f6af24fa8c79b3528d..4f7f254ba0a250ebd24cf7c11824287aef7a8337 100644 (file)
@@ -10,6 +10,7 @@
 #define TOPICLEN    250
 #define CHANNELLEN  200
 #define KEYLEN      23 
+#define AWAYLEN     160
 
 #define MAXSERVERS 4096
 
index c7db7cb1f90a66ac8dc3763ac5b74f320cd98912..dd11918b901a4eee813157d1a520c6a4bf193f8d 100644 (file)
@@ -114,6 +114,7 @@ nick *registerlocaluserflags(char *nickname, char *ident, char *host, char *real
   newuser->timestamp=getnettime();
   newuser->shident=NULL;
   newuser->sethost=NULL;
+  newuser->away=NULL;
   newuser->marker=0;
   memset(newuser->exts, 0, MAXNICKEXTS * sizeof(void *));
 
index 100ddf94bd9dbaea7f2a874f5d9bed97571cdf31..d4531b4c12306f7561e761f324c3d6320c1d40a4 100644 (file)
@@ -178,6 +178,7 @@ void _init() {
   /* Nickname operations */
   registersearchterm(reg_nicksearch, "hostmask",hostmask_parse, 0, "The user's nick!user@host; \"hostmask real\" returns nick!user@host\rreal");     /* nick only */
   registersearchterm(reg_nicksearch, "realname",realname_parse, 0, "User's current realname");     /* nick only */
+  registersearchterm(reg_nicksearch, "away",away_parse, 0, "User's current away message");       /* nick only */
   registersearchterm(reg_nicksearch, "authname",authname_parse, 0, "User's current authname or false");     /* nick only */
   registersearchterm(reg_nicksearch, "authts",authts_parse, 0, "User's Auth timestamp");         /* nick only */
   registersearchterm(reg_nicksearch, "ident",ident_parse, 0, "User's current ident");           /* nick only */
index 9b4a26e90a542c38202f82eabda729649e43f854..727886a00fdebf70a128e739faa880022e3952d9 100644 (file)
@@ -126,6 +126,7 @@ struct searchNode *modes_parse(searchCtx *ctx, int argc, char **argv);
 /* Nick functions (various types) */
 struct searchNode *hostmask_parse(searchCtx *ctx, int argc, char **argv);
 struct searchNode *realname_parse(searchCtx *ctx, int argc, char **argv);
+struct searchNode *away_parse(searchCtx *ctx, int argc, char **argv);
 struct searchNode *authname_parse(searchCtx *ctx, int argc, char **argv);
 struct searchNode *authts_parse(searchCtx *ctx, int argc, char **argv);
 struct searchNode *ident_parse(searchCtx *ctx, int argc, char **argv);
diff --git a/newsearch/ns-away.c b/newsearch/ns-away.c
new file mode 100644 (file)
index 0000000..fb09e78
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * AWAY functionality 
+ */
+
+#include "newsearch.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+void *away_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
+void away_free(searchCtx *ctx, struct searchNode *thenode);
+
+struct searchNode *away_parse(searchCtx *ctx, int argc, char **argv) {
+  struct searchNode *thenode;
+
+  if (!(thenode=(struct searchNode *)malloc(sizeof (struct searchNode)))) {
+    parseError = "malloc: could not allocate memory for this search.";
+    return NULL;
+  }
+
+  thenode->returntype = RETURNTYPE_STRING;
+  thenode->localdata = NULL;
+  thenode->exe = away_exe;
+  thenode->free = away_free;
+
+  return thenode;
+}
+
+void *away_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput) {
+  nick *np = (nick *)theinput;
+
+  return (np->away) ? np->away->content : "";
+}
+
+void away_free(searchCtx *ctx, struct searchNode *thenode) {
+  free(thenode);
+}
+
index c43a87e0294b75454edace7477b0d956544cafa6..3b9dead2bb69ae4e3cae2bd34edc4588792a2ac7 100644 (file)
@@ -91,6 +91,7 @@ void _init() {
   registerserverhandler("AC",&handleaccountmsg,4);
   registerserverhandler("R",&handlestatsmsg,2);
   registerserverhandler("P",&handleprivmsg,2);
+  registerserverhandler("A",&handleawaymsg,1);
   
   /* Fake the addition of our own server */
   handleserverchange(HOOK_SERVER_NEWSERVER,(void *)numerictolong(mynumeric->content,2));
@@ -128,6 +129,7 @@ void _fini() {
   deregisterserverhandler("AC",&handleaccountmsg);
   deregisterserverhandler("R",&handlestatsmsg);  
   deregisterserverhandler("P",&handleprivmsg);
+  deregisterserverhandler("A",&handleawaymsg);
 }
 
 /*
index 8fbe01e47279ce9902d2df3e97df06cb8d230c25..004aa4b1cdc6e8730b3521d35fc8c46a7b64533f 100644 (file)
@@ -140,6 +140,7 @@ typedef struct nick {
   authname *auth; /* This requires User ID numbers to work */
   time_t timestamp;
   time_t accountts;
+  sstring *away;
   patricia_node_t *ipnode;
   unsigned int marker;
   struct nick *next;
@@ -207,6 +208,7 @@ int handlewhoismsg(void *source, int cargc, char **cargv);
 int handleaccountmsg(void *source, int cargc, char **cargv);
 int handlestatsmsg(void *source, int cargc, char **cargv);
 int handleprivmsg(void *source, int cargc, char **cargv);
+int handleawaymsg(void *source, int cargc, char **cargv);
 
 /* These functions have been replaced by macros 
 nick **gethandlebynumeric(long numeric);
index 86c3590577d809dcb74637facfd6d660615430e8..282139f3070696df4583b82346e34c13b8a08265 100644 (file)
@@ -143,6 +143,7 @@ int handlenickmsg(void *source, int cargc, char **cargv) {
     np->ipnode = refnode(iptree, &ipaddress, PATRICIA_MAXBITS);
     node_increment_usercount(np->ipnode);
 
+    np->away=NULL;
     np->shident=NULL;
     np->sethost=NULL;
     np->opername=NULL;
@@ -527,3 +528,22 @@ int handleprivmsg(void *source, int cargc, char **cargv) {
   return CMD_OK;
 }
 
+int handleawaymsg(void *source, int cargc, char **cargv) {
+  nick *sender;
+    
+  /* Check source is a valid user */ 
+  if (!(sender=getnickbynumericstr(source))) {
+    return CMD_OK;
+  }
+
+  /* Done with the old away message either way */
+  freesstring(sender->away);
+  sender->away=NULL;
+  
+  /* If we have an arg and it isn't an empty string, this sets a new message */
+  if (cargc > 0 && *(cargv[0])) {
+    sender->away=getsstring(cargv[0], AWAYLEN);
+  }
+
+  return CMD_OK;
+}