ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/memoserv/ignore.C
Revision: 1.2
Committed: Sat Jul 21 01:29:09 2007 UTC (19 years, 2 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.1: +2 -2 lines
Log Message:
- moved to new documentation system
- fixed small build error

File Contents

# User Rev Content
1 pippijn 1.1 /*
2     * Copyright © 2005 Atheme Development Group
3 pippijn 1.2 * Rights to this code are as documented in doc/pod/license.pod.
4 pippijn 1.1 *
5     * This file contains code for the Memoserv IGNORE functions
6     *
7 pippijn 1.2 * $Id: ignore.C,v 1.1 2007-07-19 08:24:54 pippijn Exp $
8 pippijn 1.1 */
9    
10     #include "atheme.h"
11     #include <account/myuser.h>
12    
13     static char const rcsid[] = "$Id";
14    
15     struct ms_ignore_listeners : callback::has_listeners
16     {
17     };
18    
19     ms_ignore_listeners listeners;
20    
21     DECLARE_MODULE_V1 ("memoserv/ignore", false, _modinit, _moddeinit, rcsid, "The Ermyth Team <http://ermyth.schmorp.de>");
22    
23     static void ms_cmd_ignore (sourceinfo_t *si, int parc, char *parv[]);
24     static void ms_cmd_ignore_add (sourceinfo_t *si, int parc, char *parv[]);
25     static void ms_cmd_ignore_del (sourceinfo_t *si, int parc, char *parv[]);
26     static void ms_cmd_ignore_clear (sourceinfo_t *si, int parc, char *parv[]);
27     static void ms_cmd_ignore_list (sourceinfo_t *si, int parc, char *parv[]);
28    
29     command_t ms_ignore = { "IGNORE", N_(N_("Ignores memos.")), AC_NONE, 2, ms_cmd_ignore };
30     command_t ms_ignore_add = { "ADD", N_(N_("Ignores memos from a user.")), AC_NONE, 1, ms_cmd_ignore_add };
31     command_t ms_ignore_del = { "DEL", N_(N_("Stops ignoring memos from a user.")), AC_NONE, 1, ms_cmd_ignore_del };
32     command_t ms_ignore_clear = { "CLEAR", N_(N_("Clears your memo ignore list.")), AC_NONE, 1, ms_cmd_ignore_clear };
33     command_t ms_ignore_list = { "LIST", N_(N_("Shows all users you are ignoring memos from.")), AC_NONE, 1, ms_cmd_ignore_list };
34    
35     cmdvec *ms_cmdtree;
36     helpvec *ms_helptree;
37     cmdvec ms_ignore_cmds;
38    
39     void
40     _modinit (module_t *m)
41     {
42     MODULE_USE_SYMBOL_T (ms_cmdtree, cmdvec, "memoserv/main", "ms_cmdtree");
43     MODULE_USE_SYMBOL_T (ms_helptree, helpvec, "memoserv/main", "ms_helptree");
44    
45     ms_cmdtree << ms_ignore;
46     help_addentry (ms_helptree, "IGNORE", "help/memoserv/ignore", NULL);
47    
48     /* Add sub-commands */
49     &ms_ignore_cmds << ms_ignore_add;
50     &ms_ignore_cmds << ms_ignore_del;
51     &ms_ignore_cmds << ms_ignore_clear;
52     &ms_ignore_cmds << ms_ignore_list;
53     }
54    
55     void
56     _moddeinit ()
57     {
58     ms_cmdtree >> ms_ignore;
59     help_delentry (ms_helptree, "IGNORE");
60    
61     /* Delete sub-commands */
62     &ms_ignore_cmds >> ms_ignore_add;
63     &ms_ignore_cmds >> ms_ignore_del;
64     &ms_ignore_cmds >> ms_ignore_clear;
65     &ms_ignore_cmds >> ms_ignore_list;
66     }
67    
68     static void
69     ms_cmd_ignore (sourceinfo_t *si, int parc, char *parv[])
70     {
71     /* Grab args */
72     char *cmd = parv[0];
73     command_t const *c;
74    
75     /* Bad/missing arg */
76     if (!cmd)
77     {
78     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "IGNORE");
79    
80     command_fail (si, fault_needmoreparams, _("Syntax: IGNORE ADD|DEL|LIST|CLEAR [account]"));
81     return;
82     }
83    
84     /* User logged in? */
85     if (si->smu == NULL)
86     {
87     command_fail (si, fault_noprivs, _("You are not logged in."));
88     return;
89     }
90    
91     c = ms_ignore_cmds.find (cmd);
92     if (c == NULL)
93     {
94     command_fail (si, fault_badparams, _("Invalid command. Use \2/%s%s help\2 for a command listing."), (ircd->uses_rcommand == false) ? "msg " : "", memosvs.me->disp);
95     return;
96     }
97    
98     c->exec (si->service, si, parc - 1, parv + 1);
99     }
100    
101     static void
102     ms_cmd_ignore_add (sourceinfo_t *si, int parc, char *parv[])
103     {
104     myuser_t *tmu;
105     myuser_t::mzignore_vector::iterator miit, miit_end;
106     char *temp;
107    
108     /* Arg check */
109     if (parc < 1)
110     {
111     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "IGNORE");
112    
113     command_fail (si, fault_needmoreparams, _("Syntax: IGNORE ADD|DEL|LIST|CLEAR <account>"));
114     return;
115     }
116    
117     /* User attempting to ignore themself? */
118     if (!irccasecmp (parv[0], si->smu->name))
119     {
120     command_fail (si, fault_badparams, _("Silly wabbit, you can't ignore yourself."));
121     return;
122     }
123    
124     /* Does the target account exist? */
125     if (!(tmu = myuser_find_ext (parv[0])))
126     {
127     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), parv[0]);
128     return;
129     }
130    
131     /* Ignore list is full */
132     if (si->smu->memo_ignores.size () >= MAXMSIGNORES)
133     {
134     command_fail (si, fault_toomany, _("Your ignore list is full, please DEL an account."));
135     return;
136     }
137    
138     /* Iterate through list, make sure target not in it, if last node append */
139     for (miit = si->smu->memo_ignores.begin (), miit_end = si->smu->memo_ignores.end (); miit != miit_end; ++miit)
140     {
141     temp = *miit;
142    
143     /* Already in the list */
144     if (!irccasecmp (temp, parv[0]))
145     {
146     command_fail (si, fault_nochange, _("Account \2%s\2 is already in your ignore list."), temp);
147     return;
148     }
149     }
150    
151     /* Add to ignore list */
152     si->smu->memo_ignores.insert (sstrdup (tmu->name));
153     logcommand (si, CMDLOG_SET, "IGNORE ADD %s", tmu->name);
154     command_success_nodata (si, _("Account \2%s\2 added to your ignore list."), tmu->name);
155     return;
156     }
157    
158     static void
159     ms_cmd_ignore_del (sourceinfo_t *si, int parc, char *parv[])
160     {
161     int i = 0;
162     size_t ignorenum = 0;
163     myuser_t::mzignore_vector::iterator miit, miit_end;
164     char *temp;
165    
166     /* Arg check */
167     if (parc < 1)
168     {
169     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "IGNORE");
170     command_fail (si, fault_needmoreparams, _("Syntax: IGNORE ADD|DEL|LIST|CLEAR <account>"));
171     return;
172     }
173    
174     ignorenum = atoi (parv[0]);
175     if (ignorenum > si->smu->memo_ignores.size ())
176     {
177     command_fail (si, fault_badparams, _("Invalid ignore index"));
178     return;
179     }
180    
181     if (ignorenum > 0)
182     {
183     temp = si->smu->memo_ignores[ignorenum - 1];
184     logcommand (si, CMDLOG_SET, "IGNORE DEL %s", temp);
185     command_success_nodata (si, _("Account \2%s\2 removed from ignore list."), temp);
186     si->smu->memo_ignores.erase (ignorenum - 1);
187     free (temp);
188    
189     return;
190     }
191    
192     /* Iterate through list, make sure they're not in it, if last node append */
193     for (miit = si->smu->memo_ignores.begin (), miit_end = si->smu->memo_ignores.end (); miit != miit_end; ++miit)
194     {
195     temp = *miit;
196    
197     /* Not using list or clear, but we've found our target in the ignore list */
198     if (!irccasecmp (temp, parv[0]))
199     {
200     logcommand (si, CMDLOG_SET, "IGNORE DEL %s", temp);
201     command_success_nodata (si, _("Account \2%s\2 removed from ignore list."), temp);
202     si->smu->memo_ignores.erase (i);
203     free (temp);
204    
205     return;
206     }
207    
208     ++i;
209     }
210    
211     command_fail (si, fault_nosuch_target, _("\2%s\2 is not in your ignore list."), parv[0]);
212     return;
213     }
214    
215     static void
216     ms_cmd_ignore_clear (sourceinfo_t *si, int parc, char *parv[])
217     {
218     if (si->smu->memo_ignores.empty ())
219     {
220     command_fail (si, fault_nochange, _("Ignore list already empty."));
221     return;
222     }
223    
224     while (!si->smu->memo_ignores.empty ())
225     {
226     free (si->smu->memo_ignores.back ());
227     si->smu->memo_ignores.pop_back ();
228     }
229    
230     /* Let them know list is clear */
231     command_success_nodata (si, _("Ignore list cleared."));
232     logcommand (si, CMDLOG_SET, "IGNORE CLEAR");
233     return;
234     }
235    
236     static void
237     ms_cmd_ignore_list (sourceinfo_t *si, int parc, char *parv[])
238     {
239     unsigned int i = 1;
240     myuser_t::mzignore_vector::iterator miit, miit_end;
241    
242     /* Throw in list header */
243     command_success_nodata (si, _("Ignore list:"));
244     command_success_nodata (si, "-------------------------");
245    
246     /* Iterate through list, make sure they're not in it, if last node append */
247     for (miit = si->smu->memo_ignores.begin (), miit_end = si->smu->memo_ignores.end (); miit != miit_end; ++miit)
248     {
249     command_success_nodata (si, "%d - %s", i, *miit);
250     i++;
251     }
252    
253     /* Ignore list footer */
254     if (i == 1)
255     command_success_nodata (si, _("list empty"));
256    
257     command_success_nodata (si, "-------------------------");
258     return;
259     }