Curses-UI-POE

 view release on metacpan or  search on metacpan

examples/irc_client  view on Meta::CPAN



open LOG, ">>", "cuirc-debug.log";

# Try to put errors in the window...
$SIG{"__DIE__"} = sub {
    print LOG $_[0];
};
$SIG{"__WARN__"} = sub {
    print LOG $_[0];
};

print "Welcome to Curses::UI::POE's IRC example";

run POE::Kernel;

package IRC::Output;

use strict;
use warnings FATAL => "all";

use POE;
use POSIX qw( strftime cuserid );
use Curses;
use Carp qw( carp );
use constant KEY_TAB => "\t";

my @nicks;

sub addnick {
    my ($nicklist, $curses) = @{ +shift }{qw( -nicks -curses )};
    my $nick = shift;

    push @nicks, $nick;

    $nicklist->values([sort @nicks]);
    $nicklist->draw(1);

    $curses->draw;
}

sub dropnick {
    my ($nicklist, $curses) = @{ +shift }{qw( -nicks -curses )};
    my $nick = shift;

    @nicks = grep $nick ne $_, @nicks;
    $nicklist->values([sort @nicks]);
    $nicklist->draw(1);
    $curses->draw;
}

sub PRINT { 
    our @Channel;

    my $object = shift;
    my ($viewer, $curses) = @$object{qw( -viewer -curses )};

    push @Channel, shift;

    $viewer->text(join "\n", @Channel);
    $viewer->cursor_down(undef, $viewer->canvasheight);
    $viewer->draw;

#    $viewer->{-ypos} = @Channel;
#    $viewer->layout_content;

    $curses->draw;
}

sub PRINTF {
    our @Channel;

    my $object = shift;
    my ($viewer, $curses) = @$object{qw( -viewer -curses )};

    # XXX Hack: Just ignore bunk requests for now...
    if (grep !defined $_, @_) {
        carp "Attempt to print undefined value";
    }

    push @Channel, sprintf shift, @_;

    $viewer->text(join "\n", @Channel);
    $viewer->cursor_down(undef, $viewer->canvasheight);
    $viewer->draw;

#    $viewer->{-ypos} = @Channel;
#    $viewer->layout_content;

    $curses->draw;
}

sub TIEHANDLE { 
    my $curses = $_[-1];

    # Main Menu
    my $menu = $curses->add
        ( 'menu','Menubar', 
          -fg   => "white",
          -bg   => "blue",
          -menu => [
            { -label => 'File', 
              -submenu => [
                { -label => 'Exit      ^Q', -value => sub { exit } }
              ]
            },
            { -label => 'Help', 
              -submenu => [
                { -label => 'about', -value => \&about_dialog }
              ]
            }, 
          ]
        );

    # Create the screen for the editor.
    my $screen = $curses->add
        ( 'screen', 'Window',
          -padtop       => 1, # leave space for the menu
          -border		=> 0,
          -ipad		    => 0,
        );

    # We add the editor widget to this screen.
    my $viewer = $screen->add
        ( 'viewer', 'TextViewer',
          -border 	        => 0,
          -pos              => -1,
          -sfg              => "blue",
          -sbg              => "white",
          -padright         => 11,
          -padtop		    => 0,	
          -padbottom 	    => 2,
          -showlines	    => 0,
          -sbborder	        => 0,
          -vscrollbar	    => 1,
          -hscrollbar	    => 0,
          -showhardreturns  => 0,
          -wrapping         => 1,
        );

    my $nicks = $screen->add
        ( 'nicks', 'Listbox',
          -x            => -1,
          -y            => -1,

examples/irc_client  view on Meta::CPAN

                $CurrentChannel = $Join;
            }
            else {
                $Channel{$Join} = 1;
                $poe_kernel->post( IRC => join => $Join );
                $CurrentChannel = $Join;
            }
        },

        nick => sub { $poe_kernel->post( IRC => nick => $_[1] ) },
        kick => sub { $poe_kernel->post( IRC => kick => @_[1..$#_] ) },
        msg  => sub { $poe_kernel->post( IRC => privmsg => @_[1..$#_] ) },
        
        quote => sub {
            $poe_kernel->post( IRC => sl => join " ", @_[1..$#_] );
        },

        quit => sub {
            $poe_kernel->post( IRC => quit => join " ", @_[1..$#_] );

            print "Have a nice day";
            exit;
        },
    };

    set_binding $editor sub {
        my $input = shift;
        my $line = $input->get;

        push @History, $line;
        $Current = @History;

        $input->text("");

        if (my ($cmd) = ($line =~ m[^/(\w+)])) {
            $cmd = lc $cmd;
            if (defined $execute->{$cmd}) {
                $execute->{$cmd}->($line =~ m[(\S+)]g);
            }
            else {
                print "--- $cmd not registered";
            }
        }
        else {
            if ($CurrentChannel) {
                $poe_kernel->post( IRC => privmsg => $CurrentChannel, $line );
                print "> $line";
            }
            else {
                print "No Current Channel ---";
            }
        }
    }, KEY_ENTER;

    set_binding $editor sub {
        # Do nothing...overload the lose-focus event.
    }, KEY_TAB, KEY_BTAB;

    # Why doesn't this work?
    set_binding $editor sub {
        warn "Calling \$viewer->cursor_pageup";
        $viewer->cursor_pageup;
        $viewer->draw;
    }, KEY_PPAGE;

    set_binding $editor sub {
        warn "Calling \$viewer->cursor_pagedown";
        $viewer->cursor_pagedown;
        $viewer->draw;
    }, KEY_NPAGE;

    set_binding $editor sub { shift->text($History[--$Current]) }, KEY_UP;
    set_binding $editor sub {
        $Current++;
        if ($Current > @History)    { shift->text("") }
        else                        { shift->text( $History[$Current] ) }
    }, KEY_DOWN;

    # Focus on the editor.
    $editor->focus;
    $editor->draw;

    $_[-1] = bless { 
        -curses => $curses,
        -viewer => $viewer,
        -screen => $screen,
        -editor => $editor,
        -menu   => $menu,
        -nicks  => $nicks,
    }, shift;
}

sub about_dialog {
	shift->root->dialog
        ( -title    => "About poco_irc_client",
		  -message  => <<'ABOUT'
Program : Curses::UI::POE IRC Client
Author  : Scott McCoy
          tag@cpan.org

The sole purpose of this client is to demonstrate
new Curses::UI::POE features, as well as provide
an example of how Curses::UI::POE could be used.
This example was crafted specifically for snl20
from #perl, on the freenode network.
ABOUT
	);
}



( run in 0.654 second using v1.01-cache-2.11-cpan-39bf76dae61 )