Home

Script: sort_arza.pl

Sort channels inside networks. (for WeeChat ≥ 0.3.0)
Author: arza, version 1, GPL3 — added: 2015-06-14
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Channel sorter for WeeChat by arza <arza@arza.us>, distributed freely and without any warranty, licensed under GPL3 <http://www.gnu.org/licenses/gpl.html>

# Sorts channels inside networks, with a command.
#
# I have:
# - server buffers merged in buffer 1
# - a special order of networks
#
# I want:
# - a command to sort channels inside every network, preserving the order of networks
# - ##-channels sorted like #-channels
# - queries and script buffers in the end

weechat::register('sort_arza', 'arza <arza@arza.us>', '1', 'GPL3', 'Sort channels inside networks.', '', '');
weechat::hook_command('sort_arza', 'Sort channels inside networks', '[-test]', '-test: dry run', '-test', 'command', '');

sub command { my $arg = $_[2];
	my @servers;
	my %old; # %old -> $server -> $channel -> $buffer_pointer

	my $infolist = weechat::infolist_get('buffer', '', '');
	while(weechat::infolist_next($infolist)){ # loop buffers
		my $buffer_pointer = weechat::infolist_pointer($infolist, 'pointer');
		if(weechat::buffer_get_string($buffer_pointer, 'localvar_type') ne 'channel' || weechat::infolist_integer($infolist, 'active') eq 0){ next; } # skip non-channel and non-active (in merged buffers)
		my $server_name = weechat::buffer_get_string($buffer_pointer, 'localvar_server');
		my $buffer_short_name = weechat::infolist_string($infolist, 'short_name');

		push(@servers, $server_name) unless grep { $_ eq $server_name } @servers; # push the server to the list if it isn't there already
		$buffer_short_name =~ s/^[#&+]+|^![A-Z0-9]{5}/#/; # make all channel prefixes '#'
		$old{$server_name}{$buffer_short_name} = $buffer_pointer;
	}
	weechat::infolist_free($infolist);

	my $new_number=2;
	for my $server (@servers){ # sort and move
		for my $channel (sort { lc $a cmp lc $b } keys %{$old{$server}}){
			if($arg){ weechat::print('', sprintf("%2d", $new_number).": $server.$channel (".weechat::buffer_get_integer($old{$server}{$channel}, 'number').")"); } # dry run
			else{ weechat::buffer_set($old{$server}{$channel}, 'number', $new_number); } # move the buffer
			$new_number++;
		}
	}

	return weechat::WEECHAT_RC_OK;
}