00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "module.h"
00017
00018 int do_set(User * u);
00019 int do_set_notify(User * u, MemoInfo * mi, char *param);
00020 int do_set_limit(User * u, MemoInfo * mi, char *param);
00021 void myMemoServHelp(User * u);
00022
00029 int AnopeInit(int argc, char **argv)
00030 {
00031 Command *c;
00032
00033 moduleAddAuthor("Anope");
00034 moduleAddVersion("$Id: ms_set.c 1345 2008-01-13 12:54:14Z geniusdex $");
00035 moduleSetType(CORE);
00036
00037 c = createCommand("SET", do_set, NULL, MEMO_HELP_SET, -1, -1, -1, -1);
00038 moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
00039
00040 c = createCommand("SET NOTIFY", NULL, NULL, MEMO_HELP_SET_NOTIFY, -1,
00041 -1, -1, -1);
00042 moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
00043
00044 c = createCommand("SET LIMIT", NULL, NULL, -1, MEMO_HELP_SET_LIMIT,
00045 MEMO_SERVADMIN_HELP_SET_LIMIT,
00046 MEMO_SERVADMIN_HELP_SET_LIMIT,
00047 MEMO_SERVADMIN_HELP_SET_LIMIT);
00048 c->help_param1 = (char *) (long) MSMaxMemos;
00049 moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
00050
00051 moduleSetMemoHelp(myMemoServHelp);
00052
00053 return MOD_CONT;
00054 }
00055
00059 void AnopeFini(void)
00060 {
00061
00062 }
00063
00064
00065
00070 void myMemoServHelp(User * u)
00071 {
00072 notice_lang(s_MemoServ, u, MEMO_HELP_CMD_SET);
00073 }
00074
00080 int do_set(User * u)
00081 {
00082 char *cmd = strtok(NULL, " ");
00083 char *param = strtok(NULL, "");
00084 MemoInfo *mi = &u->na->nc->memos;
00085
00086 if (readonly) {
00087 notice_lang(s_MemoServ, u, MEMO_SET_DISABLED);
00088 return MOD_CONT;
00089 }
00090 if (!param) {
00091 syntax_error(s_MemoServ, u, "SET", MEMO_SET_SYNTAX);
00092 } else if (!nick_identified(u)) {
00093 notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
00094 return MOD_CONT;
00095 } else if (stricmp(cmd, "NOTIFY") == 0) {
00096 do_set_notify(u, mi, param);
00097 } else if (stricmp(cmd, "LIMIT") == 0) {
00098 do_set_limit(u, mi, param);
00099 } else {
00100 notice_lang(s_MemoServ, u, MEMO_SET_UNKNOWN_OPTION, cmd);
00101 notice_lang(s_MemoServ, u, MORE_INFO, s_MemoServ, "SET");
00102 }
00103 return MOD_CONT;
00104 }
00105
00111 int do_set_notify(User * u, MemoInfo * mi, char *param)
00112 {
00113 if (stricmp(param, "ON") == 0) {
00114 u->na->nc->flags |= NI_MEMO_SIGNON | NI_MEMO_RECEIVE;
00115 notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_ON, s_MemoServ);
00116 } else if (stricmp(param, "LOGON") == 0) {
00117 u->na->nc->flags |= NI_MEMO_SIGNON;
00118 u->na->nc->flags &= ~NI_MEMO_RECEIVE;
00119 notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_LOGON, s_MemoServ);
00120 } else if (stricmp(param, "NEW") == 0) {
00121 u->na->nc->flags &= ~NI_MEMO_SIGNON;
00122 u->na->nc->flags |= NI_MEMO_RECEIVE;
00123 notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_NEW, s_MemoServ);
00124 } else if (stricmp(param, "MAIL") == 0) {
00125 if (u->na->nc->email) {
00126 u->na->nc->flags |= NI_MEMO_MAIL;
00127 notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_MAIL);
00128 } else {
00129 notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_INVALIDMAIL);
00130 }
00131 } else if (stricmp(param, "NOMAIL") == 0) {
00132 u->na->nc->flags &= ~NI_MEMO_MAIL;
00133 notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_NOMAIL);
00134 } else if (stricmp(param, "OFF") == 0) {
00135 u->na->nc->flags &= ~(NI_MEMO_SIGNON | NI_MEMO_RECEIVE);
00136 notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_OFF, s_MemoServ);
00137 } else {
00138 syntax_error(s_MemoServ, u, "SET NOTIFY", MEMO_SET_NOTIFY_SYNTAX);
00139 }
00140 return MOD_CONT;
00141 }
00142
00148 int do_set_limit(User * u, MemoInfo * mi, char *param)
00149 {
00150 char *p1 = strtok(param, " ");
00151 char *p2 = strtok(NULL, " ");
00152 char *p3 = strtok(NULL, " ");
00153 char *user = NULL, *chan = NULL;
00154 int32 limit;
00155 NickAlias *na = u->na;
00156 ChannelInfo *ci = NULL;
00157 int is_servadmin = is_services_admin(u);
00158
00159 if (p1 && *p1 == '#') {
00160 chan = p1;
00161 p1 = p2;
00162 p2 = p3;
00163 p3 = strtok(NULL, " ");
00164 if (!(ci = cs_findchan(chan))) {
00165 notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan);
00166 return MOD_CONT;
00167 } else if (ci->flags & CI_VERBOTEN) {
00168 notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan);
00169 return MOD_CONT;
00170 } else if (!is_servadmin && !check_access(u, ci, CA_MEMO)) {
00171 notice_lang(s_MemoServ, u, ACCESS_DENIED);
00172 return MOD_CONT;
00173 }
00174 mi = &ci->memos;
00175 }
00176 if (is_servadmin) {
00177 if (p2 && stricmp(p2, "HARD") != 0 && !chan) {
00178 if (!(na = findnick(p1))) {
00179 notice_lang(s_MemoServ, u, NICK_X_NOT_REGISTERED, p1);
00180 return MOD_CONT;
00181 }
00182 user = p1;
00183 mi = &na->nc->memos;
00184 p1 = p2;
00185 p2 = p3;
00186 } else if (!p1) {
00187 syntax_error(s_MemoServ, u, "SET LIMIT",
00188 MEMO_SET_LIMIT_SERVADMIN_SYNTAX);
00189 return MOD_CONT;
00190 }
00191 if ((!isdigit(*p1) && stricmp(p1, "NONE") != 0) ||
00192 (p2 && stricmp(p2, "HARD") != 0)) {
00193 syntax_error(s_MemoServ, u, "SET LIMIT",
00194 MEMO_SET_LIMIT_SERVADMIN_SYNTAX);
00195 return MOD_CONT;
00196 }
00197 if (chan) {
00198 if (p2)
00199 ci->flags |= CI_MEMO_HARDMAX;
00200 else
00201 ci->flags &= ~CI_MEMO_HARDMAX;
00202 } else {
00203 if (p2)
00204 na->nc->flags |= NI_MEMO_HARDMAX;
00205 else
00206 na->nc->flags &= ~NI_MEMO_HARDMAX;
00207 }
00208 limit = atoi(p1);
00209 if (limit < 0 || limit > 32767) {
00210 notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_OVERFLOW, 32767);
00211 limit = 32767;
00212 }
00213 if (stricmp(p1, "NONE") == 0)
00214 limit = -1;
00215 } else {
00216 if (!p1 || p2 || !isdigit(*p1)) {
00217 syntax_error(s_MemoServ, u, "SET LIMIT",
00218 MEMO_SET_LIMIT_SYNTAX);
00219 return MOD_CONT;
00220 }
00221 if (chan && (ci->flags & CI_MEMO_HARDMAX)) {
00222 notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_FORBIDDEN, chan);
00223 return MOD_CONT;
00224 } else if (!chan && (na->nc->flags & NI_MEMO_HARDMAX)) {
00225 notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT_FORBIDDEN);
00226 return MOD_CONT;
00227 }
00228 limit = atoi(p1);
00229
00230
00231 if (limit < 0 || (MSMaxMemos > 0 && limit > MSMaxMemos)) {
00232 if (chan) {
00233 notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_TOO_HIGH,
00234 chan, MSMaxMemos);
00235 } else {
00236 notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT_TOO_HIGH,
00237 MSMaxMemos);
00238 }
00239 return MOD_CONT;
00240 } else if (limit > 32767) {
00241 notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_OVERFLOW, 32767);
00242 limit = 32767;
00243 }
00244 }
00245 mi->memomax = limit;
00246 if (limit > 0) {
00247 if (!chan && na->nc == u->na->nc)
00248 notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT, limit);
00249 else
00250 notice_lang(s_MemoServ, u, MEMO_SET_LIMIT,
00251 chan ? chan : user, limit);
00252 } else if (limit == 0) {
00253 if (!chan && na->nc == u->na->nc)
00254 notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT_ZERO);
00255 else
00256 notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_ZERO,
00257 chan ? chan : user);
00258 } else {
00259 if (!chan && na->nc == u->na->nc)
00260 notice_lang(s_MemoServ, u, MEMO_UNSET_YOUR_LIMIT);
00261 else
00262 notice_lang(s_MemoServ, u, MEMO_UNSET_LIMIT,
00263 chan ? chan : user);
00264 }
00265 return MOD_CONT;
00266 }