]> jfr.im git - irc/quakenet/newserv.git/blobdiff - chanserv/chanservstdcmds.c
A4STATS: remove E style escapes and switch to createtable for indices
[irc/quakenet/newserv.git] / chanserv / chanservstdcmds.c
index 58fdcd99fec2c64fdd274c8a261a3b4546b9b0c3..d98cf2900d87030f3690b7bb24c42c40e4fe76e5 100644 (file)
@@ -5,9 +5,10 @@
 #include "chanserv.h"
 #include "../core/schedule.h"
 #include "../lib/irc_string.h"
-#include "../pqsql/pqsql.h"
+#include "../dbapi/dbapi.h"
 
 #include <string.h>
+#include <stdio.h>
 
 int cs_dorehash(void *source, int cargc, char **cargv) {
   nick *sender=source;
@@ -44,6 +45,24 @@ int cs_doquit(void *source, int cargc, char **cargv) {
   return CMD_OK;
 }
 
+int cs_dosetquitreason(void *source, int cargc, char **cargv) {
+  nick *sender=(nick *)source;
+
+  if (cargc<0) {
+    chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "setquitreason");
+    return CMD_ERROR;
+  }
+  
+  if (cs_quitreason)
+    freesstring(cs_quitreason);
+  cs_quitreason=getsstring(cargv[0], 250);
+
+  chanservstdmessage(sender, QM_DONE);
+
+  return CMD_OK;
+}
+
 int cs_dorename(void *source, int cargc, char **cargv) {
   char newnick[NICKLEN+1];
   nick *sender=source;
@@ -70,6 +89,9 @@ int cs_doshowcommands(void *source, int cargc, char **cargv) {
   int lang;
   char *message;
   cmdsummary *summary;
+  char cmdbuf[50];
+  char *ct;
+  unsigned int dumpcount=0;
   
   n=getcommandlist(cscommands, cmdlist, 200);
   rup=getreguserfromnick(sender);
@@ -81,7 +103,50 @@ int cs_doshowcommands(void *source, int cargc, char **cargv) {
 
   chanservstdmessage(sender, QM_COMMANDLIST);
 
+  if (cargc>0 && rup && UIsDev(rup) && !ircd_strcmp(cargv[0], "-v")) {
+    dumpcount=1;
+  }
+
   for (i=0;i<n;i++) {
+    /* Generate the appropriate strings for the command name (including 
+     * prefixes for privileged users) and the summary text.
+     *
+     * We do this before we're sure we will print the command to make things
+     * easier when we are doing -v */    
+    summary=(cmdsummary *)cmdlist[i]->ext;
+    
+    if (rup && UHasStaffPriv(rup)) {
+      if (cmdlist[i]->level & QCMD_DEV) {
+        sprintf(cmdbuf,"+d %s",cmdlist[i]->command->content);
+      } else if(cmdlist[i]->level & QCMD_ADMIN) {
+        sprintf(cmdbuf,"+a %s",cmdlist[i]->command->content);
+      } else if(cmdlist[i]->level & QCMD_OPER) {
+        sprintf(cmdbuf,"+o %s",cmdlist[i]->command->content);
+      } else if(cmdlist[i]->level & QCMD_HELPER) {
+        sprintf(cmdbuf,"+h %s",cmdlist[i]->command->content);
+      } else if(cmdlist[i]->level & QCMD_STAFF) {
+        sprintf(cmdbuf,"+q %s",cmdlist[i]->command->content);
+      } else {
+        sprintf(cmdbuf,"   %s",cmdlist[i]->command->content);
+      }
+      ct=cmdbuf;
+    } else {
+      ct=cmdlist[i]->command->content;
+    }
+    
+    if (summary->bylang[lang]) {
+      message=summary->bylang[lang]->content;
+    } else if (summary->bylang[0]) {
+      message=summary->bylang[0]->content;
+    } else {
+      message=summary->def->content;
+    }
+    
+    if (dumpcount) {
+      chanservsendmessage(sender,"%-20s %u", cmdbuf, cmdlist[i]->calls);
+      continue;
+    }
+    
     if (cargc>0 && !match2strings(cargv[0],cmdlist[i]->command->content))
       continue;
 
@@ -96,6 +161,10 @@ int cs_doshowcommands(void *source, int cargc, char **cargv) {
     if ((cmdlist[i]->level & QCMD_NOTAUTHED) && rup)
       continue;
 
+    if ((cmdlist[i]->level & QCMD_STAFF) && 
+       (!rup || !UHasStaffPriv(rup)))
+      continue;
+
     if ((cmdlist[i]->level & QCMD_HELPER) && 
        (!rup || !UHasHelperPriv(rup)))
       continue;
@@ -112,17 +181,27 @@ int cs_doshowcommands(void *source, int cargc, char **cargv) {
        (!rup || !UIsDev(rup) || !IsOper(sender)))
       continue;
     
-    summary=(cmdsummary *)cmdlist[i]->ext;
-    
-    if (summary->bylang[lang]) {
-      message=summary->bylang[lang]->content;
-    } else if (summary->bylang[0]) {
-      message=summary->bylang[0]->content;
-    } else {
-      message=summary->def->content;
+    /* Commands flagged QCMD_ACHIEVEMENTS:
+     *  Always invalid before 01/04/2010.
+     *  Valid after 02/04/2010 only if you have the flag set */
+    if (cmdlist[i]->level & QCMD_ACHIEVEMENTS) {
+      if (time(NULL) < ACHIEVEMENTS_START)
+        continue;
+      
+      if ((time(NULL) > ACHIEVEMENTS_END) && 
+        !UIsAchievements(rup))
+        continue;
     }
     
-    chanservsendmessage(sender, "%-20s %s",cmdlist[i]->command->content, message);
+    /* Commands flagged QCMD_TITLES:
+     *  Only valid on 01/04/2010. */
+    if ((cmdlist[i]->level & QCMD_TITLES) && 
+        ((time(NULL) < ACHIEVEMENTS_START) ||
+         (time(NULL) > ACHIEVEMENTS_END)))
+      continue;
+    
+    /* We passed all the checks, send the message */    
+    chanservsendmessage(sender, "%-20s %s",ct, message);
   }
 
   chanservstdmessage(sender, QM_ENDOFLIST);
@@ -146,11 +225,13 @@ int cs_sendhelp(nick *sender, char *thecmd, int oneline) {
   rup=getreguserfromnick(sender);
   
   /* Don't showhelp for privileged users to others.. */
-  if (((cmd->level & QCMD_HELPER) && (!rup || !UHasHelperPriv(rup))) ||
+  if (((cmd->level & QCMD_STAFF) && (!rup || !UHasStaffPriv(rup))) ||
+      ((cmd->level & QCMD_HELPER) && (!rup || !UHasHelperPriv(rup))) ||
       ((cmd->level & QCMD_OPER) && (!rup || !UHasOperPriv(rup))) ||
       ((cmd->level & QCMD_ADMIN) && (!rup || !UHasAdminPriv(rup))) ||
-      ((cmd->level & QCMD_DEV) && (!rup || !UIsDev(rup)))) {
-    chanservstdmessage(sender, QM_NOHELP, cmd->command->content);
+      ((cmd->level & QCMD_DEV) && (!rup || !UIsDev(rup))) ||
+      ((cmd->level & (QCMD_TITLES | QCMD_ACHIEVEMENTS)) && (time(NULL) < ACHIEVEMENTS_START))) {
+    chanservstdmessage(sender, QM_UNKNOWNCMD, thecmd);
     return CMD_OK;
   }
 
@@ -158,9 +239,9 @@ int cs_sendhelp(nick *sender, char *thecmd, int oneline) {
 
   if (sum->defhelp && *(sum->defhelp)) {
     if (oneline) {
-      chanservsendmessageoneline(sender, sum->defhelp);
+      chanservsendmessageoneline(sender, "%s", sum->defhelp);
     } else {
-      chanservsendmessage(sender, sum->defhelp);
+      chanservsendmessage(sender, "%s", sum->defhelp);
     }
   } else {
     if (!oneline)
@@ -191,15 +272,15 @@ int cs_doctcpping(void *source, int cargc, char **cargv) {
 }
   
 int cs_doctcpversion(void *source, int cargc, char **cargv) {
-  sendnoticetouser(chanservnick, source, "\01VERSION Q9 version %s (Compiled on " __DATE__ ")  (C) 2002-3 David Mansell (splidge)\01", QVERSION);
-  sendnoticetouser(chanservnick, source, "\01VERSION Built on newserv version 1.00.  (C) 2002-3 David Mansell (splidge)\01");
+  sendnoticetouser(chanservnick, source, "\01VERSION Q9 version %s (Compiled on " __DATE__ ")  (C) 2002-8 David Mansell (splidge) and others.\01", QVERSION);
+  sendnoticetouser(chanservnick, source, "\01VERSION Built on newserv.  (C) 2002-8 David Mansell (splidge) and others.\01");
 
   return CMD_OK;
 }
 
 int cs_doversion(void *source, int cargc, char **cargv) {
-  chanservsendmessage((nick *)source, "Q9 version %s (Compiled on " __DATE__ ") (C) 2002-3 David Mansell (splidge)", QVERSION);
-  chanservsendmessage((nick *)source, "Built on newserv version 1.00.  (C) 2002-3 David Mansell (splidge)");
+  chanservsendmessage((nick *)source, "Q9 version %s (Compiled on " __DATE__ ") (C) 2002-8 David Mansell (splidge) and others.", QVERSION);
+  chanservsendmessage((nick *)source, "Built on newserv.  (C) 2002-8 David Mansell (splidge) and others.");
   return CMD_OK;
 }
 
@@ -209,7 +290,7 @@ int cs_doctcpgender(void *source, int cargc, char **cargv) {
   return CMD_OK;
 }
 
-void csdb_dohelp_real(PGconn *, void *);
+void csdb_dohelp_real(DBConn *, void *);
 
 struct helpinfo {
   unsigned int numeric;
@@ -228,16 +309,16 @@ void csdb_dohelp(nick *np, Command *cmd) {
   hip->cmd=cmd;
 
   q9asyncquery(csdb_dohelp_real, (void *)hip, 
-                 "SELECT languageID, fullinfo from help where lower(command)=lower('%s')",cmd->command->content);
+                 "SELECT languageID, fullinfo from chanserv.help where lower(command)=lower('%s')",cmd->command->content);
 }
 
-void csdb_dohelp_real(PGconn *dbconn, void *arg) {
+void csdb_dohelp_real(DBConn *dbconn, void *arg) {
   struct helpinfo *hip=arg;
   nick *np=getnickbynumeric(hip->numeric);
   reguser *rup;
   char *result;
-  PGresult *pgres;
-  int i,j,num,lang=0;
+  DBResult *pgres;
+  int j,lang=0;
   
   if(!dbconn) {
     freesstring(hip->commandname);
@@ -245,27 +326,25 @@ void csdb_dohelp_real(PGconn *dbconn, void *arg) {
     return; 
   }
 
-  pgres=PQgetResult(dbconn);
+  pgres=dbgetresult(dbconn);
 
-  if (PQresultStatus(pgres) != PGRES_TUPLES_OK) {
+  if (!dbquerysuccessful(pgres)) {
     Error("chanserv",ERR_ERROR,"Error loading help text.");
     freesstring(hip->commandname);
     free(hip);
     return; 
   }
 
-  if (PQnfields(pgres)!=2) {
+  if (dbnumfields(pgres)!=2) {
     Error("chanserv",ERR_ERROR,"Help text format error.");
-    PQclear(pgres);
+    dbclear(pgres);
     freesstring(hip->commandname);
     free(hip);
     return;
   }
   
-  num=PQntuples(pgres);
-  
   if (!np) {
-    PQclear(pgres);
+    dbclear(pgres);
     freesstring(hip->commandname);
     free(hip);
     return;
@@ -276,21 +355,21 @@ void csdb_dohelp_real(PGconn *dbconn, void *arg) {
 
   result=NULL;
   
-  for (i=0;i<num;i++) {
-    j=strtoul(PQgetvalue(pgres,i,0),NULL,10);
+  while(dbfetchrow(pgres)) {
+    j=strtoul(dbgetvalue(pgres,0),NULL,10);
     if ((j==0 && result==NULL) || (j==lang)) {
-      result=PQgetvalue(pgres,i,1);
+      result=dbgetvalue(pgres,1);
       if(strlen(result)==0)
        result=NULL;
     }
   }
 
   if (result) {
-    chanservsendmessage(np, result);
+    chanservsendmessage(np, "%s", result);
   } else {
     cmdsummary *sum=hip->cmd->ext;
     if (sum->defhelp && *(sum->defhelp)) {
-      chanservsendmessage(np, sum->defhelp);
+      chanservsendmessage(np, "%s", sum->defhelp);
     } else {
       chanservstdmessage(np, QM_NOHELP, hip->commandname->content);
     }
@@ -298,4 +377,5 @@ void csdb_dohelp_real(PGconn *dbconn, void *arg) {
   
   freesstring(hip->commandname);
   free(hip);
+  dbclear(pgres);
 }