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;