ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/memoserv/sendops.C
Revision: 1.7
Committed: Sat Sep 22 14:27:27 2007 UTC (19 years ago) by pippijn
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.6: +4 -3 lines
Log Message:
split up ermyth into ermyth-modules, libermyth (currently just ermyth-util) and ermyth-core

File Contents

# User Rev Content
1 pippijn 1.6 /**
2     * sendops.C: This file contains code for the Memoserv SENDOPS function
3     *
4     * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team
5     * Rights to this code are as documented in COPYING.
6     *
7     *
8     * Portions of this file were derived from sources bearing the following license:
9 pippijn 1.4 * Copyright © 2005-2007 Atheme Development Group
10 pippijn 1.2 * Rights to this code are as documented in doc/pod/license.pod.
11 pippijn 1.1 *
12 pippijn 1.7 * $Id: sendops.C,v 1.6 2007-09-16 18:54:43 pippijn Exp $
13 pippijn 1.1 */
14    
15     #include "atheme.h"
16 pippijn 1.7 #include <libermyth.h>
17 pippijn 1.4 #include <ermyth/module.h>
18 pippijn 1.1 #include <account/chanacs.h>
19     #include <account/mychan.h>
20     #include <account/myuser.h>
21     #include <account/mymemo.h>
22    
23 pippijn 1.7 static char const rcsid[] = "$Id: sendops.C,v 1.6 2007-09-16 18:54:43 pippijn Exp $";
24 pippijn 1.1
25 pippijn 1.7 REGISTER_MODULE ("memoserv/sendops", false, "The Ermyth Team <http://ermyth.xinutec.org>");
26 pippijn 1.1
27     static void ms_cmd_sendops (sourceinfo_t *si, int parc, char *parv[]);
28    
29 pippijn 1.4 command_t const ms_sendops = { "SENDOPS", N_("Sends a memo to all ops on a channel."), AC_NONE, 2, ms_cmd_sendops };
30 pippijn 1.1
31 pippijn 1.4 E cmdvec ms_cmdtree;
32     E helpvec ms_helptree;
33 pippijn 1.1
34 pippijn 1.4 bool
35     _modinit (module *m)
36 pippijn 1.1 {
37     ms_cmdtree << ms_sendops;
38     help_addentry (ms_helptree, "SENDOPS", "help/memoserv/sendops", NULL);
39 pippijn 1.4
40     return true;
41 pippijn 1.1 }
42    
43     void
44     _moddeinit ()
45     {
46     ms_cmdtree >> ms_sendops;
47     help_delentry (ms_helptree, "SENDOPS");
48     }
49    
50     static void
51     ms_cmd_sendops (sourceinfo_t *si, int parc, char *parv[])
52     {
53     /* misc structs etc */
54     myuser_t *tmu;
55     node_t *tn;
56     mymemo_t *memo;
57     mychan_t *mc;
58     int sent = 0, tried = 0;
59     bool ignored;
60     myuser_t::mzignore_vector::iterator miit, miit_end;
61    
62     /* Grab args */
63     char *target = parv[0];
64     char *m = parv[1];
65    
66     /* Arg validation */
67     if (!target || !m)
68     {
69 pippijn 1.5 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "SENDOPS");
70 pippijn 1.1
71 pippijn 1.5 command_fail (si, fault::needmoreparams, "Syntax: SENDOPS <channel> <memo>");
72 pippijn 1.1
73     return;
74     }
75    
76     /* user logged in? */
77     if (!si->smu)
78     {
79 pippijn 1.5 command_fail (si, fault::noprivs, _("You are not logged in."));
80 pippijn 1.1 return;
81     }
82    
83     if (si->smu->flags & MU_WAITAUTH)
84     {
85 pippijn 1.5 command_fail (si, fault::notverified, _("You need to verify your email address before you may send memos."));
86 pippijn 1.1 return;
87     }
88    
89     /* rate limit it -- jilles */
90     if (NOW - si->smu->memo_ratelimit_time > MEMO_MAX_TIME)
91     si->smu->memo_ratelimit_num = 0;
92     if (si->smu->memo_ratelimit_num > MEMO_MAX_NUM && !has_priv (si, PRIV_FLOOD))
93     {
94 pippijn 1.5 command_fail (si, fault::toomany, _("You have used this command too many times; please wait a while and try again."));
95 pippijn 1.1 return;
96     }
97     si->smu->memo_ratelimit_num++;
98     si->smu->memo_ratelimit_time = NOW;
99    
100     /* Check for memo text length -- includes/common.h */
101     if (strlen (m) >= MEMOLEN)
102     {
103 pippijn 1.5 command_fail (si, fault::badparams, "Please make sure your memo is less than %d characters", MEMOLEN);
104 pippijn 1.1
105     return;
106     }
107    
108     /* Check to make sure the memo doesn't contain hostile CTCP responses.
109     * realistically, we'll probably want to check the _entire_ message for this... --nenolod
110     */
111     if (*m == '\001')
112     {
113 pippijn 1.5 command_fail (si, fault::badparams, _("Your memo contains invalid characters."));
114 pippijn 1.1 return;
115     }
116    
117 pippijn 1.5 mc = mychan_t::find (target);
118 pippijn 1.1
119     if (mc == NULL)
120     {
121 pippijn 1.5 command_fail (si, fault::nosuch_target, "\2%s\2 is not registered.", target);
122 pippijn 1.1 return;
123     }
124    
125     if (!chanacs_user_has_flag (mc, si->su, CA_ACLVIEW))
126     {
127 pippijn 1.5 command_fail (si, fault::noprivs, _("You are not authorized to perform this operation."));
128 pippijn 1.1 return;
129     }
130    
131     LIST_FOREACH (tn, mc->chanacs.head)
132     {
133     chanacs_t *ca = (chanacs_t *) tn->data;
134     tmu = ca->myuser;
135    
136     if (!(ca->level & (CA_OP | CA_AUTOOP)) || tmu == NULL || tmu == si->smu)
137     continue;
138    
139     tried++;
140    
141     /* Does the user allow memos? --pfish */
142     if (tmu->flags & MU_NOMEMO)
143     continue;
144    
145     /* Check to make sure target inbox not full */
146     if (tmu->memos.size () >= me.mdlimit)
147     continue;
148    
149     /* As in SEND to a single user, make ignore fail silently */
150     sent++;
151    
152     /* Make sure we're not on ignore */
153     ignored = false;
154     for (miit = tmu->memo_ignores.begin (), miit_end = tmu->memo_ignores.end (); miit != miit_end; ++miit)
155     {
156     if (!strcasecmp (*miit, si->smu->name))
157     ignored = true;
158     }
159     if (ignored)
160     continue;
161    
162     /* Malloc and populate struct */
163 pippijn 1.4 memo = new mymemo_t;
164 pippijn 1.1 memo->sent = NOW;
165     memo->status = MEMO_CHANNEL;
166     strlcpy (memo->sender, si->smu->name, NICKLEN);
167     snprintf (memo->text, MEMOLEN, "%s %s", mc->name, m);
168    
169     /* Create a linked list node and add to memos */
170     tmu->memos.insert (memo);
171     tmu->memoct_new++;
172    
173     /* Should we email this? */
174     if (tmu->flags & MU_EMAILMEMOS)
175     {
176     if (sendemail (si->su, EMAIL_MEMO, tmu, memo->text))
177     continue;
178     }
179    
180     /* Is the user online? If so, tell them about the new memo. */
181     if (si->su == NULL || !irccasecmp (si->su->nick, si->smu->name))
182 pippijn 1.4 tmu->notice (memosvs.nick, _("You have a new memo from %s."), si->smu->name);
183 pippijn 1.1 else
184 pippijn 1.4 tmu->notice (memosvs.nick, _("You have a new memo from %s (nick: %s)."), si->smu->name, si->su->nick);
185 pippijn 1.1 }
186    
187     /* Tell user memo sent, return */
188     logcommand (si, CMDLOG_SET, "SENDOPS to %s (%d/%d sent)", mc->name, sent, tried);
189     command_success_nodata (si, _("The memo has been successfully sent to %d ops on \2%s\2."), sent, mc->name);
190     return;
191     }