diff options
| author | Ailin Nemui | 2016-04-26 23:53:02 +0200 | 
|---|---|---|
| committer | Ailin Nemui | 2016-04-27 13:28:07 +0200 | 
| commit | 8295537e51cb0c04355ba698051626c17466c856 (patch) | |
| tree | 9f219a48b3004ae11e527233a6a340e2099a8bdf | |
| parent | 91c8e2ec878d6942b11f61daa5cfef1d211de0d9 (diff) | |
| download | scripts.irssi.org-8295537e51cb0c04355ba698051626c17466c856.tar.bz2 | |
Add colon_emoji
Replace words between :...: in messages according to a text file. Was
intended for Unicode Emoji on certain proprietary platforms.
| -rw-r--r-- | scripts/colon_emoji.pl | 124 | 
1 files changed, 124 insertions, 0 deletions
| diff --git a/scripts/colon_emoji.pl b/scripts/colon_emoji.pl new file mode 100644 index 0000000..c1147a2 --- /dev/null +++ b/scripts/colon_emoji.pl @@ -0,0 +1,124 @@ +use strict; +use warnings; + +our $VERSION = '0.1'; # dd9c3f5ff21242d +our %IRSSI = ( +    authors     => 'Lars Djerf, Nei', +    contact     => 'lars.djerf@gmail.com, Nei @ anti@conference.jabber.teamidiot.de', +    name        => 'colon_emoji', +    description => 'Replace words between :...: in messages according to a text file. Was intended for Unicode Emoji on certain proprietary platforms.', +    license     => 'GPLv3', +   ); + +# Options +# ======= +# /set colon_emoji_target net1/#chan1 net2/ +# * space separated list of network/channel entries (network/ for the +#   whole network) +# +# /set colon_emoji_file filename.dat +# * the file which contains the replacements. it must be formatted +#   like this: +# +#      emojiname1   "replacement string 1" +#      emojiname2   "replacement string 2" +# +#   You can find a suitable file on +#   <http://anti.teamidiot.de/static/nei/*/Code/Irssi/> + +# Usage +# ===== +# after loading the script, configure the channels/networks and the +# data file. aferwards, all incoming messages will have words between +#  :...: replaced according to the file + +# TODO handle outgoing messages + +use File::Basename 'dirname'; +use File::Spec; +use Cwd 'abs_path'; +use constant ScriptFile => __FILE__; + +my %netchans; +my ($lastfile, $lastfilemod); + +my %emojie; + +my $regex = qr/(?!)/; + +sub sig_message_public { +    my ($server, $msg, $nick, $address, $channel, @x) = @_; +    if (_want_targ($server, $channel)) { +	&event_message; +    } +} + +sub sig_message_private { +    my ($server, $msg, $nick, $address, @x) = @_; +    if (_want_targ($server, $nick)) { +	&event_message; +    } +} + +sub event_message { +    my ($server, $msg, @rest) = @_; +    $msg =~ s/$regex/$emojie{$1}/g; +    Irssi::signal_continue($server, $msg, @rest); +} + +sub sig_setup_changed { +    my @targets = split ' ', lc Irssi::settings_get_str('colon_emoji_target'); +    %netchans = map { ($_ => 1) } @targets; +    my $file = Irssi::settings_get_str('colon_emoji_file'); +    my $file2 = $file; +    $file2 =~ s/^~\//$ENV{HOME}\//; +    unless (File::Spec->file_name_is_absolute($file2)) { +	$file2 = File::Spec->catfile(dirname(abs_path(+ScriptFile)), $file2); +    } +    unless (defined $lastfile && $lastfile eq $file2 && ((-M $file2) // 0) >= ($lastfilemod//0)) { +	if (open my $in, '<', $file2) { +	    %emojie = (); +	    while (my $e = <$in>) { +		chomp $e; +		next if $e =~ /^>>/; +		if ($e =~ /^\s*(.*?)\s+"(.*?)"/) { +		    $emojie{$1} = $2; +		} +	    } +	    print CLIENTERROR "Warning, no emoji were found in $file" unless keys %emojie; +	} +	else { +	    print CLIENTERROR "Could not read colon_emoji_file $file: $!"; +	} +	$lastfile = $file2; +	$lastfilemod = -M $file2; +	my $pat = join '|', map { quotemeta } sort { length $b <=> length $a || $b cmp $a } keys %emojie; +	$regex = length $pat ? qr/:($pat):/ : qr/(?!)/; +    } +} + +sub _want_targ { +    my ($server, $target) = @_; +    return unless $server; +    my $t = $server->channel_find($target) +	|| $server->query_find($target) +	|| return; +    my $tag = lc $server->{tag}; +    my $name = lc $t->{visible_name}; +    my $netchan = "$tag/$name"; +    return unless exists $netchans{"$tag/"} || exists $netchans{$netchan} || exists $netchans{"/$name"}; +    return 1; +} + +sub init { +    sig_setup_changed(); +} + +Irssi::settings_add_str('colon_emoji', 'colon_emoji_target', ''); +Irssi::settings_add_str('colon_emoji', 'colon_emoji_file', 'emoji_def.txt'); + +Irssi::signal_add('setup changed' => 'sig_setup_changed'); +Irssi::signal_add_first('message public' => 'sig_message_public'); +Irssi::signal_add_first('message private' => 'sig_message_private'); + +init(); | 
