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