ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/chanserv/count.C
Revision: 1.3
Committed: Sat Jul 21 13:23:18 2007 UTC (19 years, 2 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.2: +2 -2 lines
Log Message:
- added rcsid to some files
- more documentation tweaks
- made most protocol commands local to phandler.C
- added ircd metadata (inspircd only for now)
- added inspircd swhois support

File Contents

# User Rev Content
1 pippijn 1.1 /*
2     * Copyright © 2005-2006 Patrick Fish, 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 CService COUNT functions.
6     *
7 pippijn 1.3 * $Id: count.C,v 1.2 2007-07-21 01:29:08 pippijn Exp $
8 pippijn 1.1 */
9    
10     #include "atheme.h"
11     #include <account/mychan.h>
12     #include <account/chanacs.h>
13     #include "template.h"
14    
15 pippijn 1.3 static char const rcsid[] = "$Id$";
16 pippijn 1.1
17     struct cs_count_listeners : callback::has_listeners
18     {
19     };
20    
21     cs_count_listeners listeners;
22    
23     DECLARE_MODULE_V1 ("chanserv/count", false, _modinit, _moddeinit, rcsid, "The Ermyth Team <http://ermyth.schmorp.de>");
24    
25     static void cs_cmd_count (sourceinfo_t *si, int parc, char *parv[]);
26    
27     command_t cs_count = { "COUNT", N_("Shows number of entries in access lists."),
28     AC_NONE, 1, cs_cmd_count
29     };
30    
31     cmdvec *cs_cmdtree;
32     helpvec *cs_helptree;
33    
34     void
35     _modinit (module_t *m)
36     {
37     MODULE_USE_SYMBOL_T (cs_cmdtree, cmdvec, "chanserv/main", "cs_cmdtree");
38     MODULE_USE_SYMBOL_T (cs_helptree, helpvec, "chanserv/main", "cs_helptree");
39     help_addentry (cs_helptree, "COUNT", "help/cservice/count", NULL);
40     cs_cmdtree << cs_count;
41     }
42    
43     void
44     _moddeinit ()
45     {
46     help_delentry (cs_helptree, "COUNT");
47     cs_cmdtree >> cs_count;
48     }
49    
50     static void
51     cs_cmd_count (sourceinfo_t *si, int parc, char *parv[])
52     {
53     char *chan = parv[0];
54     chanacs_t *ca;
55     mychan_t *mc = mychan_find (chan);
56     unsigned int ca_sop, ca_aop, ca_hop, ca_vop;
57     int vopcnt = 0, aopcnt = 0, hopcnt = 0, sopcnt = 0, akickcnt = 0;
58     int othercnt = 0;
59     int i;
60     node_t *n;
61     char str[512];
62     int operoverride = 0;
63    
64     if (!chan)
65     {
66     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "COUNT");
67     command_fail (si, fault_needmoreparams, _("Syntax: COUNT <#channel>"));
68     return;
69     }
70    
71     if (!mc)
72     {
73     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), chan);
74     return;
75     }
76    
77     if (!chanacs_source_has_flag (mc, si, CA_ACLVIEW))
78     {
79     if (has_priv (si, PRIV_CHAN_AUSPEX))
80     operoverride = 1;
81     else
82     {
83     command_fail (si, fault_noprivs, _("You are not authorized to perform this operation."));
84     return;
85     }
86     }
87    
88     if (mc->find_metadata ("private:close:closer"))
89     {
90     command_fail (si, fault_noprivs, _("\2%s\2 is closed."), chan);
91     return;
92     }
93    
94     ca_sop = get_template_flags (mc, "SOP");
95     ca_aop = get_template_flags (mc, "AOP");
96     ca_hop = get_template_flags (mc, "HOP");
97     ca_vop = get_template_flags (mc, "VOP");
98    
99     LIST_FOREACH (n, mc->chanacs.head)
100     {
101     ca = (chanacs_t *) n->data;
102    
103     if (ca->level == ca_vop)
104     vopcnt++;
105     else if (ca->level == ca_hop)
106     hopcnt++;
107     else if (ca->level == ca_aop)
108     aopcnt++;
109     else if (ca->level == ca_sop)
110     sopcnt++;
111     else if (ca->level == CA_AKICK)
112     akickcnt++;
113     else if (ca->myuser != mc->founder)
114     othercnt++;
115     }
116     if (ca_hop == ca_vop)
117     command_success_nodata (si, _("%s: VOp: %d, AOp: %d, SOp: %d, AKick: %d, other: %d"), chan, vopcnt, aopcnt, sopcnt, akickcnt, othercnt);
118     else
119     command_success_nodata (si, _("%s: VOp: %d, HOp: %d, AOp: %d, SOp: %d, AKick: %d, other: %d"), chan, vopcnt, hopcnt, aopcnt, sopcnt, akickcnt, othercnt);
120     snprintf (str, sizeof str, "%s: ", chan);
121     for (i = 0; chanacs_flags[i].flag; i++)
122     {
123     othercnt = 0;
124     LIST_FOREACH (n, mc->chanacs.head)
125     {
126     ca = (chanacs_t *) n->data;
127    
128     if (ca->level & chanacs_flags[i].value)
129     othercnt++;
130     }
131     snprintf (str + strlen (str), sizeof str - strlen (str), "%c:%d ", chanacs_flags[i].flag, othercnt);
132     }
133     command_success_nodata (si, "%s", str);
134     if (operoverride)
135     logcommand (si, CMDLOG_ADMIN, "%s COUNT (oper override)", mc->name);
136     else
137     logcommand (si, CMDLOG_GET, "%s COUNT", mc->name);
138     }
139    
140     /* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
141     * vim:ts=8
142     * vim:sw=8
143     * vim:noexpandtab
144     */