00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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 {
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
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
00198 if (m->flags & MF_RECEIPT) {
00199 rsend_notify(u, m, chan);
00200 }
00201
00202 return 1;
00203 }