Author: bdonlan
Date: 2004-05-29 16:50:23 -0400 (Sat, 29 May 2004)
New Revision: 188

Modified:
   trunk/haver-gtk/TODO
   trunk/haver-gtk/bin/haver-gtk.pl
   trunk/haver-gtk/lib/Haver/Client/Gtk/Page/Channel.pm
   trunk/haver-gtk/lib/Haver/Client/Gtk/Pages.pm
Log:
Moved channel haver_* events to a per-tab session


Modified: trunk/haver-gtk/TODO
===================================================================
--- trunk/haver-gtk/TODO        2004-05-29 20:03:30 UTC (rev 187)
+++ trunk/haver-gtk/TODO        2004-05-29 20:50:23 UTC (rev 188)
@@ -1,4 +1,7 @@
 TODO:
+* Figure out why /quit dosen't work
+* Split pmsg, etc into Query.pm, like with Channel.pm
+* Move rawlog functions to its own file
 * Move cmd_* and haver_* to separate files
 * Server list
 * Preferences

Modified: trunk/haver-gtk/bin/haver-gtk.pl
===================================================================
--- trunk/haver-gtk/bin/haver-gtk.pl    2004-05-29 20:03:30 UTC (rev 187)
+++ trunk/haver-gtk/bin/haver-gtk.pl    2004-05-29 20:50:23 UTC (rev 188)
@@ -40,6 +40,9 @@
 use Haver::Config;
 use Haver::Client::Command::Callback;
 use Haver::Client::Gtk::Pages;
+use Haver::Client::Gtk::Page::Channel;
+use Haver::Client::Gtk::Page::Text;
+use Haver::Client::Gtk::Page::Query;
 # XXX: Implement config files
 use Data::Dumper;
 use Carp;
@@ -62,7 +65,7 @@
 sub get_query_page ($) {
        my $page = $pages->get_page("=$_[0]");
        if(!$page) {
-               $page = $pages->new_page('Query', $_[0]);
+               $page = $pages->add_page(new 
Haver::Client::Gtk::Page::Query($_[0]));
                $page->print_page("Starting query with $_[0]");
        }
        return $page;
@@ -132,14 +135,8 @@
        haver_login_request
        haver_login
        haver_login_fail
-       haver_msg
        haver_pmsg
        haver_joined
-       haver_parted
-       haver_join
-       haver_part
-       haver_quit
-       haver_users
        cmd_join
        cmd_j
        cmd_users
@@ -215,8 +212,8 @@
 
        $gui{main_window}->show;
 
-       $pages->new_page("Text", "Server");
-       $pages->new_page("Text", "!rawlog");
+       $pages->add_page(new Haver::Client::Gtk::Page::Text("Server"));
+       $pages->add_page(new Haver::Client::Gtk::Page::Text("!rawlog"));
        $pages->set_page(0);
 
        $kernel->yield('connect_win');
@@ -411,16 +408,6 @@
        $pages->get_page(0)->print_page("Logged in.");
        $_[HEAP]->{ready} = 1;
 }
-sub haver_msg {
-       my ($kernel, $heap, $args, $chan) = @_[KERNEL,HEAP,ARG0,ARG1];
-       my ($type, $from, $text) = (@$args)[0,1,2];
-       my @lines = split "\n", $text;
-       if($type eq q{"}) {
-               $pages->get_page("#$chan")->print_page(map { "$from: $_" } 
@lines);
-       } elsif ($type eq q{:}) {
-               $pages->get_page("#$chan")->print_page(map { "* $from $_" } 
@lines);
-       }
-}
 
 sub haver_pmsg {
        my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
@@ -440,83 +427,36 @@
                $kernel->post('haver', 'part', $channel);
                return;
        }
-       return if(defined $heap->{clist}->{$channel});
-       $heap->{clist}->{$channel} = $pages->new_page("Channel", "$channel");
-       $pages->get_page("#$channel")->print_page("Joined $channel.");
-       $kernel->post('haver', 'users', $channel);
 }      
 
-sub haver_join {
-       my ($kernel, $heap, $args, $channel) = @_[KERNEL,HEAP,ARG0,ARG1];
-       my $uid = $args->[0];
-
-       my $page = $pages->get_page("#$channel");
-       return unless $page;
-       $page->add_ulist($uid);
-       $page->print_page("$uid has joined $channel.");
-}
-
-sub haver_part {
-       my ($kernel, $heap, $args, $channel) = @_[KERNEL,HEAP,ARG0,ARG1];
-       my $uid = $args->[0];
-
-       my $page = $pages->get_page("#$channel");
-       return unless $page;
-       $page->del_ulist($uid);
-       $page->print_page("$uid has left $channel.");
-}
-
-sub haver_quit {
-       my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
-       my ($uid, $why) = @$args;
-
-       for($pages->get_pages()) {
-               next unless $_->get_name() =~ /^\#/;
-               my $present = $_->del_ulist($uid);
-               $_->print_page("$uid has quit: $why") if($present);
-       }
-}
-
-sub haver_users {
-       my ($kernel, $heap, $args, $chan) = @_[KERNEL,HEAP,ARG0,ARG1];
-       my @users = @$args;
-       $pages->get_page("#$chan")->set_ulist(@users);
-       $pages->get_page("#$chan")->print_page("Users for channel $chan:", 
join(" - ", @users)); # XXX: Split into multiple lines
-}
-
-sub haver_parted {
-       my ($kernel, $heap, $chan) = @_[KERNEL,HEAP,ARG1];
-       my $page = delete $heap->{clist}->{$chan};
-       return unless defined $page;
-       $pages->del_page($page);
-}
-
 sub cmd_say {
        my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG1];
        $pages->get_current_page()->send_msg(q{"}, $args->[0]);
 }
 
+sub cmd_j { goto &cmd_join; }
 
-
-sub cmd_j { goto &cmd_join }
-
 sub cmd_quit { goto &quit; }
 
-
 sub cmd_join {
        my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG1];
        my ($chan) = @$args;
 
-       if(exists $heap->{clist}->{$chan}) {
-               $pages->set_page("#$chan") if $pages->get_page("#$chan");
-               return;
+       if (exists $heap->{clist}->{$chan}) {
+               my $page = $pages->get_page("#$chan");
+               if ($page) {
+                       ### XXX: Move rejoin logic to channel module
+                       unless ($page->{present}) {
+                               $kernel->post('haver', 'join', $chan);
+                       }
+                       $pages->set_page($page);
+                       return;
+               }
        }
        $kernel->post("haver", "join", $chan);
-       $heap->{clist}->{$chan} = undef;
+       $pages->add_page(new Haver::Client::Gtk::Page::Channel($chan, FALSE));
 }
 
-
-
 sub cmd_users {
        my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG1];
        my $chan;

Modified: trunk/haver-gtk/lib/Haver/Client/Gtk/Page/Channel.pm
===================================================================
--- trunk/haver-gtk/lib/Haver/Client/Gtk/Page/Channel.pm        2004-05-29 
20:03:30 UTC (rev 187)
+++ trunk/haver-gtk/lib/Haver/Client/Gtk/Page/Channel.pm        2004-05-29 
20:50:23 UTC (rev 188)
@@ -30,8 +30,11 @@
 
 our $VERSION = 0.01;
 
+### METHODS
+
 sub new ($$) {
-       my ($class, $name) = @_;
+       my ($class, $name, $present) = @_;
+       $present ||= 0; # Make sure it's defined
        my $page = Haver::Client::Gtk::Page::Text::new($class, "#$name");
                
        my $sw = Gtk::ScrolledWindow->new(undef, undef);
@@ -47,11 +50,31 @@
        $page->{sw} = $sw;
        $page->{channel} = $name;
        $page->{local} = 0;
+       $page->{present} = $present;
+       $page->{session}  = POE::Session->create(
+               object_states => [
+               $page => {qw{
+                       haver_joined            _joined
+                       haver_parted            _parted
+                       haver_join                      _join
+                       haver_part                      _part
+                       haver_quit                      _quit
+                       haver_users                     _users
+                       haver_msg                       _msg
+                       haver_disconnected      _discon
+                       _start                          _start
+               }}, # $page => {qw{
+               ], # object_states =>
+       )->ID;
        return $page;
 }
 
 sub send_msg ($$$) {
        my ($self, $type, $text) = @_;
+       if (!$self->{present}) {
+               $self->print_page("You're not on this channel.");
+               return;
+       }
        $poe_kernel->post('haver', 'msg', $type, $self->{channel}, $text);
 }
 
@@ -100,8 +123,111 @@
 
 sub close ($) {
        my $self = shift;
-       $poe_kernel->post('haver', 'part', $self->{channel});
-       return 0;
+       if ($self->{present}) {
+               $poe_kernel->post('haver', 'part', $self->{channel});
+               return 0;
+       } else {
+               return 1;
+       }
 }
 
+sub added {
+       my ($self, $notebook) = @_;
+       $self->{notebook} = $notebook;
+}
+
+sub removed {
+       # We've been removed from the tablist, destroy the session
+       my $self = shift;
+       $poe_kernel->post($self->{session}, 'destroy');
+       delete $self->{notebook};
+}
+
+### SESSION EVENTS
+
+sub _start {
+       my ($self, $kernel) = @_[OBJECT,KERNEL];
+       # XXX: smaller registration set?
+       $kernel->post('haver', 'register', 'all');
+}
+
+sub _joined {
+       my ($self, $kernel, $chan) = @_[OBJECT,KERNEL,ARG1];
+       if ($self->{channel} eq $chan) {
+               $self->print_page("Joined $chan.");
+               $self->{present} = 1;
+               $kernel->post('haver', 'users', $chan);
+       }
+}
+
+sub _parted {
+       my ($self, $kernel, $chan) = @_[OBJECT,KERNEL,ARG1];
+       if ($chan eq $self->{channel}) {
+               $self->{notebook}->del_page($self) if $self->{notebook};
+       }
+}
+
+sub _join {
+       my ($self, $kernel, $args, $chan) = @_[OBJECT,KERNEL,ARG0,ARG1];
+       if ($chan eq $self->channel) {
+               my $who = $args->[0];
+               $self->ulist_add($who);
+               $self->print_page("$who has joined $chan.");
+       }
+}
+
+sub _part {
+       my ($self, $kernel, $args, $chan) = @_[OBJECT,KERNEL,ARG0,ARG1];
+       if ($chan eq $self->channel) {
+               my $who = $args->[0];
+               $self->ulist_del($who);
+               $self->print_page("$who has left $chan.");
+       }
+}
+
+sub _quit {
+       my ($self, $kernel, $args) = @_[OBJECT,KERNEL,ARG0];
+       my ($who, $why) = @$args;
+       if ($self->ulist_del($who)) {
+               $self->print_page("$who has quit: $why.");
+       }
+}
+       
+sub _msg {
+       my ($self, $kernel, $args, $chan) = @_[OBJECT,KERNEL,ARG0,ARG1];
+       if ($chan eq $self->{channel}) {
+               my ($type, $who, $text) = @$args;
+               my $prefix;
+               my @lines = split "\n", $text;
+               if ($type eq q{"}) {
+                       $prefix = "<$who> ";
+               } elsif ($type eq q{:}) {
+                       $prefix = "* $who ";
+               } else {
+                       if ($text =~ /\n/) {
+                               @lines = map { ">$_" } @lines;
+                               $self->print_page("$who sent unknown message 
type $type:", @lines);
+                       } else {
+                               $self->print_page("$who send unknown message 
type $type: $text");
+                       }
+                       return;
+               }
+               @lines = map { "$prefix$_" } @lines;
+               $self->print_page(@lines);
+       }
+}
+
+sub _users {
+       my ($self, $kernel, $users, $chan) = @_[OBJECT,KERNEL,ARG0,ARG1];
+       if ($chan eq $self->{channel}) {
+               $self->set_ulist(@$users);
+       }
+}
+
+sub _discon {
+       my ($self, $kernel) = @_[OBJECT,KERNEL];
+       $self->print_page("Disconnected.");
+       $self->{present} = 0;
+}
+
 1;

Modified: trunk/haver-gtk/lib/Haver/Client/Gtk/Pages.pm
===================================================================
--- trunk/haver-gtk/lib/Haver/Client/Gtk/Pages.pm       2004-05-29 20:03:30 UTC 
(rev 187)
+++ trunk/haver-gtk/lib/Haver/Client/Gtk/Pages.pm       2004-05-29 20:50:23 UTC 
(rev 188)
@@ -72,6 +72,7 @@
        $self->{notebook}->append_page($hash->{frame}, $hash->{label});
        $hash->{frame}->show;
        $self->set_page($hash);
+       $hash->added($self) if $hash->can('added');
        return $hash;
 }
 
@@ -108,6 +109,7 @@
                carp "Warning: page $id not found";
                return;
        }
+       $pagestruct->removed() if $pagestruct->can('removed');
        $self->{notebook}->remove_page($pagestruct->{pagenum});
        delete $self->{pagenam}{$pagestruct->{string}};
        splice @{$self->{pagenum}}, $pagestruct->{pagenum}, 1;


Reply via email to