[251] in BarnOwl Developers

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

[D-O-H] r424 - trunk/conf.asedeno/owl/modules

daemon@ATHENA.MIT.EDU (asedeno@MIT.EDU)
Thu Oct 29 18:04:08 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 17:50:42 -0500 (EST)

Author: asedeno
Date: 2006-10-29 17:50:41 -0500 (Sun, 29 Oct 2006)
New Revision: 424

Modified:
   trunk/conf.asedeno/owl/modules/jabber.pl
Log:
Preliminary groupchat support.



Modified: trunk/conf.asedeno/owl/modules/jabber.pl
===================================================================
--- trunk/conf.asedeno/owl/modules/jabber.pl	2006-10-29 18:02:03 UTC (rev 423)
+++ trunk/conf.asedeno/owl/modules/jabber.pl	2006-10-29 22:50:41 UTC (rev 424)
@@ -71,6 +71,27 @@
             usage       => "jwrite JID [-t thread]"
         }
     );
+    owl::new_command(
+        jchat => \&cmd_jwrite_gc,
+        {
+            description => "Send a Jabber Message",
+            usage       => "jchat [room]@[server]"
+        }
+    );
+    owl::new_command(
+        jjoin => \&cmd_join_gc,
+        {
+            description => "Joins a jabber groupchat.",
+            usage       => "jjoin [room]@[server]/[nick]"
+        }
+    );
+    owl::new_command(
+        jpart => \&cmd_part_gc,
+        {
+            description => "Parts a jabber groupchat.",
+            usage       => "jpart [room]@[server]/[nick]"
+        }
+    );
 }
 
 sub cmd_login
@@ -131,6 +152,8 @@
 
 our $jwrite_to;
 our $jwrite_thread;
+our $jwrite_subject;
+our $jwrite_type;
 sub cmd_jwrite
 {
     if (!$client)
@@ -141,22 +164,91 @@
 
     $jwrite_to = "";
     $jwrite_thread = "";
+    $jwrite_subject = "";
+    $jwrite_type = "chat";
     my @args = @_;
     my $argsLen = @args;
-    for (my $i = 1; $i < $argsLen; $i++)
+
+  JW_ARG: for (my $i = 1; $i < $argsLen; $i++)
     {
-	$args[$i] =~ /^-t$/ && ($jwrite_thread = $args[$i++] and next $i);
+	$args[$i] =~ /^-t$/ && ($jwrite_thread = $args[++$i]  && next JW_ARG);
+	$args[$i] =~ /^-s$/ && ($jwrite_subject = $args[++$i] && next JW_ARG);
+	if ($jwrite_to ne '')
+	{
+	    # Too many To's
+	    $jwrite_to = '';
+	    last;
+	}
+	if ($jwrite_to)
+	{
+	    $jwrite_to == '';
+	    last;
+	}
 	$jwrite_to = $args[$i];
     }
 
     if(!$jwrite_to) {
-        owl::error("Usage: jwrite JID [-t thread]");
+        owl::error("Usage: jwrite JID [-t thread] [-s 'subject']");
         return;
     }
+    
     owl::message("Type your message below.  End with a dot on a line by itself.  ^C will quit.");
-    owl::start_edit_win("jwrite ".$jwrite_to, \&process_owl_jwrite);
+    owl::start_edit_win(join(' ', @args), \&process_owl_jwrite);
 }
 
+sub cmd_join_gc
+{
+    if (!$client)
+    {
+	# Error here
+	return;
+    }
+    if(!$_[1])
+    {
+	owl::error("Usage: jchat [room]@[server]/[nick]");
+	return;
+    }
+
+    $client->PresenceSend(to=>$_[1]);
+    return "";
+}
+
+sub cmd_part_gc
+{
+    if (!$client)
+    {
+	# Error here
+	return;
+    }
+    if(!$_[1])
+    {
+	owl::error("Usage: jchat [room]@[server]/[nick]");
+	return;
+    }
+
+    $client->PresenceSend(to=>$_[1], type=>'unavailable');
+    return "";
+}
+
+sub cmd_jwrite_gc
+{
+    if (!$client)
+    {
+	# Error here
+	return;
+    }
+
+    $jwrite_to = $_[1];
+    $jwrite_thread = "";
+    $jwrite_subject = "";
+    $jwrite_type = "groupchat";
+    my @args = @_;
+    my $argsLen = @args;
+
+    owl::message("Type your message below.  End with a dot on a line by itself.  ^C will quit.");
+    owl::start_edit_win(join(' ', @args), \&process_owl_jwrite);
+}
+
 ################################################################################
 ### Owl Callbacks
 sub process_owl_jwrite
@@ -164,17 +256,22 @@
     my $body = shift;
 
     my $j = new Net::XMPP::Message;
+    $body =~ s/\n\z//;
     $j->SetMessage(to => $jwrite_to,
-		   from => $jid->GetJID('base'),
- 		   type => 'chat',
+		   from => $jid->GetJID('full'),
+ 		   type => $jwrite_type,
  		   body => $body
 		   );
     $j->SetThread($jwrite_thread) if ($jwrite_thread);
+    $j->SetSubject($jwrite_subject) if ($jwrite_subject);
 
     my $m = j2o($j, 'out');
-    owl::queue_message($m);
+    if ($jwrite_type ne 'groupchat')
+    {
+	#XXX TODO: Check for displayoutgoing.
+	owl::queue_message($m);
+    }
     $client->Send($j);
-    # Errors?
 }
 
 ### XMPP Callbacks
@@ -220,34 +317,45 @@
     my %props = (type => 'jabber',
 		 direction => $dir);
 
+
+    $props{replycmd} = "jwrite";
+
+    $props{jtype} = $j->GetType();
+    $props{jtype} =~ /^(?:headline|error)$/ && {$props{replycmd} = undef};
+    $props{jtype} =~ /^groupchat$/ && {$props{replycmd} = "jchat"};
+
     my $reply_to;
     if ($j->DefinedTo())
     {
 	my $jid = $j->GetTo('jid');
 	$props{recipient} = $jid->GetJID('base');
 	$props{to_jid} = $jid->GetJID('full');
-	$reply_to = $props{recipient} if ($dir eq 'out');
+	if ($dir eq 'out')
+	{
+	    $reply_to = $props{to_jid};
+	    $props{jtype} =~ /^groupchat$/ && {$reply_to = $jid->GetJID('base')};
+	}
     }
     if ($j->DefinedFrom())
     {
 	my $jid = $j->GetFrom('jid');
 	$props{sender} = $jid->GetJID('base');
 	$props{from_jid} = $jid->GetJID('full');
-	$reply_to = $props{sender} if ($dir eq 'in');
+	$reply_to = $props{from_jid} if ($dir eq 'in');
+	if ($dir eq 'in')
+	{
+	    $reply_to = $props{from_jid};
+	    $props{jtype} =~ /^groupchat$/ && {$reply_to = $jid->GetJID('base')};
+	}
     }
 
-    $props{jtype} = $j->GetType();
-
-    $props{replycmd} = "jwrite";
-    $props{jtype} =~ /^(?:headline|error)/ && {$props{replycmd} = undef};
-
     $props{subject} = $j->GetSubject() if ($j->DefinedSubject());
     $props{body} = $j->GetBody() if ($j->DefinedBody());
-    if ($j->DefinedThread())
-    {
-	$props{thread} = $j->GetThread() if ($j->DefinedThread());
-	$props{replycmd} .= " -t $props{thread}";
-    }
+#    if ($j->DefinedThread())
+#    {
+#	$props{thread} = $j->GetThread() if ($j->DefinedThread());
+#	$props{replycmd} .= " -t $props{thread}";
+#    }
     $props{error} = $j->GetError() if ($j->DefinedError());
     $props{error_code} = $j->GetErrorCode() if ($j->DefinedErrorCode());
     $props{replycmd} .= " $reply_to";


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