xep-0203: handle delayed delivery of messages in groupchat.
authorPat Thoyts <patthoyts@users.sourceforge.net>
Fri, 20 Jun 2008 10:11:09 +0000 (11:11 +0100)
committerPat Thoyts <patthoyts@users.sourceforge.net>
Fri, 20 Jun 2008 10:11:09 +0000 (11:11 +0100)
bin/bf_xmpp.tcl
bin/message.tcl

index 82b7233c5390748cd61bba11ce46da0eba448f5c..f70fe2b03366ae6a09c48c2238d1031a4575d8d4 100644 (file)
@@ -632,6 +632,15 @@ proc ::xmppplugin::OnMessage2 {ctx jlib xmldata} {
              [wrapper::getfirstchildwithxmlns $xmldata http://jabber.org/protocol/chatstates]]
     set receipt [wrapper::getchildswithtagandxmlns $xmldata request urn:xmpp:receipts]
 
+    set time [clock seconds]
+    set delay [lindex [wrapper::getchildswithtag $xmldata delay] 0]
+    if {$delay ne {}} {
+        set stamp [wrapper::getattribute $delay stamp]
+        if {[catch {set time [clock scan $stamp -format {%Y-%m-%dT%H:%M:%S%Z}]} err]} {
+            Log $ctx "Delayed delivery error \"$stamp\": $err"
+        }
+    }
+
     foreach x [wrapper::getchildswithtag $xmldata x] {
         switch -exact -- [wrapper::getattribute $x xmlns] {
             "jabber:x:delay" {}
@@ -671,7 +680,8 @@ proc ::xmppplugin::OnMessage2 {ctx jlib xmldata} {
                                 set newnick [lindex [split $msg] 4]
                             }
                         }
-                        Callback $ctx traffic $what $fromjid $fromres $newnick -group irc
+                        Callback $ctx traffic $what $fromjid $fromres \
+                            $newnick $time -group irc
                         return 0
                     } elseif {[regexp {^\* (\S+) (.*)$} $msg -> fromres msg]} {
                         set what action
@@ -683,7 +693,7 @@ proc ::xmppplugin::OnMessage2 {ctx jlib xmldata} {
                 set msg [string range $msg 3 end]
             }
             if {[string length $msg] > 0} {
-                Callback $ctx chat $fromjid $fromres $msg $what
+                Callback $ctx chat $fromjid $fromres $msg $what $time
             }
         }
         chat {
@@ -719,7 +729,7 @@ proc ::xmppplugin::OnMessage2 {ctx jlib xmldata} {
 
             if {[llength $body] > 0} {
                 Callback $ctx chat $a(from) $nick \
-                    [wrapper::getcdata [lindex $body 0]] normal
+                    [wrapper::getcdata [lindex $body 0]] normal $time
             }
         }
         normal {
@@ -728,13 +738,6 @@ proc ::xmppplugin::OnMessage2 {ctx jlib xmldata} {
             if {[llength $nicktag] >0} {
                 set from "[wrapper::getcdata [lindex $nicktag 0]] <$from>"
             }
-            set time [clock seconds]
-            set delay [lindex [wrapper::getchildswithtag $xmldata delay] 0]
-            if {$delay ne {}} {
-                set stamp [wrapper::getattribute $delay stamp]
-                catch {set time [clock scan $da(stamp) \
-                                     -format {%Y-%m-%dT%H:%M:%S%Z}]}
-            }
             set p [list -date $time -subject $subject]
             if {$thread ne {}} {lappend p -thread $thread}
             lappend p -body [set bodydata [wrapper::getcdata [lindex $body 0]]]
@@ -744,7 +747,7 @@ proc ::xmppplugin::OnMessage2 {ctx jlib xmldata} {
         }
         headline {
             Callback $ctx chat $a(to) $a(from) \
-                "header: [wrapper::etcdata [lindex $body 0]]" normal
+                "header: [wrapper::etcdata [lindex $body 0]]" normal $time
             Log $ctx "$a(from)->$a(to) headline $xmldata"
         }
         error {
@@ -788,16 +791,6 @@ proc ::xmppplugin::query_user {Chat user what} {
     return
 }
 
-proc ::xmppplugin::SendReceipt {Chat} {
-    lappend xlist [wrapper::createtag received \
-                       -attrlist {xmlns urn:xmpp:receipts}]
-    set margs [list -type $chat(type) -xlist $xlist]
-    if {![catch {set thread [dict get $xmpp(opts) $chat(channel) -thread]}]} {
-        lappend margs -thread $thread
-    }
-    eval [linsert $margs 0 $xmpp(jlib) send_message $chat(channel)]
-}
-
 package provide xmppplugin $::xmppplugin::version
 
 # -------------------------------------------------------------------------
@@ -1287,7 +1280,7 @@ proc XmppCallback {Session context state args} {
         }
         close {
             foreach {target} $args break
-            Debug $Session [mc "closing $s" $target]
+            Debug $Session [mc "closing %s" $target]
             XmppRemoveWindow $Session $target
         }
         addchat {
@@ -1351,14 +1344,15 @@ proc XmppCallback {Session context state args} {
             }
         }
         chat {
-            foreach {target nick msg type} $args break
+            foreach {target nick msg type time} $args break
             if {$type eq ""} {set type normal}
+            if {$time eq ""} {set time [clock seconds]}
             set w [XmppCreateWindow $Session $target -type chat]
             XmppAlert $Session $target
             switch -exact -- [winfo class $w] {
-                Chatwidget {$w message $msg -nick $nick -type $type}
+                Chatwidget {$w message $msg -nick $nick -type $type -time $time}
                 Messagewidget {
-                    $w add -from $nick -to Me -body $msg -date [clock seconds]
+                    $w add -from $nick -to Me -body $msg -date $time
                 }
                 default {puts stderr "invalid chat target \"$target\""}
             }
@@ -1393,27 +1387,28 @@ proc XmppCallback {Session context state args} {
             }
         }
         traffic {
-            foreach {action target nick new} $args break
+            foreach {action target nick new time} $args break
+            if {$time eq ""} {set time [clock seconds]}
             set w [XmppFindWindow $Session $target]
             if {[winfo class $w] ne "Chatwidget"} {return}
             switch -exact -- $action {
                 joining { XmppCreateWindow $Session $target -type groupchat}
                 entered {
                     eval [linsert $args 0 $w name add $nick]
-                    $w message [mc "%s entered" $nick] -nick $nick -type system
+                    $w message [mc "%s entered" $nick] -nick $nick -time $time -type system
                 }
                 left {
                     $w name delete $nick
-                    $w message [mc "%s left" $nick] -nick $nick -type system
+                    $w message [mc "%s left" $nick] -nick $nick -time $time -type system
                 }
                 nickchange {
                     $w name delete $nick
                     eval [linsert $args 0 $w name add $new]
                     $w message [mc "%s is now known as %s" $nick $new] \
-                        -nick $nick -type system
+                        -nick $nick -time $time -type system
                 }
                 default {
-                    $w message "$nick $action" -nick $nick -type system
+                    $w message "$nick $action" -nick $nick -time $time -type system
                 }
             }
         }
index a186c28e1c32e5e2424a5d824502d08023c602cf..a7ab287a1c2ae4dfe89fb90c0e4bd914ee28b960 100644 (file)
@@ -142,6 +142,8 @@ proc messagewidget::DisplayTime {time} {
     return $r
 }
 
+# -date : date/time as clock seconds
+# 
 proc messagewidget::Add {self args} {
     upvar #0 [namespace current]::$self state
     set msg [eval [linsert $args 0 dict create -state U \