aboutsummaryrefslogtreecommitdiff
path: root/.irssi/scripts/twtopic.pl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.irssi/scripts/twtopic.pl193
1 files changed, 193 insertions, 0 deletions
diff --git a/.irssi/scripts/twtopic.pl b/.irssi/scripts/twtopic.pl
new file mode 100644
index 0000000..a32e3f2
--- /dev/null
+++ b/.irssi/scripts/twtopic.pl
@@ -0,0 +1,193 @@
+# John Engelbrecht's original versions (<= 1.0.2) were released under the public
+# domain. Ryan Kavanagh's changes are distributed under the ISC license:
+#
+# Copyright (C) 2017 Ryan Kavanagh <rak@ryanak.ca>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+
+use strict;
+use vars qw($VERSION %IRSSI);
+use Irssi;
+use Irssi::Irc;
+use Irssi::TextUI;
+
+$VERSION = '2.0';
+%IRSSI = (
+ authors => 'John Engelbrecht, Ryan Kavanagh',
+ contact => 'jengelbr@yahoo.com, rak@ryanak.ca',
+ name => 'twtopic.pl',
+ description => 'Animated Topic bar.',
+ sbitems => 'twtopic',
+ license => 'Public Domain, ISC',
+ changed => 'Wed Jan 03 16:20:17 EST 2017',
+ url => 'http://irssi.darktalker.net' . "\n",
+);
+
+my $instrut =
+ ".--------------------------------------------------.\n"
+ . "| 1.) shell> mkdir ~/.irssi/scripts |\n"
+ . "| 2.) shell> cp twtopic.pl ~/.irssi/scripts/ |\n"
+ . "| 3.) shell> mkdir ~/.irssi/scripts/autorun |\n"
+ . "| 4.) shell> ln -s ~/.irssi/scripts/twtopic.pl \\ |\n"
+ . "| ~/.irssi/scripts/autorun/twtopic.pl |\n"
+ . "| 5.) /sbar topic remove topic |\n"
+ . "| 6.) /sbar topic remove topic_empty |\n"
+ . "| 7.) /sbar topic add -after topicbarstart |\n"
+ . "| -priority 100 -alignment left twtopic |\n"
+ . "| 9.) /toggle twtopic_instruct and last /save |\n"
+ . "|--------------------------------------------------|\n"
+ . "| Options: Default: |\n"
+ . "| /set twtopic_refresh <speed> 150 |\n"
+ . "| /set twtopic_size <size> 20 |\n"
+ . "| /set twtopic_padding <size> 20 |\n"
+ . "| /set twtopic_auto_resize <ON|OFF> OFF |\n"
+ . "| /set twtopic_ar_padding <size> 0 |\n"
+ . "| /set twtopic_min_scroll <ON|OFF> OFF |\n"
+ . "| /set twtopic_init_pause <length> 10 |\n"
+ . "| /toggle twtopic_instruct |Startup instructions |\n"
+ . "\`--------------------------------------------------'";
+
+my $timeout;
+my $start_pos = 0;
+my $size;
+my $min_scroll;
+my $padding;
+my $topic = "";
+my @mirc_color_arr = (
+ "\0031", "\0035", "\0033", "\0037", "\0032", "\0036",
+ "\00310", "\0030", "\00314", "\0034", "\0039", "\0038",
+ "\00312", "\00313", "\00311", "\00315", "\017"
+);
+
+sub setup {
+ my $window = Irssi::active_win;
+ if ( Irssi::settings_get_bool('twtopic_auto_resize') ) {
+ $size =
+ $window->{'width'} - Irssi::settings_get_int('twtopic_ar_padding');
+ }
+ else {
+ $size = Irssi::settings_get_int('twtopic_size');
+ }
+ # Subtract 4 because we wrap the topic in '[ ' / ' ]'.
+ $size = $size - 4;
+ $min_scroll = Irssi::settings_get_bool('twtopic_min_scroll');
+ $padding = Irssi::settings_get_int('twtopic_padding');
+ update_topic();
+}
+
+sub regular_timer {
+ my $time = Irssi::settings_get_int('twtopic_refresh');
+ Irssi::timeout_remove($timeout);
+ $timeout = Irssi::timeout_add( $time, 'reload', undef );
+}
+
+sub init_timer {
+ my $time = Irssi::settings_get_int('twtopic_init_pause');
+ Irssi::timeout_remove($timeout);
+ $timeout = Irssi::timeout_add( $time, 'regular_timer', undef );
+}
+
+sub show {
+ my ( $item, $get_size_only ) = @_;
+ my $text = get();
+ $text = "[ " . $text . " ]";
+ $item->default_handler( $get_size_only, $text, undef, 1 );
+}
+
+sub update_topic {
+ $topic = "";
+ my $name = Irssi::active_win()->{active}->{name};
+ my $type = Irssi::active_win()->{active}->{type};
+ if ( $name eq "" ) {
+ # We're in the status window
+ $topic =
+ "Irssi website: http://www.irssi.org, "
+ . "Irssi IRC channel: #irssi @ irc://irc.freenode:6667, "
+ . "twtopic has been written by Tech Wizard and ryanakca";
+ }
+ elsif ( $type eq "QUERY" ) {
+ $topic = "You are now talking to...... " . $name;
+ }
+ else {
+ my $channel = Irssi::Irc::Server->channel_find($name);
+ $topic = $channel->{topic};
+ foreach (@mirc_color_arr) { $topic =~ s/$_//g; }
+ }
+ if ( $topic eq "" ) {
+ $topic = "=-=-=-=-= No Topic =-=-=-=-=-=-=-";
+ }
+ $topic =~ s/(\00313)+//;
+ $topic =~ s/(\002)+//;
+ $topic =~ s/(\001)+//;
+ # Reset the topic and pause
+ init_timer();
+ # The length of the topic may have changed. We should reset our $start_pos
+ # to avoid going off the end in case the topic got shorter.
+ $start_pos = -1;
+ reload ();
+}
+
+sub get {
+ my $topiclen = length($topic);
+ if ( $topiclen <= $size && $min_scroll ) {
+ return $topic . ( ' ' x ( $size - $topiclen ) );
+ }
+ my $padded = $topic . ( ' ' x $padding );
+ my $str = "";
+ my $needed = $size - length($str);
+ while ( $needed > 0 ) {
+ if ( $needed < length($padded) - $start_pos ) {
+ $str = $str . substr( $padded, $start_pos, $needed );
+ }
+ elsif ( $needed < length($padded) ) {
+ $str =
+ $str
+ . substr( $padded, $start_pos )
+ . substr( $padded, 0, $needed - length($padded) );
+ }
+ else {
+ $str =
+ $str
+ . substr( $padded, $start_pos )
+ . substr( $padded, 0, $start_pos );
+ }
+ $needed = $size - length($str);
+ }
+ $start_pos = $start_pos + 1 < length($padded) ? $start_pos + 1 : 0;
+ return $str;
+}
+
+
+Irssi::signal_add( 'channel topic changed', 'update_topic' );
+Irssi::signal_add( 'setup changed', 'setup' );
+Irssi::signal_add( 'terminal resized', 'setup' );
+Irssi::signal_add( 'window changed', 'update_topic' );
+
+Irssi::settings_add_bool( 'tech_addon', 'twtopic_auto_resize', 0 );
+Irssi::settings_add_bool( 'tech_addon', 'twtopic_instruct', 1 );
+Irssi::settings_add_bool( 'tech_addon', 'twtopic_min_scroll', 0 );
+Irssi::settings_add_int( 'tech_addon', 'twtopic_ar_padding', 10 );
+Irssi::settings_add_int( 'tech_addon', 'twtopic_init_pause', 10 );
+Irssi::settings_add_int( 'tech_addon', 'twtopic_padding', 20 );
+Irssi::settings_add_int( 'tech_addon', 'twtopic_refresh', 150 );
+Irssi::settings_add_int( 'tech_addon', 'twtopic_size', 20 );
+
+sub reload { Irssi::statusbar_items_redraw('twtopic'); }
+
+if ( Irssi::settings_get_bool('twtopic_instruct') ) {
+ print $instrut;
+}
+
+setup();
+
+Irssi::statusbar_item_register( 'twtopic', '$0', 'show' );