summaryrefslogtreecommitdiff
path: root/irssi/scripts/micmot.pl
blob: 1ff8f874f096e18d0261f652fe1aa821b383ce4d (plain)
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/perl
#
# Irssi script to display buffer activity in tmux pane name.
#
# Ideally one single feature complete chat client should be used, but this
# workaround makes life a bit more bearably in our contemporary world requiring
# multiple chat clients.
#
# Requires something like: `F=~/.irssi/micmot-fifo; mkfifo $F; tail -f $F &`
#
# Also requires ":set-option allow-rename on" in the tmux buffer.

use strict;
use vars qw ($VERSION %IRSSI);
use 5.32.0;

use Irssi;

$VERSION = '0.1.0';
%IRSSI = (
  authors => 'cos',
  contact => '|cos|',
  description => 'Abusing tmux pane names for displaying channel activity.',
  license => 'MIT',
  name => 'micmot',
);

my $TMUX_FIFO = $ENV{'IRSSI_TMUX_FIFO'};
$TMUX_FIFO = $ENV{'HOME'}.'/.irssi/micmot-fifo' unless $TMUX_FIFO;

my $PANE_NAME = $ENV{'IRSSI_TMUX_PANE'};
$PANE_NAME = 'irssi' unless $PANE_NAME;

sub set_pane_title {
  my ( $title ) = @_;

  my $FILE_HANDLE;
  open $FILE_HANDLE, '>>', $TMUX_FIFO or return;
  printf($FILE_HANDLE "%c]2;%s%c\\", 0x1b, $title, 0x1b);
  close $FILE_HANDLE;
}

sub set_pane_name {
  my ( $name ) = @_;

  my $FILE_HANDLE;
  open $FILE_HANDLE, '>>', $TMUX_FIFO or return;
  printf($FILE_HANDLE "%ck%s%c\\", 0x1b, $name, 0x1b);
  close $FILE_HANDLE;
}

sub highlight_pane {
  my $FILE_HANDLE;
  open $FILE_HANDLE, '>>', $TMUX_FIFO or return;
  printf($FILE_HANDLE "\x07");
  close $FILE_HANDLE;
}

sub activity_to_tmux {
  my $active_win = Irssi::active_win() or return;
  my $active_win_refnum = $active_win->{'refnum'} or return;

  my @windows = Irssi::windows() or return;
  my $tmux = "";
  for ( @windows ) {
    # Skip the currently active window.
    next if $_->{'refnum'} eq $active_win_refnum;

    # Include any windows with data_level 'msg' or 'highlight'.
    if ($_->{'active'}->{'data_level'} ge 2) {
      if (length($tmux) > 0) {
        $tmux .= ",";
      }
      $tmux .= $_->{'active'}->{'visible_name'};
    }
  }

  set_pane_name( $tmux ? "[" . $tmux =~ s/[^.,#0-9A-Za-z-]+//rg . "]" :
      $PANE_NAME );
  if ( $tmux ) {
    highlight_pane();
  }
}

say qq($IRSSI{name} $VERSION using "$TMUX_FIFO");
set_pane_name( $PANE_NAME );
set_pane_title( $PANE_NAME );

Irssi::signal_add 'window activity' => \&activity_to_tmux;
Irssi::signal_add 'window changed' => \&activity_to_tmux;