]> jfr.im git - irc/SurrealServices/srsv.git/blame - branches/0.5.0/modules/services.pm
Fwiw, it';s a lot more stable now. Most stuff seems to work.
[irc/SurrealServices/srsv.git] / branches / 0.5.0 / modules / services.pm
CommitLineData
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
16package services;
17use strict;
5e682044 18use Data::Dumper;
aecfa1fd 19use SrSv::Conf::services;
20
21use SrSv::MySQL qw($dbh);
22use SrSv::Conf qw(main services sql);
23use SrSv::Conf2Consts qw(main services sql);
24use SrSv::Timer qw(add_timer);
25use SrSv::Agent;
26use SrSv::IRCd::Event qw(addhandler);
27use SrSv::Log;
28use SrSv::User qw( :flood __flood_expire );
29
30use modules::serviceslibs::adminserv;
31use modules::serviceslibs::nickserv;
32use modules::serviceslibs::chanserv;
33use modules::serviceslibs::operserv;
34use modules::serviceslibs::botserv;
35use modules::serviceslibs::memoserv;
36use modules::serviceslibs::hostserv;
37
38*conf = \%services_conf; # only used in some help docs
39
40our @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);
49if(services_conf_nickserv) {
50 push @agents, [services_conf_nickserv, '+opqzBHS', 'Nick Registration Agent'];
51 $nickserv::nsnick = services_conf_nickserv;
52}
53if(services_conf_chanserv) {
54 push @agents, [services_conf_chanserv, '+pqzBS', 'Channel Registration Agent'];
55 $chanserv::csnick = services_conf_chanserv;
56}
57if(services_conf_operserv) {
58 push @agents, [services_conf_operserv, '+opqzBHS', 'Operator Services Agent'];
59 $operserv::osnick = services_conf_operserv;
60}
61if(services_conf_memoserv) {
62 push @agents, [services_conf_memoserv, '+pqzBS', 'Memo Exchange Agent'];
63 $memoserv::msnick = services_conf_memoserv;
64}
65if(services_conf_botserv) {
66 push @agents, [services_conf_botserv, '+pqzBS', 'Channel Bot Control Agent'];
67 $botserv::bsnick = services_conf_botserv;
68}
69if(services_conf_adminserv) {
70 push @agents, [services_conf_adminserv, '+pqzBS', 'Services\' Administration Agent'];
71 $adminserv::asnick = services_conf_adminserv;
72}
73if(services_conf_hostserv) {
74 push @agents, [services_conf_hostserv, '+pqzBS', 'vHost Agent'];
75 $hostserv::hsnick = services_conf_hostserv;
76}
77
78our $qlreason = 'Reserved for Services';
79
80foreach 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 89addhandler('ENDBURST', undef, undef, 'services::ev_connect');
aecfa1fd 90sub ev_connect {
91 botserv::eos();
92 nickserv::cleanup_users();
93 nickserv::fix_vhosts();
94 chanserv::eos();
95 operserv::expire();
96}
97
5e682044 98addhandler('ENDBURST', undef, undef, 'services::eos');
aecfa1fd 99sub eos {
100 chanserv::eos($_[0]);
101}
102
103addhandler('KILL', undef, undef, 'nickserv::killhandle');
104
105addhandler('NICKCONN', undef, undef, 'services::ev_nickconn');
106sub ev_nickconn {
107 nickserv::nick_create(@_[0,2..4,8,5..7,9,10,11]);
108}
109
110# NickServ
111addhandler('NICKCHANGE', undef, undef, 'nickserv::nick_change');
112addhandler('QUIT', undef, undef, 'nickserv::nick_delete');
113addhandler('UMODE', undef, undef, 'nickserv::umode');
114addhandler('CHGHOST', undef, undef, 'nickserv::chghost');
115addhandler('CHGIDENT', undef, undef, 'nickserv::chgident');
116addhandler('USERIP', undef, undef, 'nickserv::userip');
117addhandler('SQUIT', undef, undef, 'nickserv::squit') if ircd::NOQUIT();
5e682044 118addhandler("OPERUP", undef, undef, 'nickserv::handle_oper');
92c29160 119addhandler('PRIVMSG', undef, undef, 'core::dispatch');
5e682044 120addhandler('PRIVMSG', undef, undef, 'nickserv::dispatch');
aecfa1fd 121addhandler('PRIVMSG', undef, lc services_conf_nickserv, 'nickserv::dispatch') if services_conf_nickserv;
122
123addhandler('BACK', undef, undef, 'nickserv::notify_auths');
124
125# ChanServ
126addhandler('JOIN', undef, undef, 'chanserv::user_join');
127addhandler('SJOIN', undef, undef, 'chanserv::handle_sjoin');
128addhandler('PART', undef, undef, 'chanserv::user_part');
129addhandler('KICK', undef, undef, 'chanserv::process_kick');
130addhandler('MODE', undef, qr/^#/, 'chanserv::chan_mode');
131addhandler('TOPIC', undef, undef, 'chanserv::chan_topic');
132
5e682044 133addhandler('PRIVMSG', undef, undef, 'chanserv::dispatch');
aecfa1fd 134addhandler('PRIVMSG', undef, lc services_conf_chanserv, 'chanserv::dispatch') if services_conf_chanserv;
135
136# OperServ
5e682044 137addhandler('PRIVMSG', undef, undef, 'operserv::dispatch');
aecfa1fd 138addhandler('PRIVMSG', undef, lc services_conf_operserv, 'operserv::dispatch') if services_conf_operserv;
139
140add_timer('flood_expire', 10, __PACKAGE__, 'services::flood_expire');
141
142sub flood_expire(;$) {
143 add_timer('flood_expire', 10, __PACKAGE__, 'services::flood_expire');
144 __flood_expire();
145}
146
147# MemoServ
5e682044 148addhandler('PRIVMSG', undef, undef, 'memoserv::dispatch');
aecfa1fd 149addhandler('PRIVMSG', undef, lc services_conf_memoserv, 'memoserv::dispatch') if services_conf_memoserv;
150addhandler('BACK', undef, undef, 'memoserv::notify');
151
152# BotServ
153addhandler('PRIVMSG', undef, undef, 'botserv::dispatch');
154# botserv takes all PRIVMSG and NOTICEs, so no special dispatch is needed.
155addhandler('NOTICE', undef, qr/^#/, 'botserv::chan_msg');
156
157# AdminServ
5e682044 158addhandler('PRIVMSG', undef, undef, 'adminserv::dispatch');
aecfa1fd 159addhandler('PRIVMSG', undef, lc services_conf_adminserv, 'adminserv::dispatch') if services_conf_adminserv;
160
161add_timer('', 30, __PACKAGE__, 'services::maint');
162#add_timer('', 20, __PACKAGE__, 'nickserv::cleanup_users');
163add_timer('', 60, __PACKAGE__, 'nickserv::expire_silence_timed');
164
165# HostServ
5e682044 166addhandler('PRIVMSG', undef, undef, 'hostserv::dispatch');
aecfa1fd 167addhandler('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
171sub 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
181sub 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
191sub 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
204sub begin {
205 nickserv::init();
206 chanserv::init();
207 operserv::init();
208 botserv::init();
209 adminserv::init();
210 memoserv::init();
211 hostserv::init();
212}
213
214sub end {
215 $dbh->disconnect;
216}
217
218sub unload { }
219
2201;