ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/contrib/cs_userinfo.C
Revision: 1.6
Committed: Wed Sep 5 11:23:13 2007 UTC (19 years, 1 month ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.5: +4 -4 lines
Log Message:
removed GPLed code and put license back to BSD

File Contents

# User Rev Content
1 pippijn 1.1 /*
2 pippijn 1.3 * Copyright © 2007 Jilles Tjoelker, et al
3 pippijn 1.2 * Rights to this code are as documented in doc/pod/license.pod.
4 pippijn 1.1 *
5     * Per-channel userinfo thingie
6     *
7 pippijn 1.6 * $Id: cs_userinfo.C,v 1.5 2007-08-30 19:56:22 pippijn Exp $
8 pippijn 1.1 */
9    
10     #include "atheme.h"
11 pippijn 1.3 #include <ermyth/module.h>
12 pippijn 1.1 #include <account/mychan.h>
13     #include <account/myuser.h>
14     #include <account/chanacs.h>
15    
16 pippijn 1.6 static char const rcsid[] = "$Id: cs_userinfo.C,v 1.5 2007-08-30 19:56:22 pippijn Exp $";
17 pippijn 1.1
18 pippijn 1.3 REGISTER_MODULE ("chanserv/userinfo", false, "The Ermyth Team <http://ermyth.schmorp.de>");
19    
20     E cmdvec cs_cmdtree;
21     E helpvec cs_helptree;
22 pippijn 1.1
23     static void cs_cmd_userinfo (sourceinfo_t *si, int parc, char *parv[]);
24    
25 pippijn 1.3 command_t const cs_userinfo = { "USERINFO", N_("Sets a userinfo message."), AC_NONE, 3, cs_cmd_userinfo };
26 pippijn 1.1
27     /* USERINFO <channel> [user] [message] */
28     static void
29     cs_cmd_userinfo (sourceinfo_t *si, int parc, char *parv[])
30     {
31     node_t *n;
32     myuser_t *mu;
33     mychan_t *mc;
34     chanacs_t *ca;
35 pippijn 1.6 metadata *md;
36 pippijn 1.1 unsigned int restrictflags;
37    
38     if (parc < 1)
39     {
40 pippijn 1.5 command_fail (si, fault::needmoreparams, STR_INSUFFICIENT_PARAMS, "USERINFO");
41     command_fail (si, fault::needmoreparams, _("Syntax: USERINFO <channel> [target] [info]"));
42 pippijn 1.1 return;
43     }
44    
45 pippijn 1.5 mc = mychan_t::find (parv[0]);
46 pippijn 1.1 if (!mc)
47     {
48 pippijn 1.5 command_fail (si, fault::nosuch_target, _("\2%s\2 is not registered."), parv[0]);
49 pippijn 1.1 return;
50     }
51    
52     if (mc->find_metadata ("private:close:closer") && !has_priv (si, PRIV_CHAN_AUSPEX))
53     {
54 pippijn 1.5 command_fail (si, fault::noprivs, _("\2%s\2 is closed."), mc->name);
55 pippijn 1.1 return;
56     }
57    
58     restrictflags = chanacs_source_flags (mc, si);
59    
60     if (parc == 1)
61     {
62     if (!(restrictflags & CA_ACLVIEW))
63     {
64 pippijn 1.5 command_fail (si, fault::noprivs, _("You are not authorized to perform this operation."));
65 pippijn 1.1 return;
66     }
67     command_success_nodata (si, _("Nickname Info"));
68     command_success_nodata (si, "------------------- ---------------");
69    
70     LIST_FOREACH (n, mc->chanacs.head)
71     {
72     ca = static_cast<chanacs_t *> (n->data);
73     if (ca->myuser == NULL)
74     continue;
75     md = ca->find_metadata ("userinfo");
76     if (md == NULL)
77     continue;
78     command_success_nodata (si, "%-19s %s", ca->myuser->name, md->value);
79     }
80    
81     command_success_nodata (si, "------------------- ---------------");
82     command_success_nodata (si, _("End of \2%s\2 USERINFO listing."), mc->name);
83     logcommand (si, CMDLOG_GET, "%s USERINFO", mc->name);
84     }
85     else
86     {
87     if (!(restrictflags & CA_FLAGS))
88     {
89 pippijn 1.5 command_fail (si, fault::noprivs, _("You are not authorized to perform this operation."));
90 pippijn 1.1 return;
91     }
92 pippijn 1.4 mu = myuser_t::find_ext (parv[1]);
93 pippijn 1.1 if (mu == NULL)
94     {
95 pippijn 1.5 command_fail (si, fault::nosuch_target, _("\2%s\2 is not registered."), parv[1]);
96 pippijn 1.1 return;
97     }
98     ca = chanacs_find (mc, mu, 0);
99     if (ca == NULL || ca->level & CA_AKICK)
100     {
101 pippijn 1.5 command_fail (si, fault::nosuch_target, _("\2%s\2 has no access to \2%s\2."), mu->name, mc->name);
102 pippijn 1.1 return;
103     }
104     if (ca->level & ~allow_flags (restrictflags))
105     {
106 pippijn 1.5 command_fail (si, fault::noprivs, _("You are not authorized to modify the access entry for \2%s\2 on \2%s\2."), mu->name, mc->name);
107 pippijn 1.1 return;
108     }
109     if (parc == 2)
110     {
111     ca->del_metadata ("userinfo");
112     command_success_nodata (si, _("Deleted userinfo for \2%s\2 on \2%s\2."), mu->name, mc->name);
113     logcommand (si, CMDLOG_SET, "%s USERINFO %s", mc->name, mu->name);
114     return;
115     }
116    
117     ca->add_metadata ("userinfo", parv[2]);
118     command_success_nodata (si, _("Added userinfo for \2%s\2 on \2%s\2."), mu->name, mc->name);
119     logcommand (si, CMDLOG_SET, "%s USERINFO %s %s", mc->name, mu->name, parv[2]);
120     }
121     return;
122     }
123    
124 pippijn 1.3 static bool
125     userinfo_check_join (chanuser_t *cu)
126 pippijn 1.1 {
127     myuser_t *mu;
128     mychan_t *mc;
129     chanacs_t *ca;
130 pippijn 1.6 metadata *md;
131 pippijn 1.1
132     if (cu == NULL)
133 pippijn 1.3 return true;
134 pippijn 1.1 if (!(cu->user->server->flags & SF_EOB))
135 pippijn 1.3 return true;
136 pippijn 1.1 mu = cu->user->myuser;
137 pippijn 1.5 mc = mychan_t::find (cu->chan->name);
138 pippijn 1.1 if (mu == NULL || mc == NULL)
139 pippijn 1.3 return true;
140 pippijn 1.1 ca = chanacs_find (mc, mu, 0);
141     if (ca == NULL || ca->level & CA_AKICK)
142 pippijn 1.3 return true;
143 pippijn 1.1 if (!(md = ca->find_metadata ("userinfo")))
144 pippijn 1.3 return true;
145     phandler->privmsg (chansvs.nick, cu->chan->name, "[%s] %s", cu->user->nick, md->value);
146    
147     return true;
148     }
149    
150     bool
151     _modinit (module *m)
152     {
153     chanuser_t::callback.join.attach (userinfo_check_join);
154     cs_cmdtree << cs_userinfo;
155     help_addentry (cs_helptree, "USERINFO", "help/chanserv/userinfo", NULL);
156    
157     return true;
158     }
159    
160     void
161     _moddeinit (void)
162     {
163     chanuser_t::callback.join.detach (userinfo_check_join);
164     cs_cmdtree >> cs_userinfo;
165     help_delentry (cs_helptree, "USERINFO");
166 pippijn 1.1 }