irssi dcc статистика на канале
Я сделал свой первый сценарий irssi perl, но он не работает. Я не понимаю, почему нет.
Когда я печатаю !dccstat
на канале мой домашний ПК просто отвечает всеми соединениями DCC, как при вводе /dcc stat
на ирсси.
use Irssi;
use vars qw($VERSION %IRSSI);
$VERSION = "1.0";
%IRSSI = (
Test
);
sub event_privmsg {
my ($server, $data, $nick, $mask) =@_;
my ($target, $text) = $data =~ /^(\S*)\s:(.*)/;
return if ( $text !~ /^!dccstat$/i );
if ($text =~ /^!dccstat$/ ) {
my $dcc = dccs();
$server->command ( "msg $target $dcc" )
}
}
Irssi::signal_add('event privmsg', 'event_privmsg');
1 ответ
Одна проблема может быть dccs()
сама команда, она не распознается в моем Irssi v0.8.15, поэтому я использовал Irssi::Irc::dccs()
, Он возвращает массив соединений dcc, поэтому он (извините за мой сарказм) не "волшебным образом" превратится в строку текущего статуса dccs, как "/dcc list" (вы использовали термин "/dcc stat", который, как я полагаю, либо ошибка или команда скрипта, которая мне неизвестна). Вам нужно перебрать массив dccs и собрать все данные, которые вы хотите. Ниже приведен схематичный (но работающий) код, чтобы вы могли использовать его в качестве шаблона. Получайте удовольствие от сценариев Irssi.
use Irssi;
use vars qw($VERSION %IRSSI);
$VERSION = "1.0";
%IRSSI = (
Test
);
sub event_privmsg {
my ($server, $data, $nick, $mask) =@_;
my ($target, $text) = $data =~ /^(\S*)\s:(.*)/;
return if ( $text !~ /^!dccstat$/i ); # this line could be removed as the next one checks for the same
if ($text =~ /^!dccstat$/ ) {
# get array of dccs and store it in @dccs
my @dccs = Irssi::Irc::dccs();
# iterate through array
foreach my $dcc (@dccs) {
# get type of dcc (SEND, GET or CHAT)
my $type = $dcc->{type};
# process only SEND and GET types
if ($type eq "SEND" || $type eq "GET") {
my $filename = $dcc->{arg}; # name of file
my $nickname = $dcc->{nick}; # nickname of sender/receiver
my $filesize = $dcc->{size}; # size of file in bytes
my $transfered = $dcc->{transfd}; # bytes transfered so far
# you probably want to format file size and bytes transfered nicely, i'll leave it to you
$server->command("msg $target nick: $nickname type: $type file: $filename size: $filesize transfered: $transfered");
}
}
}
}
Irssi::signal_add('event privmsg', 'event_privmsg');
Кроме того, вы используете "событие privmsg", которое запускает также (удивительно!) Личные сообщения, не только канальные, но и для них тоже (ответ будет отправлен как личное сообщение пользователю). Если это нежелательно, я предлагаю использовать сигнал "public public", как показано ниже:
# ..
sub event_message_public {
my ($server, $msg, $nick, $mask, $target) = @_;
# .. the rest of code
}
Irssi::signal_add("message public", event_message_public);