Skip to content

Instantly share code, notes, and snippets.

@jhacksworth
Forked from uriel1998/colorize-0.0.3.pl
Created July 1, 2014 13:36
Show Gist options
  • Select an option

  • Save jhacksworth/add0fee0bf5805ceb83f to your computer and use it in GitHub Desktop.

Select an option

Save jhacksworth/add0fee0bf5805ceb83f to your computer and use it in GitHub Desktop.

Revisions

  1. @uriel1998 uriel1998 created this gist Feb 25, 2013.
    511 changes: 511 additions & 0 deletions colorize-0.0.3.pl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,511 @@
    #!/usr/bin/perl

    # This script was no no longer online, so I snagged it from archive.org at
    # http://web.archive.org/web/20051216235430/http://ant.home.comcast.net/colorize/colorize-pod.html
    #
    # colorize-0.0.3.pl - Colorize messages, nicks in message text, or both.
    #
    # Usage: see the POD at the end of this file or type '/colorize ?' in Xchat.
    #
    # To customize the brackets that surround the sending nick, e.g. <nick>,
    # modify any of the three variables in the section called 'BRACKET SETTINGS'
    # below.
    #

    use strict;
    use warnings;

    my %color = (
    white => '00',
    black => '01',
    blue => '02',
    green => '03',
    red => '04',
    darkgred => '05',
    purple => '06',
    darkyellow => '07',
    yellow => '08',
    brightgreen => '09',
    darkgreen => '10',
    green => '11',
    blue => '12',
    brightpurple => '13',
    darkgrey => '14',
    lightgrey => '15',
    );

    #-----------------------------------------------------------------
    # BRACKET SETTINGS
    #
    # For surrounding the nick, e.g. <nick>
    #
    # Examples are in the following comments
    # my $BRACKET_COLOR = $color{white};
    # my $LEFT_BRACKET_STYLE = '<';
    # my $RIGHT_BRACKET_STYLE = '>';
    #
    my $BRACKET_COLOR = "";
    my $LEFT_BRACKET_STYLE = '';
    my $RIGHT_BRACKET_STYLE = '';

    #-----------------------------------------------------------------

    my $script_name = 'colorize.pl';
    my $script_version = '0.0.3';

    # Text Event to listen in on
    my $print_event = 'Channel Message';

    # Xchat command to set colorize option
    my $config_command = 'colorize';

    # functions for colorizing [ nicks | messages | all ]
    my %colorize_with = (
    'message and embedded nicks' => \&colorize_all,
    'message only' => \&colorize_messages_only,
    'embedded nicks only' => \&colorize_nicks_only,
    );

    # Default to colorizing 'enabled' and colorizing all
    my $colorize_command = 'message and embedded nicks';
    my $colorize_enabled = 1;

    # Formatting codes
    my $start_coloring_with = "\cC";
    my $formatting_off = "\cO";

    # Brackets
    my $left_bracket
    = $start_coloring_with
    . $BRACKET_COLOR
    . $LEFT_BRACKET_STYLE
    . $formatting_off
    ;

    my $right_bracket
    = $start_coloring_with
    . $BRACKET_COLOR
    . $RIGHT_BRACKET_STYLE
    . $formatting_off
    ;

    # Cache for color codes of seen nicks
    my %color_code_for = ();

    # Register plugin with Xchat
    Xchat::register( $script_name , $script_version );

    # Print a notice that the plugin was loaded
    Xchat::print(
    "\cB$script_name\cB version \cB$script_version\cB " . "loaded\n"
    );

    # Intercept events
    Xchat::hook_print( $print_event, \&do_colorize );
    Xchat::hook_command( $config_command, \&set_colorize_option );

    # Get/Set options
    sub set_colorize_option { # {{{
    my ( $switch ) = $_[0][1];

    $switch ||= '';

    my $msg;

    for ( $switch ) {
    # No switch, report state
    /^$/ and do {
    $msg = report_state();

    last;
    };
    # Show usage
    /^\?$|^h/i and do {
    $msg = usage();

    last;
    };

    # Enable/Disable

    # disable
    /^d/i and do {
    # off
    $colorize_enabled = 0;

    $msg = "$script_name: Colorizing disabled\n";
    last;
    };
    # enable
    /^e/i and do {
    # on
    $colorize_enabled = 1;

    $msg = "$script_name: Colorizing enabled\n";
    last;
    };

    # Colorizing scheme

    # colorize all
    /^a/i and do {
    $colorize_command = 'message and embedded nicks';

    $msg
    = "$script_name: Setting colorize scheme to "
    . "'$colorize_command'\n";

    last;
    };
    # colorize message only
    /^m/i and do {
    $colorize_command = 'message only';

    $msg
    = "$script_name: Setting colorize scheme to "
    . "'$colorize_command'\n";

    last;
    };
    # colorize nicks only
    /^n/i and do {
    $colorize_command = 'embedded nicks only';

    $msg
    = "$script_name: Setting colorize scheme to "
    . "'$colorize_command'\n";

    last;
    };

    # Unrecognized switch
    $msg
    = "$script_name: Unrecognized option '$switch', "
    . "keeping current option: $colorize_command\n";
    }

    Xchat::print( $msg );
    return Xchat::EAT_ALL;

    } # }}}

    # Calls appropriate colorizing function
    sub do_colorize { # {{{
    my ( $nick, $text ) = @{ $_[0] };

    return Xchat::EAT_NONE unless $colorize_enabled;

    # Get: message sender's nick color for future reference
    # sender's nick without color coding for use as key in cache
    my ( $nick_color, $nick_name_only ) = $nick =~ /^\x03(\d{2})(.*)$/;

    # Stop processing if nicks aren't colored
    return Xchat::EAT_NONE unless defined $nick_color;

    my $channel = Xchat::get_info("channel");
    my $server = Xchat::get_info("server");

    # Cache the color code for the sender's nick
    $color_code_for{$server}{$channel}{$nick_name_only} = $nick_color;

    # Use appropriate colorize scheme
    my $colorized = $colorize_with{$colorize_command}->(
    channel => $channel,
    server => $server,
    nick => $nick,
    text => $text,
    nick_color => $nick_color,
    );

    # Print newly colorized [ nick | message | both ]
    Xchat::print(
    $colorized,
    $channel,
    $server
    );

    # Let other plugins/scripts still see this event
    return Xchat::EAT_XCHAT;

    } # }}}

    sub colorize_messages_only { # {{{
    my %arg = @_;

    my $nick = $arg{nick};
    my $text = $arg{text};
    my $nick_color = $arg{nick_color};

    # Colorize the message text
    my $colorized_text
    = $start_coloring_with
    . $arg{nick_color}
    . $arg{text};

    # Join nick and colorized text
    my $colorized_message
    = $left_bracket . $arg{nick} . $right_bracket
    . "\t"
    . $colorized_text
    . "\n"
    ;

    return $colorized_message;

    } # }}}

    sub colorize_nicks_only { # {{{
    my %arg = @_;

    my $channel = $arg{channel};
    my $server = $arg{server};
    my $nick = $arg{nick};
    my $text = $arg{text};
    my $nick_color = $arg{nick_color};

    # Colorize the mention of any cached nicks in the message text
    for my $cached_nick ( keys %{ $color_code_for{$server}{$channel} } ) {
    # cached nick found in message
    if ( $text =~ /(\b\Q$cached_nick\E\b)/ ) {
    my $cached_nick_color
    = $color_code_for{$server}{$channel}{$cached_nick};

    my $colorized_cached_nick
    = $start_coloring_with
    . $cached_nick_color
    . $cached_nick
    . $formatting_off;

    $text =~ s/(\b)\Q$cached_nick\E(\b)/$1$colorized_cached_nick$2/g;
    }
    }

    # Join sender's nick and colorized text
    my $message_with_colored_nicks_only
    = $left_bracket . $nick . $right_bracket
    . "\t"
    . $text
    . "\n"
    ;

    return $message_with_colored_nicks_only;

    } # }}}

    sub colorize_all { # {{{
    my %arg = @_;

    my $channel = $arg{channel};
    my $server = $arg{server};
    my $nick = $arg{nick};
    my $text = $arg{text};
    my $nick_color = $arg{nick_color};

    # Colorize the mention of any cached nicks in the message text
    for my $cached_nick ( keys %{ $color_code_for{$server}{$channel} } ) {
    if ( $text =~ /(\b\Q$cached_nick\E\b)/ ) {
    my $cached_nick_color
    = $color_code_for{$server}{$channel}{$cached_nick};

    my $colorized_cached_nick
    = $start_coloring_with
    . $cached_nick_color
    . $cached_nick
    . $start_coloring_with
    . $nick_color
    ;

    $text =~ s/(\b)\Q$cached_nick\E(\b)/$1$colorized_cached_nick$2/g;
    }
    }

    # Colorize the message
    $text
    = $start_coloring_with
    . $nick_color
    . $text;

    # Join sender's nick and colorized text
    my $colorized_message
    = $left_bracket . $nick . $right_bracket
    . "\t"
    . $text
    . "\n"
    ;

    return $colorized_message;

    } # }}}

    sub report_state { # {{{

    my $msg;

    if ( $colorize_enabled ) {
    $msg
    = "$script_name: Status - Colorizing is enabled. "
    . "Colorization scheme set to '$colorize_command'\n";
    }
    else {
    $msg
    = "$script_name: Status - Colorizing is disabled. "
    . "Colorization scheme last set to '$colorize_command'\n";
    }

    return $msg;
    } # }}}

    sub usage { # {{{
    return my $usage = <<END_USAGE;
    -------------------------------
    Usage: /$config_command [OPTION]
    If no option is given, the default action is to show the current settings.
    ?, help - Display this help message
    Enable/Disabling Colorization
    enable - Enable colorizing
    disable - Disable colorizing
    Colorizing Schemes
    all - Colorize message and embedded nicks in message
    message - Colorize message only
    nicks - Colorize embedded nicks only
    Example. To set colorization scheme to only colorize embedded nicks:
    /colorize nicks
    Note that you only need to type the first letter of the option. So the
    following command will also set the scheme to colorize just nicks:
    /colorize n
    -------------------------------
    END_USAGE
    } # }}}

    __END__
    =head1 NAME
    colorize.pl - Colorize messages and/or embedded nicks with corresponding
    colors.
    =head1 VERSION
    This documentation refers to colorize.pl version 0.0.3.
    =head1 INSTALLATION
    Short answer:
    Put this file in your Xchat data directory (e.g. ~/.xchat2 on
    linux). Make sure you've turned on colored nick names in your preferences.
    Long answer:
    The following is from http://www.xchat.org/faq/#q218
    18. How do I auto-load scripts at startup?
    You just have to place the scripts into XChat's data directory. XChat will
    auto-load scripts if they have the right extension .e.g If a filename ends in
    .pl, it will be loaded as a Perl script. This data directory is different on
    each platform:
    Windows
    It depends on your version of Windows and where it stores the Application Data
    folder. On Windows XP it is usually:
    C:\Documents and Settings\username\Application Data\X-Chat 2\
    UNIX
    ~/.xchat2/ Where "~" represents your home directory i.e.: $HOME/.xchat2/
    =head1 USAGE
    /colorize [OPTION]
    If no option is given, the default action is to show the current settings.
    ?, help - Display this help message
    Enable/Disabling Colorization
    enable - Enable colorizing
    disable - Disable colorizing
    Colorizing Schemes
    all - Colorize message and embedded nicks in message
    message - Colorize message only
    nicks - Colorize embedded nicks only
    Example. To set colorization scheme to only colorize embedded nicks:
    /colorize nicks
    Note that you only need to type the first letter of the option. So the
    following command will also set the scheme to colorize just nicks:
    /colorize n
    =head1 CONFIGURATION
    You can customize the type and color of the brackets that surround the
    nick names. The default is to not have any surrounding brackets.
    To change the bracket type and color, go to the section labeled
    "BRACKET SETTINGS" towards the top of the script and edit the three
    variables:
    my $BRACKET_COLOR = "";
    my $LEFT_BRACKET_STYLE = '';
    my $RIGHT_BRACKET_STYLE = '';
    You can use the %color hash defined at the top of the script for defining
    $BRACKET_COLOR. For example, to set the bracket color to green, set
    the following:
    my $BRACKET_COLOR = $color{green};
    The brackets can be any characters you want, you are not limited to
    the usual '<' and '>'. For example, to set the bracket type to use
    parentheses, set the following:
    my $LEFT_BRACKET_STYLE = '(';
    my $RIGHT_BRACKET_STYLE = ')';
    =head1 INCOMPATIBILITIES
    Xchat 2.0.8 or above is required to load this plugin.
    =head1 BUGS AND LIMITATIONS
    Please report any bugs you find to the author.
    This version only colorizes messages sent by other users. It does not
    colorize messages sent by you or for you.
    Patches welcome. :-)
    =head1 SEE ALSO
    http://ant.home.comcast.net/colorize is where this plugin is hosted.
    http://www.xchat.org/docs/xchat2-perl.html has good documentation on
    writing perl plugins.
    =head1 AUTHOR
    jf3 at swift.fastmail.fm
    =head1 LICENSE AND COPYRIGHT
    This plugin is made available under the same license as XChat, which
    is the GPL. You can read it at http://www.gnu.org/licenses/gpl.txt.