ms_set.c

Go to the documentation of this file.
00001 /* MemoServ core functions
00002  *
00003  * (C) 2003-2008 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_set.c 1345 2008-01-13 12:54:14Z geniusdex $
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         /* The first character is a digit, but we could still go negative
00230          * from overflow... watch out! */
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 }

Generated on Sun Oct 5 09:06:55 2008 for Anope by  doxygen 1.5.7.1