ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/nickserv/list.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-2007 Robin Burchell, et al.
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 NickServ LIST function.
6     * Based on Alex Lambert's LISTEMAIL.
7     *
8 pippijn 1.2 * $Id: list.C,v 1.1 2007-07-19 08:24:54 pippijn Exp $
9 pippijn 1.1 */
10    
11     #include "atheme.h"
12     #include <account/mynick.h>
13     #include <account/myuser.h>
14    
15     static char const rcsid[] = "$Id";
16    
17     struct ns_list_listeners : callback::has_listeners
18     {
19     };
20    
21     ns_list_listeners listeners;
22    
23     DECLARE_MODULE_V1 ("nickserv/list", false, _modinit, _moddeinit, rcsid, "The Ermyth Team <http://ermyth.schmorp.de>");
24    
25     static void ns_cmd_list (sourceinfo_t *si, int parc, char *parv[]);
26    
27     command_t ns_list = { "LIST", N_("Lists nicknames registered matching a given pattern."), PRIV_USER_AUSPEX, 1, ns_cmd_list };
28    
29     cmdvec *ns_cmdtree;
30     helpvec *ns_helptree;
31    
32     void
33     _modinit (module_t *m)
34     {
35     MODULE_USE_SYMBOL_T (ns_cmdtree, cmdvec, "nickserv/main", "ns_cmdtree");
36     MODULE_USE_SYMBOL_T (ns_helptree, helpvec, "nickserv/main", "ns_helptree");
37    
38     ns_cmdtree << ns_list;
39     help_addentry (ns_helptree, "LIST", "help/nickserv/list", NULL);
40     }
41    
42     void
43     _moddeinit ()
44     {
45     ns_cmdtree >> ns_list;
46     help_delentry (ns_helptree, "LIST");
47     }
48    
49     static void
50     list_one (sourceinfo_t *si, myuser_t *mu, mynick_t *mn)
51     {
52     char buf[BUFSIZE];
53    
54     if (mn != NULL)
55     mu = mn->owner;
56    
57     *buf = '\0';
58     if (mu->find_metadata ("private:freeze:freezer"))
59     {
60     if (*buf)
61     strlcat (buf, " ", BUFSIZE);
62    
63     strlcat (buf, "\2[frozen]\2", BUFSIZE);
64     }
65     if (mu->find_metadata ("private:mark:setter"))
66     {
67     if (*buf)
68     strlcat (buf, " ", BUFSIZE);
69    
70     strlcat (buf, "\2[marked]\2", BUFSIZE);
71     }
72     if (mu->flags & MU_HOLD)
73     {
74     if (*buf)
75     strlcat (buf, " ", BUFSIZE);
76    
77     strlcat (buf, "\2[held]\2", BUFSIZE);
78     }
79     if (mu->flags & MU_WAITAUTH)
80     {
81     if (*buf)
82     strlcat (buf, " ", BUFSIZE);
83    
84     strlcat (buf, "\2[unverified]\2", BUFSIZE);
85     }
86    
87     if (mn == NULL || !irccasecmp (mn->nick, mu->name))
88     command_success_nodata (si, "- %s (%s) %s", mu->name, mu->email, buf);
89     else
90     command_success_nodata (si, "- %s (%s) (%s) %s", mn->nick, mu->email, mu->name, buf);
91     }
92    
93     static void
94     ns_cmd_list (sourceinfo_t *si, int parc, char *parv[])
95     {
96     char pat[512], *nickpattern = NULL, *hostpattern = NULL, *p;
97     bool hostmatch;
98     dictionary_iteration_state_t state;
99     myuser_t *mu;
100     mynick_t *mn;
101     metadata *md;
102     int matches = 0;
103    
104     if (parc < 1)
105     {
106     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "LIST");
107     command_fail (si, fault_needmoreparams, _("Syntax: LIST <pattern>[!<user@host>]"));
108     return;
109     }
110     strlcpy (pat, parv[0], sizeof pat);
111     p = strrchr (pat, ' ');
112     if (p == NULL)
113     p = strrchr (pat, '!');
114     if (p != NULL)
115     {
116     *p++ = '\0';
117     nickpattern = pat;
118     hostpattern = p;
119     }
120     else if (strchr (pat, '@'))
121     hostpattern = pat;
122     else
123     nickpattern = pat;
124     if (nickpattern && !strcmp (nickpattern, "*"))
125     nickpattern = NULL;
126    
127     if (nicksvs.no_nick_ownership)
128     {
129     snoop ("LIST:ACCOUNTS: \2%s\2 by \2%s\2", parv[0], get_oper_name (si));
130     DICTIONARY_FOREACH (mu, myuser_t, &state, mulist)
131     {
132     if (nickpattern && match (nickpattern, mu->name))
133     continue;
134     if (hostpattern)
135     {
136     hostmatch = false;
137     md = mu->find_metadata ("private:host:actual");
138     if (md != NULL && !match (hostpattern, md->value))
139     hostmatch = true;
140     md = mu->find_metadata ("private:host:vhost");
141     if (md != NULL && !match (hostpattern, md->value))
142     hostmatch = true;
143     if (!hostmatch)
144     continue;
145     }
146     list_one (si, mu, NULL);
147     matches++;
148     }
149     }
150     else
151     {
152     snoop ("LIST:NICKS: \2%s\2 by \2%s\2", parv[0], get_oper_name (si));
153     DICTIONARY_FOREACH (mn, mynick_t, &state, nicklist)
154     {
155     if (nickpattern && match (nickpattern, mn->nick))
156     continue;
157     mu = mn->owner;
158     if (hostpattern)
159     {
160     hostmatch = false;
161     md = mu->find_metadata ("private:host:actual");
162     if (md != NULL && !match (hostpattern, md->value))
163     hostmatch = true;
164     md = mu->find_metadata ("private:host:vhost");
165     if (md != NULL && !match (hostpattern, md->value))
166     hostmatch = true;
167     if (!hostmatch)
168     continue;
169     }
170     list_one (si, NULL, mn);
171     matches++;
172     }
173     }
174    
175     logcommand (si, CMDLOG_ADMIN, "LIST %s (%d matches)", parv[0], matches);
176     if (matches == 0)
177     command_success_nodata (si, _("No nicknames matched pattern \2%s\2"), parv[0]);
178     else
179     command_success_nodata (si, ngettext (N_("\2%d\2 match for pattern \2%s\2"), N_("\2%d\2 matches for pattern \2%s\2"), matches), matches, parv[0]);
180     }