ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/nickserv/set.C
Revision: 1.7
Committed: Thu Aug 30 19:56:23 2007 UTC (19 years, 1 month ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.6: +52 -52 lines
Log Message:
- put faultcodes into their own namespace
- removed old files
- limited header garbage in atheme.h
- macros to inline bools for connection_t::is_*
- put some connection_t functions into the connection_t class

File Contents

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