ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/contrib/cs_userinfo.C
Revision: 1.4
Committed: Tue Aug 28 22:18:30 2007 UTC (19 years, 2 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.3: +3 -3 lines
Log Message:
added type traits

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.4 * $Id: cs_userinfo.C,v 1.3 2007-08-28 17:08:09 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.4 static char const rcsid[] = "$Id: cs_userinfo.C,v 1.3 2007-08-28 17:08:09 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     metadata *md;
36     unsigned int restrictflags;
37    
38     if (parc < 1)
39     {
40     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "USERINFO");
41     command_fail (si, fault_needmoreparams, _("Syntax: USERINFO <channel> [target] [info]"));
42     return;
43     }
44    
45     mc = mychan_find (parv[0]);
46     if (!mc)
47     {
48     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), parv[0]);
49     return;
50     }
51    
52     if (mc->find_metadata ("private:close:closer") && !has_priv (si, PRIV_CHAN_AUSPEX))
53     {
54     command_fail (si, fault_noprivs, _("\2%s\2 is closed."), mc->name);
55     return;
56     }
57    
58     restrictflags = chanacs_source_flags (mc, si);
59    
60     if (parc == 1)
61     {
62     if (!(restrictflags & CA_ACLVIEW))
63     {
64     command_fail (si, fault_noprivs, _("You are not authorized to perform this operation."));
65     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     command_fail (si, fault_noprivs, _("You are not authorized to perform this operation."));
90     return;
91     }
92 pippijn 1.4 mu = myuser_t::find_ext (parv[1]);
93 pippijn 1.1 if (mu == NULL)
94     {
95     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), parv[1]);
96     return;
97     }
98     ca = chanacs_find (mc, mu, 0);
99     if (ca == NULL || ca->level & CA_AKICK)
100     {
101     command_fail (si, fault_nosuch_target, _("\2%s\2 has no access to \2%s\2."), mu->name, mc->name);
102     return;
103     }
104     if (ca->level & ~allow_flags (restrictflags))
105     {
106     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     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     metadata *md;
131    
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     mc = mychan_find (cu->chan->name);
138     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 }