00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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);
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);
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 }