os_ignore.c

Go to the documentation of this file.
00001 /* OperServ 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: os_ignore.c 1265 2007-08-26 15:33:06Z geniusdex $
00012  *
00013  */
00014 /*************************************************************************/
00015 
00016 #include "module.h"
00017 
00018 int do_ignorelist(User * u);
00019 void myOperServHelp(User * u);
00020 int do_ignoreuser(User * u);
00021 int do_clearignore(User * u);
00022 void delete_ignore(const char *nick);
00023 
00030 int AnopeInit(int argc, char **argv)
00031 {
00032     Command *c;
00033 
00034     moduleAddAuthor("Anope");
00035     moduleAddVersion("$Id: os_ignore.c 1265 2007-08-26 15:33:06Z geniusdex $");
00036     moduleSetType(CORE);
00037     c = createCommand("IGNORE", do_ignoreuser, is_services_admin,
00038                       OPER_HELP_IGNORE, -1, -1, -1, -1);
00039     moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
00040 
00041     moduleSetOperHelp(myOperServHelp);
00042 
00043     return MOD_CONT;
00044 }
00045 
00049 void AnopeFini(void)
00050 {
00051 
00052 }
00053 
00054 
00059 void myOperServHelp(User * u)
00060 {
00061     if (is_services_admin(u)) {
00062         notice_lang(s_OperServ, u, OPER_HELP_CMD_IGNORE);
00063     }
00064 }
00065 
00071 int do_ignoreuser(User * u)
00072 {
00073     char *cmd = strtok(NULL, " ");
00074     int t;
00075 
00076     if (!cmd) {
00077         notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
00078         return MOD_CONT;
00079     }
00080 
00081     if (!stricmp(cmd, "ADD")) {
00082 
00083         char *time = strtok(NULL, " ");
00084         char *nick = strtok(NULL, " ");
00085         char *rest = strtok(NULL, "");
00086 
00087         if (!nick) {
00088             notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
00089             return MOD_CONT;
00090         } else if (!time) {
00091             notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
00092             return MOD_CONT;
00093         } else {
00094             t = dotime(time);
00095             rest = NULL;
00096 
00097             if (t <= -1) {
00098                 notice_lang(s_OperServ, u, OPER_IGNORE_VALID_TIME);
00099                 return MOD_CONT;
00100             } else if (t == 0) {
00101                 t = 157248000;  /* if 0 is given, we set time to 157248000 seconds == 5 years (let's hope the next restart will  be before that time ;-)) */
00102                 add_ignore(nick, t);
00103                 notice_lang(s_OperServ, u, OPER_IGNORE_PERM_DONE, nick);
00104             } else {
00105                 add_ignore(nick, t);
00106                 notice_lang(s_OperServ, u, OPER_IGNORE_TIME_DONE, nick,
00107                             time);
00108             }
00109         }
00110     } else if (!stricmp(cmd, "LIST")) {
00111         do_ignorelist(u);
00112     }
00113 
00114     else if (!stricmp(cmd, "DEL")) {
00115         char *nick = strtok(NULL, " ");
00116         if (!nick) {
00117             notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
00118         } else {
00119             if (get_ignore(nick) == 0) {
00120                 notice_lang(s_OperServ, u, OPER_IGNORE_LIST_NOMATCH, nick);
00121                 return MOD_CONT;
00122             } else {
00123                 delete_ignore(nick);
00124                 notice_lang(s_OperServ, u, OPER_IGNORE_DEL_DONE, nick);
00125             }
00126         }
00127     } else if (!stricmp(cmd, "CLEAR")) {
00128         do_clearignore(u);
00129 
00130     } else
00131         notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
00132     return MOD_CONT;
00133 }
00134 
00135 /* shows the Services ignore list */
00136 
00137 int do_ignorelist(User * u)
00138 {
00139     int sent_header = 0;
00140     IgnoreData *id;
00141     int i;
00142 
00143     for (i = 0; i < 256; i++) {
00144         for (id = ignore[i]; id; id = id->next) {
00145             if (!sent_header) {
00146                 notice_lang(s_OperServ, u, OPER_IGNORE_LIST);
00147                 sent_header = 1;
00148             }
00149             notice_user(s_OperServ, u, "%s", id->who);
00150         }
00151     }
00152     if (!sent_header)
00153         notice_lang(s_OperServ, u, OPER_IGNORE_LIST_EMPTY);
00154     return MOD_CONT;
00155 }
00156 
00157 /* deletes a nick from the ignore list  */
00158 
00159 void delete_ignore(const char *nick)
00160 {
00161     IgnoreData *ign, *prev;
00162     IgnoreData **whichlist;
00163 
00164     if (!nick || !*nick) {
00165         return;
00166     }
00167 
00168     whichlist = &ignore[tolower(nick[0])];
00169 
00170     for (ign = *whichlist, prev = NULL; ign; prev = ign, ign = ign->next) {
00171         if (stricmp(ign->who, nick) == 0)
00172             break;
00173     }
00174     /* If the ignore was not found, bail out -GD */
00175     if (!ign)
00176         return;
00177     if (prev)
00178         prev->next = ign->next;
00179     else
00180         *whichlist = ign->next;
00181     free(ign);
00182     ign = NULL;
00183 }
00184 
00185 /**************************************************************************/
00186 /* Cleares the Services ignore list */
00187 
00188 int do_clearignore(User * u)
00189 {
00190     IgnoreData *id = NULL, *next = NULL;
00191     int i;
00192     for (i = 0; i < 256; i++) {
00193         for (id = ignore[i]; id; id = next) {
00194             next = id->next;
00195             free(id);
00196             if (!next) {
00197                 ignore[i] = NULL;
00198             }
00199         }
00200     }
00201     notice_lang(s_OperServ, u, OPER_IGNORE_LIST_CLEARED);
00202     return MOD_CONT;
00203 }

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