summaryrefslogtreecommitdiffstats
path: root/scripts/relm.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/relm.pl')
-rw-r--r--scripts/relm.pl93
1 files changed, 93 insertions, 0 deletions
diff --git a/scripts/relm.pl b/scripts/relm.pl
new file mode 100644
index 0000000..460423e
--- /dev/null
+++ b/scripts/relm.pl
@@ -0,0 +1,93 @@
+## Usage: /RELM [-l || index] [target]
+## to list last 15 messages:
+## /RELM -l
+## to redirect msg #4, 7, 8, 9, 10, 13 to current channel/query:
+## /RELM 4,7-10,13
+## to redirect last message to current channel/query:
+## /RELM
+
+use strict;
+use Irssi;
+
+use vars qw($VERSION %IRSSI);
+$VERSION = "1.1";
+%IRSSI = (
+ authors => "Maciek \'fahren\' Freudenheim",
+ contact => "fahren\@bochnia.pl",
+ name => "REdirect Last Message",
+ description => "Keeps last 15 messages in cache",
+ license => "GNU GPLv2 or later",
+ changed => "2019-02-25"
+);
+
+my %relm=();
+
+sub cmd_relm {
+ my ($args, $server, $winit) = @_;
+ my $ircnet = lc($server->{tag});
+ my ($which, $where) = split(/ +/, $args, 2);
+
+ $where = $which unless $which =~ /[0-9]/;
+
+ unless ($relm{$ircnet}) {
+ Irssi::print("%R>>%n Nothing in relm buffer on $ircnet.", MSGLEVEL_CRAP);
+ return;
+ }
+
+ $which = scalar(@{$relm{lc($ircnet)}}) unless ($which);
+
+ if ($where eq "-l") {
+ my $numspace;
+ Irssi::print(">> ---- Context ------------------------", MSGLEVEL_CRAP);
+ for (my $i = 0; $i < scalar(@{$relm{$ircnet}}); $i++) {
+ $numspace = sprintf("%.2d", $i+1);
+ Irssi::print("[%W$numspace%n] $relm{$ircnet}[$i]", MSGLEVEL_CRAP);
+ }
+ return;
+ }
+
+ unless ($where) {
+ unless ($winit && ($winit->{type} eq "CHANNEL" || $winit->{type} eq "QUERY")) {
+ Irssi::print("%R>>%n You have to join channel first", MSGLEVEL_CRAP);
+ return;
+ }
+ $where = $winit->{name};
+ }
+
+ $which =~ s/,/ /g;
+ my @nums;
+ for my $num (split(/ /, $which)) {
+ if ($num =~ /-/) {
+ my ($start, $end) = $num =~ /([0-9]+)-([0-9]*)/;
+ for (;$start <= $end; $start++) {
+ push(@nums, $start - 1);
+ }
+ } else {
+ push(@nums, $num - 1);
+ }
+ }
+
+ for my $num (@nums) {
+ unless ($relm{$ircnet}[$num]) {
+ Irssi::print("%R>>%n No such message in relm buffer /" . ($num + 1). "/", MSGLEVEL_CRAP);
+ } else {
+ Irssi::active_server()->command("msg $where $relm{$ircnet}[$num]");
+ }
+ }
+}
+
+sub event_privmsg {
+ my ($server, $data, $nick, $address) = @_;
+ my ($target, $text) = split(/ :/, $data, 2);
+ my $ircnet = lc($server->{tag});
+
+ return if ($server->{nick} ne $target);
+ my $relm = "\00312[ \00310$nick!$address \00312]\003 $text";
+ if ( exists $relm{$ircnet} ) {
+ shift(@{$relm{$ircnet}}) if scalar(@{$relm{$ircnet}}) > 14;
+ }
+ push(@{$relm{$ircnet}}, $relm);
+}
+
+Irssi::command_bind("relm", "cmd_relm");
+Irssi::signal_add("event privmsg", "event_privmsg");