Your IP : 216.73.216.48
#
# This script supplies a topicbar.
# It uses the status_format or status_format1 to format output.
# Currently it "hogs" topline 1.
#
# Shut off with /SET TOPICBAR OFF. The default is ON.
#
# I hope you like it. :-)
#
# - howl@epicsol.org sep'08
#
if (word(2 $loadinfo()) != [pf])
{
load -pf $word(1 $loadinfo());
return;
};
package TOPICBAR;
alias topicbar.update
{
fe (topic 332 331 333 switch_channels switch_windows part server_lost) li
{
fe ($hookctl(list hooks $li)) ho
{
if (hookctl(get $ho package) == 'TOPICBAR')
{
@ hookctl(remove $ho);
};
};
};
if (getset(topicbar) == 'off')
{
topicbar.off;
return;
};
^on #-topic + "*"
{
topicbar.dataupdate $serverctl(from_server) $1-;
};
@ hookctl(set hook $hookctl(last_created) package topicbar);
^on #-332 + "*"
{
topicbar.dataupdate $serverctl(from_server) $1-;
};
@ hookctl(set hook $hookctl(last_created) package topicbar);
^on #-331 + "*"
{
topicbar.dataupdate $serverctl(from_server) $1;
};
@ hookctl(set hook $hookctl(last_created) package topicbar);
^on #-switch_channels + "*"
{
topicbar.winupdate $0;
};
@ hookctl(set hook $hookctl(last_created) package topicbar);
^on #-switch_windows + "*"
{
topicbar.winupdate $3;
};
@ hookctl(set hook $hookctl(last_created) package topicbar);
^on #-part + "*"
{
@ :se = serverctl(from_server);
if ([$0] != serverctl(get $se nick))
return;
topicbar.datapurge $se $1;
};
@ hookctl(set hook $hookctl(last_created) package topicbar);
^on #-server_lost + "*"
{
topicbar.datapurge $0;
};
@ hookctl(set hook $hookctl(last_created) package topicbar);
topicbar.harvest;
};
alias topicbar.off (list default $winrefs())
{
fe ($list) win
{
window $win toplines 0;
window $win topline 0;
};
};
alias topicbar.winupdate (list default $winrefs())
{
fe ($list) win
{
@ :se = windowctl(get $win server);
@ :ch = winchan($win);
@ :it = matchitem(topicbar $se $ch *);
@ :st = afterw($ch $getitem(topicbar $it));
@ :ol = 1;
if (windowctl(get $win double) == 1)
{
@ :for = windowctl(get $win status_format1);
if (!@for)
{
@ for = getset(status_format1);
};
}
else
{
@ :for = windowctl(get $win status_format);
if (!@for)
{
@ for = getset(status_format);
};
};
@ for = before($left(1 $stripcrap(all,ansi $for)) $for);
if (!@ch || it < 0 || #st == 0)
{
window $win toplines 0;
window $win topline $ol;
continue;
};
window $win toplines $ol;
window $win topline $ol "$^"for $^"st";
};
};
alias topicbar.dataupdate
{
@ :item = matchitem(topicbar $0 $1 *);
if (item < 0)
{
@ :item = numitems(topicbar);
};
@ :st = aliasctl(alias exist utf8hack) ? utf8hack($2-) : [$2-];
@ setitem(topicbar $item $0 $1 $st);
xeval -s $0
{
topicbar.winupdate $chanwin($1);
};
};
alias topicbar.flush
{
@ delarray(topicbar);
};
alias topicbar.harvest
{
@ topicbar.harvest = myservers(*);
fe ($topicbar.harvest) server
{
xeval -s $server {@ topicbar.harvest[$server] = mychannels();};
};
topicbar.harvest_next;
};
alias topicbar.harvest_next
{
fe (331 332 333) li
{
fe ($hookctl(list hooks $li)) ho
{
if (hookctl(get hook $ho package) == 'topicbar_harvest')
{
@ hookctl(remove $ho);
};
};
};
@ :server = word(0 $topicbar.harvest);
@ :channel = pop(topicbar.harvest[$server]);
if (!@channel && !@topicbar.harvest[$server])
{
shift topicbar.harvest;
^assign -topicbar.harvest[$server];
@ :server = word(0 $topicbar.harvest);
if (!@topicbar.harvest) ^assign -topicbar.harvest;
@ :channel = pop(topicbar.harvest[$server]);
if (!@channel)
{
^assign -topicbar.harvest;
return;
};
};
@ :p = ["$serverctl(get $server itsname) $channel *"];
^on ^331 $p
{
defer {topicbar.harvest_next;};
@ hookctl(remove $word(0 $hookctl(exec)));
};
@ hookctl(set hook $hookctl(last_created) package topicbar_harvest);
^on ^332 $p
{
@ hookctl(remove $word(0 $hookctl(exec)));
};
@ hookctl(set hook $hookctl(last_created) package topicbar_harvest);
^on ^333 $p
{
@ hookctl(remove $word(0 $hookctl(exec)));
defer {topicbar.harvest_next;};
};
@ hookctl(set hook $hookctl(last_created) package topicbar_harvest);
xeval -s $server {topic $channel;}
};
alias topicbar.list
{
@ :item = 0;
xecho -b Topicbar data;
while ((:st = getitem(topicbar $item)) != '')
{
xecho $item: $st;
@ item++;
}
};
alias topicbar.datapurge
{
@ :l = [$*];
if (@l == 0)
@ l = [*];
while ((:it = matchitem(topicbar $l)) > -1)
{
@ delitem(topicbar $it);
};
while ((:it = matchitem(topicbar $l *)) > -1)
{
@ delitem(topicbar $it);
};
if (numitems(topicbar) == 0)
@ delarray(topicbar);
};
@ symbolctl(create topicbar);
@ symbolctl(set topicbar 1 builtin_variable type bool);
@ symbolctl(set topicbar 1 builtin_variable script topicbar.update);
@ symbolctl(set topicbar 1 builtin_variable data on);
# vim: tabstop=2 syntax=