Advertisement
Guest User

Untitled

a guest
Dec 14th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.44 KB | None | 0 0
  1. # Name: showhighlight-3.3.pl
  2. # Version: 3.3
  3. # Author: LifeIsPain < idontlikespam (at) orvp [dot] net >
  4. # Date: 2011-08-30
  5. # Description: Show highlighted messages in a seperate tab
  6. # License: zlib (attribute me, free to use for whatever)
  7.  
  8. # Version History at end of file
  9.  
  10. # No changes needed within this file
  11.  
  12. use strict;
  13. use warnings;
  14. use Data::Dumper;
  15. use File::Spec;
  16. use Xchat qw(:all);
  17. use POSIX qw(strftime);
  18.  
  19. my $version = '3.3';
  20. my $name = 'Show Highlight';
  21.  
  22. =begin documentation
  23. Documentation of settings
  24. All changes are made using /sh_set [-q] [-e] <variable> [value]
  25. nick_format : What should be used for nick formating, for additional details
  26. msg_format : what should be used for message formating, similar to above
  27. Both nick_format and msg_format can use:
  28. %channel% : name of the channel
  29. %network% : name of the network based on resolve_type
  30. %network_list% : network as specified in network list
  31. %network_server% : actual server name
  32. %network_reported% : network as returned by server on connect (sometimes)
  33. %timestamp% : timestamp as specified in Preferences > Text box
  34. %nick% : user who said the line (default of nick_format)
  35. %message% : actual message said (default of msg_format)
  36. color_tab : -1 - 3, What color to change the tab to
  37. -1) new data (unless something higher, default); 0) visited; 1) new data;
  38. 2) new message; 3) new highlight
  39. highlight_tab : The string to use as a highlight tab, no double quotes (")
  40. shared_tab : 0, 1, or 2, 0 is no sharing (highlight only), 1 is shared with other
  41. networks, 2 is shared with the server tab
  42. quiet_manage : 1 or 0, if 1, the options in the right click won't announce changes
  43. gui_manage : 1 or 0, if 0, the normal right click menu won't have options
  44. resolve_type : How should %network% be resolved in order:
  45. 1) As specified in network list, as reported by server, server address
  46. 2) As specified in network list, server address
  47. 3) As reported by server, as specified in network list, server address
  48. 4) As reported by server, server address
  49. =end documentation
  50. =cut
  51.  
  52. use constant {
  53. TYPE_STRING => 1,
  54. TYPE_BOOL => 2,
  55. TYPE_INT => 3,
  56. TYPE_ARRAY => 4
  57. };
  58.  
  59. my $DEFAULTS = {
  60. 'nick_format' => ['%nick%/%channel%', TYPE_STRING],
  61. 'msg_format' => ['%message%', TYPE_STRING],
  62. 'color_tab' => [-1, TYPE_INT],
  63. 'highlight_tab' => [':highlight:', TYPE_STRING],
  64. 'shared_tab' => [1, TYPE_INT],
  65. 'quiet_manage' => [0, TYPE_BOOL],
  66. 'gui_manage' => [1, TYPE_BOOL],
  67. 'ignore_nicks' => [[], TYPE_ARRAY],
  68. 'resolve_type' => [1, TYPE_INT],
  69. };
  70.  
  71. register($name, $version, 'Shows Highlighted messages in a special window.', \&del_menu);
  72. prnt("Loading $name $version");
  73.  
  74. for my $event ('Channel Msg Hilight', 'Channel Action Hilight') {
  75. hook_print($event, \&msg_highlight, { data => $event });
  76. }
  77.  
  78. hook_command('sh_ignore', \&cmd_sh_ignore, { help_text => 'sh_ignore [-q] <nick>, add nick to the Show Highlight ignore list'});
  79. hook_command('sh_allow', \&cmd_sh_allow, { help_text => 'sh_allow [-q] <nick>, remove nick from the Show Highlight ignore list'});
  80. hook_command('sh_set', \&cmd_sh_set, { help_text => 'sh_set [-q] [-e] [<variable>] [<value>], list or change settings for Show Highlight script'});
  81.  
  82. my $CONF;
  83. my $conf_file = File::Spec->catfile(get_info('xchatdir'), 'showhighlight.conf');
  84.  
  85. # this will behave much as /set
  86. sub cmd_sh_set {
  87. my $i = 1;
  88. my $quiet = 0;
  89. my $erase = 0;
  90. my ($variable, $value);
  91.  
  92. while ($_[0][$i]) {
  93. if (lc $_[0][$i] =~ /^-q/) { # meh, match -q and -quiet
  94. $quiet = 1;
  95. $i++;
  96. }
  97. elsif (lc $_[0][$i] eq '-e') {
  98. $erase = 1;
  99. $i++;
  100. }
  101. else {
  102. $variable = lc $_[0][$i];
  103. $value = $_[1][$i+1] if defined $_[1][$i+1];
  104. last;
  105. }
  106. }
  107.  
  108. # list available options if need be (as in, no extra param)
  109. unless (defined $value || $erase) {
  110. my @keys;
  111. unless ($variable) {
  112. @keys = sort keys %$CONF;
  113. }
  114. else {
  115. # turn that key into a simple string for matching
  116. $variable = '^'. $variable . '$';
  117. $variable =~ s/\*/.*/g;
  118. @keys = grep(/$variable/, sort keys %$CONF);
  119. }
  120.  
  121. foreach(@keys) {
  122. # special case of arrays
  123. if ($DEFAULTS->{$_}[1] == TYPE_ARRAY) {
  124. $value = join(', ', @{$CONF->{$_}});
  125. }
  126. elsif ($DEFAULTS->{$_}[1] == TYPE_BOOL) {
  127. $value = $CONF->{$_} ? 'on' : 'off';
  128. }
  129. else {
  130. $value = $CONF->{$_};
  131. }
  132. prnt $_ . '.' x (29-length $_).': '. $value;
  133. }
  134. unless (scalar @keys) {
  135. prnt 'No such variable.';
  136. }
  137. }
  138.  
  139. elsif (defined $variable && exists $CONF->{$variable}) {
  140. my $oldvalue = $CONF->{$variable};
  141. if ($erase) {
  142. # not really erasing, setting to default
  143. $CONF->{$variable} = $DEFAULTS->{$variable}[0];
  144. }
  145. else {
  146. # a few special cases
  147. if ($DEFAULTS->{$variable}[1] == TYPE_ARRAY) {
  148. # split and sort, then rejoin for display!
  149. $CONF->{$variable} = [ sort split (/,\s*/, $value) ];
  150. }
  151. # highlight_tab can't have double quotes
  152. elsif ($variable eq 'highlight_tab') {
  153. $value =~ s/"//g;
  154. $CONF->{$variable} = $value;
  155. }
  156. # some, we want only booleans
  157. elsif ($DEFAULTS->{$variable}[1] == TYPE_BOOL) {
  158. if ($value =~ /^of|^f/i || !$value) {
  159. $CONF->{$variable} = 0;
  160. }
  161. else {
  162. $CONF->{$variable} = 1;
  163. }
  164. }
  165. # and other times ints
  166. elsif ($DEFAULTS->{$variable}[1] == TYPE_INT) {
  167. # really make sure it is an integer
  168. $value =~ s/^.*?(-?\d+).*/$1/g;
  169. # update that conf!
  170. $CONF->{$variable} = int $value;
  171. }
  172. # no special cases, set it!
  173. else {
  174. $CONF->{$variable} = $value;
  175. }
  176. }
  177.  
  178. unless ($quiet) {
  179. # sometimes, the default is an array ref
  180. if ($DEFAULTS->{$variable}[1] == TYPE_ARRAY) {
  181. $value = join(', ', @{ $CONF->{$variable} });
  182. }
  183. # we want to pretty up booleans
  184. elsif ($DEFAULTS->{$variable}[1] == TYPE_BOOL) {
  185. $value = $CONF->{$variable} ? 'on' : 'off';
  186. }
  187. else {
  188. $value = $CONF->{$variable};
  189. }
  190. prnt $variable.' set to: '.$value;
  191. }
  192.  
  193. # save that sucker!
  194. save_conf();
  195.  
  196. # more with the quiet_manage and gui_manage
  197. if ( ($variable eq 'quiet_manage' || $variable eq 'gui_manage') && $CONF->{$variable} != $oldvalue) {
  198. del_menu();
  199. add_menu();
  200. }
  201. }
  202. elsif (!$quiet) {
  203. prnt 'No such variable.';
  204. }
  205. return EAT_XCHAT;
  206. }
  207.  
  208. sub msg_highlight {
  209. my @msgdata = @{$_[0]};
  210. my $event = $_[1];
  211.  
  212. # leave now if the nick is to be ignored
  213. # strip codes on nick, due to colored nicks
  214. my $cmpnick = strip_code($msgdata[0]);
  215. foreach (@{ $CONF->{ignore_nicks} }) {
  216. return EAT_NONE if (nickcmp($_, $cmpnick) == 0);
  217. }
  218.  
  219. my $check_context;
  220.  
  221. # default setting is to append channel, can be changed with setting
  222. if ($CONF->{nick_format} ne '%nick%') {
  223. $msgdata[0] = format_fill($CONF->{nick_format}, [$msgdata[0], $msgdata[1]]);
  224. }
  225. if ($CONF->{msg_format} ne '%message%') {
  226. $msgdata[1] = format_fill($CONF->{msg_format}, [$msgdata[0], $msgdata[1]]);
  227. }
  228.  
  229. if ($event eq 'Channel Msg Hilight') { $event = 'Channel Message'; }
  230. else { $event = 'Channel Action'; }
  231.  
  232. # Three cases, first for network tab if available, second for when each network has
  233. # own highlight tab, third for share
  234. # 2nd and 3rd case just finds the context, if it fails, creates a tab and the re-finds
  235. # the context to the newly created tab
  236. # 1st case won't ever create a context, just has to do work to find the server tab
  237. if ( $CONF->{shared_tab} == 2 && get_prefs('tab_server') ) {
  238. # start out with the base case of if things are smooth, which they may not be
  239. $check_context = find_context(get_info('network'), get_info('server'));
  240. # the strange case of if the found context is actually a query or something
  241. undef $check_context if ($check_context && context_info($check_context)->{type} != 1);
  242. if ( !$check_context ) {
  243. my @channels = get_list('channels');
  244. my $serverid = get_info('id');
  245. for (@channels) {
  246. if ($_->{id} == $serverid && $_->{type} == 1) {
  247. $check_context = $_->{context};
  248. last;
  249. }
  250. }
  251. # if it loops through the whole thing, we get to the end, and still no context
  252. # (like when tab_server was off on connect, and later turned on), need to go to
  253. # the next statement, don't like having parent as a seperate if block, so...
  254. goto HIGHLIGHT_TAB unless $check_context;
  255. }
  256. }
  257. # Next case if it is 0 or 2, both of which are always current server, but for 2,
  258. # only if it tab_server is off (silly people, if you want to save space, use shared_tab 1)
  259. elsif ( $CONF->{shared_tab} == 0 || $CONF->{shared_tab} == 2 ) {
  260. HIGHLIGHT_TAB:
  261. $check_context = find_context($CONF->{highlight_tab}, get_info('server'));
  262. if ( !$check_context ) {
  263. my $tab_new_to_front = get_prefs('tab_new_to_front');
  264. command('set -quiet tab_new_to_front 0') if ($tab_new_to_front);
  265. command('QUERY "'.$CONF->{highlight_tab}.'"');
  266. $check_context = find_context($CONF->{highlight_tab}, get_info('server'));
  267. command('set -quiet tab_new_to_front '.$tab_new_to_front) if ($tab_new_to_front);
  268. }
  269.  
  270. }
  271. elsif ( $CONF->{shared_tab} == 1 ) {
  272. # need to make sure it is the shared tab rather than a possible query, which is tricky
  273. $check_context = find_context($CONF->{highlight_tab});
  274. my $problem = ($check_context && context_info($check_context)->{type} == 3);
  275.  
  276. # if there is a problem, first have to sort through list to see if the tab exists anyway
  277. if ($problem) {
  278. my @channels = get_list('channels');
  279. foreach (@channels) {
  280. if ($_->{channel} eq $CONF->{highlight_tab} && $_->{type} != 3) {
  281. $check_context = $_->{context};
  282. $problem = 0; # no more problem!
  283. last;
  284. }
  285. }
  286. }
  287.  
  288. # if it wasn't there, or there was another tab named that, make a new server tab
  289. if (!$check_context || $problem) {
  290. my $tab_new_to_front = get_prefs('tab_new_to_front');
  291. command('set -quiet tab_new_to_front 0') if ($tab_new_to_front);
  292. command('NEWSERVER -noconnect "'.$CONF->{highlight_tab}.'"');
  293. command('set -quiet tab_new_to_front '.$tab_new_to_front) if ($tab_new_to_front);
  294. }
  295.  
  296. # if there still was a problem after last search, have to be careful this time around, as it still will exist
  297. if ($problem) {
  298. my @channels = get_list('channels');
  299. foreach (@channels) {
  300. if ($_->{channel} eq $CONF->{highlight_tab} && $_->{type} != 3) {
  301. $check_context = $_->{context};
  302. last;
  303. }
  304. }
  305. }
  306. # if the problem isn't there, that means no context had been found before, so set one
  307. # just assume it will find it, all good to go
  308. elsif (!$check_context) {
  309. $check_context = find_context($CONF->{highlight_tab});
  310. }
  311. }
  312.  
  313. # for some reason, if context doesn't exist, don't worry about it
  314. if ($check_context) {
  315. set_context($check_context);
  316. prnt( format_event($event, @msgdata) );
  317. command('GUI COLOR '.$CONF->{color_tab}) if (0 <= $CONF->{color_tab} && $CONF->{color_tab} <= 3);
  318. }
  319.  
  320. return EAT_NONE;
  321. }
  322.  
  323. # Convert Text Events with data into just a string which is returned
  324. # usage: format_event("Channel Message", @arrayofargs)
  325. sub format_event {
  326. # Expect up to 5 events (that is what text.c goes up to)
  327. my ($event, @items) = @_;
  328. $#items = 4; # force there to be 4 items
  329.  
  330. # Future regex has problems if a string doesn't exist
  331. foreach (@items) {
  332. $_ = '' unless $_;
  333. }
  334.  
  335. my $string = get_info('event_text ' . $event);
  336.  
  337. # Do the static macro replacements
  338. $string = macro_fill($string);
  339.  
  340. # Actually replace the $s
  341. $string =~ s/\$1/$items[0]/g;
  342. $string =~ s/\$3/$items[2]/g;
  343. $string =~ s/\$4/$items[3]/g;
  344. $string =~ s/\$2/$items[1]/g; # $2 may actually have $1, $3, or $4 in it, so do it last
  345.  
  346. return $string;
  347. }
  348.  
  349. # sub for macro replacement using ///e regex
  350. # usage: s/%(.)/macro_short_sub $1/eg
  351. sub macro_short_sub ($) {
  352. if ($_[0] eq 'U') { return "\c_"; }
  353. elsif ($_[0] eq 'B') { return "\cB"; }
  354. elsif ($_[0] eq 'C') { return "\cC"; }
  355. elsif ($_[0] eq 'O') { return "\cO"; }
  356. elsif ($_[0] eq 'R') { return "\cV"; }
  357. elsif ($_[0] eq 'H') { return "\cH"; }
  358. elsif ($_[0] eq '%') { return '%'; }
  359. return '%'.$_[0];
  360. }
  361.  
  362. sub macro_fill {
  363. $_[0] =~ s/%(.)/macro_short_sub $1/eg;
  364. $_[0] =~ s/\$t/\t/;
  365. return ($_[0]);
  366. }
  367.  
  368. sub macro_long_sub ($$) {
  369. if ($_[0] eq 'channel') { return get_info('channel'); }
  370. elsif ($_[0] eq 'network') { return network_name_priority(); }
  371. elsif ($_[0] eq 'network_reported') { return network_name_reported(); }
  372. elsif ($_[0] eq 'network_list') { return get_info('network'); }
  373. elsif ($_[0] eq 'network_server') { return get_info('server'); }
  374. elsif ($_[0] eq 'nick') { return $_[1][0]; }
  375. elsif ($_[0] eq 'message') { return $_[1][1]; }
  376. elsif ($_[0] eq 'timestamp') { return strftime(get_prefs('stamp_text_format'), localtime); }
  377. return '%'.$_[0].'%';
  378. }
  379.  
  380. sub format_fill {
  381. my $string = shift;
  382. my $data_ref = shift;
  383. $string =~ s/%([^%\s]+)%/macro_long_sub $1, $data_ref/eg;
  384. return ($string);
  385. }
  386.  
  387. sub network_name_priority {
  388. my $name;
  389. # 2) As specified in network list, server address
  390. if ($CONF->{resolve_type} == 2) {
  391. $name = get_info('network') || get_info('server');
  392. }
  393. # 3) As reported by server, as specified in network list, server address
  394. elsif ($CONF->{resolve_type} == 3) {
  395. $name = network_name_reported() || get_info('network') || get_info('server');
  396. }
  397. # 4) As reported by server, server address
  398. elsif ($CONF->{resolve_type} == 4) {
  399. $name = network_name_reported() || get_info('server');
  400. }
  401. # default to 1) As specified in network list, as reported by server, server address
  402. else {
  403. $name = get_info('network') || network_name_reported() || get_info('server');
  404. }
  405. return $name;
  406. }
  407.  
  408. sub network_name_reported {
  409. my $reported = '';
  410. my @channels = get_list('channels');
  411. my $serverid = get_info('id');
  412. for (@channels) {
  413. if ($_->{id} == $serverid && $_->{type} == 1) {
  414. $reported = $_->{channel};
  415. last;
  416. }
  417. }
  418. return $reported;
  419. }
  420.  
  421. # add new nicks to ignore highlight on to list
  422. sub cmd_sh_ignore {
  423. my ($cmd, @args) = @{$_[0]};
  424. my $quiet = ($args[0] && lc $args[0] eq '-q' ? 1 : 0);
  425. shift @args if $quiet;
  426.  
  427. if ($args[0]) {
  428. #make sure it isn't in here already
  429. my $found = 0;
  430. foreach (@{ $CONF->{ignore_nicks} }) {
  431. $found = 1 if (nickcmp($_, $args[0]) == 0);
  432. }
  433. unless ($found) {
  434. # lets make it sorted for print purposes
  435. $CONF->{ignore_nicks} = [sort (@{$CONF->{ignore_nicks}}, $args[0])];
  436. save_conf();
  437. }
  438. # lets give some status errors unless quiet
  439. if (!$quiet) {
  440. if ($found) {
  441. message_print("Messages from $args[0] previously ignored for Show Highlight");
  442. }
  443. else {
  444. message_print("Messages from $args[0] now ignored for Show Higlight");
  445. }
  446. }
  447. }
  448. return EAT_XCHAT;
  449. }
  450.  
  451. # remove nicks from ignore highlight list
  452. sub cmd_sh_allow {
  453. my ($cmd, @args) = @{$_[0]};
  454. my $quiet = ($args[0] && lc $args[0] eq '-q' ? 1 : 0);
  455. shift @args if $quiet;
  456.  
  457. if ($args[0]) {
  458. #make sure it is actually here
  459. my $found = 0;
  460. my $i = 0;
  461. while ($i < scalar @{ $CONF->{ignore_nicks} }) {
  462. if (nickcmp($CONF->{ignore_nicks}[$i], $args[0]) == 0) {
  463. splice( @{ $CONF->{ignore_nicks} }, $i, 1 );
  464. $found = 1;
  465. save_conf();
  466. last;
  467. }
  468. else {
  469. $i++;
  470. }
  471. }
  472. # lets give some status errors unless quiet
  473. if (!$quiet) {
  474. if ($found) {
  475. message_print("Messages from $args[0] no longer ignored for Show Highlight");
  476. }
  477. else {
  478. message_print("Messages from $args[0] had not been ignored for Show Higlight");
  479. }
  480. }
  481. }
  482. return EAT_XCHAT;
  483. }
  484.  
  485. # Save the conf. Use Data::Dumper to serialize it, as is Core Module
  486. sub save_conf {
  487. open (DATA, '>'.$conf_file);
  488. print DATA '# '.$name.' '.$version." configruation file\n# This file is automatically generated and may be replaced\n\n";
  489. $Data::Dumper::Indent = 1;
  490. print DATA Data::Dumper->Dump([$CONF], [qw(CONF)]);
  491.  
  492. close DATA;
  493. }
  494.  
  495. # load the configuration to $CONF
  496. sub load_conf {
  497. if (-e $conf_file) {
  498. unless ($CONF = do $conf_file) {
  499. prnt "Couldn't parse $conf_file: $@" if $@;
  500. prnt "Couldn't do $conf_file: $!" unless defined $CONF;
  501. prnt "Couldn't run $conf_file" unless $CONF;
  502. }
  503. }
  504. else {
  505. message_print("Configuration file does not exist. Will be created when needed.");
  506. }
  507.  
  508. # need backwards compatibility due to new features
  509. if (defined $CONF->{append_string} && defined $CONF->{append_channel}) {
  510. $CONF->{nick_format} = ('%nick%' . ($CONF->{append_channel} ? $CONF->{append_string} . '%channel%' : '')) unless defined $CONF->{nick_format};
  511. # clean up the old vars from conf
  512. delete $CONF->{append_string};
  513. delete $CONF->{append_channel};
  514. }
  515.  
  516. # set the defaults if they aren't there
  517. foreach (keys %$DEFAULTS) {
  518. $CONF->{$_} = $DEFAULTS->{$_}[0] unless defined $CONF->{$_}
  519. }
  520. }
  521.  
  522. # generic message print, has a delay for after hook_prints
  523. sub message_print {
  524. my $message = $_[0];
  525. hook_timer( 10,
  526. sub {
  527. emit_print('Generic Message', '*Show Highlight*', $message);
  528. return REMOVE;
  529. }
  530. );
  531. }
  532.  
  533. # add the menu items
  534. sub add_menu {
  535. if ($CONF->{gui_manage}) {
  536. command('timer 1 menu ADD "$NICK/Show Highlights" "sh_allow'.($CONF->{quiet_manage} ? ' -q ' : ' ').'%s"');
  537. command('timer 1 menu ADD "$NICK/Ignore Highlights" "sh_ignore'.($CONF->{quiet_manage} ? ' -q ' : ' ').'%s"');
  538. }
  539. }
  540.  
  541. # User Menu items were added, remove them
  542. sub del_menu {
  543. command('menu DEL "$NICK/Show Highlights"');
  544. command('menu DEL "$NICK/Ignore Highlights"');
  545. }
  546.  
  547. load_conf();
  548. add_menu();
  549.  
  550. __END__
  551.  
  552. Version History:
  553. 0.1 2005-09-10 Initial Code
  554. 0.2 2006-04-01 Modified Global Grouping method
  555. 1.0 2008-01-01 Cleaned up code, finally released
  556. 1.1 2008-06-04 More Cleanup
  557. 1.2 2008-07-07 No longer uses emit_print, requires 2.8.2 or higher
  558. This change better handles other scripts so as to not cause
  559. double emits, inadvertently send data to a non existant
  560. server, or several other possible "bugs" when used with
  561. with other scripts.
  562. 1.3 2009-04-13 Deal better with not stealing context
  563. 2.0 2009-09-06 Have list of users to still highlight but not show in window
  564. Users can be added either with a command, or right click on
  565. username in list
  566. Use External Configuration file
  567. Some Cleanup
  568. 2.1 2009-12-24 Issue when allowing a nick on clean install fixed (although,
  569. The nick would have already been allowed...)
  570. 2.2 2010-02-04 Fixed case where $3 and $4 in actual message was replaced
  571. /sh_set to 'off' was broken, now fixed (0 worked before)
  572. fixed using /sh_set on ignore_nicks
  573. allow spaces in tab name
  574. 3.0 2010-03-23 Bug fixed where /sh_set -e wouldn't update gui config setting
  575. Moved version history to end of file
  576. /sh_set now displays booleans as 'on' and 'off'
  577. Changed default tab name to ':highlight:'
  578. Since not everyone has tab_new_to_front disabled, temp set it
  579. on new tab creation (focus will never be taken)
  580. Make sure shared tab is a server tab, and not a lingering query
  581. (thanks to Bj�rn "Vampire" Kautler for some code)
  582. New nick_format and msg_format variables for fine tuning
  583. appearance. nick_format replaces append_*, allowing for
  584. channel and or network to be before or after nick. Channel and
  585. server may also be placed in the actual message line if
  586. indenting space is an issue. %network% will default to the
  587. name as specified in the network list, but can use reported
  588. or server canonical name
  589. $DEFAULTS format changed, makes things cleaner for /sh_set
  590. 3.1 2010-03-25 Bug fixes for things reported by Bj�rn "Vampire" Kautler:
  591. Update in file documentation for %nick% and %message%
  592. Fix conversion to new format from 2.x code
  593. Remove redundant set_context
  594. Make shared_tab 2 set highlights in the server tab if available,
  595. and create a query tab if not (when tab_server is 0)
  596. Kill a set_context that gets done by the Perl plugin anyway
  597. 3.2 2010-07-30 Now allow tab of highlight to change to something else, based
  598. on the value of /sh_set color_tab (suggestion by nanotube)
  599. 3.3 2011-08-30 Allow %timestamp% in nick_format and msg_format, from /set value
  600. %nick% and %message% can now also be in msg_format and
  601. nick_format respectively
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement