[246] in BarnOwl Developers
[D-O-H] r420 - trunk/conf.asedeno/owl/modules
daemon@ATHENA.MIT.EDU (asedeno@MIT.EDU)
Thu Oct 29 18:04:05 2009
Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
To: dirty-owl-hackers@mit.edu
From: asedeno@MIT.EDU
Reply-to: dirty-owl-hackers@MIT.EDU
Date: Sun, 29 Oct 2006 09:58:09 -0500 (EST)
Author: asedeno
Date: 2006-10-29 05:02:26 -0500 (Sun, 29 Oct 2006)
New Revision: 420
Added:
trunk/conf.asedeno/owl/modules/jabber.pl
Log:
First pass jabber module.
Added: trunk/conf.asedeno/owl/modules/jabber.pl
===================================================================
--- trunk/conf.asedeno/owl/modules/jabber.pl (rev 0)
+++ trunk/conf.asedeno/owl/modules/jabber.pl 2006-10-29 10:02:26 UTC (rev 420)
@@ -0,0 +1,225 @@
+package owl_jabber;
+use Authen::SASL qw(Perl);
+use Net::Jabber;
+################################################################################
+# owl perl jabber support
+#
+# Todo:
+# Connect command.
+#
+################################################################################
+
+our $client;
+our $jid;
+
+sub onStart
+{
+ if(eval{\&owl::queue_message})
+ {
+ register_owl_commands();
+ }
+ else
+ {
+ # Our owl doesn't support queue_message. Unfortunately, this
+ # means it probably *also* doesn't support owl::error. So just
+ # give up silently.
+ }
+}
+push @::onStartSubs, \&onStart;
+
+sub onMainLoop
+{
+ return if ($client == undef);
+
+ my $status = $client->Process(0);
+ if ($status == undef)
+ {
+ #Admin message about disconnect here.
+ #Also consider getting out of @::onMainLoop.
+ return;
+ }
+
+ if ($::shutdown)
+ {
+ #Admin message about disconnect here.
+ #Also consider getting out of @::onMainLoop.
+ $client->Disconect();
+ return;
+ }
+}
+push @::onMainLoop, \&onMainLoop;
+
+################################################################################
+### Owl Commands
+sub register_owl_commands()
+{
+ 0;
+ owl::new_command(jabberlogin => \&cmd_login);
+ owl::new_command(jabberlogout => \&cmd_logout);
+ owl::new_command(jabberreply => \&cmd_reply);
+ owl::new_command(jwrite => \&cmd_jwrite);
+}
+
+sub cmd_login
+{
+ if ($client != undef)
+ {
+ # Admin message here.
+ return;
+ }
+
+ # These strings should not be hard-coded here.
+ $client = Net::Jabber::Client->new();
+ $client->SetMessageCallBacks(chat => \&process_incoming_chat_message);
+ my $status = $client->Connect(hostname => 'jabber.mit.edu',
+ tls => 1,
+ port => 5222,
+ componentname => 'mit.edu');
+
+ if (!$status)
+ {
+ owl::error("We failed to connect");
+ return;
+ }
+
+ # this needs error handling.
+ $client->AuthSend(username => $ENV{USER}, resource => 'owl', password => '');
+
+ $jid = new Net::Jabber::JID;
+ $jid->SetJID(userid => $ENV{USER},
+ server => ($client->{SERVER}->{componentname} ||
+ $client->{SERVER}->{hostname}),
+ resource => 'owl');
+
+ $client->PresenceSend(priority => 1);
+
+ return "";
+}
+
+sub cmd_logout
+{
+ if ($client)
+ {
+ $client->Disconnect();
+ $client = undef;
+ # Admin message here.
+ }
+}
+
+#our $repl_msg = undef;
+sub cmd_reply
+{
+ my $repl_msg = owl::getcurmsg();
+ if (!$repl_msg->is_jabber)
+ {
+ # owl::getcurmsg() doesn't work from the callback.
+ $repl_msg = undef;
+ return;
+ }
+ my $to = ($repl_msg->is_incoming)
+ ? $repl_msg->sender
+ : $repl_msg->recipient;
+
+ owl::start_edit_win("jwrite ".$to, \&process_owl_jabber_reply);
+}
+
+our $jwrite_to;
+sub cmd_jwrite
+{
+ if (!$client)
+ {
+ # Error here
+ return;
+ }
+ $jwrite_to = @_[1];
+ owl::start_edit_win("jwrite ".$jwrite_to, \&process_owl_jwrite);
+}
+
+################################################################################
+### Owl Callbacks
+sub process_owl_jwrite
+{
+ my $body = shift;
+# my $repl_msg = shift;
+ my $repl_msg = owl::getcurmsg();
+
+ my $j = new Net::XMPP::Message;
+ $j->SetMessage(to => $jwrite_to,
+ from => $jid->GetJID('base'),
+ type => 'chat',
+ body => $body
+ );
+
+ my $m = j2o($j, 'out');
+ owl::queue_message($m);
+ $client->Send($j);
+ # Errors?
+}
+
+sub process_owl_jabber_reply
+{
+ my $reply = shift;
+# my $repl_msg = shift;
+ my $repl_msg = owl::getcurmsg();
+
+ my $j = new Net::XMPP::Message;
+ $j->SetMessage(to => $repl_msg->is_incoming
+ ? $repl_msg->{sender}
+ : $repl_msg->{recipient},
+ from => $repl_msg->is_incoming
+ ? $repl_msg->{recipient}
+ : $repl_msg->{sender},
+ type => $repl_msg->{jtype},
+ body => $reply
+ );
+
+ $j->SetSubject($repl_msg->{subject}) if ($repl_msg->{subject});
+ $j->SetSubject($repl_msg->{thread}) if ($repl_msg->{thread});
+
+ my $m = j2o($j, 'out');
+ owl::queue_message($m);
+ $client->Send($j);
+ # Errors?
+}
+
+### XMPP Callbacks
+
+sub process_incoming_chat_message
+{
+ my ($session, $j) = @_;
+ owl::queue_message(j2o($j, 'in'));
+}
+
+
+### Helper functions
+
+sub j2o
+{
+ my $j = shift;
+ my $dir = shift;
+
+ my %props = (type => 'jabber',
+ replycmd => 'jabberreply',
+ direction => $dir);
+
+ if ($j->DefinedTo())
+ {
+ my $jid = $j->GetTo('jid');
+ $props{recipient} = $jid->GetJID('base');
+ $props{to_jid} = $jid->GetJID('full');
+ }
+ if ($j->DefinedFrom())
+ {
+ my $jid = $j->GetFrom('jid');
+ $props{sender} = $jid->GetJID('base');
+ $props{from_jid} = $jid->GetJID('full');
+ }
+ $props{jtype} = $j->GetType() if ($j->DefinedType());
+ $props{subject} = $j->GetSubject() if ($j->DefinedSubject());
+ $props{body} = $j->GetBody() if ($j->DefinedBody());
+ $props{thread} = $j->GetThread() if ($j->DefinedThread());
+ $props{error} = $j->GetError() if ($j->DefinedError());
+ $props{error_code} = $j->GetErrorCode() if ($j->DefinedErrorCode());
+
+ return owl::Message->new(%props);
+}