ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/nickserv/info.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-2006 William Pitcock, 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 INFO functions.
6     *
7 pippijn 1.2 * $Id: info.C,v 1.1 2007-07-19 08:24:54 pippijn Exp $
8 pippijn 1.1 */
9    
10     #include "atheme.h"
11     #include <account/mynick.h>
12     #include <account/myuser.h>
13    
14     static char const rcsid[] = "$Id";
15    
16     struct ns_info_listeners : callback::has_listeners
17     {
18     };
19    
20     ns_info_listeners listeners;
21    
22     DECLARE_MODULE_V1 ("nickserv/info", false, _modinit, _moddeinit, rcsid, "The Ermyth Team <http://ermyth.schmorp.de>");
23    
24     static void ns_cmd_info (sourceinfo_t *si, int parc, char *parv[]);
25    
26     command_t ns_info = { "INFO", N_("Displays information on registrations."), AC_NONE, 2, ns_cmd_info };
27    
28     cmdvec *ns_cmdtree;
29     helpvec *ns_helptree;
30    
31     void
32     _modinit (module_t *m)
33     {
34     MODULE_USE_SYMBOL_T (ns_cmdtree, cmdvec, "nickserv/main", "ns_cmdtree");
35     MODULE_USE_SYMBOL_T (ns_helptree, helpvec, "nickserv/main", "ns_helptree");
36    
37     ns_cmdtree << ns_info;
38     help_addentry (ns_helptree, "INFO", "help/nickserv/info", NULL);
39     }
40    
41     void
42     _moddeinit ()
43     {
44     ns_cmdtree >> ns_info;
45     help_delentry (ns_helptree, "INFO");
46     }
47    
48     static void
49     ns_cmd_info (sourceinfo_t *si, int parc, char *parv[])
50     {
51     myuser_t *mu;
52     mynick_t *mn = NULL;
53     user_t *u;
54     char *name = parv[0];
55     char buf[BUFSIZE], strfbuf[32], lastlogin[32];
56     struct tm tm, tm2;
57     metadata *md;
58     node_t *n;
59     hook_user_req_t req;
60    
61     if (!name)
62     {
63     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "INFO");
64     command_fail (si, fault_needmoreparams, _("Syntax: INFO <nickname>"));
65     return;
66     }
67    
68     if (!(mu = myuser_find_ext (name)))
69     {
70     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), name);
71     return;
72     }
73    
74     tm = *localtime (&mu->registered);
75     strftime (strfbuf, sizeof (strfbuf) - 1, "%b %d %H:%M:%S %Y", &tm);
76     tm2 = *localtime (&mu->lastlogin);
77     strftime (lastlogin, sizeof (lastlogin) - 1, "%b %d %H:%M:%S %Y", &tm2);
78    
79     command_success_nodata (si, _("Information on \2%s\2:"), mu->name);
80    
81     command_success_nodata (si, _("Registered: %s (%s ago)"), strfbuf, time_ago (mu->registered));
82     if (has_priv (si, PRIV_USER_AUSPEX) && (md = mu->find_metadata ("private:host:actual")))
83     command_success_nodata (si, _("Last address: %s"), md->value);
84     else if ((md = mu->find_metadata ("private:host:vhost")))
85     command_success_nodata (si, _("Last address: %s"), md->value);
86    
87     if (mu->logins.empty ())
88     command_success_nodata (si, _("Last seen: %s (%s ago)"), lastlogin, time_ago (mu->lastlogin));
89     else if (mu == si->smu || has_priv (si, PRIV_USER_AUSPEX))
90     {
91     myuser_t::login_vector::iterator it, it_end;
92     buf[0] = '\0';
93     for (it = mu->logins.begin (), it_end = mu->logins.end (); it != it_end; ++it)
94     {
95     if (strlen (buf) > 80)
96     {
97     command_success_nodata (si, _("Logins from: %s"), buf);
98     buf[0] = '\0';
99     }
100     if (buf[0])
101     strcat (buf, " ");
102     strcat (buf, (*it)->nick);
103     }
104     if (buf[0])
105     command_success_nodata (si, _("Logins from: %s"), buf);
106     }
107     else
108     command_success_nodata (si, _("Logins from: <hidden>"));
109    
110     if (!nicksvs.no_nick_ownership)
111     {
112     /* describe queried nick */
113     mn = mynick_find (*name == '=' ? name + 1 : name);
114     if (mn != NULL && mn->owner == mu)
115     {
116     tm = *localtime (&mn->registered);
117     strftime (strfbuf, sizeof (strfbuf) - 1, "%b %d %H:%M:%S %Y", &tm);
118     command_success_nodata (si, _("Nick %s registered: %s (%s ago)"), mn->nick, strfbuf, time_ago (mn->registered));
119     u = user_find_named (mn->nick);
120     if (u != NULL && u->myuser == mu)
121     command_success_nodata (si, _("Nick %s is currently online"), mn->nick);
122     else
123     {
124     tm = *localtime (&mn->lastseen);
125     strftime (strfbuf, sizeof (strfbuf) - 1, "%b %d %H:%M:%S %Y", &tm);
126     command_success_nodata (si, _("Nick %s last seen: %s (%s ago)"), mn->nick, strfbuf, time_ago (mn->lastseen));
127     }
128     }
129     /* list registered nicks if privileged */
130     if (mu == si->smu || has_priv (si, PRIV_USER_AUSPEX))
131     {
132     buf[0] = '\0';
133     LIST_FOREACH (n, mu->nicks.head)
134     {
135     if (strlen (buf) > 80)
136     {
137     command_success_nodata (si, _("Registered nicks: %s"), buf);
138     buf[0] = '\0';
139     }
140     if (buf[0])
141     strcat (buf, " ");
142     strcat (buf, ((mynick_t *) (n->data))->nick);
143     }
144     if (buf[0])
145     command_success_nodata (si, _("Registered nicks: %s"), buf);
146     }
147     }
148    
149     if (!(mu->flags & MU_HIDEMAIL) || (si->smu == mu || has_priv (si, PRIV_USER_AUSPEX)))
150     command_success_nodata (si, _("Email: %s%s"), mu->email, (mu->flags & MU_HIDEMAIL) ? " (hidden)" : "");
151    
152     *buf = '\0';
153    
154     if (MU_HIDEMAIL & mu->flags)
155     strcat (buf, "HideMail");
156    
157     if (MU_HOLD & mu->flags)
158     {
159     if (*buf)
160     strcat (buf, ", ");
161    
162     strcat (buf, "Hold");
163     }
164     if (MU_NEVEROP & mu->flags)
165     {
166     if (*buf)
167     strcat (buf, ", ");
168    
169     strcat (buf, "NeverOp");
170     }
171     if (MU_NOOP & mu->flags)
172     {
173     if (*buf)
174     strcat (buf, ", ");
175    
176     strcat (buf, "NoOp");
177     }
178     if (MU_NOMEMO & mu->flags)
179     {
180     if (*buf)
181     strcat (buf, ", ");
182    
183     strcat (buf, "NoMemo");
184     }
185     if (MU_EMAILMEMOS & mu->flags)
186     {
187     if (*buf)
188     strcat (buf, ", ");
189    
190     strcat (buf, "EMailMemos");
191     }
192    
193     if (*buf)
194     command_success_nodata (si, _("Flags: %s"), buf);
195    
196     if (mu->soper && (mu == si->smu || has_priv (si, PRIV_VIEWPRIVS)))
197     {
198     command_success_nodata (si, _("Oper class: %s"), mu->soper->operclass ? mu->soper->operclass->name : mu->soper->classname);
199     }
200    
201     if (has_priv (si, PRIV_USER_AUSPEX) && (md = mu->find_metadata ("private:freeze:freezer")))
202     {
203     char *setter = md->value;
204     const char *reason;
205     time_t ts;
206    
207     md = mu->find_metadata ("private:freeze:reason");
208     reason = md != NULL ? md->value : "unknown";
209    
210     md = mu->find_metadata ("private:freeze:timestamp");
211     ts = md != NULL ? atoi (md->value) : 0;
212    
213     tm = *localtime (&ts);
214     strftime (strfbuf, sizeof (strfbuf) - 1, "%b %d %H:%M:%S %Y", &tm);
215    
216     command_success_nodata (si, _("%s was \2FROZEN\2 by %s on %s (%s)"), mu->name, setter, strfbuf, reason);
217     }
218    
219     if (has_priv (si, PRIV_USER_AUSPEX) && (md = mu->find_metadata ("private:mark:setter")))
220     {
221     char *setter = md->value;
222     const char *reason;
223     time_t ts;
224    
225     md = mu->find_metadata ("private:mark:reason");
226     reason = md != NULL ? md->value : "unknown";
227    
228     md = mu->find_metadata ("private:mark:timestamp");
229     ts = md != NULL ? atoi (md->value) : 0;
230    
231     tm = *localtime (&ts);
232     strftime (strfbuf, sizeof (strfbuf) - 1, "%b %d %H:%M:%S %Y", &tm);
233    
234     command_success_nodata (si, _("%s was \2MARKED\2 by %s on %s (%s)"), mu->name, setter, strfbuf, reason);
235     }
236    
237     if (MU_WAITAUTH & mu->flags)
238     command_success_nodata (si, _("%s has not completed registration verification"), mu->name);
239    
240     req.si = si;
241     req.mu = mu;
242     req.mn = mn;
243     hook_call_event ("user_info", &req);
244    
245     command_success_nodata (si, _("*** \2End of Info\2 ***"));
246    
247     logcommand (si, CMDLOG_GET, "INFO %s", mu->name);
248     }