[Tkabber-dev] r937 - in trunk/tkabber-plugins: . tclchat

tkabber-svn at jabber.ru tkabber-svn at jabber.ru
Tue Feb 13 22:36:31 MSK 2007


Author: sergei
Date: 2007-02-13 22:36:28 +0300 (Tue, 13 Feb 2007)
New Revision: 937

Added:
   trunk/tkabber-plugins/tclchat/
   trunk/tkabber-plugins/tclchat/tclchat.tcl
   trunk/tkabber-plugins/tclchat/tclchat_commands.tcl
   trunk/tkabber-plugins/tclchat/tclchat_messages.tcl
Modified:
   trunk/tkabber-plugins/ChangeLog
Log:
	* tclchat/tclchat.tcl, tclchat/tclchat_commands.tcl,
	  tclchat/tclchat_messages.tcl: Added modified tclchat plugin by Pat
	  Thoyts for more comfortable use of Tclers' chat (unfinished yet).


Modified: trunk/tkabber-plugins/ChangeLog
===================================================================
--- trunk/tkabber-plugins/ChangeLog	2007-02-13 04:26:10 UTC (rev 936)
+++ trunk/tkabber-plugins/ChangeLog	2007-02-13 19:36:28 UTC (rev 937)
@@ -3,6 +3,10 @@
 	* debug/msgs/es.msg, spy/msgs/es.msg, whiteboard/msgs/es.msg: Updated
 	  Spanish translation (thanks to Badlop).
 
+	* tclchat/tclchat.tcl, tclchat/tclchat_commands.tcl,
+	  tclchat/tclchat_messages.tcl: Added modified tclchat plugin by Pat
+	  Thoyts for more comfortable use of Tclers' chat (unfinished yet).
+
 2006-02-11  Sergei Golovan <sgolovan at nes.ru>
 
 	* iconsets/icq/icondef.xml, iconsets/icq/tkabber/tkabber-logo.gif:

Added: trunk/tkabber-plugins/tclchat/tclchat.tcl
===================================================================
--- trunk/tkabber-plugins/tclchat/tclchat.tcl	                        (rev 0)
+++ trunk/tkabber-plugins/tclchat/tclchat.tcl	2007-02-13 19:36:28 UTC (rev 937)
@@ -0,0 +1,400 @@
+# tclchat.tcl - Copyright (C) 2004 Pat Thoyts <patthoyts at users.sourceforge.net>
+#
+# Inject the history from the tclers chat logs into the current chat window.
+# This hook only activates if you open a groupchat to a site that
+# we know is linked to the tclers chat. ie: tach.tclers.tk or the irc channel.
+#
+# $Id$
+
+namespace eval tclchat {
+
+    custom::defvar options(use_tkchat_colors) 1 \
+        [msgcat::mc "Use TkChat embedded colors."] \
+        -group Chat -type boolean
+
+    hook::add finload_hook [namespace current]::on_init
+    hook::add open_chat_post_hook [namespace current]::on_open_chat
+    hook::add chat_send_message_hook [namespace current]::send_message 85
+}
+
+# Load in the additional files that are part of the tclchat plugin.
+#
+source [file join [file dirname [info script]] tclchat_messages.tcl]
+source [file join [file dirname [info script]] tclchat_commands.tcl]
+
+proc tclchat::on_init {} {
+    global tcl_platform
+    global loginconf
+    variable Options
+    variable urlid 0
+
+    set menu [.mainframe getmenu plugins]
+    $menu add checkbutton -label [msgcat::mc "Tkchat colors"] \
+        -underline 0 -variable [namespace current]::options(use_tkchat_colors)
+
+    array set Options {
+        auth          {}
+        HistoryLines  0
+        url           "http://tclers.tk/conferences/tcl"
+        sel           "/?pattern=*.tcl"
+        RE            {<A HREF="([0-9\-%d]+\.tcl)">.*\s([0-9]+) bytes}
+    }
+    package require http
+    if {![info exists loginconf(useragent)]} {
+        set loginconf(useragent) [http::config -useragent]
+    }
+    http::config \
+        -proxyfilter [namespace origin proxyfilter] \
+        -useragent $loginconf(useragent)
+
+    if {[package provide tls] != {}} {
+        http::register https 443 ::tls::socket
+    }
+        
+    if {$loginconf(useproxy)} {
+        if {[string length $loginconf(httplogin)] > 0} {
+            set Options(auth) [list Proxy-Authorization \
+                [concat Basic [base64::encode \
+                     "$loginconf(httplogin):$loginconf(httppassword)"]]]
+        }
+    }
+}
+
+proc tclchat::proxyfilter {host} {
+    global loginconf
+    if {[string match "localhost*" $host] || [string match "127.*" $host]} {
+        return {}
+    }
+    if {$loginconf(useproxy)} {
+        return [list $loginconf(httpproxy) $loginconf(httpproxyport)]
+    }
+    return {}
+}
+
+proc tclchat::on_open_chat {chatid type} {
+    variable Options
+    if {[string equal $type "groupchat"]} {
+        switch -glob -- [set mucjid [chat::get_jid $chatid]] {
+            *@tach.tclers.tk {
+                set muc [lindex [split $mucjid @] 0]
+                set Options(url) "http://tclers.tk/conferences/$muc"
+                after 400 [LoadHistory $chatid]
+            }
+        }
+    }
+    set W [chat::chat_win $chatid]
+    $W tag configure URL -underline 1
+    $W tag bind URL <Enter> [list $W configure -cursor hand2]
+    $W tag bind URL <Leave> [list $W configure -cursor xterm]
+    return
+}
+
+# -------------------------------------------------------------------------
+
+# Check the HTTP response for redirecting URLs. - PT
+proc tclchat::checkForRedirection {tok} {
+    set ncode [::http::ncode $tok]
+    if {[expr {$ncode == 302 || $ncode == 301 || $ncode == 307}]} {
+        upvar \#0 $tok state
+        array set meta $state(meta)
+        if {[info exists meta(Location)]} {
+            return $meta(Location)
+        }
+    }
+    return {}
+}
+
+proc tclchat::FetchHistoryIndex {url} {
+    variable Options
+
+    set loglist {}
+    set tok [::http::geturl ${url}$Options(sel) -headers $Options(auth)]
+    switch -- [::http::status $tok] {
+        ok {
+            if {[::http::ncode $tok] >= 500} {
+                debugmsg tclchat "error [::http::code $tok]"
+            } elseif {[http::ncode $tok] >= 400} {
+                debugmsg tclchat "error [::http::code $tok]"
+            } else {
+                if {[set _url [checkForRedirection $tok]] != {}} {
+                    regsub {/\?M=D} $_url {} $_url
+                    set loglist [FetchHistoryIndex $_url]
+                } else {
+                    foreach line [split [::http::data $tok] \n] {
+                        if { [regexp -- $Options(RE) $line -> logname size] } {
+                            set logname [string map {"%2d" -} $logname]
+                            set size [expr {$size / 1024}]k
+                            set loglist [linsert $loglist 0 $logname $size]
+                        }
+                    }
+                }
+            }
+        }
+        reset   { debugmsg tclchat "reset" }
+        timeout { debugmsg tclchat "timeout" }
+        error   { debugmsg tclchat "error [::http::error $tok]" }
+        default { debugmsg tclchat "????? [::http::error $tok]" }
+    }
+    ::http::cleanup $tok
+    return $loglist
+}
+
+proc tclchat::ParseHistLog {log {reverse 0}} {
+    variable Options
+    
+    set retList {}
+    set MsgRE {^\s*(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun).+?\[([^\]]+)\]\s+([^:]+):?\s*(.*)$}
+    set ircRE {ircbridge: \*\*\* (.+) (.+)$}
+    set TimeRE {^(.+?)\s+(.+?)\s+(\d{1,2})\s+(\d\d:\d\d:\d\d)\s+(\d{4})}
+    set logtime 0
+
+    # fetch log
+    set url "$Options(url)/$log"
+    debugmsg tclchat "fetch log \"$url\""
+    set tok [::http::geturl $url -headers $Options(auth)]
+    
+    debugmsg tclchat "status [::http::status $tok] [::http::code $tok]"
+    switch -- [::http::status $tok] {
+        ok {
+            # Tcl Jabber logs
+            set I [interp create -safe]
+            interp alias $I m {} [namespace current]::ParseLogMsg
+            if { $reverse } {
+                set histTmp [set [namespace current]::History]
+                set Options(History) {}
+            }
+            $I eval [::http::data $tok]
+            if { $reverse } {
+                set Options(History) [concat $Options(History) $histTmp]
+            }
+        }
+        reset   { debugmsg tclchat "reset" }
+        timeout { debugmsg tclchat "timeout" }
+        error   { debugmsg tclchat "error [::http::error $tok]" }
+        default { debugmsg tclchat "????? [::http::error $tok]" }
+    }
+    ::http::cleanup $tok
+    return $retList
+}
+
+# this called on first logon and after a purge
+# so not bothering to backgound it
+proc tclchat::LoadHistory {chatid} {
+    variable Options
+    
+    set FinalList {}
+    if {$Options(HistoryLines) == 0} {
+	# don't even bother
+    } elseif {$Options(HistoryLines) < 0} {
+	set loglist [FetchHistoryIndex $Options(url)]
+	if {[set len [llength $loglist]] > 0} {
+            if {$len > 18} {
+                set loglist [lrange $loglist 0 17]
+            }
+
+	    # ask user
+	    set t [toplevel .histQ -class dialog]
+	    wm withdraw $t
+	    wm transient $t
+	    wm protocol $t WM_DELETE_WINDOW { }
+	    wm title $t "Load History From Logs"
+	    grid [label $t.lbl -font $::font \
+		    -text "Please select how far back you want to load:"] \
+		    -sticky ew -pady 5
+	    set i 0
+	    variable HistQueryNum [expr {[llength $loglist] / 2}]
+            set loglist [lpairreverse $loglist]
+	    foreach {l s} $loglist {
+		grid [radiobutton $t.rb$i -text "$l $s" -font $::font \
+                          -val $i -var [namespace current]::HistQueryNum] \
+                    -sticky w -padx 15 -pady 0
+		incr i
+	    }
+	    grid [radiobutton $t.rb$i -text "None" -font $::font \
+                      -val $i -var [namespace current]::HistQueryNum] \
+                -sticky w -padx 15 -pady 0
+	    grid [button $t.ok -text Ok -width 8 -font $::font \
+                      -command [list destroy $t] -default active] \
+                -sticky e -padx 5 -pady 10
+	    grid columnconfigure $t 0 -weight 1
+	    bind $t <Return> [list $t.ok invoke]
+	    catch {::tk::PlaceWindow $t widget .}
+	    wm deiconify $t
+	    tkwait visibility $t
+            focus $t.ok
+	    grab $t
+	    tkwait window $t
+	    foreach {l s} [lrange $loglist [expr {$HistQueryNum * 2}] end] {
+                debugmsg tclchat "loading history \"$l\" (${s}k)"
+		if {[catch {ParseHistLog $l} new]} {
+		    debugmsg tclchat "ERROR: $new"
+                }
+            }
+	}
+    } else {
+	set loglist [FetchHistoryIndex $Options(url)]
+	# go thru logs in reverse until N lines loaded
+        foreach {log size} $loglist {
+	    # fetch log
+	    if {[catch {ParseHistLog $log} new]} {
+		debugmsg tclchat "ERROR: $new"
+            }
+	    if {[llength $Options(History)] >= $Options(HistoryLines)} {
+		break
+	    }
+	}
+    }
+
+    set W [chat::chat_win $chatid]
+    
+    # Set a mark for the history insertion point.
+    if {[lsearch -exact [$W mark names] HISTORY] == -1} {
+        $W config -state normal
+        $W insert 0.0 \
+            "+++++++++++++++ Loading History +++++++++++++\n"
+        $W mark set HISTORY 0.0
+        $W config -state normal
+    }
+
+    LoadHistoryLines $chatid
+
+    $W see end
+}
+
+
+proc tclchat::LoadHistoryLines {chatid} {
+    variable Options
+
+    set w [chat::chat_win $chatid]
+    set state [$w cget -state]
+    $w configure -state normal
+
+    if {![info exists Options(History)]} {set Options(History) {}}
+
+    set count 0
+    foreach {time nick msg} $Options(History) {
+        #$w insert HISTORY "<$nick> $msg\n" [list they NICK-$nick]
+        Insert $w $nick $msg $time
+        incr count 3
+        if {$count > 100} { break }
+    }
+    $w see end
+    set Options(History) [lrange $Options(History) $count end]
+
+    if {$Options(History) == {}} {
+        $w configure -state normal
+        $w delete "HISTORY + 1 char" "HISTORY + 1 line"
+        $w insert "HISTORY + 1 char" \
+            "+++++++++++++++ End Of History +++++++++++++\n"
+    } else {
+        after idle [list [namespace origin LoadHistoryLines] $chatid]
+    }
+    
+    $w configure -state $state
+}
+
+proc tclchat::gotourl {url} {
+    debugmsg tclchat "goto url \"$url\""
+    browseurl $url
+}
+
+proc tclchat::Insert {w nick msg time} {
+    variable urlid
+    if {[info exists ::plugins::options(delayed_timestamp_format)]} {
+        set fmt $::plugins::options(delayed_timestamp_format)
+    } else {
+        set fmt "\[%m/%d %R\]"
+    }
+
+    if {[string equal $nick "ijchain"]} {
+        set nick ""
+        regexp {^<(\w+)> (.*)$} $msg -> nick msg
+    }
+
+    set nk "<$nick>"
+    if {[string length $nick] < 1} {set nk "*"}
+
+    $w insert HISTORY \
+        [clock format $time -format $fmt] {} \
+        "$nk " [list they NICK-$nick]
+    while {[regexp -nocase -- {^(.*?)<A.*?HREF="(.+?)".*?>(.*?)</A>(.*?)$} \
+                  $msg -> pre url link post]} {
+	if {[string length $pre]} {
+            $w insert HISTORY $pre [list they NICK-$nick]
+	}
+        set id URL-[incr urlid]
+        $w insert HISTORY $link [list they NICK-$nick URL $id]
+        $w tag bind $id <1> [list [namespace origin gotourl] $link]
+	set msg $post
+    }
+    $w insert HISTORY "$msg\n" [list they NICK-$nick]
+}
+
+proc tclchat::ParseLogMsg { when nick msg {opts ""} args } {
+    variable Options
+    set Options(HaveHistory) 1
+    set time [clock scan ${when} -gmt 1]
+    lappend Options(History) $time $nick $msg
+    if { [llength $args] > 0 } {
+	debugmsg tclchat "WARNING: Log incorrect log format."
+    }   
+    #debugmsg tclchat "[clock format $time] $nick :: $msg $opts $args"
+}
+
+proc tclchat::lpairreverse {L} {
+    set res {}
+    set i [llength $L]
+    while {$i} {
+        lappend res [lindex $L [incr i -2]] [lindex $L [incr i]]
+        incr i -1
+    }
+    set res
+}
+
+proc tclchat::color_to_hex {color} {
+    if {[string match "#*" $color]} {
+        return [string trim $color "#"]
+    } else {
+        foreach {r g b} [winfo rgb . $color] break
+        return [format "%02x%02x%02x" \
+                    [expr {$r % 256}] [expr {$g % 256}] [expr {$b % 256}]]
+    }
+}
+
+# tclchat::send_message --
+#
+#	In our tclers groupchat window, we want to override the normal send
+#	so that we can add additional 'x' elements to add our own color
+#	specification.
+#
+proc tclchat::send_message {chatid user body type} {
+    variable options
+    set jid [chat::get_jid $chatid]
+    if {$options(use_tkchat_colors) \
+            && [cequal $type "groupchat"] \
+            && [string match "*@tach.tclers.tk" $jid]} {
+        debugmsg tclchat "MESSAGE: $user $type"
+        if {[hook::is_flag chat_send_message_hook send]} {
+            set color [plugins::nickcolors::get_nick_color $user]
+            if {[string length $color] > 0} {
+                lappend xlist [jlib::wrapper:createtag x \
+                                   -vars [list xmlns urn:tkchat:chat \
+                                              color [color_to_hex $color]]]
+                set cmd [list message::send_msg $jid \
+                             -connection [chat::get_connid $chatid] \
+                             -type $type \
+                             -body $body \
+                             -xlist $xlist]
+                debugmsg tclchat "Handling message with color $color"
+                lassign [eval $cmd] status x
+                if {[cequal $status "error"]} {
+                    return stop
+                }
+                hook::unset_flag chat_send_message_hook send
+                return stop
+            }
+        }
+    }
+}
+
+# vim:ts=8:sw=4:sts=4:noet


Property changes on: trunk/tkabber-plugins/tclchat/tclchat.tcl
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: trunk/tkabber-plugins/tclchat/tclchat_commands.tcl
===================================================================
--- trunk/tkabber-plugins/tclchat/tclchat_commands.tcl	                        (rev 0)
+++ trunk/tkabber-plugins/tclchat/tclchat_commands.tcl	2007-02-13 19:36:28 UTC (rev 937)
@@ -0,0 +1,84 @@
+# tclchat_commands.tcl - Copyright (C) 2004 Pat Thoyts <patthoyts at users.sf.net>
+#
+#
+# $Id$
+
+namespace eval tclchat {
+    hook::add chat_send_message_hook \
+        [namespace current]::send_commands 50
+    hook::add generate_completions_hook \
+        [namespace current]::command_completion
+}
+
+proc tclchat::command_completion {chatid compsvar wordstart line} {
+    upvar 0 $compsvar comps
+    if {!$wordstart} {
+        lappend comps {/google }
+        lappend comps {/googlefight }
+        lappend comps {/tip }
+        lappend comps {/bug }
+    }
+}
+
+proc tclchat::send_commands {chatid user body type} {
+    if {$type == "groupchat"} {
+        set body [string trim $body]
+        if {[string match /* $body]} {
+            switch -regexp -- $body {
+                {^/google\s} {
+                    set body [string range $body 8 end]
+                    debugmsg tclchat "google \"$body\""
+                    if {[string length $body] > 0} {
+                        set q {http://www.google.com/search?ie=UTF-8&oe=UTF-8&}
+                        append q [::http::formatQuery q $body]
+                        browseurl $q
+                        return stop
+                    }
+                }
+                {^/googlefight\s} {
+                    googlefight $body
+                    return stop
+                }
+                {^/(urn:)?tip[: ]\d+} {
+                    if {[regexp {(?:urn:)?tip[: ](\d+)} $body -> tip]} {
+                        browseurl http://tip.tcl.tk/$tip
+                        return stop
+                    }
+                }
+                {^/bug[: ]} {
+                    dobug [split $body ": "]
+                    return stop
+                }
+            }
+        }
+    }
+}
+
+proc tclchat::dobug {msg} {
+    # msg should be of form: ^/bug[: ]id
+    if {[llength $msg] != 2} {
+	debugmsg tclchat "wrong # args: must be /bug id"
+	return
+    }
+    set id  [lindex $msg end]
+    set url "http://sourceforge.net/support/tracker.php?aid=$id"
+    browseurl $url
+}
+
+proc tclchat::googlefight {msg} {
+    set q {http://www.googlefight.com/cgi-bin/compare.pl}
+    set n 1
+    foreach word [lrange $msg 1 end] {
+        append q [expr {($n == 1) ? "?" : "&"}]
+        append q q$n=$word
+        incr n
+    }
+    if {[string match fr_* [msgcat::mclocale]]} {
+        append q &langue=fr
+    } else {
+        append q &langue=us
+    }
+    browseurl $q
+}
+
+# vim:ts=8:sw=4:sts=4:noet


Property changes on: trunk/tkabber-plugins/tclchat/tclchat_commands.tcl
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: trunk/tkabber-plugins/tclchat/tclchat_messages.tcl
===================================================================
--- trunk/tkabber-plugins/tclchat/tclchat_messages.tcl	                        (rev 0)
+++ trunk/tkabber-plugins/tclchat/tclchat_messages.tcl	2007-02-13 19:36:28 UTC (rev 937)
@@ -0,0 +1,129 @@
+# $Id$
+#
+# This does the same job and draw_normal_message but is capable of filtering
+# the extra nicks generated by the various bridges used in the tclers chats.
+# Namely ircbridge and ijbridge.
+#
+# This plugin processes messages from ijbridge in Tclers' chat only
+# (tcl at tach.tclers.tk)
+#
+# Includes support for nick_colors.tcl (now incorporated into tkabber proper)
+# and also supports the tclers chat embedded color.
+#
+# Originally by Steve Redler.
+# Modified by Pat Thoyts.
+# Rewritten by Sergei Golovan
+
+namespace eval tclchat {
+    hook::add process_message_hook [namespace current]::process_ijchain_message 30
+}
+
+proc tclchat::process_ijchain_message \
+     {connid from id type is_subject subject body err thread priority x} {
+
+    # Filter groupchat messages only
+    if {![cequal $type groupchat]} return
+
+    set group [node_and_server_from_jid $from]
+
+    set chatid [chat::chatid $connid $group]
+
+    # Filter messages from tcl at tach.tclers.tk only
+    if {![cequal $group tcl at tach.tclers.tk]} return
+
+    set nick [chat::get_nick $connid $from $type]
+
+    # Filter messages frim ijchain and *bridge only
+    if {$nick != "ijchain" && ![string match "*bridge" $nick]} return
+
+    set lbody [split $body " "]
+    # Update userlist on "*** nick leaves" and "*** nick joins" messages
+    # Update userlist on "* nick left" and "* nick entered" messages
+    if {[llength $lbody] == 3 && [cequal [lindex $lbody 0] "***"]} {
+
+	set nick [lindex $lbody 1]
+	set nickid $group/$nick
+
+	switch -- [lindex $lbody 2] {
+	    joins {
+		debugmsg chat "Handle \"$nick\" joined message."
+
+		set px [jlib::wrapper:createtag x \
+			    -vars [list xmlns $::NS(muc#user)] \
+			    -subtags [list [jlib::wrapper:createtag item \
+						-vars [list jid $from \
+							    affiliation none]]]]
+
+		if {[lsearch -exact $::grouproster(users,$chatid) $nickid] < 0} {
+		    client:presence $connid $nickid available [list $px]
+		} else {
+		    client:message $connid $group $id $type 0 "" \
+				   [::msgcat::mc "%s has joined IRC channel,\
+						  but he/she is already in Jabber room" \
+						 $nick] \
+				   $err $thread $priority $x
+		}
+		return stop
+	    }
+	    leaves {
+		debugmsg chat "Handle \"$nick\" left message."
+
+		if {[lsearch -exact $::grouproster(users,$chatid) $nickid] >= 0 && \
+			[muc::get_real_jid $connid $nickid] != $from} {
+		    client:message $connid $group $id $type 0 "" \
+				   [::msgcat::mc "%s has left IRC channel,\
+						  but he/she is still in Jabber room" \
+						 $nick] \
+				   $err $thread $priority $x
+		} else {
+		    client:presence $connid $nickid unavailable {}
+		}
+		return stop
+	    }
+	}
+
+	return
+    }
+
+    # Filter out nicks
+    if {[regexp {^<(\S+)>\s+(.*)} $body -> nick body]} {
+	set nickid $group/$nick
+	client:message $connid $nickid $id $type $is_subject $subject $body \
+		       $err $thread $priority $x
+	return stop
+    } elseif {[regexp {^\*\s+(\S+)\s+(.*)} $body -> nick body]} {
+	set nickid $group/$nick
+	client:message $connid $nickid $id $type $is_subject $subject "/me $body" \
+		       $err $thread $priority $x
+	return stop
+    }
+
+    return
+}
+
+# TODO: Use of tkchat colors
+# tclchat::check_color --
+#
+#	The tclers chat client 'tkchat' likes to embed the users choice of
+#	color into the 'x' elements of each jabber message. In this procedure
+#	we check that our idea of their color agrees. If not we'll update
+#	and refresh.
+#
+proc tclchat::check_color {nick x} {
+    foreach node $x {
+        jlib::wrapper:splitxml $node tag attr isempty body children
+        if {[cequal [jlib::wrapper:getattr $attr xmlns] "urn:tkchat:chat"]} {
+            set color [string trim [jlib::wrapper:getattr $attr "color"] "#"]
+            if {[string length $color] > 0} {
+                set orig [::plugins::nickcolors::get_nick_color $nick]
+                debugmsg chat "Checking color for $nick ('$orig' eq '#$color')"
+                if {![cequal "$orig" "#$color"]} {
+                    set ::plugins::nickcolors::NickColors($nick) "#$color"
+                    ::plugins::nickcolors::change_options
+                }
+            }
+        }
+    }
+}
+
+# vim:ts=8:sw=4:sts=4:noet


Property changes on: trunk/tkabber-plugins/tclchat/tclchat_messages.tcl
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native



More information about the Tkabber-dev mailing list