You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
526 lines
13 KiB
526 lines
13 KiB
#use lib "/opt/kde/share/apps/ksirc";
|
|
|
|
&docommand("/load pbase.pm");
|
|
&docommand("/load pwidget.pm");
|
|
&docommand("/load pframe.pm");
|
|
&docommand("/load ptablevw.pm");
|
|
&docommand("/load plistbox.pm");
|
|
&docommand("/load pbutton.pm");;
|
|
&docommand("/load pboxlayout.pm");
|
|
&docommand("/load plabel.pm");
|
|
&docommand("/load pbutton.pm");
|
|
&docommand("/load ppushbt.pm");
|
|
&docommand("/load plined.pm");
|
|
&docommand("/load pkfiledialog.pm");
|
|
&docommand("/load ppopmenu.pm");
|
|
|
|
&docommand("/load dcc_progress.pm");
|
|
|
|
&docommand("/load plined.pm");
|
|
&docommand("/load pprogress.pm");
|
|
|
|
use POSIX qw(getcwd);
|
|
use strict;
|
|
|
|
package DCCSendDialog;
|
|
use vars qw(@ISA);
|
|
@ISA = qw(PFrame);
|
|
|
|
sub new {
|
|
my $class = shift;
|
|
my $self = $class->SUPER::new($class, @_);
|
|
$self->create();
|
|
|
|
my $gm_main = new PBoxLayout($self, $PBoxLayout::TopToBottom, 5);
|
|
|
|
my $gm_to = new PBoxLayout($PBoxLayout::LeftToRight, 5);
|
|
$gm_main->addLayout($gm_to);
|
|
|
|
my $label_to = new PLabel($self);
|
|
$label_to->setText("To Nick:");
|
|
$label_to->setMaximumSize(1000,30);
|
|
$label_to->setMinimumSize(50,30);
|
|
$gm_to->addWidget($label_to, 0, $PBoxLayout::AlignCenter);
|
|
|
|
my $line_to = new PLineEdit($self);
|
|
$gm_to->addWidget($line_to, 5, $PBoxLayout::AlignCenter);
|
|
|
|
my $gm_file = new PBoxLayout($PBoxLayout::LeftToRight, 5);
|
|
$gm_main->addLayout($gm_file);
|
|
|
|
my $label_file = new PLabel($self);
|
|
$label_file->setText("Filename:");
|
|
$label_file->setMaximumSize(1000,30);
|
|
$label_file->setMinimumSize(50,30);
|
|
$gm_file->addWidget($label_file, 0, $PBoxLayout::AlignCenter);
|
|
|
|
my $line_file = new PLineEdit($self);
|
|
$gm_file->addWidget($line_file, 5, $PBoxLayout::AlignLeft);
|
|
|
|
my $button_file = new PPushButton($self);
|
|
$button_file->setText("&Browse");
|
|
$button_file->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->browseClicked});
|
|
$gm_file->addWidget($button_file, 2, $PBoxLayout::AlignRight);
|
|
|
|
my $button_send = new PPushButton($self);
|
|
$button_send->setText("&Send");
|
|
$button_send->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->sendClicked});
|
|
$gm_main->addWidget($button_send, 4, $PBoxLayout::AlignRight);
|
|
|
|
@$self{'gm_main', 'gm_to', 'gm_file', 'label_to', 'line_to', 'label_file', 'line_file', 'button_file', 'button_send'}
|
|
= ($gm_main, $gm_to, $gm_file, $label_to, $line_to, $label_file, $line_file, $button_file, $button_send);
|
|
|
|
print "*I* Finished creating DCCSend\n";
|
|
|
|
$self->{fileDialog} = new PKFileDialog();
|
|
my $dlg = $self->{fileDialog};
|
|
$dlg->setDir(POSIX::getcwd());
|
|
$dlg->installHandler($::PUKE_KBFD_FILE_SELECTED_ACK, sub{$self->fileSelected(shift())});
|
|
|
|
$self->setMinimumSize(450, 110);
|
|
$self->setMaximumSize(2000, 2000);
|
|
$self->resize(450, 110);
|
|
|
|
return $self;
|
|
|
|
}
|
|
|
|
sub browseClicked {
|
|
my $self = shift;
|
|
|
|
$self->{fileDialog}->show();
|
|
|
|
}
|
|
|
|
sub fileSelected {
|
|
my $self = shift;
|
|
|
|
my $hargs = shift;
|
|
|
|
$self->{fileDialog}->hide();
|
|
|
|
my $file = $hargs->{'cArg'};
|
|
|
|
if($file ne ''){
|
|
$self->{'line_file'}->setText($file);
|
|
}
|
|
}
|
|
|
|
sub sendClicked {
|
|
my $self = shift;
|
|
|
|
my $to_nick = $self->{'line_to'}->text();
|
|
my $to_file = $self->{'line_file'}->text();
|
|
|
|
if($to_nick eq '' || $to_file eq ''){
|
|
return;
|
|
}
|
|
|
|
&::docommand("dcc send $to_nick $to_file");
|
|
$self->hide();
|
|
}
|
|
|
|
|
|
use vars qw(@ISA $KSIRC_DCC %KSIRC_DCC);
|
|
|
|
package DCCStatus;
|
|
use vars qw(@ISA);
|
|
@ISA = qw(PFrame);
|
|
|
|
sub new {
|
|
my $class = shift;
|
|
my $self = $class->SUPER::new($class, @_);
|
|
$self->create();
|
|
|
|
my $gm_main = new PBoxLayout($self, $PBoxLayout::TopToBottom, 5);
|
|
|
|
my $label = new PLabel($self);
|
|
$label->setText("Pending DCC");
|
|
$label->setMaximumSize(1000,20);
|
|
$gm_main->addWidget($label, 5, $PBoxLayout::AlignCenter);
|
|
my $lb = new PListBox($self);
|
|
$gm_main->addWidget($lb, 5, $PBoxLayout::AlignCenter);
|
|
|
|
my $gm_but1 = new PBoxLayout($PBoxLayout::LeftToRight, 5);
|
|
$gm_main->addLayout($gm_but1);
|
|
|
|
my $button_get = new PPushButton($self);
|
|
$button_get->setText("&Open Connection");
|
|
$button_get->setMaximumSize(1000,30);
|
|
$button_get->setMinimumSize(10,30);
|
|
$button_get->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->openClicked});
|
|
$gm_but1->addWidget($button_get, 5);
|
|
|
|
my $button_forget = new PPushButton($self);
|
|
$button_forget->setText("&Forget Connection");
|
|
$button_forget->setMaximumSize(1000,30);
|
|
$button_forget->setMinimumSize(10,30);
|
|
$button_forget->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->forgetClicked});
|
|
$gm_but1->addWidget($button_forget, 5);
|
|
|
|
my $gm_but2 = new PBoxLayout($PBoxLayout::LeftToRight, 5);
|
|
$gm_main->addLayout($gm_but2);
|
|
|
|
my $button_send = new PPushButton($self);
|
|
$button_send->setText("&Send File");
|
|
$button_send->setMaximumSize(1000,30);
|
|
$button_send->setMinimumSize(10,30);
|
|
$button_send->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub{$self->sendClicked});
|
|
$gm_but2->addWidget($button_send, 5);
|
|
|
|
$gm_main->activate();
|
|
|
|
$self->setMinimumSize(400, 275);
|
|
$self->setMaximumSize(2000, 2000);
|
|
$self->resize(400, 275);
|
|
|
|
@$self{'gm_main', 'label1', 'lb', 'button_get', 'button_chat', 'button_forget', 'gm_but1', 'gm_but2', 'button_send' }
|
|
= ( $gm_main, $label, $lb, $button_get, $button_send, $button_forget, $gm_but1, $gm_but2, $button_send );
|
|
|
|
|
|
print "*I* Finished creating DCCStatus\n";
|
|
|
|
return $self;
|
|
}
|
|
|
|
sub addItem {
|
|
my $self = shift;
|
|
|
|
my %hargs = @_;
|
|
|
|
my $line = $hargs{'line'};
|
|
|
|
if($self->{'lines'}->{$line}){
|
|
return -1;
|
|
}
|
|
|
|
$self->{'lines'}->{$line}->{'OpenCode'} = $hargs{'open'};
|
|
$self->{'lines'}->{$line}->{'ForgetCode'} = $hargs{'forget'};
|
|
|
|
$self->{'lb'}->insertText($line, -1);
|
|
if($self->{'lb'}->currentText() eq ''){
|
|
$self->{'lb'}->setCurrentItem(0);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
sub openClicked {
|
|
my $self = shift;
|
|
|
|
my $line = $self->{'lb'}->currentText();
|
|
if($line eq ''){
|
|
return;
|
|
}
|
|
|
|
&{$self->{'lines'}->{$line}->{'OpenCode'}};
|
|
$self->{'lb'}->removeItem($self->{'lb'}->current());
|
|
if($self->{'lb'}->{count} == 0){
|
|
$self->hide();
|
|
}
|
|
|
|
delete $self->{'lines'}->{$line};
|
|
|
|
}
|
|
|
|
sub forgetClicked {
|
|
my $self = shift;
|
|
|
|
my $line = $self->{'lb'}->currentText();
|
|
if($line eq ''){
|
|
return;
|
|
}
|
|
|
|
&{$self->{'lines'}->{$line}->{'ForgetCode'}};
|
|
$self->{'lb'}->removeItem($self->{'lb'}->current());
|
|
if($self->{'lb'}->{count} == 0){
|
|
$self->hide();
|
|
}
|
|
|
|
|
|
delete $self->{'lines'}->{$line};
|
|
|
|
}
|
|
|
|
sub sendClicked {
|
|
my $self = shift;
|
|
|
|
if(!$self->{sendDialog}){
|
|
my $dlg = new DCCSendDialog();
|
|
if($dlg == undef){
|
|
&print("*E* Could not load DCCSendDialog");
|
|
return;
|
|
}
|
|
$self->{sendDialog} = $dlg;
|
|
}
|
|
|
|
$self->{sendDialog}->show();
|
|
}
|
|
|
|
sub DESTROY {
|
|
print "*E* Destroying dcc status widget\n";
|
|
shift()->close();
|
|
}
|
|
|
|
sub close {
|
|
my $self = shift;
|
|
$self->sendMessage('iCommand' => $::PUKE_WIDGET_DELETE,
|
|
'CallBack' => sub {},
|
|
'WaitFor' => 1);
|
|
# $self->{'gm_main'}->DESTROY;
|
|
#elete $self->{'gm_main'};
|
|
}
|
|
|
|
package DCCPopupMenu;
|
|
use vars qw(@ISA);
|
|
@ISA = qw(PPopupMenu);
|
|
|
|
sub new {
|
|
my $class = shift;
|
|
my $self = $class->SUPER::new($class, @_);
|
|
$self->create();
|
|
return $self;
|
|
}
|
|
|
|
sub insertText {
|
|
my $self = shift;
|
|
|
|
my $id = $self->SUPER::insertText(@_);
|
|
|
|
my @arr;
|
|
|
|
if(ref($self->{'Ids'}) ne 'ARRAY'){
|
|
$self->{'Ids'} = \@arr;
|
|
}
|
|
|
|
@arr = @{$self->{'Ids'}};
|
|
|
|
$arr[$#arr+1] = $id;
|
|
|
|
$self->{'Ids'} = \@arr;
|
|
|
|
return $id;
|
|
}
|
|
|
|
sub DESTROY {
|
|
my $self = shift;
|
|
|
|
my @arr = @{$self->{'Ids'}};
|
|
my $id;
|
|
|
|
foreach $id (@arr) {
|
|
$self->removeItem($id);
|
|
}
|
|
|
|
$self->sendMessage('iCommand' => $::PUKE_RELEASEWIDGET,
|
|
'CallBack' => sub {});
|
|
|
|
|
|
}
|
|
|
|
|
|
package main;
|
|
use vars qw($KSIRC_DCC %KSIRC_DCC $who $KSIRC_DCCSTATUS $silent $nick $KSIRC_POPSC $KSIRC_POPDOCK);
|
|
|
|
sub hook_ksirc_dcc_request {
|
|
my($type) = shift;
|
|
my($machine) = shift;
|
|
my($port) = shift;
|
|
my($file) = shift;
|
|
my($size) = shift;
|
|
my($mwho) = $who;
|
|
if($KSIRC_DCCSTATUS == undef){
|
|
$KSIRC_DCCSTATUS = new DCCStatus;
|
|
$KSIRC_DCCSTATUS->resize(400, 275);
|
|
}
|
|
|
|
if($type eq 'SEND'){
|
|
my $open = sub {
|
|
&docommand("/dcc get $mwho $file");
|
|
};
|
|
my $forget = sub {
|
|
&docommand("/dcc close get $mwho $file");
|
|
};
|
|
$::KSIRC_FILE_SIZES{$file} = $size;
|
|
$KSIRC_DCCSTATUS->addItem('line' => "SEND: $who offered $file at size $size",
|
|
'open' => $open,
|
|
'forget' => $forget);
|
|
}
|
|
elsif($type eq 'CHAT'){
|
|
$KSIRC_DCCSTATUS->addItem('line' => "CHAT: $who",
|
|
'open' => sub { &docommand("/dcc chat $mwho"); },
|
|
'forget' => sub { &docommand("/dcc close chat $mwho"); });
|
|
|
|
}
|
|
$KSIRC_DCCSTATUS->show;
|
|
|
|
}
|
|
|
|
&addhook("dcc_request", "ksirc_dcc_request");
|
|
|
|
sub hook_ksirc_dcc_send {
|
|
my $nick = shift;
|
|
my $file = shift;
|
|
my $size = shift;
|
|
my $fh = shift;
|
|
|
|
# print "*I* Starting dcc into with: $nick, $file, $size, $fh\n";
|
|
|
|
my($window) = new DCCProgress;
|
|
$size = 10240 if $size == 0;
|
|
$window->setRange(0, $size);
|
|
$window->setCaption("$file=>$nick");
|
|
$window->setTopText("Sending: $file Size: $size");
|
|
$window->setBotText("Status: pending");
|
|
$window->setCancel("dcc close send $nick $file");
|
|
$KSIRC_DCC{$fh}{$file}{'Window'} = $window;
|
|
$KSIRC_DCC{$fh}{$file}{'StartTime'} = time() - 1;
|
|
$window->show;
|
|
}
|
|
|
|
&addhook("dcc_send", "ksirc_dcc_send");
|
|
|
|
sub hook_ksirc_dcc_send_status {
|
|
my $file = shift;
|
|
my $bytes = shift;
|
|
my $fh = shift;
|
|
|
|
my $window = $KSIRC_DCC{$fh}{$file}{'Window'};
|
|
if($window == undef){
|
|
my($window) = new DCCProgress;
|
|
$window->setRange(0, 1);
|
|
$window->setCaption("$file=>$nick");
|
|
$window->setTopText("Sending: $file Size: Unkown");
|
|
$window->setCancel("dcc close send $nick $file");
|
|
$KSIRC_DCC{$fh}{$file}{'Window'} = $window;
|
|
$KSIRC_DCC{$fh}{$file}{'StartTime'} = time() - 1;
|
|
$window->show;
|
|
}
|
|
$window->setBotText("BPS: " . int($bytes/(time() - $KSIRC_DCC{$fh}{$file}{'StartTime'})));
|
|
$window->setValue($bytes);
|
|
}
|
|
|
|
&addhook("dcc_send_status", "ksirc_dcc_send_status");
|
|
|
|
sub hook_ksirc_dcc_get {
|
|
my $nick = shift;
|
|
my $file = shift;
|
|
my $fh = shift;
|
|
|
|
my $size = $::KSIRC_FILE_SIZES{$file};
|
|
|
|
#print "*I* Starting dcc into with: $nick, $file, $size, $fh\n";
|
|
|
|
if($KSIRC_DCC{$fh}{$file}{'Window'} == undef){
|
|
my($window) = new DCCProgress;
|
|
$size = 10240 if $size == 0;
|
|
$window->setRange(0, $size);
|
|
$window->setCaption("$file<=$nick");
|
|
$window->setTopText("Receiver: $file Size: $size");
|
|
$window->setBotText("Status: pending");
|
|
$window->setCancel("dcc close get $nick $file");
|
|
$KSIRC_DCC{$fh}{$file}{'Window'} = $window;
|
|
$KSIRC_DCC{$fh}{$file}{'StartTime'} = time() - 1;
|
|
$window->show;
|
|
}
|
|
}
|
|
|
|
&addhook("dcc_get", "ksirc_dcc_get");
|
|
|
|
sub hook_ksirc_dcc_get_status {
|
|
my $file = shift;
|
|
my $bytes = shift;
|
|
my $fh = shift;
|
|
|
|
my $window = $KSIRC_DCC{$fh}{$file}{'Window'};
|
|
if($window == undef){
|
|
my($window) = new DCCProgress;
|
|
$window->setRange(0, 1);
|
|
$window->setCaption("$file<=$nick");
|
|
$window->setTopText("Receiver: $file Size: Unkown");
|
|
$window->setBotText("Status: pending");
|
|
$window->setCancel("dcc close get $nick $file");
|
|
$KSIRC_DCC{$fh}{$file}{'Window'} = $window;
|
|
$KSIRC_DCC{$fh}{$file}{'StartTime'} = time() - 1;
|
|
$window->show;
|
|
}
|
|
$window->setBotText("BPS: " . int($bytes/(time() - $KSIRC_DCC{$fh}{$file}{'StartTime'})));
|
|
$window->setValue($bytes);
|
|
}
|
|
|
|
&addhook("dcc_get_status", "ksirc_dcc_get_status");
|
|
|
|
|
|
sub hook_ksirc_dcc_disconnect {
|
|
my $nick = shift;
|
|
my $file = shift;
|
|
my $bytes = shift;
|
|
my $time = shift;
|
|
my $fh = shift;
|
|
|
|
if($fh){
|
|
my $window = $KSIRC_DCC{$fh}{$file}{'Window'};
|
|
$window->close();
|
|
delete $KSIRC_DCC{$fh}{$file};
|
|
delete $KSIRC_DCC{$fh};
|
|
print "*D* DCC transfer with $nick ($file) terminated; $bytes transferred in $time seconds (" . int(($bytes/($time+1))/1024) . "KBps)";
|
|
$silent = 1;
|
|
}
|
|
}
|
|
|
|
addhook("dcc_disconnect", "ksirc_dcc_disconnect");
|
|
|
|
|
|
|
|
&print("*I* Done DCC Status");
|
|
#$::test = new DCCStatus;
|
|
#$::test->resize(400, 275);
|
|
#$::test->show();
|
|
|
|
sub popup_dccstatus{
|
|
if($KSIRC_DCCSTATUS == undef){
|
|
$KSIRC_DCCSTATUS = new DCCStatus;
|
|
$KSIRC_DCCSTATUS->resize(400, 275);
|
|
}
|
|
$KSIRC_DCCSTATUS->show();
|
|
}
|
|
|
|
sub popup_dccsend{
|
|
if($KSIRC_DCCSTATUS == undef){
|
|
$KSIRC_DCCSTATUS = new DCCStatus;
|
|
$KSIRC_DCCSTATUS->resize(400, 275);
|
|
}
|
|
$KSIRC_DCCSTATUS->sendClicked();
|
|
}
|
|
|
|
=cut
|
|
if(!$KSIRC_POPSC){
|
|
$KSIRC_POPSC = new DCCPopupMenu();
|
|
if($KSIRC_POPSC->fetchWidget("servercontroller_menu_file") >= 0){
|
|
my $id_control = $KSIRC_POPSC->insertText("Show DCC Control ($::server)");
|
|
my $id_send = $KSIRC_POPSC->insertText("Show DCC Send ($::server)");
|
|
$KSIRC_POPSC->installMenu($id_control, sub{&popup_dccstatus();});
|
|
$KSIRC_POPSC->installMenu($id_send, sub{&popup_dccsend();});
|
|
}
|
|
}
|
|
|
|
if(!$KSIRC_POPDOCK){
|
|
$KSIRC_POPDOCK = new DCCPopupMenu();
|
|
if($KSIRC_POPDOCK->fetchWidget("dockServerController_menu_pop") >= 0){
|
|
my $id_control = $KSIRC_POPDOCK->insertText("Show DCC Control ($::server)");
|
|
my $id_send = $KSIRC_POPDOCK->insertText("Show DCC Send ($::server)");
|
|
$KSIRC_POPDOCK->installMenu($id_control, sub { &popup_dccstatus(); } );
|
|
$KSIRC_POPDOCK->installMenu($id_send, sub { &popup_dccsend(); } );
|
|
}
|
|
}
|
|
=cut
|
|
|
|
sub hook_quit_release {
|
|
$KSIRC_POPDOCK->DESTROY();
|
|
$KSIRC_POPSC->DESTROY();
|
|
}
|
|
|
|
&addhook("quit", "quit_release");
|
|
|
|
1;
|