Index: openacs-4/packages/xowiki/tcl/chat-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/chat-procs.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/xowiki/tcl/chat-procs.tcl 13 Sep 2012 16:05:26 -0000 1.15 @@ -0,0 +1,150 @@ +::xo::library doc { + XoWiki - chat procs + + @creation-date 2006-02-02 + @author Gustaf Neumann + @cvs-id $Id: chat-procs.tcl,v 1.15 2012/09/13 16:05:26 victorg Exp $ +} +namespace eval ::xowiki { + ::xo::ChatClass Chat -superclass ::xo::Chat + + Chat instproc render {} { + my orderby time + set result "" + foreach child [my children] { + set msg [$child msg] + set user_id [$child user_id] + set timelong [clock format [$child time]] + set timeshort [clock format [$child time] -format {[%H:%M:%S]}] + if {$user_id > 0} { + acs_user::get -user_id $user_id -array user + set name [expr {$user(screen_name) ne "" ? $user(screen_name) : $user(name)}] + set url "/shared/community-member?user%5fid=$user_id" + set creator "$name" + } else { + set creator "Nobody" + } + append result "$timeshort\ + [my encode $creator]\ + [my encode $msg]\n" + } + return $result + } + + Chat proc initialize_nsvs {} {;} ;# noop + + Chat proc login {-chat_id -package_id -mode} { + my log "--" + auth::require_login + if {![info exists package_id]} {set package_id [ad_conn package_id] } + if {![info exists chat_id]} {set chat_id $package_id } + set context id=$chat_id&s=[ad_conn session_id].[clock seconds] + set path [lindex [site_node::get_url_from_object_id -object_id $package_id] 0] + + if {![info exists mode]} { + set mode polling + if {[info command ::thread::mutex] ne "" && + ![catch {ns_conn contentsentlength}]} { + # we seem to have libthread installed, and the patch for obtaining the tcl-stream + # from a connection thread, so we can use the background delivery thread; + # scripted streaming should work everywhere + set mode scripted-streaming + if {[regexp (firefox) [string tolower [ns_set get [ns_conn headers] User-Agent]]]} { + # for firefox, we could use the nice mode without the spinning load indicator + # currently, streaming mode seems broken with current firefox... + #set mode streaming + } + } + my log "--chat mode $mode" + } + + switch $mode { + polling { + ::xo::Page requireJS "/resources/xowiki/get-http-object.js" + set jspath packages/xowiki/www/ajax/chat.js + set login_url ${path}ajax/chat?m=login&$context + set get_update "chatSendCmd(\"$path/ajax/chat?m=get_new&$context\",chatReceiver)" + set get_all "chatSendCmd(\"$path/ajax/chat?m=get_all&$context\",chatReceiver)" + } + streaming { + set jspath packages/xowiki/www/ajax/streaming-chat.js + set subscribe_url ${path}ajax/chat?m=subscribe&$context + } + scripted-streaming { + append context &mode=scripted + set jspath packages/xowiki/www/ajax/scripted-streaming-chat.js + set subscribe_url ${path}ajax/chat?m=subscribe&$context + } + } + set send_url ${path}ajax/chat?m=add_msg&$context&msg= + + if { ![file exists [acs_root_dir]/$jspath] } { + return -code error "File [acs_root_dir]/$jspath does not exist" + } + set file [open [acs_root_dir]/$jspath]; set js [read $file]; close $file + + my log "--CHAT mode=$mode" + + switch $mode { + polling {return "\ + +
+ + +
" + } + + + streaming {return "\ + +
+
+ " + } + + + scripted-streaming {return "\ + +
+ + + +
" + } + } + } +} +