summaryrefslogtreecommitdiffstats
path: root/scripts/fakectcp.pl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--scripts/fakectcp.pl277
1 files changed, 277 insertions, 0 deletions
diff --git a/scripts/fakectcp.pl b/scripts/fakectcp.pl
new file mode 100644
index 0000000..73fe490
--- /dev/null
+++ b/scripts/fakectcp.pl
@@ -0,0 +1,277 @@
+#!/usr/bin/perl -w
+
+## Bugreports and Licence disclaimer.
+#
+# For bugreports and other improvements contact Geert Hauwaerts <geert@irssi.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this script; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+##
+
+use strict;
+use Irssi;
+use vars qw($VERSION %IRSSI);
+
+$VERSION = "1.04";
+
+%IRSSI = (
+ authors => 'Geert Hauwaerts',
+ contact => 'geert@irssi.org',
+ name => 'fakectcp.pl',
+ description => 'This script sends fake ctcp replies to a client using a fake ctcp list.',
+ license => 'GNU General Public License',
+ url => 'http://irssi.hauwaerts.be/default.pl',
+ changed => '2018-09-17',
+);
+
+my @fakectcp = ();
+my $fakectcp_file = "fctcplist";
+my $irssidir = Irssi::get_irssi_dir();
+
+my $help = <<EOF;
+
+Usage: (all on one line)
+/FCTCP [-add||-replace <ctcp-item> <ctcp-reply>] [-del <ctcp-item>] [-list] [-help]
+
+-add: Add a new fake ctcp-reply to the list.
+-del: Delete a fake ctcp-reply from the list.
+-list: Display the contents of the fake ctcp-reply list.
+-help: Display this useful little helpfile.
+-replace: Replace an existing fake reply with a new one. If the old one doesn't exist, the new one will be added by default.
+
+Examples: (all on one line)
+/FCTCP -add CHRISTEL We all love christel, don't we! :)
+/FCTCP -add LOCATION I'm at home, reading some helpfiles.
+
+/FCTCP -del CHRISTEL
+/FCTCP -del LOCATION
+
+Note: The caps are not obligated. The default parameter is -list.
+EOF
+
+Irssi::theme_register([
+ 'fctcp_info', ' # ctcpitem ctcpreply',
+ 'fctcp_empty', '%R>>%n %_FCTCP:%_ Your fake ctcp list is empty.',
+ 'fctcp_added', '%R>>%n %_FCTCP:%_ Added %_$0%_ ($1) to the fake ctcp list.',
+ 'fctcp_replaced', '%R>>%n %_FCTCP:%_ Replaced the old fake reply %_$0%_ with the new one ($1)',
+ 'fctcp_delled', '%R>>%n %_FCTCP:%_ Deleted %_$0%_ from the fake ctcp list.',
+ 'fctcp_nfound', '%R>>%n %_FCTCP:%_ Can\'t find $0 in the fake ctcp list.',
+ 'fctcp_delusage', '%R>>%n %_FCTCP:%_ Usage: /FCTCP -del <ctcp-item>',
+ 'fctcp_usage', '%R>>%n %_FCTCP:%_ Usage: /FCTCP -add <ctcp-item> <ctcp-reply>',
+ 'fctcp_repusage', '%R>>%n %_FCTCP:%_ Usage: /FCTCP -replace <ctcp-item> <ctcp-reply>',
+ 'fctcp_nload', '%R>>%n %_FCTCP:%_ Could not load the fake ctcp list.',
+ 'fctcp_request', '%R>>%n %_FCTCP:%_ Used the fake reply %_$1%_ on %_$0%_',
+ 'fctcp_loaded', '%R>>%n %_FCTCP:%_ The fake reply %_$0%_ already exists, use %_/FCTCP -del $0%_ to remove it from the list.',
+ 'fctcp_print', '$[!-2]0 $[20]1 $2',
+ 'fctcp_help', '$0',
+ 'loaded', '%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2.'
+]);
+
+sub ctcpreply {
+
+ my ($server, $data, $nick, $address, $target) = @_;
+ my ($findex);
+
+ $data = lc($data);
+
+ return unless (lc($server->{nick}) eq lc($target));
+
+ if (!already_loaded($data)) {
+ $findex = check_loaded($data);
+ $server->command("^NCTCP $nick $data $fakectcp[$findex]->{reply}");
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_request', $nick, $data);
+ Irssi::signal_stop();
+ }
+}
+
+sub new_fctcp {
+
+ my $fctcp = {};
+
+ $fctcp->{item} = shift;
+ $fctcp->{reply} = shift;
+
+ return $fctcp;
+}
+
+sub already_loaded {
+
+ my ($item) = @_;
+ my $loaded = check_loaded($item);
+
+ if ($loaded > -1) {
+ return 0;
+ }
+
+ return 1;
+}
+
+sub check_loaded {
+
+ my ($item) = @_;
+
+ $item = lc($item);
+
+ for (my $loaded = 0; $loaded < @fakectcp; ++$loaded) {
+ return $loaded if (lc($fakectcp[$loaded]->{item}) eq $item);
+ }
+
+ return -1;
+}
+
+sub load_fakectcplist {
+
+ my ($file) = @_;
+
+ @fakectcp = ();
+
+ if (-e $file) {
+ local *F;
+ open(F, "<", $file);
+ local $/ = "\n";
+
+ while (<F>) {
+ chop;
+ my $new_fctcp = new_fctcp(split("\t"));
+
+ if (($new_fctcp->{item} ne "") && ($new_fctcp->{reply} ne "")) {
+ push(@fakectcp, $new_fctcp);
+ }
+ }
+
+ close(F);
+ } else {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_nload');
+ }
+}
+
+sub save_fakectcplist {
+
+ my ($file) = @_;
+
+ local *F;
+ open(F, ">", $file) or die "Could not load the fake ctcpreply list for writing";
+
+ for (my $n = 0; $n < @fakectcp; ++$n) {
+ print(F join("\t", $fakectcp[$n]->{item}, $fakectcp[$n]->{reply}) . "\n");
+ }
+
+ close(F);
+}
+
+sub addfakectcp {
+
+ my ($ctcpitem, $ctcpreply) = split (" ", $_[0], 2);
+
+ if (($ctcpitem eq "") || ($ctcpreply eq "")) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_usage');
+ return;
+ } elsif (!already_loaded($ctcpitem)) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_loaded', $ctcpitem);
+ return;
+ }
+
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_added', $ctcpitem, $ctcpreply);
+ push(@fakectcp, new_fctcp($ctcpitem, $ctcpreply));
+ save_fakectcplist("$irssidir/$fakectcp_file");
+}
+
+sub delfakectcp {
+
+ my ($fdata) = @_;
+ my ($fdataindex);
+
+ if ($fdata eq "") {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_delusage');
+ return;
+ }
+
+ for (my $index = 0; $index < @fakectcp; ++$index) {
+ if (lc($fakectcp[$index]->{item}) eq $fdata) {
+ $fdataindex = splice(@fakectcp, $index, 1);
+ }
+ }
+
+ if ($fdataindex) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_delled', $fdata);
+ save_fakectcplist("$irssidir/$fakectcp_file");
+ } else {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_nfound', $fdata);
+ }
+}
+
+sub replacefakectcp {
+
+ my ($ctcpitem, $ctcpreply) = split (" ", $_[0], 2);
+ my ($fdataindex);
+
+ if (($ctcpitem eq "") || ($ctcpreply eq "")) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_repusage');
+ return;
+ }
+
+ if (!already_loaded($ctcpitem)) {
+ for (my $index = 0; $index < @fakectcp; ++$index) {
+ if (lc($fakectcp[$index]->{item}) eq $ctcpitem) {
+ $fdataindex = splice(@fakectcp, $index, 1);
+ } elsif ($fdataindex) {
+ save_fakectcplist("$irssidir/$fakectcp_file");
+ }
+ }
+ }
+
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_replaced', $ctcpitem, $ctcpreply);
+ push(@fakectcp, new_fctcp($ctcpitem, $ctcpreply));
+ save_fakectcplist("$irssidir/$fakectcp_file");
+}
+
+sub fakectcp {
+
+ my ($cmdoption, $ctcpitem, $ctcpreply) = split (" ", $_[0], 3);
+
+ $ctcpitem = lc($ctcpitem);
+ $cmdoption = lc($cmdoption);
+
+ if ($cmdoption eq "-add") {
+ addfakectcp("$ctcpitem $ctcpreply");
+ return;
+ } elsif ($cmdoption eq "-del") {
+ delfakectcp("$ctcpitem");
+ return;
+ } elsif ($cmdoption eq "-help") {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_help', $help);
+ return;
+ } elsif ($cmdoption eq "-replace") {
+ replacefakectcp("$ctcpitem $ctcpreply");
+ return;
+ }
+
+ if (@fakectcp == 0) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_empty');
+ } else {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_info');
+
+ for (my $n = 0; $n < @fakectcp ; ++$n) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_print', $n, $fakectcp[$n]->{item}, $fakectcp[$n]->{reply});
+ }
+ }
+}
+
+load_fakectcplist("$irssidir/$fakectcp_file");
+
+Irssi::signal_add('ctcp msg', 'ctcpreply');
+Irssi::command_bind('fctcp', 'fakectcp');
+Irssi::command_set_options('fctcp','add del list help replace');
+Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'loaded', $IRSSI{name}, $VERSION, $IRSSI{authors});