00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
00111 last = -1;
00112 last0 = -1;
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
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
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
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
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
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
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 }