summaryrefslogtreecommitdiffstats
path: root/ksirc/puke/dcc_status.pm
diff options
context:
space:
mode:
Diffstat (limited to 'ksirc/puke/dcc_status.pm')
-rw-r--r--ksirc/puke/dcc_status.pm525
1 files changed, 525 insertions, 0 deletions
diff --git a/ksirc/puke/dcc_status.pm b/ksirc/puke/dcc_status.pm
new file mode 100644
index 00000000..65bc1b07
--- /dev/null
+++ b/ksirc/puke/dcc_status.pm
@@ -0,0 +1,525 @@
+#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;