# Tray notifer plugin.
# Version 0.3
# Released under GNU GPL v2
# PhoeniX
#
# Changelog
# 0.3 - all message handlers are now optional (options handle_*)
# - fix: check konch presence
# - double click on tray icon raises konsole window (if weechat runs in konsole)
# 0.2 - tray icon
# - tray icon tooltip
# - tray icon tooltip templates
# - tray icon reseting
# - fully configurable via config file
# 0.1 - Initial version, was lost
# This script requires Konch (http://konch.kdex.org/)
# TODO: /tray help for help
require 'strscan'
require 'iconv'
require 'fileutils'
# reading config and default walues handling
def method_missing(name, *args, &block)
if instance_variable_defined? "@#{name.to_s}"
instance_variable_get "@#{name.to_s}"
else
val=if (Weechat.get_plugin_config(name.to_s).empty?)
then args*''
else
Weechat.get_plugin_config(name.to_s)
end
instance_variable_set("@#{name.to_s}", val )
end
end
$konchscript=<$fifo
done
}
case $EVENT in
init)
echo 'popup Weechat tray plugin started'
;;
click)
fifo "tray reset"
;;
dclick)
fifo "tray toggle"
;;
quit)
rm $0
;;
esac
EOS
def weechat_init
# registering
Weechat.register "tray", "0.3", "deinit", "Tray notifer plugin."
# handlers
Weechat.add_command_handler "tray", "tray","","reset|toggle", "", "reset|toggle"
Weechat.add_message_handler "weechat_pv","on_query" if handle_query("true")=="true"
Weechat.add_message_handler "weechat_highlight","on_hl" if handle_highlight("true")=="true"
Weechat.add_message_handler "privmsg","on_privmsg" if handle_message("true")=="true"
Weechat.add_message_handler "part", "on_part" if handle_part("true")=="true"
Weechat.add_message_handler "quit", "on_quit" if handle_quit("true")=="true"
Weechat.add_message_handler "join", "on_join" if handle_join("true")=="true"
Weechat.add_keyboard_handler "on_kbd"
#config && defaults
message_template("%channel% :: %nick%: %msg%")
message_action_template("%channel% :: %nick% %msg%")
query_template("@%nick%: %msg%")
query_action_template("@%nick% -> %msg%")
highlight_template("%channel% :: %nick%: %msg%")
highlight_action_template("%channel% :: %nick% -> %msg%")
join_template("%channel% += %nick%")
part_template("%channel% -= %nick%: %msg%")
quit_template("<< %nick%: %msg%")
default_icon("terminal")
logsize("20")
$log=Array.new
$arg=Hash.new
$overlay=false
$triggered=false
# starting konch
return Weechat::PLUGIN_RC_KO if `which konch`.empty? # there's no konch
$konch=`konch --icon #{default_icon} 2>/dev/null`
$konch.chomp!
# giving new name (mouse menu header) and script
`dcop #{$konch} Konch setName "WeeChat"`
File.open("#{ENV['HOME']}/.weechat/konch", 'w'){|f| f<<$konchscript}
FileUtils.chmod 0755, "#{ENV['HOME']}/.weechat/konch"
`dcop #{$konch} Konch setScript #{ENV['HOME']}/.weechat/konch`
# utf8 to locale converter
enc=ENV['LANG'].include?('.') ? ENV['LANG'].split('.')[-1] : 'C'
$converter = Iconv.new( enc +'//IGNORE', 'UTF-8')
return Weechat::PLUGIN_RC_OK
end
def parseargs args
hash=Hash.new
#hash['nick'], hash['ident'], hash['host'], hash['msg_type'], hash['channel'], hash['msg']=args.scan(/:([^!]*)!([^@]*)@(\S*)\s(\S*)\s(\S*)\s:(.*)/)[0]
ss=StringScanner.new(args)
ss.pos=ss.pos+1
hash['nick']= ss.scan(/[^!]*/)
ss.pos=ss.pos+1
hash['ident']= ss.scan(/[^@]*/)
ss.pos=ss.pos+1
hash['host']= ss.scan(/\S*/)
ss.pos=ss.pos+1
hash['msg_type']=ss.scan(/\S*/)
ss.pos=ss.pos+1
case hash['msg_type']
when "PRIVMSG"
hash['channel']=ss.scan(/\S*/)
ss.pos=ss.pos+2
tail=ss.scan(/.*/)
tail=tail.gsub /[\x01\x02\x03\x1f\x16\x0f]/, ''
hash['action']=tail.include?("ACTION")
hash['msg']=tail.sub /^ACTION/, ''
when "QUIT"
ss.pos=ss.pos+1
hash['msg']=ss.scan(/.*/).gsub(/[\x01\x02\x03\x1f\x16\x0f]/, '')
when "JOIN"
ss.pos=ss.pos+1
hash['channel']=ss.scan(/.*/)
when "PART"
hash['channel']=ss.scan(/\S*/)
ss.pos=ss.pos+2
hash['msg']=ss.scan(/.*/).gsub(/[\x01\x02\x03\x1f\x16\x0f]/, '')
else
File.open("#{ENV['HOME']}/.weechat/msg.log", 'a') {|f| f.puts args}
end
return hash
end
# checks, contains source defined in config highlights or not
def highlight?(source)
Weechat.get_config('irc_highlight').each(',') do |entry|
return true if source.include?(entry.gsub('*',''))
end
return false
end
# handles regular channel messages
def on_privmsg (server, args_src)
$arg=parseargs args_src
#skipping unregular messages
return Weechat::PLUGIN_RC_OK if ( \
#it's a query
($arg['channel']==Weechat.get_info("nick")) || \
#it's a highlight
($arg['msg'].include?(Weechat.get_info("nick"))) || \
highlight?($arg['msg'])
)
if $arg['action']
do_notify message_action_template, "setIcon openterm"
else
do_notify message_template, "overlay presence_online"
$overlay=true
end
return Weechat::PLUGIN_RC_OK
end
# other handlers
def on_query (server, args_src)
$arg=parseargs args_src
if $arg['action']
do_notify query_action_template, "blink 500", :popup => true
else
do_notify query_template, "blink 500", :popup => true
end
return Weechat::PLUGIN_RC_OK
end
def on_hl(server, args_src)
$arg=parseargs args_src
if $arg['action']
do_notify highlight_action_template, "blink 500", :popup => true
else
do_notify highlight_template, "blink 500", :popup => true
end
return Weechat::PLUGIN_RC_OK
end
def on_join(server, args_src)
$arg=parseargs args_src
do_notify join_template, "setIcon openterm"
return Weechat::PLUGIN_RC_OK
end
def on_part(server, args_src)
$arg=parseargs args_src
do_notify part_template, "setIcon openterm"
return Weechat::PLUGIN_RC_OK
end
def on_quit(server, args_src)
$arg=parseargs args_src
do_notify quit_template, "setIcon openterm"
return Weechat::PLUGIN_RC_OK
end
def do_notify(logline, command, options = {})
# template expansion
logline=logline.gsub(/%.*?%/){|key| $arg[key[1..-2]] }
# removing dangerous shell symbols
logline=logline.gsub("'", "").gsub('"','')
# set encoding to locale to execute in a shell
logline=$converter.iconv logline
#last read line separator
$log<< "
" unless $triggered
$log< logsize.to_i
# make log a list and pass it to konch
tooltip=""+$log.map{|l| "- "+l+"
\n"}.join+"
"
`dcop #{$konch} Konch setTooltip \'#{tooltip}\'`
`dcop #{$konch} Konch #{command}`
`dcop #{$konch} Konch overlay presence_online` if $overlay
`dcop #{$konch} Konch passivePopup \'#{logline}\'` if ((!options[:popup].nil?) && (options[:popup]))
$triggered=true
end
# reseting icon and tooltip log
def reset(arg=[])
$log.delete "
"
# make log a list and pass it to konch
tooltip=""+$log.map{|l| "- "+l+"
\n"}.join+"
"
`dcop #{$konch} Konch setTooltip \'#{tooltip}\'`
`dcop #{$konch} Konch resetIcon`
`dcop #{$konch} Konch setIcon #{default_icon}`
$overlay=false
$triggered=false
return Weechat::PLUGIN_RC_OK
end
def on_kbd(a,b,c)
return Weechat::PLUGIN_RC_OK unless $triggered
reset
return Weechat::PLUGIN_RC_OK
end
# raises konsole window, if running inside it
def toggle(arg=[])
reset
return unless ENV['KONSOLE_DCOP'].nil?
konsole=ENV['KONSOLE_DCOP'].scan(/\((.*),/)
`dcop #{konsole} konsole-mainwindow#1 hide`
`dcop #{konsole} konsole-mainwindow#1 restore`
end
# set/list internal variables/settings
def set(argv)
if argv.empty?
instance_variables.sort.each{|var| var=var[1..-1]; Weechat.print_server var+" = "+ send(:"#{var}")}
else
instance_variable_set("@"+argv[0], argv.size<2 ? "" : argv[1])
end
end
# calling a function, defined in this script, on /tray funcname
def tray(server,arg)
arr=arg.split(' ')
command=arr.shift
if (respond_to?(command))
send(:"#{command}", arr)
else
help
end
return Weechat::PLUGIN_RC_OK
end
# saving/deinitializing
def deinit
instance_variables.each do |varname|
Weechat.set_plugin_config(varname[1..-1], instance_variable_get(varname))
end
# shutting down konch
`dcop #{$konch} Konch quit`
return Weechat::PLUGIN_RC_OK
end