ms_read.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_read.c 1345 2008-01-13 12:54:14Z geniusdex $
00012  *
00013  */
00014 /*************************************************************************/
00015 
00016 #include "module.h"
00017 
00018 int do_read(User * u);
00019 int read_memo_callback(User * u, int num, va_list args);
00020 int read_memo(User * u, int index, MemoInfo * mi, const char *chan);
00021 void myMemoServHelp(User * u);
00022 extern void rsend_notify(User * u, Memo * m, const char *chan);
00023 
00024 
00031 int AnopeInit(int argc, char **argv)
00032 {
00033     Command *c;
00034 
00035     moduleAddAuthor("Anope");
00036     moduleAddVersion("$Id: ms_read.c 1345 2008-01-13 12:54:14Z geniusdex $");
00037     moduleSetType(CORE);
00038     c = createCommand("READ", do_read, NULL, MEMO_HELP_READ, -1, -1, -1,
00039                       -1);
00040     moduleAddCommand(MEMOSERV, c, MOD_UNIQUE);
00041     moduleSetMemoHelp(myMemoServHelp);
00042 
00043     return MOD_CONT;
00044 }
00045 
00049 void AnopeFini(void)
00050 {
00051 
00052 }
00053 
00054 
00055 
00060 void myMemoServHelp(User * u)
00061 {
00062     notice_lang(s_MemoServ, u, MEMO_HELP_CMD_READ);
00063 }
00064 
00070 int do_read(User * u)
00071 {
00072     MemoInfo *mi;
00073     ChannelInfo *ci;
00074     char *numstr = strtok(NULL, " "), *chan = NULL;
00075     int num, count;
00076 
00077     if (numstr && *numstr == '#') {
00078         chan = numstr;
00079         numstr = strtok(NULL, " ");
00080         if (!(ci = cs_findchan(chan))) {
00081             notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan);
00082             return MOD_CONT;
00083         } else if (ci->flags & CI_VERBOTEN) {
00084             notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan);
00085             return MOD_CONT;
00086         } else if (!check_access(u, ci, CA_MEMO)) {
00087             notice_lang(s_MemoServ, u, ACCESS_DENIED);
00088             return MOD_CONT;
00089         }
00090         mi = &ci->memos;
00091     } else {
00092         if (!nick_identified(u)) {
00093             notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
00094             return MOD_CONT;
00095         }
00096         mi = &u->na->nc->memos;
00097     }
00098     num = numstr ? atoi(numstr) : -1;
00099     if (!numstr
00100         || (stricmp(numstr, "LAST") != 0 && stricmp(numstr, "NEW") != 0
00101             && num <= 0)) {
00102         syntax_error(s_MemoServ, u, "READ", MEMO_READ_SYNTAX);
00103 
00104     } else if (mi->memocount == 0) {
00105         if (chan)
00106             notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_MEMOS, chan);
00107         else
00108             notice_lang(s_MemoServ, u, MEMO_HAVE_NO_MEMOS);
00109 
00110     } else {
00111         int i;
00112 
00113         if (stricmp(numstr, "NEW") == 0) {
00114             int readcount = 0;
00115             for (i = 0; i < mi->memocount; i++) {
00116                 if (mi->memos[i].flags & MF_UNREAD) {
00117                     read_memo(u, i, mi, chan);
00118                     readcount++;
00119                 }
00120             }
00121             if (!readcount) {
00122                 if (chan)
00123                     notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_NEW_MEMOS,
00124                                 chan);
00125                 else
00126                     notice_lang(s_MemoServ, u, MEMO_HAVE_NO_NEW_MEMOS);
00127             }
00128         } else if (stricmp(numstr, "LAST") == 0) {
00129             for (i = 0; i < mi->memocount - 1; i++);
00130             read_memo(u, i, mi, chan);
00131         } else {                /* number[s] */
00132             if (!process_numlist(numstr, &count, read_memo_callback, u,
00133                                  mi, chan)) {
00134                 if (count == 1)
00135                     notice_lang(s_MemoServ, u, MEMO_DOES_NOT_EXIST, num);
00136                 else
00137                     notice_lang(s_MemoServ, u, MEMO_LIST_NOT_FOUND,
00138                                 numstr);
00139             }
00140         }
00141 
00142     }
00143     return MOD_CONT;
00144 }
00145 
00153 int read_memo_callback(User * u, int num, va_list args)
00154 {
00155     MemoInfo *mi = va_arg(args, MemoInfo *);
00156     const char *chan = va_arg(args, const char *);
00157     int i;
00158 
00159     for (i = 0; i < mi->memocount; i++) {
00160         if (mi->memos[i].number == num)
00161             break;
00162     }
00163     /* Range check done in read_memo */
00164     return read_memo(u, i, mi, chan);
00165 }
00166 
00175 int read_memo(User * u, int index, MemoInfo * mi, const char *chan)
00176 {
00177     Memo *m;
00178     char timebuf[64];
00179     struct tm tm;
00180 
00181     if (index < 0 || index >= mi->memocount)
00182         return 0;
00183     m = &mi->memos[index];
00184     tm = *localtime(&m->time);
00185     strftime_lang(timebuf, sizeof(timebuf),
00186                   u, STRFTIME_DATE_TIME_FORMAT, &tm);
00187     timebuf[sizeof(timebuf) - 1] = 0;
00188     if (chan)
00189         notice_lang(s_MemoServ, u, MEMO_CHAN_HEADER, m->number,
00190                     m->sender, timebuf, s_MemoServ, chan, m->number);
00191     else
00192         notice_lang(s_MemoServ, u, MEMO_HEADER, m->number,
00193                     m->sender, timebuf, s_MemoServ, m->number);
00194     notice_lang(s_MemoServ, u, MEMO_TEXT, m->text);
00195     m->flags &= ~MF_UNREAD;
00196 
00197     /* Check if a receipt notification was requested */
00198     if (m->flags & MF_RECEIPT) {
00199         rsend_notify(u, m, chan);
00200     }
00201 
00202     return 1;
00203 }

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