]> jfr.im git - irc/SurrealServices/srsv.git/blob - branches/0.5.0/modules/services.pm
c7102fd7da92aca76ecf957e80dac45ffd47057b
[irc/SurrealServices/srsv.git] / branches / 0.5.0 / modules / services.pm
1 # This file is part of SurrealServices.
2 #
3 # SurrealServices is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
7 #
8 # SurrealServices is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with SurrealServices; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 package services;
17 use strict;
18
19 use SrSv::Conf::services;
20
21 use SrSv::MySQL qw($dbh);
22 use SrSv::Conf qw(main services sql);
23 use SrSv::Conf2Consts qw(main services sql);
24 use SrSv::Timer qw(add_timer);
25 use SrSv::Agent;
26 use SrSv::IRCd::Event qw(addhandler);
27 use SrSv::Log;
28 use SrSv::User qw( :flood __flood_expire );
29
30 use modules::serviceslibs::adminserv;
31 use modules::serviceslibs::nickserv;
32 use modules::serviceslibs::chanserv;
33 use modules::serviceslibs::operserv;
34 use modules::serviceslibs::botserv;
35 use modules::serviceslibs::memoserv;
36 use modules::serviceslibs::hostserv;
37
38 *conf = \%services_conf; # only used in some help docs
39
40 our @agents = (
41 [$nickserv::nsnick_default, '+opqzBHS', 'Nick Registration Agent'],
42 [$chanserv::csnick_default, '+pqzBS', 'Channel Registration Agent'],
43 [$operserv::osnick_default, '+opqzBHS', 'Operator Services Agent'],
44 [$memoserv::msnick_default, '+pqzBS', 'Memo Exchange Agent'],
45 [$botserv::bsnick_default, '+pqzBS', 'Channel Bot Control Agent'],
46 [$adminserv::asnick_default, '+pqzBS', 'Services\' Administration Agent'],
47 [$hostserv::hsnick_default, '+pqzBS', 'vHost Agent']
48 );
49 if(services_conf_nickserv) {
50 push @agents, [services_conf_nickserv, '+opqzBHS', 'Nick Registration Agent'];
51 $nickserv::nsnick = services_conf_nickserv;
52 }
53 if(services_conf_chanserv) {
54 push @agents, [services_conf_chanserv, '+pqzBS', 'Channel Registration Agent'];
55 $chanserv::csnick = services_conf_chanserv;
56 }
57 if(services_conf_operserv) {
58 push @agents, [services_conf_operserv, '+opqzBHS', 'Operator Services Agent'];
59 $operserv::osnick = services_conf_operserv;
60 }
61 if(services_conf_memoserv) {
62 push @agents, [services_conf_memoserv, '+pqzBS', 'Memo Exchange Agent'];
63 $memoserv::msnick = services_conf_memoserv;
64 }
65 if(services_conf_botserv) {
66 push @agents, [services_conf_botserv, '+pqzBS', 'Channel Bot Control Agent'];
67 $botserv::bsnick = services_conf_botserv;
68 }
69 if(services_conf_adminserv) {
70 push @agents, [services_conf_adminserv, '+pqzBS', 'Services\' Administration Agent'];
71 $adminserv::asnick = services_conf_adminserv;
72 }
73 if(services_conf_hostserv) {
74 push @agents, [services_conf_hostserv, '+pqzBS', 'vHost Agent'];
75 $hostserv::hsnick = services_conf_hostserv;
76 }
77
78 our $qlreason = 'Reserved for Services';
79
80 foreach my $a (@agents) {
81 agent_connect($a->[0], 'services', undef, $a->[1], $a->[2]);
82 ircd::sqline($a->[0], $qlreason);
83 agent_join($a->[0], main_conf_diag);
84 ircd::setmode($main::rsnick, main_conf_diag, '+o', $a->[0]);
85 }
86
87 addhandler('SEOS', undef, undef, 'services::ev_connect');
88 sub ev_connect {
89 botserv::eos();
90 nickserv::cleanup_users();
91 nickserv::fix_vhosts();
92 chanserv::eos();
93 operserv::expire();
94 }
95
96 addhandler('EOS', undef, undef, 'services::eos');
97 sub eos {
98 chanserv::eos($_[0]);
99 }
100
101 addhandler('KILL', undef, undef, 'nickserv::killhandle');
102
103 addhandler('NICKCONN', undef, undef, 'services::ev_nickconn');
104 sub ev_nickconn {
105 nickserv::nick_create(@_[0,2..4,8,5..7,9,10,11]);
106 }
107
108 # NickServ
109 addhandler('NICKCHANGE', undef, undef, 'nickserv::nick_change');
110 addhandler('QUIT', undef, undef, 'nickserv::nick_delete');
111 addhandler('UMODE', undef, undef, 'nickserv::umode');
112 addhandler('CHGHOST', undef, undef, 'nickserv::chghost');
113 addhandler('CHGIDENT', undef, undef, 'nickserv::chgident');
114 addhandler('USERIP', undef, undef, 'nickserv::userip');
115 addhandler('SQUIT', undef, undef, 'nickserv::squit') if ircd::NOQUIT();
116
117 addhandler('PRIVMSG', undef, 'nickserv', 'nickserv::dispatch');
118 addhandler('PRIVMSG', undef, lc services_conf_nickserv, 'nickserv::dispatch') if services_conf_nickserv;
119
120 addhandler('BACK', undef, undef, 'nickserv::notify_auths');
121
122 # ChanServ
123 addhandler('JOIN', undef, undef, 'chanserv::user_join');
124 addhandler('SJOIN', undef, undef, 'chanserv::handle_sjoin');
125 addhandler('PART', undef, undef, 'chanserv::user_part');
126 addhandler('KICK', undef, undef, 'chanserv::process_kick');
127 addhandler('MODE', undef, qr/^#/, 'chanserv::chan_mode');
128 addhandler('TOPIC', undef, undef, 'chanserv::chan_topic');
129
130 addhandler('PRIVMSG', undef, 'chanserv', 'chanserv::dispatch');
131 addhandler('PRIVMSG', undef, lc services_conf_chanserv, 'chanserv::dispatch') if services_conf_chanserv;
132
133 # OperServ
134 addhandler('PRIVMSG', undef, 'operserv', 'operserv::dispatch');
135 addhandler('PRIVMSG', undef, lc services_conf_operserv, 'operserv::dispatch') if services_conf_operserv;
136
137 add_timer('flood_expire', 10, __PACKAGE__, 'services::flood_expire');
138
139 sub flood_expire(;$) {
140 add_timer('flood_expire', 10, __PACKAGE__, 'services::flood_expire');
141 __flood_expire();
142 }
143
144 # MemoServ
145 addhandler('PRIVMSG', undef, 'memoserv', 'memoserv::dispatch');
146 addhandler('PRIVMSG', undef, lc services_conf_memoserv, 'memoserv::dispatch') if services_conf_memoserv;
147 addhandler('BACK', undef, undef, 'memoserv::notify');
148
149 # BotServ
150 addhandler('PRIVMSG', undef, undef, 'botserv::dispatch');
151 # botserv takes all PRIVMSG and NOTICEs, so no special dispatch is needed.
152 addhandler('NOTICE', undef, qr/^#/, 'botserv::chan_msg');
153
154 # AdminServ
155 addhandler('PRIVMSG', undef, 'adminserv', 'adminserv::dispatch');
156 addhandler('PRIVMSG', undef, lc services_conf_adminserv, 'adminserv::dispatch') if services_conf_adminserv;
157
158 add_timer('', 30, __PACKAGE__, 'services::maint');
159 #add_timer('', 20, __PACKAGE__, 'nickserv::cleanup_users');
160 add_timer('', 60, __PACKAGE__, 'nickserv::expire_silence_timed');
161
162 # HostServ
163 addhandler('PRIVMSG', undef, 'hostserv', 'hostserv::dispatch');
164 addhandler('PRIVMSG', undef, lc services_conf_hostserv, 'hostserv::dispatch') if services_conf_hostserv;
165
166 # $nick should be a registered root nick, if applicable
167 # $src is the nick or nickid that sent the command
168 sub ulog($$$$;$$) {
169 my ($service, $level, $text) = splice(@_, 0, 3);
170
171 my $hostmask = nickserv::get_hostmask($_[0]);
172
173 # TODO - Record this in the database
174
175 wlog($service, $level, "$hostmask - $text");
176 }
177
178 sub maint {
179 wlog($main::rsnick, LOG_INFO(), " -- Running maintenance routines.");
180 add_timer('', 3600, __PACKAGE__, 'services::maint');
181
182 nickserv::expire();
183 chanserv::expire();
184
185 wlog($main::rsnick, LOG_INFO(), " -- Maintenance routines complete.");
186 }
187
188 sub init {
189 return if main::COMPILE_ONLY();
190 my $tmpdbh = DBI->connect("DBI:mysql:".sql_conf_mysql_db, sql_conf_mysql_user, sql_conf_mysql_pass, { AutoCommit => 1, RaiseError => 1 });
191
192 $tmpdbh->do("TRUNCATE TABLE chanuser");
193 $tmpdbh->do("TRUNCATE TABLE nickchg");
194 $tmpdbh->do("TRUNCATE TABLE chan");
195 $tmpdbh->do("TRUNCATE TABLE chanban");
196 $tmpdbh->do("UPDATE user SET online=0, quittime=".time());
197
198 $tmpdbh->disconnect;
199 }
200
201 sub begin {
202 nickserv::init();
203 chanserv::init();
204 operserv::init();
205 botserv::init();
206 adminserv::init();
207 memoserv::init();
208 hostserv::init();
209 }
210
211 sub end {
212 $dbh->disconnect;
213 }
214
215 sub unload { }
216
217 1;