Instantly share code, notes, and snippets.

Embed
What would you like to do?
Notify operators about incomming private message - script for the Globster direct connect client
#!/usr/bin/perl
use strict;
use warnings;
use Net::DBus;
use XML::Simple;
use Net::DBus::Reactor;
# create xml object
my $xml = new XML::Simple;
# read XML file
my $config = $xml->XMLin($ARGV[0], ForceArray => ['hub','ignored','optout'], SearchPath => [ '/etc/globster' ]);
$ENV{DBUS_SESSION_BUS_ADDRESS} = $config->{'dbusaddr'} ? $config->{'dbusaddr'} : $ENV{DBUS_SESSION_BUS_ADDRESS};
my @hubs = @{$config->{'hub'}};
my $g = Net::DBus->find->get_service("net.blicky.Globster")->get_object("/net/blicky/Globster");
my %objs = map +($_->{'hubid'}, $g->get_child_object("/Hub/$_->{'hubid'}")), @hubs;
my @userfields = ('', qw|nick description client mail slots sharedfiles sharesize conn hubs ip4 ip6 as cid flags|);
my %userfields = map +($userfields[$_], $_), 1..$#userfields;
sub userstruct2hash {
my($fields, $struct) = @_;
+{ map +($userfields[$fields->[$_]], $struct->[$_]), 0..$#{$struct} };
}
sub send_pm {
my($hubid, $user, $str) = @_;
$objs{$hubid}->SendChat($user, $str, 0);
}
sub in_array {
my ($pattern, $array) = @_;
for my $item (@{$array}) {
if ($item eq $pattern) {
return 1;
}
}
return 0;
}
for my $hub (@hubs) {
$hub->{'destination'} = 0 if (!$hub->{'opchat'});
$objs{$hub->{'hubid'}}->connect_to_signal('ReceiveChat', sub {
my($group, $user, $message, $me) = @_;
return if $group != $user || $group == -1 || $user == -1 || !$user; # Do not reply to own messages, main chat or custom chatroom messages
my $username = [$objs{$hub->{'hubid'}}->UserInfo($user, [ 1 ])]->[1]{$user}[0];
if ($hub->{'state'} == 1 && !in_array($username, $hub->{'ignored'})) {
if ($hub->{'response'}) {
my $r = $hub->{'response'};
$r =~ s/%\[userNI\]/$username/g;
send_pm($hub->{'hubid'}, $group, $r);
}
my($fields, $list) = $objs{$hub->{'hubid'}}->UserInfo(-1, [ values %userfields ]);
my @u = map +{ id => $_, %{ userstruct2hash($fields, $list->{$_}) } }, keys %$list;
my $pm = $hub->{'message'};
$pm =~ s/%\[userNI\]/$username/g;
$pm =~ s/%\[message\]/$message/g;
if ($hub->{'destination'} == 0) {
for my $usr (@u) {
if ($usr->{'flags'} & 4 && !in_array($usr->{'nick'}, $hub->{'ignored'}) && !in_array($usr->{'nick'}, $hub->{'optout'})) {
if (!$hub->{'opchat'} || ($hub->{'opchat'} && $usr->{'nick'} ne $hub->{'opchat'})) {
sleep $hub->{'timeout'} if $hub->{'timeout'};
send_pm($hub->{'hubid'}, $usr->{'id'}, $pm);
}
}
}
} else {
for my $usr (@u) {
if ($usr->{'nick'} eq $hub->{'opchat'}) {
sleep $hub->{'timeout'} if $hub->{'timeout'};
send_pm($hub->{'hubid'}, $usr->{'id'}, $pm);
}
}
}
}
});
}
my $reactor = Net::DBus::Reactor->main;
$reactor->run;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment