]> jfr.im git - irc/quakenet/newserv.git/blobdiff - control/control.c
Port to git.
[irc/quakenet/newserv.git] / control / control.c
index c2b57053790adb620177db19e5720fc3b28afad8..7c9878f64e768e52561c0d3a75ad92c1b502d58e 100644 (file)
@@ -68,6 +68,7 @@ const flag no_noticeflags[] = {
     { 'k', NL_KICKKILLS },    /* KICK/KILL commands */
     { 'I', NL_MISC },         /* misc commands */
     { 'g', NL_GLINES },       /* GLINE commands */
+    { 'G', NL_GLINES_AUTO },  /* automated gline messages */
     { 'h', NL_HITS },         /* Where a gline or kill is set automatically by the bot */
     { 'c', NL_CLONING },      /* Clone detection */
     { 'C', NL_CLEARCHAN },    /* When someone clearchans */
@@ -77,6 +78,7 @@ const flag no_noticeflags[] = {
     { 'O', NL_OPERING },      /* when someone opers */
     { 'n', NL_NOTICES },      /* turn off to receive notices instead of privmsgs */
     { 'A', NL_ALL_COMMANDS }, /* all commands sent */
+    { 'a', NL_CLEANUP },      /* automated cleanup notices */
     { '\0', 0 }
   };
 
@@ -85,6 +87,7 @@ void handlemessages(nick *target, int messagetype, void **args);
 int controlstatus(void *sender, int cargc, char **cargv);
 void controlconnect(void *arg);
 int controlwhois(void *sender, int cargc, char **cargv);
+int controllistusers(void *sender, int cargc, char **cargv);
 int controlchannel(void *sender, int cargc, char **cargv);
 int relink(void *sender, int cargc, char **cargv);
 int die(void *sender, int cargc, char **cargv);
@@ -115,6 +118,7 @@ void _init() {
 
   registercontrolhelpcmd("status",NO_DEVELOPER,1,&controlstatus,"Usage: status ?level?\nDisplays status information, increasing level gives more verbose information.");
   registercontrolhelpcmd("whois",NO_OPERED,1,&controlwhois,"Usage: whois <nickname|#numeric>\nDisplays lots of information about the specified nickname or numeric.");
+  registercontrolhelpcmd("listusers", NO_OPERED | NO_ACCOUNT, 2, &controllistusers, "Syntax: LISTUSERS\nLists all accounts.");
   registercontrolhelpcmd("channel",NO_OPER,1,&controlchannel,"Usage: channel <#channel>\nDisplays channel information.");
   registercontrolhelpcmd("relink",NO_DEVELOPER,1,&relink,"Usage: relink\nRelinks service to the network.");
   registercontrolhelpcmd("die",NO_DEVELOPER,1,&die,"Usage: die <reason>\nTerminates the service.");
@@ -149,6 +153,7 @@ void _fini() {
   
   deregistercontrolcmd("status",&controlstatus);
   deregistercontrolcmd("whois",&controlwhois);
+  deregistercontrolcmd("listusers", &controllistusers);
   deregistercontrolcmd("channel",&controlchannel);
   deregistercontrolcmd("relink",&relink);
   deregistercontrolcmd("die",&die);
@@ -328,7 +333,7 @@ static int controlwhois_plain(void *sender, int cargc, char **cargv) {
       }
     }
   }
-  controlreply((nick *)sender,"IP address: %s",IPtostr(target->p_ipaddr));
+  controlreply((nick *)sender,"IP address: %s",IPtostr(target->ipaddress));
   controlreply((nick *)sender,"Realname  : %s (%d user(s) have this realname)",target->realname->name->content,target->realname->usercount);
   if (target->umodes) {
     controlreply((nick *)sender,"Umode(s)  : %s",printflags(target->umodes,umodeflags));
@@ -501,6 +506,39 @@ void noperserv_whois_account_handler(int hooknum, void *arg) {
   }
 }
 
+int controllistusers(void *sender, int cargc, char **cargv) {
+  nick *np = (nick *)sender;
+  int i, count = 0;
+  authname *anp;
+  no_autheduser *au;
+
+  hooknick = np;
+
+  registerhook(HOOK_CONTROL_WHOISREPLY, &handlewhois);
+
+  for (i=0;i<AUTHNAMEHASHSIZE;i++) {
+    for (anp=authnametable[i];anp;anp=anp->next) {
+      au = noperserv_get_autheduser(anp);
+      if(!au)
+        continue;
+
+      if (count > 0)
+        controlreply(np, "---");
+
+      controlreply(np, "Account   : %s", au->authname->name);
+      noperserv_whois_account_handler(HOOK_CONTROL_WHOISREQUEST_AUTHEDUSER, (void *)au);
+      controlreply(np, "Flags     : %s", printflags(NOGetAuthLevel(au), no_userflags));
+
+      count++;
+    }
+  }
+
+  deregisterhook(HOOK_CONTROL_WHOISREPLY, &handlewhois);
+
+  controlreply(np, "--- Found %d users.", count);
+
+  return CMD_OK;
+}
 
 int controlinsmod(void *sender, int cargc, char **cargv) {
   if (cargc<1)
@@ -584,7 +622,7 @@ int relink(void *sender, int cargc, char **cargv) {
   }
   
   irc_send("%s SQ %s 0 :%s",mynumeric->content,myserver->content,cargv[0]);
-  irc_disconnected();
+  irc_disconnected(0);
   
   return CMD_OK;
 }
@@ -698,31 +736,22 @@ void handlemessages(nick *target, int messagetype, void **args) {
     case LU_PRIVMSG:
     case LU_SECUREMSG:
       /* If it's a message, first arg is nick and second is message */
-      sender=(nick *)args[0];
+      sender = (nick *)args[0];
 
-      Error("control",ERR_INFO,"From: %s!%s@%s: %s",sender->nick,sender->ident,sender->host->name->content, (char *)args[1]);
+      controlwall(NO_DEVELOPER, NL_ALL_COMMANDS, "From: %s!%s@%s%s%s: %s", sender->nick, sender->ident, sender->host->name->content, IsAccount(sender)?"/":"", IsAccount(sender)?sender->authname:"", (char *)args[1]);
 
       /* Split the line into params */
-      cargc=splitline((char *)args[1],cargv,50,0);
+      cargc = splitline((char *)args[1], cargv, 50, 0);
       
-      if (!cargc) {
-        /* Blank line */
+      if(!cargc) /* Blank line */
         return;
-      } 
                
-      cmd=findcommandintree(controlcmds,cargv[0],1);
-      if (cmd==NULL) {
-        controlreply(sender,"Unknown command.");
-        return;
-      }
-      
-      if (cmd->level>0 && !IsOper(sender)) {
-        controlreply(sender,"You need to be opered to use this command.");
+      cmd = findcommandintree(controlcmds,cargv[0],1);
+      if(!cmd || !noperserv_policy_command_permitted(cmd->level, sender)) {
+        controlreply(sender, "Unknown command or access denied.");
         return;
       }
       
-      /* If we were doing "authed user tracking" here we'd put a check in for authlevel */
-      
       /* Check the maxargs */
       if (cmd->maxparams<(cargc-1)) {
         /* We need to do some rejoining */
@@ -732,6 +761,7 @@ void handlemessages(nick *target, int messagetype, void **args) {
       
       if((cmd->handler)((void *)sender,cargc-1,&(cargv[1])) == CMD_USAGE)
         controlhelp(sender, cmd);
+
       break;
       
     case LU_KILLED:
@@ -739,6 +769,7 @@ void handlemessages(nick *target, int messagetype, void **args) {
       scheduleoneshot(time(NULL)+1,&controlconnect,NULL);
       mynick=NULL;
       triggerhook(HOOK_CONTROL_REGISTERED, NULL);
+
       break;
       
     default: