ms_del.c

Go to the documentation of this file.
00001 /* MemoServ 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: ms_del.c 1265 2007-08-26 15:33:06Z geniusdex $
00012  *
00013  */
00014 /*************************************************************************/
00015 
00016 #include "module.h"
00017 
00018 int do_del(User * u);
00019 int del_memo_callback(User * u, int num, va_list args);
00020 void myMemoServHelp(User * u);
00021 
00028 int AnopeInit(int argc, char **argv)
00029 {
00030     Command *c;
00031 
00032     moduleAddAuthor("Anope");
00033     moduleAddVersion("$Id: ms_del.c 1265 2007-08-26 15:33:06Z geniusdex $");
00034     moduleSetType(CORE);
00035     c = createCommand("DEL", do_del, NULL, MEMO_HELP_DEL, -1, -1, -1, -1);
00036     moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
00037     moduleSetMemoHelp(myMemoServHelp);
00038 
00039     return MOD_CONT;
00040 }
00041 
00045 void AnopeFini(void)
00046 {
00047 
00048 }
00049 
00050 
00051 
00056 void myMemoServHelp(User * u)
00057 {
00058     notice_lang(s_MemoServ, u, MEMO_HELP_CMD_DEL);
00059 }
00060 
00066 int do_del(User * u)
00067 {
00068     MemoInfo *mi;
00069     ChannelInfo *ci;
00070     char *numstr = strtok(NULL, ""), *chan = NULL;
00071     int last, last0, i;
00072     char buf[BUFSIZE], *end;
00073     int delcount, count, left;
00074 
00075     if (numstr && *numstr == '#') {
00076         chan = strtok(numstr, " ");
00077         numstr = strtok(NULL, "");
00078         if (!(ci = cs_findchan(chan))) {
00079             notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan);
00080             return MOD_CONT;
00081         } else if (readonly) {
00082             notice_lang(s_MemoServ, u, READ_ONLY_MODE);
00083             return MOD_CONT;
00084         } else if (ci->flags & CI_VERBOTEN) {
00085             notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan);
00086             return MOD_CONT;
00087         } else if (!check_access(u, ci, CA_MEMO)) {
00088             notice_lang(s_MemoServ, u, ACCESS_DENIED);
00089             return MOD_CONT;
00090         }
00091         mi = &ci->memos;
00092     } else {
00093         if (!nick_identified(u)) {
00094             notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
00095             return MOD_CONT;
00096         }
00097         mi = &u->na->nc->memos;
00098     }
00099     if (!numstr
00100         || (!isdigit(*numstr) && stricmp(numstr, "ALL") != 0
00101             && stricmp(numstr, "LAST") != 0)) {
00102         syntax_error(s_MemoServ, u, "DEL", MEMO_DEL_SYNTAX);
00103     } else if (mi->memocount == 0) {
00104         if (chan)
00105             notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_MEMOS, chan);
00106         else
00107             notice_lang(s_MemoServ, u, MEMO_HAVE_NO_MEMOS);
00108     } else {
00109         if (isdigit(*numstr)) {
00110             /* Delete a specific memo or memos. */
00111             last = -1;          /* Last memo deleted */
00112             last0 = -1;         /* Beginning of range of last memos deleted */
00113             end = buf;
00114             left = sizeof(buf);
00115             delcount =
00116                 process_numlist(numstr, &count, del_memo_callback, u, mi,
00117                                 &last, &last0, &end, &left);
00118             if (last != -1) {
00119                 /* Some memos got deleted; tell them which ones. */
00120                 if (delcount > 1) {
00121                     if (last0 != last)
00122                         end += snprintf(end, sizeof(buf) - (end - buf),
00123                                         ",%d-%d", last0, last);
00124                     else
00125                         end += snprintf(end, sizeof(buf) - (end - buf),
00126                                         ",%d", last);
00127                     /* "buf+1" here because *buf == ',' */
00128                     notice_lang(s_MemoServ, u, MEMO_DELETED_SEVERAL,
00129                                 buf + 1);
00130                 } else {
00131                     notice_lang(s_MemoServ, u, MEMO_DELETED_ONE, last);
00132                 }
00133             } else {
00134                 /* No memos were deleted.  Tell them so. */
00135                 if (count == 1)
00136                     notice_lang(s_MemoServ, u, MEMO_DOES_NOT_EXIST,
00137                                 atoi(numstr));
00138                 else
00139                     notice_lang(s_MemoServ, u, MEMO_DELETED_NONE);
00140             }
00141         } else if (stricmp(numstr, "LAST") == 0) {
00142             /* Delete last memo. */
00143             for (i = 0; i < mi->memocount; i++)
00144                 last = mi->memos[i].number;
00145             delmemo(mi, last);
00146             notice_lang(s_MemoServ, u, MEMO_DELETED_ONE, last);
00147         } else {
00148             /* Delete all memos. */
00149             for (i = 0; i < mi->memocount; i++) {
00150                 free(mi->memos[i].text);
00151                 moduleCleanStruct(&mi->memos[i].moduleData);
00152             }
00153             free(mi->memos);
00154             mi->memos = NULL;
00155             mi->memocount = 0;
00156             if (chan)
00157                 notice_lang(s_MemoServ, u, MEMO_CHAN_DELETED_ALL, chan);
00158             else
00159                 notice_lang(s_MemoServ, u, MEMO_DELETED_ALL);
00160         }
00161 
00162         /* Reset the order */
00163         for (i = 0; i < mi->memocount; i++)
00164             mi->memos[i].number = i + 1;
00165     }
00166     return MOD_CONT;
00167 }
00168 
00176 int del_memo_callback(User * u, int num, va_list args)
00177 {
00178     MemoInfo *mi = va_arg(args, MemoInfo *);
00179     int *last = va_arg(args, int *);
00180     int *last0 = va_arg(args, int *);
00181     char **end = va_arg(args, char **);
00182     int *left = va_arg(args, int *);
00183 
00184     if (delmemo(mi, num)) {
00185         if (num != (*last) + 1) {
00186             if (*last != -1) {
00187                 int len;
00188                 if (*last0 != *last)
00189                     len = snprintf(*end, *left, ",%d-%d", *last0, *last);
00190                 else
00191                     len = snprintf(*end, *left, ",%d", *last);
00192                 *end += len;
00193                 *left -= len;
00194             }
00195             *last0 = num;
00196         }
00197         *last = num;
00198         return 1;
00199     } else {
00200         return 0;
00201     }
00202 }

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