summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-default/channels.xml30
-rw-r--r--config-default/commands.xml16
-rw-r--r--config-default/settings.xml4
-rwxr-xr-xmeta.pl20
-rw-r--r--modules/classes.pl38
-rw-r--r--modules/command.pl2
-rw-r--r--modules/event.pl48
-rw-r--r--modules/inspect.pl24
-rw-r--r--modules/log.pl32
-rw-r--r--modules/mysql.pl3
-rw-r--r--modules/xml.pl9
11 files changed, 145 insertions, 81 deletions
diff --git a/config-default/channels.xml b/config-default/channels.xml
index 9cefb35..035fcd4 100644
--- a/config-default/channels.xml
+++ b/config-default/channels.xml
@@ -38,7 +38,9 @@
<opalert>numist</opalert>
<opalert>PhilKC</opalert>
</hilights>
- <msgs opalert="##linux-ops" />
+ <msgs>
+ <opalert>##linux-ops</opalert>
+ </msgs>
</channel>
<channel id="##windows" op="no">
<hilights>
@@ -63,6 +65,11 @@
<debug>newmanbe</debug>
</hilights>
</channel>
+ <channel id="#wikimedia" op="no">
+ <msgs>
+ <low>#wikimedia-ops</low>
+ </msgs>
+ </channel>
<channel id="#wikimedia-commons" op="no">
<hilights>
<debug>White_cat</debug>
@@ -102,12 +109,16 @@
<low>stylus</low>
<low>Martinp23</low>
<low>Soms</low>
+ <low>Daniel-Bryant</low>
+ <low>amidaniel</low>
+ <low>Gracenotes</low>
+ <low>SWATJester</low>
</hilights>
<msgs>
<debug>#wikimedia-ops</debug>
</msgs>
</channel>
- <channel id="#wikipedia-en" op="no">
+ <channel id="#wikipedia-en" op="yes">
<hilights>
<debug>White_Cat</debug>
<low>AppleBoy</low>
@@ -142,7 +153,12 @@
<debug>#wikimedia-ops</debug>
</msgs>
</channel>
- <channel id="default" op="yes">
+ <channel id="#wikipedia-social" op="no">
+ <msgs>
+ <low>#wikimedia-ops</low>
+ </msgs>
+ </channel>
+ <channel id="default" op="no">
<event id="flood-15to45" action="none" class="floodqueue" reason="flooding 15 to 45" risk="low" time="0" type="public">15:45</event>
</channel>
<channel id="master">
@@ -152,7 +168,7 @@
<event id="dcc" action="ban" class="re" override="dcc-medium" reason="using the DC.C SE.ND exploit" risk="high" time="0" type="public">^DCC SEND |\bDCC SEND &quot;?[A-Za-z0-9]+&quot;? \d+ \d+ \d+</event>
<event id="dcc-medium" action="ban" class="re" reason="using the DC.C SE.ND exploit" risk="medium" time="0" type="public">DCC SEND </event>
<event id="dcc-topic" action="ban" class="re" reason="setting a bad topic" risk="medium" time="0" type="topic">\bDCC SEND </event>
- <event id="ddos_countdown" action="none" class="re" reasion="doing the ddos countdown thing" risk="medium" time="0" type="public">^... DDOS COUNTDOWN ...$</event>
+ <event id="ddos_countdown" action="none" class="re" reason="doing the ddos countdown thing" risk="medium" time="0" type="public">^... DDOS COUNTDOWN.*</event>
<event id="dosrequest" action="none" class="re" reason="requesting a DoS" risk="medium" time="0" type="public">via paypal if you DoS somone for</event>
<event id="dronebl" action="ban" class="dnsbl" override="ahbl" reason="in dnsbl.dronebl.org" risk="info" time="0" type="join">dnsbl.dronebl.org</event>
<event id="efnet_rbl" action="none" class="dnsbl" reason="in rbl.efnet.org" risk="info" time="0" type="join">rbl.efnet.org</event>
@@ -167,16 +183,16 @@
<event id="last_measure_regex" action="kban" class="re" reason="posting what appears to be a last measure link" risk="medium" time="0" type="public">http://\S+\.on\.nimp\.org</event>
<event id="lesbian" action="ban" class="re" reason="bad nick match (lesbian..)" risk="medium" time="0" type="join">^lesbian..$</event>
<event id="magical" action="none" class="ident" reason="typical w00t ident" risk="info" time="0" type="join">i=magical</event>
- <event id="massflood" action="ban" class="splitflood" reason="distributed flooding" risk="medium" time="0" type="public,part,caction">5:3</event>
+ <event id="massflood" action="ban" class="splitflood" reason="distributed flooding" risk="high" time="0" type="public,part,caction">5:3</event>
<event id="massflood2" action="ban" class="splitflood" reason="distributed flooding" risk="medium" time="0" type="caction">5:3</event>
- <event id="nick_cupid" action="ban" class="re" reason="bad nick match (cupid..)" risk="medium" time="0" type="join">^cupid..$</event>
- <event id="nick_mudkip" action="ban" class="re" reason="bad nick match (mudkip..)" risk="medium" time="0" type="join">MUDKIP..</event>
<event id="nickspam" action="ban" class="nickspam" reason="nickspamming" risk="high" time="0" type="public">150:20</event>
<event id="notice" action="ban" class="re" reason="sending a notice to the channel" risk="high" time="0" type="notice">.*</event>
<event id="redarmyoflol" action="ban" class="re" reason="parting with 'red army of lol'" risk="low" time="0" type="part">RED ARMY OF LOL</event>
<event id="sms_spam" action="none" class="re" reason="spam link / virus" risk="low" time="0" type="public">\.com/sms.exe</event>
<event id="weirdspam_1" action="none" class="re" reason="wwe mass murderer nonsense" risk="medium" time="0" type="public">hello sir, my name is Chris Benoit and I am a WWE MASS MURDERER.</event>
<event id="wikifags2" action="none" class="re" nocase="nocase" reason="saying 'sure are a lot of wikifag'..." risk="low" time="0" type="public">sure are a ?lot of wikifag</event>
+ <event id="dcc-part" action="ban" class="re" reason="using the DC.C SE.ND exploit in a part message" risk="high" time="0" type="part">DCC SEND </event>
+ <event id="levenflood" action="none" class="levenflood" reason="levenshtein flood match" risk="debug" time="0" type="public" override="flood-5to3">contentisuseless</event>
<hilights>
<debug>AfterDeath</debug>
</hilights>
diff --git a/config-default/commands.xml b/config-default/commands.xml
index 6b36aa4..5e5f9e8 100644
--- a/config-default/commands.xml
+++ b/config-default/commands.xml
@@ -162,7 +162,7 @@
</command>
<command cmd="^;rehash$" flag="a">
<![CDATA[
- readXML();
+ ASM::XML->readXML();
$conn->privmsg($event->{to}->[0], 'config files were re-read');
]]>
</command>
@@ -178,21 +178,25 @@
</command>
<command cmd="^;exempt (.*)" flag="o">
<![CDATA[
- push(@::eline, $1);
- "$1\n" >> io 'exempt.txt';
- $conn->privmsg($event->{to}->[0], "$1 exempted");
+ $::eline{lc $1} = 1;
+ "lc $1\n" >> io 'exempt.txt';
+ $conn->privmsg($event->{to}->[0], "lc $1 exempted");
]]>
</command>
<command cmd="^\!ops *(.*)">
<![CDATA[
- my $hilite=commaAndify(getAlert($event->{to}->[0], 'opalert', 'hilights'));
- $conn->privmsg($_, "$hilite: $event->{nick} wants your attention ($1) ") foreach getAlert($event->{to}->[0], 'opalert', 'msgs');
+ my $hilite=ASM::Util->commaAndify(ASM::Util->getAlert($event->{to}->[0], 'opalert', 'hilights'));
+ $conn->privmsg($_, "$hilite: $event->{nick} wants your attention ($1) ") foreach ASM::Util->getAlert($event->{to}->[0], 'opalert', 'msgs');
]]>
</command>
<command cmd="^;re(load|hash) exempts" flag="a">
<![CDATA[
@eline=io('exempt.txt')->getlines;
chomp @eline;
+ %::eline = ();
+ foreach my $item (@eline) {
+ $::eline{lc $item} = 1;
+ }
]]>
</command>
</commands>
diff --git a/config-default/settings.xml b/config-default/settings.xml
index f90dde6..cb9e554 100644
--- a/config-default/settings.xml
+++ b/config-default/settings.xml
@@ -20,8 +20,8 @@
<autojoin>#wikimedia-commons-social</autojoin>
</autojoins>
<log>
- <dir>logs/$chan</dir>
- <filefmt>$chan-%m-%d-%Y.log</filefmt>
+ <dir>logs/</dir>
+ <filefmt>-%m-%d-%Y.log</filefmt>
<timefmt>%B %d %T </timefmt>
<zone>GMT</zone>
</log>
diff --git a/meta.pl b/meta.pl
index 64236f3..4b71024 100755
--- a/meta.pl
+++ b/meta.pl
@@ -1,6 +1,12 @@
#!/usr/bin/perl -w
use lib '/home/icxcnika/AntiSpamMeta';
+#use Devel::Profiler
+# package_filter => sub {
+# my $pkg = shift;
+# return 0 if $pkg =~ /^XML::Simple/;
+# return 1;
+# };
use warnings;
use strict;
use Net::IRC;
@@ -8,12 +14,13 @@ use Data::Dumper;
use IO::All;
use Getopt::Long;
-@::eline=();
+%::eline=();
$::pass = '';
-my @modules = qw/Xml Util Inspect Services Log Command Event Classes Actions Mysql OperQueue/;
-
+BEGIN {
+my @modules = qw/Xml Util Inspect Event Services Log Command Classes Actions Mysql OperQueue/;
require 'modules/' . lc $_ . '.pl' foreach @modules;
+}
sub init {
my ( $conn, $host );
@@ -45,8 +52,11 @@ sub init {
$::commander = ASM::Commander->new();
$::event = ASM::Event->new($conn, $::inspector);
$::classes = ASM::Classes->new();
- @::eline=io('exempt.txt')->getlines;
- chomp @::eline;
+ my @eline=io('exempt.txt')->getlines;
+ chomp @eline;
+ foreach my $item (@eline) {
+ $::eline{lc $item} = 1;
+ }
$irc->start();
}
diff --git a/modules/classes.pl b/modules/classes.pl
index 3ccd113..93c5e12 100644
--- a/modules/classes.pl
+++ b/modules/classes.pl
@@ -2,6 +2,8 @@ package ASM::Classes;
use strict;
use warnings;
+use Text::LevenshteinXS qw(distance);
+
my %sf = ();
sub new
@@ -19,6 +21,7 @@ sub new
"host" => \&host,
"gecos" => \&gecos,
"nuhg" => \&nuhg,
+ "levenflood" => \&levenflood,
};
$self->{ftbl} = $tbl;
bless($self);
@@ -31,6 +34,40 @@ sub check {
return $self->{ftbl}->{$item}->(@_);
}
+my %ls = ();
+sub levenflood {
+ my ($xchk, $id, $event, $chan) = @_;
+ my $text;
+ if ($event->{type} =~ /^(public|notice|part|caction)$/) {
+ $text=$event->{args}->[0];
+ }
+ return 0 unless defined($text);
+ return 0 unless length($text) >= 30;
+ if ( ! defined($ls{$chan}) ) {
+ $ls{$chan} = [ $text ];
+ return 0;
+ }
+ my @leven = @{$ls{$chan}};
+ my $ret = 0;
+ if ( $#leven >= 5 ) {
+ my $mx = 0;
+ foreach my $item ( @leven ) {
+ next unless length($text) eq length($item);
+ my $tld = distance($text, $item);
+ if ($tld <= 4) {
+ $mx = $mx + 1;
+ }
+ }
+ if ($mx >= 5) {
+ $ret = 1;
+ }
+ }
+ push(@leven, $text);
+ shift @leven if $#leven > 10;
+ $ls{$chan} = \@leven;
+ return $ret;
+}
+
sub dnsbl {
my ($xchk, $id, $event, $chan, $rev) = @_;
my %chk = %{$xchk};
@@ -177,4 +214,5 @@ sub flood_process {
}
}
+
return 1;
diff --git a/modules/command.pl b/modules/command.pl
index 80cda19..b0523c4 100644
--- a/modules/command.pl
+++ b/modules/command.pl
@@ -25,7 +25,7 @@ sub command
next unless defined($::users->{person}->{$nick}->{flags});
next unless (grep {$_ eq $command->{flag}} split('', $::users->{person}->{$nick}->{flags}));
if ($::users->{person}->{$nick}->{host} ne 'IDENTIFY') {
- next unless leq($::users->{person}->{$nick}->{host}, $event->{host});
+ next unless (lc $::users->{person}->{$nick}->{host} eq lc $event->{host});
}
else {
if ( $cmd =~ /$command->{cmd}/ ){
diff --git a/modules/event.pl b/modules/event.pl
index d644b20..ede0efd 100644
--- a/modules/event.pl
+++ b/modules/event.pl
@@ -67,7 +67,7 @@ sub on_connect {
$conn->privmsg( 'NickServ', "ghost $::settings->{nick} $::settings->{pass}" ) if lc $event->{args}->[0] ne lc $::settings->{nick};
}
-my @leven = ();
+#my @leven = ();
sub on_join {
my ($self, $conn, $event) = @_;
@@ -103,21 +103,21 @@ sub on_join {
}
}
$::log->logg( $event );
- if ( $#leven ne -1 ) {
- my $ld = ( ( maxlen($nick, $leven[0]) - distance($nick, $leven[0]) ) / maxlen($nick, $leven[0]) );
- my $mx = $leven[0];
- foreach my $item ( @leven ) {
- next if $nick eq $item; # avoid dups
- my $tld = ( ( maxlen($nick, $item) - distance($nick, $item) ) / maxlen($nick, $item) );
- if ($tld > $ld) {
- $ld = $tld;
- $mx = $item;
- }
- }
- print "Best match for $nick was $mx with $ld\n"
- }
- push(@leven, $nick);
- shift @leven if $#leven > 5;
+# if ( $#leven ne -1 ) {
+# my $ld = ( ( maxlen($nick, $leven[0]) - distance($nick, $leven[0]) ) / maxlen($nick, $leven[0]) );
+# my $mx = $leven[0];
+# foreach my $item ( @leven ) {
+# next if $nick eq $item; # avoid dups
+# my $tld = ( ( maxlen($nick, $item) - distance($nick, $item) ) / maxlen($nick, $item) );
+# if ($tld > $ld) {
+# $ld = $tld;
+# $mx = $item;
+# }
+# }
+# print "Best match for $nick was $mx with $ld\n"
+# }
+# push(@leven, $nick);
+# shift @leven if $#leven > 5;
}
sub on_part
@@ -265,14 +265,16 @@ sub on_kick {
}
my $nick = lc $event->{to}->[0];
$::log->logg( $event );
- my @mship = @{$::sn{$nick}->{mship}};
- @mship = grep { lc $_ ne lc $event->{args}->[0] } @mship;
- if ( @mship ) {
- $::sn{$nick}->{mship} = \@mship;
- } else {
- delete($::sn{$nick});
+ if (defined($::sn{$nick}) && defined($::sn{$nick}->{mship})) {
+ my @mship = @{$::sn{$nick}->{mship}};
+ @mship = grep { lc $_ ne lc $event->{to}->[0] } @mship;
+ if ( @mship ) {
+ $::sn{$nick}->{mship} = \@mship;
+ } else {
+ delete($::sn{$nick});
+ }
}
- if ( leq( $conn->{_nick}, $nick ) )
+ if ( lc $conn->{_nick} eq lc $nick )
{
delete( $::sc{lc $event->{args}->[0]} );
}
diff --git a/modules/inspect.pl b/modules/inspect.pl
index 9b03ca1..a5fd732 100644
--- a/modules/inspect.pl
+++ b/modules/inspect.pl
@@ -2,7 +2,6 @@ package ASM::Inspect;
use warnings;
use strict;
-use List::Util qw(first);
use Data::Dumper;
%::ignored = ();
@@ -24,16 +23,11 @@ sub inspect {
my @override = [];
our $unmode='';
my $nick = lc $event->{nick};
- return if (defined(first { ( lc $event->{nick} eq lc $_ ) } @::eline));
- return if (defined(first { ( lc $event->{user} eq lc $_ ) } @::eline));
- return if (defined(first { ( lc $event->{host} eq lc $_ ) } @::eline));
+ return if (defined($::eline{$nick}) || defined($::eline{lc $event->{user}}) || defined(lc $event->{host}));
$iaddr = gethostbyname($event->{host});
$rev = join('.', reverse(unpack('C4', $iaddr))).'.' if (defined $iaddr);
%monx = defined($::channels->{channel}->{master}->{event}) ? %{$::channels->{channel}->{master}->{event}} : ();
## NB: isn't there a better way to do this with grep, somehow?
-# foreach ( @::ignored ) {
-# return if (lc $event->{nick} eq $_);
-# }
foreach $chan ( @{$event->{to}} ) {
next unless $chan =~ /^#/;
%conx = defined($::channels->{channel}->{lc $chan}->{event}) ? %{$::channels->{channel}->{lc $chan}->{event}} : ();
@@ -41,11 +35,7 @@ sub inspect {
foreach $id (keys %aonx) {
next unless ( defined(first { lc $_ eq $event->{type} } split(/[,:; ]+/, $aonx{$id}{type}) ) )
|| ( lc $event->{type} eq lc $aonx{$id}{type} );
-# next unless ( defined($::classes->{class}->{$aonx{$id}{class}}));
$dct{$id} = $aonx{$id} if $::classes->check($aonx{$id}{class}, $aonx{$id}, $id, $event, $chan, $rev);
-# my ($chk, $id, $event, $chan) = @_;
-# eval "Classes::" . $aonx{$id}{class} . "();";
-# warn $@ if $@;
}
}
foreach ( keys %dct ) {
@@ -55,26 +45,24 @@ sub inspect {
foreach $chan (@{$event->{to}}) {
foreach $id ( keys %dct ) {
$::db->record($chan, $event->{nick}, $event->{user}, $event->{host}, $::sn{lc $event->{nick}}->{gecos}, $dct{$id}{risk}, $id, $dct{$id}{reason});
- $txtz = "$dct{$id}{risk} risk threat: ".
- "Detected $event->{nick} $dct{$id}{reason} in $chan ";
+ $txtz = "\x02$dct{$id}{risk}\x02 risk threat: ".
+ "Detected \x02$event->{nick}\x02 $dct{$id}{reason} in $chan ";
$txtz = $txtz . ASM::Util->commaAndify(ASM::Util->getAlert(lc $chan, $dct{$id}{risk}, 'hilights')) if (ASM::Util->getAlert(lc $chan, $dct{$id}{risk}, 'hilights'));
if (ASM::Util->cs(lc $chan)->{op} ne 'no') {
if ($event->{type} eq 'topic') { #restore old topic
my $oldtopic = $::sc{lc $event->{to}->[0]}{topic}{text};
- o_send( $conn, "topic $chan :$oldtopic");
- o_send( $conn, "mode $chan +t");
+ $::oq->o_send( $conn, "topic $chan :$oldtopic");
+ $::oq->o_send( $conn, "mode $chan +t");
}
eval '$unmode = Actions::' . $dct{$id}{action} . '($conn, $event, $chan);';
warn $@ if $@;
my $lconn=$conn; my $lunmode = $unmode;
if ((int($dct{$id}{time}) ne 0) && ($unmode ne '')) {
- $conn->schedule(int($dct{$id}{time}), sub { print "Timer called!\n"; o_send($lconn,$lunmode); });
+ $conn->schedule(int($dct{$id}{time}), sub { print "Timer called!\n"; $::oq->o_send($lconn,$lunmode); });
}
}
unless (defined($::ignored{lc $event->{nick}}) && ($::ignored{lc $event->{nick}} >= $::RISKS{$dct{$id}{risk}})) {
- print "alerting!\n";
my @tgts = ASM::Util->getAlert($chan, $dct{$id}{risk}, 'msgs');
- print Dumper(\@tgts);
foreach my $tgt (@tgts) {
$conn->privmsg($tgt, $txtz);
}
diff --git a/modules/log.pl b/modules/log.pl
index 19b44b3..759a3ea 100644
--- a/modules/log.pl
+++ b/modules/log.pl
@@ -3,7 +3,7 @@ use strict;
package ASM::Log;
-use String::Interpolate qw(interpolate);
+#use String::Interpolate qw(interpolate);
use IO::All;
use POSIX qw(strftime);
use Data::Dumper;
@@ -14,6 +14,7 @@ sub new
my $config = shift;
my $self = {};
$self->{CONFIG} = $config;
+ $self->{MD} = {};
bless($self);
return $self;
}
@@ -29,21 +30,24 @@ sub logg
foreach my $chan ( @chans )
{
$chan = lc $chan;
- io(interpolate($cfg->{dir}))->mkpath;
+ unless (defined($self->{MD}->{$chan}) && ($self->{MD}->{$chan} == 1)) {
+ io($cfg->{dir} . $chan)->mkpath;
+ $self->{MD}->{$chan} = 1;
+ }
$_='';
- $_ = "<$event->{nick}> $event->{args}->[0]" if $event->{type} eq 'public';
- $_ = "*** $event->{nick} has joined $chan" if $event->{type} eq 'join';
- $_ = "*** $event->{nick} has left $chan" if $event->{type} eq 'part';
- $_ = "* $event->{nick} $event->{args}->[0]" if $event->{type} eq 'caction';
- $_ = "*** $event->{nick} is now known as $event->{args}->[0]" if $event->{type} eq 'nick';
- $_ = "*** $event->{nick} has quit IRC" if $event->{type} eq 'quit';
- $_ = "*** $event->{to}->[0] was kicked by $event->{nick}" if $event->{type} eq 'kick';
- $_ = "-$event->{nick}- $event->{args}->[0]" if $event->{type} eq 'notice';
- $_ = "*** $event->{nick} sets mode: ".join(" ",@{$event->{args}}) if $event->{type} eq 'mode';
- $_ = "*** $event->{nick} changes topic to \"$event->{args}->[0]\"" if $event->{type} eq 'topic';
+ $_ = "<$event->{nick}> $event->{args}->[0]" if $event->{type} eq 'public';
+ $_ = "*** $event->{nick} has joined $chan" if $event->{type} eq 'join';
+ $_ = "*** $event->{nick} has left $chan" if $event->{type} eq 'part';
+ $_ = "* $event->{nick} $event->{args}->[0]" if $event->{type} eq 'caction';
+ $_ = "*** $event->{nick} is now known as $event->{args}->[0]" if $event->{type} eq 'nick';
+ $_ = "*** $event->{nick} has quit IRC" if $event->{type} eq 'quit';
+ $_ = "*** $event->{to}->[0] was kicked by $event->{nick}" if $event->{type} eq 'kick';
+ $_ = "-$event->{nick}- $event->{args}->[0]" if $event->{type} eq 'notice';
+ $_ = "*** $event->{nick} sets mode: " . join(" ",@{$event->{args}}) if $event->{type} eq 'mode';
+ $_ = "*** $event->{nick} changes topic to \"$event->{args}->[0]\"" if $event->{type} eq 'topic';
print Dumper($event) if ($_ eq '');
- $_ = interpolate(strftime($cfg->{timefmt}, @time)) . $_ . "\n" unless $_ eq '';
- $_ >> io(interpolate($cfg->{dir}).'/'.interpolate(strftime($cfg->{filefmt}, @time))) unless ($_ eq '');
+ $_ = strftime($cfg->{timefmt}, @time) . $_ . "\n" unless $_ eq '';
+ $_ >> io($cfg->{dir} . $chan . '/' . $chan . strftime($cfg->{filefmt}, @time)) unless ($_ eq '');
}
}
diff --git a/modules/mysql.pl b/modules/mysql.pl
index 2f96410..998c647 100644
--- a/modules/mysql.pl
+++ b/modules/mysql.pl
@@ -26,6 +26,9 @@ sub record
{
my $self = shift;
my ($channel, $nick, $user, $host, $gecos, $level, $id, $reason) = @_;
+ if (! defined($gecos)) {
+ $gecos = "NOT_DEFINED";
+ }
my $dbh = $self->{DBH};
$dbh->do("INSERT INTO $self->{TABLE} (channel, nick, user, host, gecos, level, id, reason) VALUES (" .
$dbh->quote($channel) . ", " . $dbh->quote($nick) . ", " . $dbh->quote($user) .
diff --git a/modules/xml.pl b/modules/xml.pl
index c497ffc..c3da924 100644
--- a/modules/xml.pl
+++ b/modules/xml.pl
@@ -11,12 +11,11 @@ sub readXML {
my ( $p ) = $::cset; #@_;
$p = 'default' if $p eq '';
$p = "config-$p";
- $::settings = $::xs1->XMLin( "$p/settings.xml", ForceArray => [qw/host/],
- GroupTags => { altnicks => 'altnick', server => 'host', autojoins=> 'autojoin' });
- $::channels = $::xs1->XMLin( "$p/channels.xml", ForceArray => [qw/event debug info low medium high/] );
- $::users = $::xs1->XMLin( "$p/users.xml", ForceArray => 'person' );
+ $::settings = $::xs1->XMLin( "$p/settings.xml", ForceArray => ['host'], 'GroupTags' => { altnicks => 'altnick', server => 'host', autojoins => 'autojoin' });
+ $::channels = $::xs1->XMLin( "$p/channels.xml", ForceArray => [qw/event debug info low medium high/]);
+ $::users = $::xs1->XMLin( "$p/users.xml", ForceArray => 'person');
$::commands = $::xs1->XMLin( "$p/commands.xml", ForceArray => [qw/command/]);
- $::mysql = $::xs1->XMLin( "$p/mysql.xml", ForceArray => [] );
+ $::mysql = $::xs1->XMLin( "$p/mysql.xml", ForceArray => []);
}
sub writeXML {