ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/nickserv/set.C
Revision: 1.9
Committed: Sun Sep 16 18:54:43 2007 UTC (19 years, 1 month ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.8: +10 -5 lines
Log Message:
#defines to enum

File Contents

# User Rev Content
1 pippijn 1.9 /**
2     * set.C: This file contains routines to handle the NickServ SET command.
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.6 * Copyright © 2006 William Pitcock, et al.
10 pippijn 1.2 * Rights to this code are documented in doc/pod/license.pod.
11 pippijn 1.1 *
12 pippijn 1.9 * $Id: set.C,v 1.8 2007-09-05 11:23:13 pippijn Exp $
13 pippijn 1.1 */
14    
15     #include "atheme.h"
16 pippijn 1.6 #include <ermyth/module.h>
17 pippijn 1.1 #include <account/myuser.h>
18    
19 pippijn 1.9 static char const rcsid[] = "$Id: set.C,v 1.8 2007-09-05 11:23:13 pippijn Exp $";
20 pippijn 1.1
21 pippijn 1.6 REGISTER_MODULE ("nickserv/set", false, "The Ermyth Team <http://ermyth.schmorp.de>");
22 pippijn 1.1
23     static void ns_cmd_set (sourceinfo_t *si, int parc, char *parv[]);
24    
25 pippijn 1.6 E cmdvec ns_cmdtree;
26     E helpvec ns_helptree;
27 pippijn 1.1
28 pippijn 1.6 command_t const ns_set = { "SET", N_("Sets various control flags."), AC_NONE, 2, ns_cmd_set };
29 pippijn 1.1
30     cmdvec ns_set_cmdtree;
31    
32     /* HELP SET */
33     static void
34     ns_help_set (sourceinfo_t *si)
35     {
36     command_success_nodata (si, _("Help for \2SET\2:"));
37     command_success_nodata (si, " ");
38     command_success_nodata (si, _("SET allows you to set various control flags"));
39     if (nicksvs.no_nick_ownership)
40     command_success_nodata (si, _("for accounts that change the way certain operations"));
41     else
42     command_success_nodata (si, _("for nicknames that change the way certain operations"));
43     command_success_nodata (si, _("are performed on them."));
44     command_success_nodata (si, " ");
45 pippijn 1.6 command_help (si, ns_set_cmdtree);
46 pippijn 1.1 command_success_nodata (si, " ");
47     command_success_nodata (si, _("For more information, use \2/msg %s HELP SET \37command\37\2."), nicksvs.nick);
48     }
49    
50     /* SET <setting> <parameters> */
51     static void
52     ns_cmd_set (sourceinfo_t *si, int parc, char *parv[])
53     {
54     char *setting = parv[0];
55     command_t const *c;
56    
57     if (si->smu == NULL)
58     {
59 pippijn 1.7 command_fail (si, fault::noprivs, _("You are not logged in."));
60 pippijn 1.1 return;
61     }
62    
63     if (setting == NULL)
64     {
65 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "SET");
66     command_fail (si, fault::needmoreparams, _("Syntax: SET <setting> <parameters>"));
67 pippijn 1.1 return;
68     }
69    
70     /* take the command through the hash table */
71     if ((c = ns_set_cmdtree.find (setting)))
72     c->exec (si->service, si, parc - 1, parv + 1);
73     else
74 pippijn 1.7 command_fail (si, fault::badparams, _("Invalid set command. Use \2/%s%s HELP SET\2 for a command listing."), (ircd->uses_rcommand == false) ? "msg " : "", nicksvs.nick);
75 pippijn 1.1 }
76    
77     /* SET EMAIL <new address> */
78     static void
79 pippijn 1.3 ns_cmd_setemail (sourceinfo_t *si, int parc, char *parv[])
80 pippijn 1.1 {
81     char *email = parv[0];
82    
83     if (si->smu == NULL)
84     return;
85    
86     if (email == NULL)
87     {
88 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "EMAIL");
89     command_fail (si, fault::needmoreparams, _("Syntax: SET EMAIL <new e-mail>"));
90 pippijn 1.1 return;
91     }
92    
93     if (strlen (email) >= EMAILLEN)
94     {
95 pippijn 1.7 command_fail (si, fault::badparams, STR_INVALID_PARAMS, "EMAIL");
96 pippijn 1.1 return;
97     }
98    
99     if (si->smu->flags & MU_WAITAUTH)
100     {
101 pippijn 1.7 command_fail (si, fault::noprivs, _("Please verify your original registration before changing your e-mail address."));
102 pippijn 1.1 return;
103     }
104    
105     if (!validemail (email))
106     {
107 pippijn 1.7 command_fail (si, fault::badparams, _("\2%s\2 is not a valid email address."), email);
108 pippijn 1.1 return;
109     }
110    
111     if (!strcasecmp (si->smu->email, email))
112     {
113 pippijn 1.7 command_fail (si, fault::nochange, _("The email address for \2%s\2 is already set to \2%s\2."), si->smu->name, si->smu->email);
114 pippijn 1.1 return;
115     }
116    
117     snoop ("SET:EMAIL: \2%s\2 (\2%s\2 -> \2%s\2)", si->smu->name, si->smu->email, email);
118    
119     if (me.auth == AUTH_EMAIL)
120     {
121     unsigned long key = makekey ();
122    
123     si->smu->add_metadata ("private:verify:emailchg:key", itoa (key));
124     si->smu->add_metadata ("private:verify:emailchg:newemail", email);
125 pippijn 1.6 si->smu->add_metadata ("private:verify:emailchg:timestamp", itoa (NOW));
126 pippijn 1.1
127     if (!sendemail (si->su != NULL ? si->su : si->service->me, EMAIL_SETEMAIL, si->smu, itoa (key)))
128     {
129 pippijn 1.7 command_fail (si, fault::emailfail, _("Sending email failed, sorry! Your email address is unchanged."));
130 pippijn 1.1 si->smu->del_metadata ("private:verify:emailchg:key");
131     si->smu->del_metadata ("private:verify:emailchg:newemail");
132     si->smu->del_metadata ("private:verify:emailchg:timestamp");
133     return;
134     }
135    
136     logcommand (si, CMDLOG_SET, "SET EMAIL %s (awaiting verification)", email);
137     command_success_nodata (si, _("An email containing email changing instructions has been sent to \2%s\2."), email);
138     command_success_nodata (si, _("Your email address will not be changed until you follow these instructions."));
139    
140     return;
141     }
142    
143     strlcpy (si->smu->email, email, EMAILLEN);
144    
145     logcommand (si, CMDLOG_SET, "SET EMAIL %s", email);
146     command_success_nodata (si, _("The email address for \2%s\2 has been changed to \2%s\2."), si->smu->name, si->smu->email);
147     }
148    
149 pippijn 1.6 command_t const ns_set_email = { "EMAIL", N_("Changes your e-mail address."), AC_NONE, 1, ns_cmd_setemail };
150 pippijn 1.1
151     /* SET HIDEMAIL [ON|OFF] */
152     static void
153 pippijn 1.3 ns_cmd_sethidemail (sourceinfo_t *si, int parc, char *parv[])
154 pippijn 1.1 {
155     char *params = strtok (parv[0], " ");
156    
157     if (si->smu == NULL)
158     return;
159    
160     if (params == NULL)
161     {
162 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "HIDEMAIL");
163 pippijn 1.1 return;
164     }
165    
166     if (!strcasecmp ("ON", params))
167     {
168     if (MU_HIDEMAIL & si->smu->flags)
169     {
170 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is already set for \2%s\2."), "HIDEMAIL", si->smu->name);
171 pippijn 1.1 return;
172     }
173    
174     logcommand (si, CMDLOG_SET, "SET HIDEMAIL ON");
175    
176     si->smu->flags |= MU_HIDEMAIL;
177    
178     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "HIDEMAIL", si->smu->name);
179    
180     return;
181     }
182     else if (!strcasecmp ("OFF", params))
183     {
184     if (!(MU_HIDEMAIL & si->smu->flags))
185     {
186 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is not set for \2%s\2."), "HIDEMAIL", si->smu->name);
187 pippijn 1.1 return;
188     }
189    
190     logcommand (si, CMDLOG_SET, "SET HIDEMAIL OFF");
191    
192     si->smu->flags &= ~MU_HIDEMAIL;
193    
194     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "HIDEMAIL", si->smu->name);
195    
196     return;
197     }
198     else
199     {
200 pippijn 1.7 command_fail (si, fault::badparams, STR_INVALID_PARAMS, "HIDEMAIL");
201 pippijn 1.1 return;
202     }
203     }
204    
205 pippijn 1.6 command_t const ns_set_hidemail = { "HIDEMAIL", N_("Hides your e-mail address."), AC_NONE, 1, ns_cmd_sethidemail };
206 pippijn 1.1
207     static void
208 pippijn 1.3 ns_cmd_setemailmemos (sourceinfo_t *si, int parc, char *parv[])
209 pippijn 1.1 {
210     char *params = strtok (parv[0], " ");
211    
212     if (si->smu == NULL)
213     return;
214    
215     if (si->smu->flags & MU_WAITAUTH)
216     {
217 pippijn 1.7 command_fail (si, fault::noprivs, _("You have to verify your email address before you can enable emailing memos."));
218 pippijn 1.1 return;
219     }
220    
221     if (params == NULL)
222     {
223 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "EMAILMEMOS");
224 pippijn 1.1 return;
225     }
226    
227     if (!strcasecmp ("ON", params))
228     {
229     if (me.mta == NULL)
230     {
231 pippijn 1.7 command_fail (si, fault::emailfail, _("Sending email is administratively disabled."));
232 pippijn 1.1 return;
233     }
234     if (MU_EMAILMEMOS & si->smu->flags)
235     {
236 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is already set for \2%s\2."), "EMAILMEMOS", si->smu->name);
237 pippijn 1.1 return;
238     }
239    
240     logcommand (si, CMDLOG_SET, "SET EMAILMEMOS ON");
241     si->smu->flags |= MU_EMAILMEMOS;
242     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "EMAILMEMOS", si->smu->name);
243     return;
244     }
245    
246     else if (!strcasecmp ("OFF", params))
247     {
248     if (!(MU_EMAILMEMOS & si->smu->flags))
249     {
250 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is not set for \2%s\2."), "EMAILMEMOS", si->smu->name);
251 pippijn 1.1 return;
252     }
253    
254     logcommand (si, CMDLOG_SET, "SET EMAILMEMOS OFF");
255     si->smu->flags &= ~MU_EMAILMEMOS;
256     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "EMAILMEMOS", si->smu->name);
257     return;
258     }
259     else
260     {
261 pippijn 1.7 command_fail (si, fault::badparams, STR_INVALID_PARAMS, "EMAILMEMOS");
262 pippijn 1.1 return;
263     }
264     }
265    
266 pippijn 1.6 command_t const ns_set_emailmemos = { "EMAILMEMOS", N_("Forwards incoming memos to your e-mail address."), AC_NONE, 1, ns_cmd_setemailmemos };
267 pippijn 1.1
268     static void
269 pippijn 1.3 ns_cmd_setnomemo (sourceinfo_t *si, int parc, char *parv[])
270 pippijn 1.1 {
271     char *params = strtok (parv[0], " ");
272    
273     if (si->smu == NULL)
274     return;
275    
276     if (params == NULL)
277     {
278 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "NOMEMO");
279 pippijn 1.1 return;
280     }
281    
282     if (!strcasecmp ("ON", params))
283     {
284     if (MU_NOMEMO & si->smu->flags)
285     {
286 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is already set for \2%s\2."), "NOMEMO", si->smu->name);
287 pippijn 1.1 return;
288     }
289    
290     logcommand (si, CMDLOG_SET, "SET NOMEMO ON");
291     si->smu->flags |= MU_NOMEMO;
292     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "NOMEMO", si->smu->name);
293     return;
294     }
295    
296     else if (!strcasecmp ("OFF", params))
297     {
298     if (!(MU_NOMEMO & si->smu->flags))
299     {
300 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is not set for \2%s\2."), "NOMEMO", si->smu->name);
301 pippijn 1.1 return;
302     }
303    
304     logcommand (si, CMDLOG_SET, "SET NOMEMO OFF");
305     si->smu->flags &= ~MU_NOMEMO;
306     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "NOMEMO", si->smu->name);
307     return;
308     }
309     else
310     {
311 pippijn 1.7 command_fail (si, fault::badparams, STR_INVALID_PARAMS, "NOMEMO");
312 pippijn 1.1 return;
313     }
314     }
315    
316 pippijn 1.6 command_t const ns_set_nomemo = { "NOMEMO", N_("Disables the ability to recieve memos."), AC_NONE, 1, ns_cmd_setnomemo };
317 pippijn 1.1
318     static void
319 pippijn 1.3 ns_cmd_setneverop (sourceinfo_t *si, int parc, char *parv[])
320 pippijn 1.1 {
321     char *params = strtok (parv[0], " ");
322    
323     if (si->smu == NULL)
324     return;
325    
326     if (params == NULL)
327     {
328 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "NEVEROP");
329 pippijn 1.1 return;
330     }
331    
332     if (!strcasecmp ("ON", params))
333     {
334     if (MU_NEVEROP & si->smu->flags)
335     {
336 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is already set for \2%s\2."), "NEVEROP", si->smu->name);
337 pippijn 1.1 return;
338     }
339    
340     logcommand (si, CMDLOG_SET, "SET NEVEROP ON");
341    
342     si->smu->flags |= MU_NEVEROP;
343    
344     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "NEVEROP", si->smu->name);
345    
346     return;
347     }
348    
349     else if (!strcasecmp ("OFF", params))
350     {
351     if (!(MU_NEVEROP & si->smu->flags))
352     {
353 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is not set for \2%s\2."), "NEVEROP", si->smu->name);
354 pippijn 1.1 return;
355     }
356    
357     logcommand (si, CMDLOG_SET, "SET NEVEROP OFF");
358    
359     si->smu->flags &= ~MU_NEVEROP;
360    
361     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "NEVEROP", si->smu->name);
362    
363     return;
364     }
365    
366     else
367     {
368 pippijn 1.7 command_fail (si, fault::badparams, STR_INVALID_PARAMS, "NEVEROP");
369 pippijn 1.1 return;
370     }
371     }
372    
373 pippijn 1.6 command_t const ns_set_neverop = { "NEVEROP", N_("Prevents you from being added to access lists."), AC_NONE, 1, ns_cmd_setneverop };
374 pippijn 1.1
375     static void
376 pippijn 1.3 ns_cmd_setnoop (sourceinfo_t *si, int parc, char *parv[])
377 pippijn 1.1 {
378     char *params = strtok (parv[0], " ");
379    
380     if (si->smu == NULL)
381     return;
382    
383     if (params == NULL)
384     {
385 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "NOOP");
386 pippijn 1.1 return;
387     }
388    
389     if (!strcasecmp ("ON", params))
390     {
391     if (MU_NOOP & si->smu->flags)
392     {
393 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is already set for \2%s\2."), "NOOP", si->smu->name);
394 pippijn 1.1 return;
395     }
396    
397     logcommand (si, CMDLOG_SET, "SET NOOP ON");
398    
399     si->smu->flags |= MU_NOOP;
400    
401     command_success_nodata (si, _("The \2%s\2 flag has been set for \2%s\2."), "NOOP", si->smu->name);
402    
403     return;
404     }
405     else if (!strcasecmp ("OFF", params))
406     {
407     if (!(MU_NOOP & si->smu->flags))
408     {
409 pippijn 1.7 command_fail (si, fault::nochange, _("The \2%s\2 flag is not set for \2%s\2."), "NOOP", si->smu->name);
410 pippijn 1.1 return;
411     }
412    
413     logcommand (si, CMDLOG_SET, "SET NOOP OFF");
414    
415     si->smu->flags &= ~MU_NOOP;
416    
417     command_success_nodata (si, _("The \2%s\2 flag has been removed for \2%s\2."), "NOOP", si->smu->name);
418    
419     return;
420     }
421    
422     else
423     {
424 pippijn 1.7 command_fail (si, fault::badparams, STR_INVALID_PARAMS, "NOOP");
425 pippijn 1.1 return;
426     }
427     }
428    
429 pippijn 1.6 command_t const ns_set_noop = { "NOOP", N_("Prevents services from setting modes upon you automatically."), AC_NONE, 1, ns_cmd_setnoop };
430 pippijn 1.1
431     static void
432 pippijn 1.3 ns_cmd_setproperty (sourceinfo_t *si, int parc, char *parv[])
433 pippijn 1.1 {
434 pippijn 1.5 char *tok[2] = { 0 };
435     sjtoken (parv[0], ' ', tok, 2);
436     char *property = tok[0];
437     char *value = tok[1];
438 pippijn 1.1
439     if (si->smu == NULL)
440     return;
441    
442     if (!property)
443     {
444 pippijn 1.7 command_fail (si, fault::needmoreparams, _("Syntax: SET PROPERTY <property> [value]"));
445 pippijn 1.1 return;
446     }
447    
448     if (strchr (property, ':') && !has_priv (si, PRIV_METADATA))
449     {
450 pippijn 1.7 command_fail (si, fault::badparams, _("Invalid property name."));
451 pippijn 1.1 return;
452     }
453    
454     if (strchr (property, ':'))
455     snoop ("SET:PROPERTY: \2%s\2: \2%s\2/\2%s\2", si->smu->name, property, value);
456    
457     if (si->smu->mdmap.size () >= me.mdlimit)
458     {
459 pippijn 1.7 command_fail (si, fault::toomany, _("Cannot add \2%s\2 to \2%s\2 metadata table, it is full."), property, si->smu->name);
460 pippijn 1.1 return;
461     }
462    
463     if (!value)
464     {
465 pippijn 1.8 metadata *md = si->smu->find_metadata (property);
466 pippijn 1.1
467     if (!md)
468     {
469 pippijn 1.7 command_fail (si, fault::nosuch_target, _("Metadata entry \2%s\2 was not set."), property);
470 pippijn 1.1 return;
471     }
472    
473     si->smu->del_metadata (property);
474     logcommand (si, CMDLOG_SET, "SET PROPERTY %s (deleted)", property);
475     command_success_nodata (si, _("Metadata entry \2%s\2 has been deleted."), property);
476     return;
477     }
478    
479     if (strlen (property) > 32 || strlen (value) > 300)
480     {
481 pippijn 1.7 command_fail (si, fault::badparams, _("Parameters are too long. Aborting."));
482 pippijn 1.1 return;
483     }
484    
485     si->smu->add_metadata (property, value);
486     logcommand (si, CMDLOG_SET, "SET PROPERTY %s to %s", property, value);
487     command_success_nodata (si, _("Metadata entry \2%s\2 added."), property);
488     }
489    
490 pippijn 1.6 command_t const ns_set_property = { "PROPERTY", N_("Manipulates metadata entries associated with a nickname."), AC_NONE, 2, ns_cmd_setproperty };
491 pippijn 1.1
492     static void
493 pippijn 1.3 ns_cmd_setqproperty (sourceinfo_t *si, int parc, char *parv[])
494 pippijn 1.1 {
495     char *property = strtok (parv[0], " ");
496     char *value = strtok (NULL, "");
497    
498     if (si->smu == NULL)
499     return;
500    
501     if (!property)
502     {
503 pippijn 1.7 command_fail (si, fault::needmoreparams, _("Syntax: SET PROPERTY <property> [value]"));
504 pippijn 1.1 return;
505     }
506    
507     if (strchr (property, ':') && !has_priv (si, PRIV_METADATA))
508     {
509 pippijn 1.7 command_fail (si, fault::badparams, _("Invalid property name."));
510 pippijn 1.1 return;
511     }
512    
513     if (strchr (property, ':'))
514     snoop ("SET:PROPERTY: \2%s\2: \2%s\2/\2%s\2", si->smu->name, property, value);
515    
516     if (si->smu->mdmap.size () >= me.mdlimit)
517     {
518 pippijn 1.7 command_fail (si, fault::toomany, _("Cannot add \2%s\2 to \2%s\2 metadata table, it is full."), property, si->smu->name);
519 pippijn 1.1 return;
520     }
521    
522     if (!value)
523     {
524 pippijn 1.8 metadata *md = si->smu->find_metadata (property);
525 pippijn 1.1
526     if (!md)
527     {
528 pippijn 1.7 command_fail (si, fault::nosuch_target, _("Metadata entry \2%s\2 was not set."), property);
529 pippijn 1.1 return;
530     }
531    
532     si->smu->del_metadata (property);
533     logcommand (si, CMDLOG_SET, "SET PROPERTY %s (deleted)", property);
534     return;
535     }
536    
537     if (strlen (property) > 32 || strlen (value) > 300)
538     return;
539    
540     si->smu->add_metadata (property, value);
541     logcommand (si, CMDLOG_SET, "SET QPROPERTY %s to %s", property, value);
542     }
543    
544 pippijn 1.6 command_t const ns_set_qproperty = { "QPROPERTY", N_("Quietly manipulates metadata entries associated with a nickname."), AC_NONE, 2, ns_cmd_setqproperty };
545 pippijn 1.1
546     static void
547 pippijn 1.3 ns_cmd_setpassword (sourceinfo_t *si, int parc, char *parv[])
548 pippijn 1.1 {
549     char *password = strtok (parv[0], " ");
550    
551     if (si->smu == NULL)
552     return;
553    
554     if (password == NULL)
555     {
556 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "PASSWORD");
557 pippijn 1.1 return;
558     }
559    
560     if (strlen (password) > 32)
561     {
562 pippijn 1.7 command_fail (si, fault::badparams, STR_INVALID_PARAMS, "PASSWORD");
563 pippijn 1.1 return;
564     }
565    
566     if (!strcasecmp (password, si->smu->name))
567     {
568 pippijn 1.7 command_fail (si, fault::badparams, _("You cannot use your nickname as a password."));
569     command_fail (si, fault::badparams, _("Syntax: SET PASSWORD <new password>"));
570 pippijn 1.1 return;
571     }
572    
573     /*snoop("SET:PASSWORD: \2%s\2 as \2%s\2 for \2%s\2", si->su->user, si->smu->name, si->smu->name); */
574     logcommand (si, CMDLOG_SET, "SET PASSWORD");
575    
576 pippijn 1.6 si->smu->set_password (password);
577 pippijn 1.1
578     command_success_nodata (si, _("The password for \2%s\2 has been changed to \2%s\2. Please write this down for future reference."), si->smu->name, password);
579    
580     return;
581     }
582    
583 pippijn 1.6 command_t const ns_set_password = { "PASSWORD", N_("Changes the password associated with your nickname."), AC_NONE, 1, ns_cmd_setpassword };
584 pippijn 1.3
585     static void
586     ns_cmd_setwhois (sourceinfo_t *si, int parc, char *parv[])
587     {
588     char const * const value = parv[0];
589    
590     if (si->smu == NULL)
591     return;
592    
593     if (value == NULL)
594     {
595 pippijn 1.7 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "WHOIS");
596 pippijn 1.3 return;
597     }
598     else if (!strcasecmp (value, "UNSET"))
599     {
600 pippijn 1.6 phandler->mdchange (si->su->nick, "swhois", "");
601 pippijn 1.3 si->smu->del_metadata ("private:swhois");
602     command_success_nodata (si, _("Your description has been removed."));
603     return;
604     }
605    
606 pippijn 1.6 phandler->mdchange (si->su->nick, "swhois", value);
607 pippijn 1.3 si->smu->add_metadata ("private:swhois", value);
608    
609     command_success_nodata (si, _("Your description is now set to: \2%s\2"), value);
610    
611     return;
612     }
613    
614 pippijn 1.6 command_t const ns_set_whois = { "WHOIS", N_("Sets your WHOIS description."), AC_NONE, 1, ns_cmd_setwhois };
615 pippijn 1.3
616     static void
617 pippijn 1.6 whois_on_identify (user_t *u)
618 pippijn 1.3 {
619 pippijn 1.8 metadata *md;
620 pippijn 1.3
621     if ((md = u->myuser->find_metadata ("private:swhois")) != NULL)
622 pippijn 1.6 phandler->mdchange (u->nick, "swhois", md->value);
623 pippijn 1.3 }
624 pippijn 1.1
625     command_t const *ns_set_commands[] = {
626     &ns_set_email,
627     &ns_set_emailmemos,
628     &ns_set_hidemail,
629     &ns_set_nomemo,
630     &ns_set_noop,
631     &ns_set_neverop,
632     &ns_set_password,
633     &ns_set_property,
634     &ns_set_qproperty,
635 pippijn 1.3 &ns_set_whois,
636 pippijn 1.1 NULL
637     };
638    
639 pippijn 1.6 bool
640     _modinit (module *m)
641 pippijn 1.1 {
642 pippijn 1.6 user_t::callback.identify.attach (whois_on_identify);
643 pippijn 1.3
644 pippijn 1.1 ns_cmdtree << ns_set;
645    
646     help_addentry (ns_helptree, "SET", NULL, ns_help_set);
647     help_addentry (ns_helptree, "SET EMAIL", "help/nickserv/set_email", NULL);
648     help_addentry (ns_helptree, "SET EMAILMEMOS", "help/nickserv/set_emailmemos", NULL);
649     help_addentry (ns_helptree, "SET HIDEMAIL", "help/nickserv/set_hidemail", NULL);
650     help_addentry (ns_helptree, "SET NOMEMO", "help/nickserv/set_nomemo", NULL);
651     help_addentry (ns_helptree, "SET NEVEROP", "help/nickserv/set_neverop", NULL);
652     help_addentry (ns_helptree, "SET NOOP", "help/nickserv/set_noop", NULL);
653     help_addentry (ns_helptree, "SET PASSWORD", "help/nickserv/set_password", NULL);
654     help_addentry (ns_helptree, "SET PROPERTY", "help/nickserv/set_property", NULL);
655 pippijn 1.4 help_addentry (ns_helptree, "SET WHOIS", "help/nickserv/set_whois", NULL);
656 pippijn 1.1
657     /* populate ns_set_cmdtree */
658     ns_set_cmdtree << ns_set_commands;
659 pippijn 1.6
660     return true;
661 pippijn 1.1 }
662    
663     void
664     _moddeinit ()
665     {
666 pippijn 1.6 user_t::callback.identify.detach (whois_on_identify);
667 pippijn 1.3
668 pippijn 1.1 ns_cmdtree >> ns_set;
669 pippijn 1.3
670 pippijn 1.1 help_delentry (ns_helptree, "SET");
671     help_delentry (ns_helptree, "SET EMAIL");
672     help_delentry (ns_helptree, "SET EMAILMEMOS");
673     help_delentry (ns_helptree, "SET HIDEMAIL");
674     help_delentry (ns_helptree, "SET NOMEMO");
675     help_delentry (ns_helptree, "SET NEVEROP");
676     help_delentry (ns_helptree, "SET NOOP");
677     help_delentry (ns_helptree, "SET PASSWORD");
678     help_delentry (ns_helptree, "SET PROPERTY");
679 pippijn 1.4 help_delentry (ns_helptree, "SET WHOIS");
680 pippijn 1.1
681     /* clear ns_set_cmdtree */
682     ns_set_cmdtree >> ns_set_commands;
683     }