]> jfr.im git - irc/SurrealServices/srsv.git/blob - branches/0.5.0/modules/services.pm
first hack at merging erry's work + the current release 0.4.3,
[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 use Data::Dumper;
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 print "AGENT " . Dumper($a);
82 agent_connect($a->[0], 'services', undef, $a->[1], $a->[2]);
83 ircd::sqline($a->[0], $qlreason);
84 agent_join($a->[0], main_conf_diag);
85 my $rsUser = { NICK => $main::rsnick, ID => ircd::getUuid($main::rsnick) };
86 my $agent = { NICK => $a->[0], ID => ircd::getUuid ($a->[0]) };
87 ircd::setmode($agent, main_conf_diag, '+o', $agent);
88 }
89
90 addhandler('ENDBURST', undef, undef, 'services::ev_connect');
91 sub ev_connect {
92 botserv::eos();
93 nickserv::cleanup_users();
94 nickserv::fix_vhosts();
95 chanserv::eos();
96 operserv::expire();
97 }
98
99 addhandler('ENDBURST', undef, undef, 'services::eos');
100 sub eos {
101 chanserv::eos($_[0]);
102 }
103
104 addhandler('KILL', undef, undef, 'nickserv::killhandle');
105
106 addhandler('NICKCONN', undef, undef, 'services::ev_nickconn');
107 sub ev_nickconn {
108 nickserv::nick_create(@_[0,2..4,8,5..7,9,10,11]);
109 }
110
111 # NickServ
112 addhandler('NICKCHANGE', undef, undef, 'nickserv::nick_change');
113 addhandler('QUIT', undef, undef, 'nickserv::nick_delete');
114 addhandler('UMODE', undef, undef, 'nickserv::umode');
115 addhandler('CHGHOST', undef, undef, 'nickserv::chghost');
116 addhandler('CHGIDENT', undef, undef, 'nickserv::chgident');
117 addhandler('USERIP', undef, undef, 'nickserv::userip');
118 addhandler('SQUIT', undef, undef, 'nickserv::squit') if ircd::NOQUIT();
119 addhandler("OPERUP", undef, undef, 'nickserv::handle_oper');
120 addhandler('PRIVMSG', undef, undef, 'nickserv::dispatch');
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
133 addhandler('PRIVMSG', undef, undef, 'chanserv::dispatch');
134 addhandler('PRIVMSG', undef, lc services_conf_chanserv, 'chanserv::dispatch') if services_conf_chanserv;
135
136 # OperServ
137 addhandler('PRIVMSG', undef, undef, 'operserv::dispatch');
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
148 addhandler('PRIVMSG', undef, undef, 'memoserv::dispatch');
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
158 addhandler('PRIVMSG', undef, undef, 'adminserv::dispatch');
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
166 addhandler('PRIVMSG', undef, undef, 'hostserv::dispatch');
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;