diff options
Diffstat (limited to 'lib/ASM/Config.pm')
| -rw-r--r-- | lib/ASM/Config.pm | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/lib/ASM/Config.pm b/lib/ASM/Config.pm new file mode 100644 index 0000000..de0bb21 --- /dev/null +++ b/lib/ASM/Config.pm @@ -0,0 +1,110 @@ +package ASM::Config; +no autovivification; +use warnings; +use strict; +use feature 'state'; + +use XML::Simple qw(:strict); +use JSON; +use IO::All; +no if $] >= 5.017011, warnings => 'experimental::smartmatch'; + +our $json = JSON->new->utf8->pretty->canonical; + +sub serialize { + return $json->encode(@_); +} +sub deserialize { + return $json->decode(@_); +} + +sub readXML { + my ( $p ) = $::cset; + my @fchan = ( 'event', keys %::RISKS ); + my $xs1 = XML::Simple->new( KeyAttr => ['id'], Cache => [ qw/memcopy/ ]); + $::settings = $xs1->XMLin( "$p/settings.xml", ForceArray => ['host'], + 'GroupTags' => { altnicks => 'altnick', server => 'host', + autojoins => 'autojoin' }); + $::channels = $xs1->XMLin( "$p/channels.xml", ForceArray => \@fchan ); + $::users = $xs1->XMLin( "$p/users.xml", ForceArray => 'person'); + $::mysql = $xs1->XMLin( "$p/mysql.xml", ForceArray => ['ident', 'geco'], + 'GroupTags' => { ignoredidents => 'ident', ignoredgecos => 'geco' }); + $::dnsbl = $xs1->XMLin( "$p/dnsbl.xml", ForceArray => []); + $::rules = $xs1->XMLin( "$p/rules.xml", ForceArray => []); + $::restrictions = $xs1->XMLin( "$p/restrictions.xml", ForceArray => ['host', 'nick', 'account']); + $::blacklist = $xs1->XMLin( "$p/blacklist.xml", ForceArray => 'string'); +} + +sub readConfig { + if (!-e "$::cset/settings.json") { + state $in_readconfig = 0; + die "Unexpected readConfig recursion" if $in_readconfig++; + readXML(); + writeConfig(); + readConfig(); + } + else { + $::settings = deserialize(io->file("$::cset/settings.json")->all); + $::channels = deserialize(io->file("$::cset/channels.json")->all); + $::users = deserialize(io->file("$::cset/users.json")->all); + $::mysql = deserialize(io->file("$::cset/mysql.json")->all); + $::dnsbl = deserialize(io->file("$::cset/dnsbl.json")->all); + $::rules = deserialize(io->file("$::cset/rules.json")->all); + $::restrictions = deserialize(io->file("$::cset/restrictions.json")->all); + $::blacklist = deserialize(io->file("$::cset/blacklist.json")->all); + } +} + +sub writeConfig { + writeMysql(); + writeChannels(); + writeUsers(); + writeSettings(); + writeRestrictions(); + writeBlacklist(); + writeDnsbl(); + writeRules(); +} + +sub writeMysql { + $::settingschanged=1; + serialize($::mysql) > io->file("$::cset/mysql.json"); +} + +sub writeRules { + $::settingschanged=1; + serialize($::rules) > io->file("$::cset/rules.json"); +} + +sub writeDnsbl { + $::settingschanged=1; + serialize($::dnsbl) > io->file("$::cset/dnsbl.json"); +} + +sub writeChannels { + $::settingschanged=1; + serialize($::channels) > io("$::cset/channels.json"); +} + +sub writeUsers { + $::settingschanged=1; + serialize($::users) > io("$::cset/users.json"); +} + +sub writeSettings { + $::settingschanged=1; + serialize($::settings) > io("$::cset/settings.json"); +} + +sub writeRestrictions { + $::settingschanged=1; + serialize($::restrictions) > io("$::cset/restrictions.json"); +} + +sub writeBlacklist { + $::settingschanged=1; + serialize($::blacklist) > io("$::cset/blacklist.json"); +} + +return 1; +# vim: ts=2:sts=2:sw=2:expandtab |
