ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/chanserv/count.C
Revision: 1.6
Committed: Thu Aug 30 19:56:20 2007 UTC (19 years, 1 month ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.5: +8 -8 lines
Log Message:
- put faultcodes into their own namespace
- removed old files
- limited header garbage in atheme.h
- macros to inline bools for connection_t::is_*
- put some connection_t functions into the connection_t class

File Contents

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