]>
Commit | Line | Data |
---|---|---|
aecfa1fd | 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; | |
5e682044 | 18 | use Data::Dumper; |
aecfa1fd | 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); | |
5e682044 | 84 | my $rsUser = { NICK => $main::rsnick, ID => ircd::getUuid($main::rsnick) }; |
85 | my $agent = { NICK => $a->[0], ID => ircd::getUuid ($a->[0]) }; | |
86 | ircd::setmode($agent, main_conf_diag, '+o', $agent); | |
aecfa1fd | 87 | } |
88 | ||
5e682044 | 89 | addhandler('ENDBURST', undef, undef, 'services::ev_connect'); |
aecfa1fd | 90 | sub ev_connect { |
91 | botserv::eos(); | |
92 | nickserv::cleanup_users(); | |
93 | nickserv::fix_vhosts(); | |
94 | chanserv::eos(); | |
95 | operserv::expire(); | |
96 | } | |
97 | ||
5e682044 | 98 | addhandler('ENDBURST', undef, undef, 'services::eos'); |
aecfa1fd | 99 | sub eos { |
100 | chanserv::eos($_[0]); | |
101 | } | |
102 | ||
103 | addhandler('KILL', undef, undef, 'nickserv::killhandle'); | |
104 | ||
105 | addhandler('NICKCONN', undef, undef, 'services::ev_nickconn'); | |
106 | sub ev_nickconn { | |
107 | nickserv::nick_create(@_[0,2..4,8,5..7,9,10,11]); | |
108 | } | |
109 | ||
110 | # NickServ | |
111 | addhandler('NICKCHANGE', undef, undef, 'nickserv::nick_change'); | |
112 | addhandler('QUIT', undef, undef, 'nickserv::nick_delete'); | |
113 | addhandler('UMODE', undef, undef, 'nickserv::umode'); | |
114 | addhandler('CHGHOST', undef, undef, 'nickserv::chghost'); | |
115 | addhandler('CHGIDENT', undef, undef, 'nickserv::chgident'); | |
116 | addhandler('USERIP', undef, undef, 'nickserv::userip'); | |
117 | addhandler('SQUIT', undef, undef, 'nickserv::squit') if ircd::NOQUIT(); | |
5e682044 | 118 | addhandler("OPERUP", undef, undef, 'nickserv::handle_oper'); |
92c29160 | 119 | addhandler('PRIVMSG', undef, undef, 'core::dispatch'); |
5e682044 | 120 | addhandler('PRIVMSG', undef, undef, 'nickserv::dispatch'); |
aecfa1fd | 121 | addhandler('PRIVMSG', undef, lc services_conf_nickserv, 'nickserv::dispatch') if services_conf_nickserv; |
122 | ||
123 | addhandler('BACK', undef, undef, 'nickserv::notify_auths'); | |
124 | ||
125 | # ChanServ | |
126 | addhandler('JOIN', undef, undef, 'chanserv::user_join'); | |
127 | addhandler('SJOIN', undef, undef, 'chanserv::handle_sjoin'); | |
128 | addhandler('PART', undef, undef, 'chanserv::user_part'); | |
129 | addhandler('KICK', undef, undef, 'chanserv::process_kick'); | |
130 | addhandler('MODE', undef, qr/^#/, 'chanserv::chan_mode'); | |
131 | addhandler('TOPIC', undef, undef, 'chanserv::chan_topic'); | |
132 | ||
5e682044 | 133 | addhandler('PRIVMSG', undef, undef, 'chanserv::dispatch'); |
aecfa1fd | 134 | addhandler('PRIVMSG', undef, lc services_conf_chanserv, 'chanserv::dispatch') if services_conf_chanserv; |
135 | ||
136 | # OperServ | |
5e682044 | 137 | addhandler('PRIVMSG', undef, undef, 'operserv::dispatch'); |
aecfa1fd | 138 | addhandler('PRIVMSG', undef, lc services_conf_operserv, 'operserv::dispatch') if services_conf_operserv; |
139 | ||
140 | add_timer('flood_expire', 10, __PACKAGE__, 'services::flood_expire'); | |
141 | ||
142 | sub flood_expire(;$) { | |
143 | add_timer('flood_expire', 10, __PACKAGE__, 'services::flood_expire'); | |
144 | __flood_expire(); | |
145 | } | |
146 | ||
147 | # MemoServ | |
5e682044 | 148 | addhandler('PRIVMSG', undef, undef, 'memoserv::dispatch'); |
aecfa1fd | 149 | addhandler('PRIVMSG', undef, lc services_conf_memoserv, 'memoserv::dispatch') if services_conf_memoserv; |
150 | addhandler('BACK', undef, undef, 'memoserv::notify'); | |
151 | ||
152 | # BotServ | |
153 | addhandler('PRIVMSG', undef, undef, 'botserv::dispatch'); | |
154 | # botserv takes all PRIVMSG and NOTICEs, so no special dispatch is needed. | |
155 | addhandler('NOTICE', undef, qr/^#/, 'botserv::chan_msg'); | |
156 | ||
157 | # AdminServ | |
5e682044 | 158 | addhandler('PRIVMSG', undef, undef, 'adminserv::dispatch'); |
aecfa1fd | 159 | addhandler('PRIVMSG', undef, lc services_conf_adminserv, 'adminserv::dispatch') if services_conf_adminserv; |
160 | ||
161 | add_timer('', 30, __PACKAGE__, 'services::maint'); | |
162 | #add_timer('', 20, __PACKAGE__, 'nickserv::cleanup_users'); | |
163 | add_timer('', 60, __PACKAGE__, 'nickserv::expire_silence_timed'); | |
164 | ||
165 | # HostServ | |
5e682044 | 166 | addhandler('PRIVMSG', undef, undef, 'hostserv::dispatch'); |
aecfa1fd | 167 | addhandler('PRIVMSG', undef, lc services_conf_hostserv, 'hostserv::dispatch') if services_conf_hostserv; |
168 | ||
169 | # $nick should be a registered root nick, if applicable | |
170 | # $src is the nick or nickid that sent the command | |
171 | sub ulog($$$$;$$) { | |
172 | my ($service, $level, $text) = splice(@_, 0, 3); | |
173 | ||
174 | my $hostmask = nickserv::get_hostmask($_[0]); | |
175 | ||
176 | # TODO - Record this in the database | |
177 | ||
178 | wlog($service, $level, "$hostmask - $text"); | |
179 | } | |
180 | ||
181 | sub maint { | |
182 | wlog($main::rsnick, LOG_INFO(), " -- Running maintenance routines."); | |
183 | add_timer('', 3600, __PACKAGE__, 'services::maint'); | |
184 | ||
185 | nickserv::expire(); | |
186 | chanserv::expire(); | |
187 | ||
188 | wlog($main::rsnick, LOG_INFO(), " -- Maintenance routines complete."); | |
189 | } | |
190 | ||
191 | sub init { | |
192 | return if main::COMPILE_ONLY(); | |
193 | my $tmpdbh = DBI->connect("DBI:mysql:".sql_conf_mysql_db, sql_conf_mysql_user, sql_conf_mysql_pass, { AutoCommit => 1, RaiseError => 1 }); | |
194 | ||
195 | $tmpdbh->do("TRUNCATE TABLE chanuser"); | |
196 | $tmpdbh->do("TRUNCATE TABLE nickchg"); | |
197 | $tmpdbh->do("TRUNCATE TABLE chan"); | |
198 | $tmpdbh->do("TRUNCATE TABLE chanban"); | |
199 | $tmpdbh->do("UPDATE user SET online=0, quittime=".time()); | |
200 | ||
201 | $tmpdbh->disconnect; | |
202 | } | |
203 | ||
204 | sub begin { | |
205 | nickserv::init(); | |
206 | chanserv::init(); | |
207 | operserv::init(); | |
208 | botserv::init(); | |
209 | adminserv::init(); | |
210 | memoserv::init(); | |
211 | hostserv::init(); | |
212 | } | |
213 | ||
214 | sub end { | |
215 | $dbh->disconnect; | |
216 | } | |
217 | ||
218 | sub unload { } | |
219 | ||
220 | 1; |