[246] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

[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);
+}


home help back first fref pref prev next nref lref last post