[Tkabber-dev] r318 - in trunk/plugins/bldjid: . msgs

tkabber-svn at jabber.ru tkabber-svn at jabber.ru
Fri Mar 19 00:49:16 MSK 2010


Author: bigote
Date: 2010-03-19 00:49:15 +0300 (Fri, 19 Mar 2010)
New Revision: 318

Modified:
   trunk/plugins/bldjid/ChangeLog
   trunk/plugins/bldjid/README
   trunk/plugins/bldjid/README.ru
   trunk/plugins/bldjid/bldjid.tcl
   trunk/plugins/bldjid/msgs/ru.msg
Log:
Improved version requests processing. See description of options(ver_timeout) in README file.
Fixed behaviour of options log_role_aff and log_ver_os. Now their disabling disables logging such info to a file (as it should be).


Modified: trunk/plugins/bldjid/ChangeLog
===================================================================
--- trunk/plugins/bldjid/ChangeLog	2010-03-15 08:32:36 UTC (rev 317)
+++ trunk/plugins/bldjid/ChangeLog	2010-03-18 21:49:15 UTC (rev 318)
@@ -1,3 +1,16 @@
+2010-03-18  Serge Yudin  <xmpp:bigote at jabber.ru> <mailto:bigote at gmail.com>
+
+--- Version 0.9.7 of the plugin.
+
+--- Files modified:
+    bldjid.tcl, README, README.ru, ChangeLog, msgs/ru.msg.
+
+--- Changes:
+	Improved version requests processing. See description of
+	options(ver_timeout) in README file.
+	Fixed behaviour of options log_role_aff and log_ver_os.
+	Now their disabling disables logging such info to a file (as it should be).
+
 2010-03-04  Serge Yudin  <xmpp:bigote at jabber.ru> <mailto:bigote at gmail.com>
 
 --- Version 0.9.6 of the plugin.

Modified: trunk/plugins/bldjid/README
===================================================================
--- trunk/plugins/bldjid/README	2010-03-15 08:32:36 UTC (rev 317)
+++ trunk/plugins/bldjid/README	2010-03-18 21:49:15 UTC (rev 318)
@@ -165,16 +165,32 @@
 --- ::plugins::bldjid::options(log_role_aff)
 	This option is turned OFF by default.
 	This is for a better tracking of your visitors' roles and affiliation status.
-	This option, if enabled, will show them to you in a chat or monitor window.
-	Please note that if you enable logging to a file, this information
-	will be logged regardless of this option's state.
+	This option, if enabled, will show them to you in a chat or monitor window
+	as well as will save this to a log file.
 
 --- ::plugins::bldjid::options(log_ver_os)
 	This option is also turned OFF by default.
 	You might want to know client versions of your visitors in some cases.
-	As well as the previous option, this one doesn't affect logging to a file
-	which is always enabled. It only shows the results in Tkabber.
 
+--- ::plugins::bldjid::options(ver_timeout)
+	Some paranoidally configured/hacked clients don't notify us
+	about disabled version/os response, i.e. we never get any response.
+	The first implementation of version request in this plugin
+	was adding all user info to both array (current session) and log file
+	at the end of a procedure that parsed version query response.
+	Of course, if we never get response, such user becomes "invisible" to us.
+	The current implementation adds user info (without version) to the array
+	and then makes a request, setting an execution of a checking procedure
+	after timeout. If we get version response we just look for a corresponding
+	array entry and change its contents (which is previously set to "Timeout")
+	to the version, save data to the file and cancel checking procedure execution.
+	If we don't, after the timeout that procedure shoots and checks
+	if the version was added. If we still have the version field set to "Timeout"
+	we just leave the array as is and finally add the entry to the file
+	with "Timeout" version to be aware of this user. If you see too many users
+	with "Timeout" version you probably should increase the timeout wich is
+	60 seconds by default.
+
 --- ::plugins::bldjid::options(verbosity_level)
 -	Minimum level means that there will be no repeated JIDs in each room list.
 	However, if the same JID enters the same room with a different nick

Modified: trunk/plugins/bldjid/README.ru
===================================================================
--- trunk/plugins/bldjid/README.ru	2010-03-15 08:32:36 UTC (rev 317)
+++ trunk/plugins/bldjid/README.ru	2010-03-18 21:49:15 UTC (rev 318)
@@ -169,16 +169,32 @@
 --- ::plugins::bldjid::options(log_role_aff)
 	Эта настройка по умолчанию ВЫКЛЮЧЕНА.
 	Она предназначена для лучшего отслеживания ролей и членства посетителей.
-	Будучи включённой, эта опция выводит данную информацию в окно чата или монитора.
-	Учтите, что если включён вывод в файл, эта информация будет писаться туда
-	вне зависимости от состояния этой настройки.
+	Будучи включённой, эта опция выводит данную информацию в окно чата или монитора,
+	а также сохраняет её в файл лога.
 
 --- ::plugins::bldjid::options(log_ver_os)
 	Эта настройка по умолчанию тоже ВЫКЛЮЧЕНА.
 	Иногда может понадобиться знать, с каких клиентов и ОС заходят посетители.
-	Как и предыдущая настройка, эта не влияет на запись этой информации в файл.
-	Она влияет лишь на показ версии и ОС в самом Ткаббере.
 
+--- ::plugins::bldjid::options(ver_timeout)
+	Некоторые параноидально настроенные/допиленные клиенты не извещают нас
+	об отключении ответа на запрос о версии, и мы просто не получаем ответа.
+	Сначала реализация запросов о версии в этом плагине предполагала
+	добавление информации о пользователе в массив (текущая сессия) и лог
+	в конце процедуры, обрабатывающей ответ на запрос о версии.
+	Естественно, если ответ не получен, такой пользователь становился "невидимкой".
+	Сейчас информация о пользователе (без версии) добавляется в массив,
+	и затем делается запрос, при этом задаётся выполнение проверяющей процедуры
+	после тайм-аута. Получив ответ на запрос, мы просто ищем нужную запись
+	в массиве и заменяем содержимое версии (предварительно установленное в слово
+	"Timeout") на версию, пишем данные в файл и отменяем выполнение процедуры.
+	Если мы не получаем ответ, после тайм-аута срабатывает процедура и проверяет,
+	добавилась ли версия. Если на её месте по-прежнему написано "Timeout",
+	мы оставляем массив как есть и добавляем эту запись в файл, оставив в качестве
+	версии слово "Timeout", чтобы быть в курсе. Если вы наблюдаете слишком много
+	пользователей с версией "Timeout", вам следует увеличить тайм-аут,
+	который по умолчанию равен 60 секундам.
+
 --- ::plugins::bldjid::options(verbosity_level)
 -	Минимальный уровень "надоедливости" означает, что в лог будет попадать
 	лишь первое вхождение для каждого джида. Если точнее, то для каждой пары

Modified: trunk/plugins/bldjid/bldjid.tcl
===================================================================
--- trunk/plugins/bldjid/bldjid.tcl	2010-03-15 08:32:36 UTC (rev 317)
+++ trunk/plugins/bldjid/bldjid.tcl	2010-03-18 21:49:15 UTC (rev 318)
@@ -1,4 +1,4 @@
-# "Bldjid" plugin for Tkabber. 2010-02-23 v. 0.9.6
+# "Bldjid" plugin for Tkabber. 2010-03-18 v. 0.9.7
 # Written by Serge Yudin xmpp:bigote at jabber.ru
 # See README or README.ru file for usage.
 
@@ -54,17 +54,18 @@
 			-type boolean -group Bldjid
 
 		custom::defvar options(log_role_aff) 0 \
-			[::msgcat::mc "Enable this option to log visitors' affiliation and role.\
-			Please note that if logging to a file is enabled\
-			this information will be saved to file anyway."] \
+			[::msgcat::mc "Enable this option to log visitors' affiliation and role."] \
 			-type boolean -group Bldjid
 
 		custom::defvar options(log_ver_os) 0 \
-			[::msgcat::mc "Enable this option to log visitors' client version and OS.\
-			Please note that if logging to a file is enabled\
-			this information will be saved to file anyway."] \
+			[::msgcat::mc "Enable this option to log visitors' client version and OS."] \
 			-type boolean -group Bldjid
 
+		custom::defvar options(ver_timeout) 60 \
+			[::msgcat::mc "Timeout for version requests (in seconds).\
+			See README for details."] \
+			-type integer -group Bldjid
+
 		custom::defvar options(verbosity_level) min \
 			[::msgcat::mc "Verbosity level."] \
 			-type radio -group Bldjid -layout vertical -values $verbosity
@@ -157,6 +158,7 @@
 ## and Rakhmanin Ruslan <rakhmaninr at gmail.com>
 ## Adapted to bldjid's necessities by Serge Yudin
 proc bldjid::smart_enter_exit_message {chatid nick} {
+	variable ent_cntr
 	global jids_by_chats
 	variable options
 	if {!$options(enable_jids_gathering)} {
@@ -202,15 +204,41 @@
 				[expr {[llength $jids_by_chats($group)] \
 				- $options(log_length)}]]
 			}
-			set role_aff [::muc::get_role $xlib $group/$nick]
-			append role_aff "/" [::muc::get_affiliation $xlib $group/$nick]
+			if {$options(log_role_aff)} {
+				set role_aff [::muc::get_role $xlib $group/$nick]
+				append role_aff "/" [::muc::get_affiliation $xlib $group/$nick]
+			} else {
+				set role_aff ""
+			}
 			if {$options(send_chat_messages) && $options(verbosity_level) == "min"} {
 				set occupant "$nick ($real_jid)"
 				set msg [::msgcat::mc "%s has entered" $occupant]
 				::chat::add_message $chatid $group groupchat $msg {}
 			}
-			[namespace current]::request_iq \
-			$xlib $chatid $group $nick $ts $real_jid $role_aff
+			if {!$options(log_ver_os)} {
+				set ver_os ""
+				lappend jids_by_chats($group) \
+				[list $ts $nick $real_jid $role_aff $ver_os]
+				if {$options(log_file) != ""} {
+					set msg4log "$ent_cntr\t$ts\t$group\t$nick\t$rjid\t$role_aff\t$ver_os"
+					[namespace current]::log_msg $msg4log
+					incr ent_cntr
+				}
+			} else {
+				set ver_os "Timeout"
+				lappend jids_by_chats($group) \
+				[list $ts $nick $real_jid $role_aff $ver_os]
+				if {[[namespace current]::is_any_integer $options(ver_timeout)]} {
+					set vto [expr $options(ver_timeout) * 1000]
+				} else {
+					set vto 60000
+				}
+				set pid [after $vto \
+				[namespace current]::process_ver [list $nick $ts $group $real_jid $role_aff]]
+				[namespace current]::request_iq \
+				$xlib $chatid $group $nick $ts $real_jid $role_aff $pid
+# You can increase this timeout if you have bad connection.
+			}
 		}
 	}
 }
@@ -693,10 +721,6 @@
 	} else {
 		set jid [lindex [lindex $user_list $index] 2]
 		return $jid
-#		if {$jid != ""} {
-#			set ci [chat::input_win $chatid]
-#			after idle [list $ci insert end $cmd $jid\n]
-#		}
 	}
 }
 
@@ -1016,9 +1040,10 @@
 					lappend item $grp
 					lappend user_list $item
 			}
-			unset s_res
+			catch {unset s_res}
 		}
 	}
+	catch {unset a}
 }
 
 # Thanks to Konstantin Khomoutov (kostix at 007spb.ru)
@@ -1146,16 +1171,16 @@
 	}
 }
 
-proc bldjid::request_iq {xlib chatid group nick ts real_jid role_aff} {
+proc bldjid::request_iq {xlib chatid group nick ts real_jid role_aff pid} {
     ::xmpp::sendIQ $xlib get \
 	-query [::xmpp::xml::create query \
 	-xmlns jabber:iq:version] \
 	-to $group/$nick \
 	-command [list [namespace current]::parse_info_iqversion \
-		$chatid $group $nick $ts $real_jid $role_aff]
+		$chatid $group $nick $ts $real_jid $role_aff $pid]
 }
 
-proc bldjid::parse_info_iqversion {chatid group nick ts rjid role_aff res child} {
+proc bldjid::parse_info_iqversion {chatid group nick ts rjid role_aff pid res child} {
 	variable ent_cntr
 	variable options
 	global jids_by_chats
@@ -1181,17 +1206,40 @@
     }
 	set ver_os [string trim $ver_os]
 	set ver_os [join [split $ver_os \n] ""]
-	if {$options(log_file) != ""} {
-		set msg4log "$ent_cntr\t$ts\t$group\t$nick\t$rjid\t$role_aff\t$ver_os"
-		[namespace current]::log_msg $msg4log
-		incr ent_cntr
+	set i 0
+	foreach val $jids_by_chats($group) {
+		if {[string match "*$ts*" $val] && [string match *$nick* $val] \
+		 && [string match *Timeout* $val]} {
+		 	set val [lreplace $val 4 4 $ver_os]
+			set jids_by_chats($group) [lreplace $jids_by_chats($group) $i $i $val]
+			if {$options(log_file) != ""} {
+				set msg4log "$ent_cntr\t$ts\t$group\t$nick\t$rjid\t$role_aff\t$ver_os"
+				[namespace current]::log_msg $msg4log
+				incr ent_cntr
+			}
+			after cancel $pid
+			break
+		}
+		incr i
 	}
-	if {!$options(log_role_aff)} {
-		set role_aff ""
+}
+
+proc bldjid::process_ver {nick ts group rjid role_aff} {
+	variable ent_cntr
+	variable options
+	global jids_by_chats
+	if {$options(log_file) == ""} {
+		return
 	}
-	if {!$options(log_ver_os)} {
-		set ver_os ""
+	set i 0
+	foreach val $jids_by_chats($group) {
+		if {[string match "*$ts*" $val] && [string match *$nick* $val] \
+		 && [string match *Timeout* $val]} {
+			set msg4log "$ent_cntr\t$ts\t$group\t$nick\t$rjid\t$role_aff\tTimeout"
+			[namespace current]::log_msg $msg4log
+			incr ent_cntr
+			break
+		}
+		incr i
 	}
-	lappend jids_by_chats($group) \
-	[list $ts $nick $rjid $role_aff $ver_os]
 }

Modified: trunk/plugins/bldjid/msgs/ru.msg
===================================================================
--- trunk/plugins/bldjid/msgs/ru.msg	2010-03-15 08:32:36 UTC (rev 317)
+++ trunk/plugins/bldjid/msgs/ru.msg	2010-03-18 21:49:15 UTC (rev 318)
@@ -71,12 +71,14 @@
 ::msgcat::mcset ru "Whether the Bldjid plugin is loaded." "Загружено ли расширение Bldjid."
 ::msgcat::mcset ru "You can choose here if JIDs should be logged stripped (without resources) or not (with resources). They are not stripped by default as it's more informative." \
 "Вы можете выбрать, вырезать ли ресурс джида при ведении лога. По умолчанию ресурс не вырезается, поскольку так у вас имеется больше информации."
-::msgcat::mcset ru "Enable this option to log visitors' affiliation and role. Please note that if logging to a file is enabled this information will be saved to file anyway." \
-"Включите эту опцию, чтобы отслеживать членство и роли посетителей. Если включено ведение логов в файл, эта информация будет туда писаться независимо от состояния данной опции."
-::msgcat::mcset ru "Enable this option to log visitors' client version and OS. Please note that if logging to a file is enabled this information will be saved to file anyway." \
-"Включите эту опцию, чтобы отслеживать версию клиента и ОС посетителей. Если включено ведение логов в файл, эта информация будет туда писаться независимо от состояния данной опции."
+::msgcat::mcset ru "Enable this option to log visitors' affiliation and role." \
+"Включите эту опцию, чтобы отслеживать членство и роли посетителей."
+::msgcat::mcset ru "Enable this option to log visitors' client version and OS." \
+"Включите эту опцию, чтобы отслеживать версию клиента и ОС посетителей."
 ::msgcat::mcset ru "JIDs that match your search pattern '%s' in %s list of this room:" \
 "Джиды, подходящие к поисковому паттерну '%s' в списке %s этой комнаты:"
 ::msgcat::mcset ru "\nNo matches were found." "\nНе найдено ни одного подходящего джида."
 ::msgcat::mcset ru "Search for JID '%s' in %s list of this room:" \
 "Поиск джида '%s' в списке %s этой комнаты:"
+::msgcat::mcset ru "Timeout for version requests (in seconds). See README for details." \
+"Тайм-аут для запроса версии (в секундах). Читайте описание опции в файле README.ru."



More information about the Tkabber-dev mailing list