cs_list.c

Go to the documentation of this file.
00001 /* ChanServ core functions
00002  *
00003  * (C) 2003-2007 Anope Team
00004  * Contact us at info@anope.org
00005  *
00006  * Please read COPYING and README for further details.
00007  *
00008  * Based on the original code of Epona by Lara.
00009  * Based on the original code of Services by Andy Church. 
00010  * 
00011  * $Id: cs_list.c 1265 2007-08-26 15:33:06Z geniusdex $
00012  *
00013  */
00014 /*************************************************************************/
00015 
00016 #include "module.h"
00017 
00018 int do_list(User * u);
00019 void myChanServHelp(User * u);
00020 
00027 int AnopeInit(int argc, char **argv)
00028 {
00029     Command *c;
00030 
00031     moduleAddAuthor("Anope");
00032     moduleAddVersion("$Id: cs_list.c 1265 2007-08-26 15:33:06Z geniusdex $");
00033     moduleSetType(CORE);
00034 
00035     c = createCommand("LIST", do_list, NULL, -1, CHAN_HELP_LIST,
00036                       CHAN_SERVADMIN_HELP_LIST,
00037                       CHAN_SERVADMIN_HELP_LIST, CHAN_SERVADMIN_HELP_LIST);
00038 
00039     moduleAddCommand(CHANSERV, c, MOD_UNIQUE);
00040 
00041     moduleSetChanHelp(myChanServHelp);
00042 
00043     return MOD_CONT;
00044 }
00045 
00049 void AnopeFini(void)
00050 {
00051 
00052 }
00053 
00054 
00055 
00060 void myChanServHelp(User * u)
00061 {
00062     if (!CSListOpersOnly || (is_oper(u))) {
00063         notice_lang(s_ChanServ, u, CHAN_HELP_CMD_LIST);
00064     }
00065 }
00066 
00072 int do_list(User * u)
00073 {
00074     char *pattern = strtok(NULL, " ");
00075     int spattern_size;
00076     char *spattern;
00077     ChannelInfo *ci;
00078     int nchans, i;
00079     char buf[BUFSIZE];
00080     int is_servadmin = is_services_admin(u);
00081     int count = 0, from = 0, to = 0, tofree = 0;
00082     char *tmp = NULL;
00083     char *s = NULL;
00084     char *keyword;
00085     int32 matchflags = 0;
00086 
00087     if (!(!CSListOpersOnly || (is_oper(u)))) {
00088         notice_lang(s_ChanServ, u, ACCESS_DENIED);
00089         return MOD_STOP;
00090     }
00091 
00092     if (!pattern) {
00093         syntax_error(s_ChanServ, u, "LIST",
00094                      is_servadmin ? CHAN_LIST_SERVADMIN_SYNTAX :
00095                      CHAN_LIST_SYNTAX);
00096     } else {
00097 
00098         if (pattern) {
00099             if (pattern[0] == '#') {
00100                 tmp = myStrGetOnlyToken((pattern + 1), '-', 0); /* Read FROM out */
00101                 if (!tmp) {
00102                     notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
00103                     notice_lang(s_ChanServ, u, CS_LIST_INCORRECT_RANGE);
00104                     return MOD_CONT;
00105                 }
00106                 for (s = tmp; *s; s++) {
00107                     if (!isdigit(*s)) {
00108                         free(tmp);
00109                         notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
00110                         notice_lang(s_ChanServ, u, CS_LIST_INCORRECT_RANGE);
00111                         return MOD_CONT;
00112                     }
00113                 }
00114                 from = atoi(tmp);
00115                 free(tmp);
00116                 tmp = myStrGetTokenRemainder(pattern, '-', 1);  /* Read TO out */
00117                 if (!tmp) {
00118                     notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
00119                     notice_lang(s_ChanServ, u, CS_LIST_INCORRECT_RANGE);
00120                     return MOD_CONT;
00121                 }
00122                 for (s = tmp; *s; s++) {
00123                     if (!isdigit(*s)) {
00124                         free(tmp);
00125                         notice_lang(s_ChanServ, u, LIST_INCORRECT_RANGE);
00126                         notice_lang(s_ChanServ, u, CS_LIST_INCORRECT_RANGE);
00127                         return MOD_CONT;
00128                     }
00129                 }
00130                 to = atoi(tmp);
00131                 free(tmp);
00132                 pattern = sstrdup("*");
00133                 tofree = 1;
00134             }
00135         }
00136 
00137         nchans = 0;
00138 
00139         while (is_servadmin && (keyword = strtok(NULL, " "))) {
00140             if (stricmp(keyword, "FORBIDDEN") == 0)
00141                 matchflags |= CI_VERBOTEN;
00142             if (stricmp(keyword, "SUSPENDED") == 0)
00143                 matchflags |= CI_SUSPENDED;
00144             if (stricmp(keyword, "NOEXPIRE") == 0)
00145                 matchflags |= CI_NO_EXPIRE;
00146         }
00147         
00148         spattern_size = (strlen(pattern) + 2) * sizeof(char);
00149         spattern = smalloc(spattern_size);
00150         snprintf(spattern, spattern_size, "#%s", pattern);
00151         
00152 
00153         notice_lang(s_ChanServ, u, CHAN_LIST_HEADER, pattern);
00154         for (i = 0; i < 256; i++) {
00155             for (ci = chanlists[i]; ci; ci = ci->next) {
00156                 if (!is_servadmin && ((ci->flags & CI_PRIVATE)
00157                                       || (ci->flags & CI_VERBOTEN)))
00158                     continue;
00159                 if ((matchflags != 0) && !(ci->flags & matchflags))
00160                     continue;
00161 
00162                 if ((stricmp(pattern, ci->name) == 0)
00163                     || (stricmp(spattern, ci->name) == 0)
00164                     || match_wild_nocase(pattern, ci->name)
00165                     || match_wild_nocase(spattern, ci->name)) {
00166                     if ((((count + 1 >= from) && (count + 1 <= to))
00167                          || ((from == 0) && (to == 0)))
00168                         && (++nchans <= CSListMax)) {
00169                         char noexpire_char = ' ';
00170                         if (is_servadmin && (ci->flags & CI_NO_EXPIRE))
00171                             noexpire_char = '!';
00172 
00173                         if (ci->flags & CI_VERBOTEN) {
00174                             snprintf(buf, sizeof(buf),
00175                                      "%-20s  [Forbidden]", ci->name);
00176                         } else if (ci->flags & CI_SUSPENDED) {
00177                             snprintf(buf, sizeof(buf),
00178                                      "%-20s  [Suspended]", ci->name);
00179                         } else {
00180                             snprintf(buf, sizeof(buf), "%-20s  %s",
00181                                      ci->name, ci->desc ? ci->desc : "");
00182                         }
00183 
00184                         notice_user(s_ChanServ, u, "  %c%s",
00185                                     noexpire_char, buf);
00186                     }
00187                     count++;
00188                 }
00189             }
00190         }
00191         notice_lang(s_ChanServ, u, CHAN_LIST_END,
00192                     nchans > CSListMax ? CSListMax : nchans, nchans);
00193     }
00194     if (tofree)
00195         free(pattern);
00196     return MOD_CONT;
00197 
00198 }

Generated on Sun Dec 30 09:26:46 2007 for Anope by  doxygen 1.5.1-20070107