my $channel_msg_format = Xchat::get_info( "event_text Channel Message" );
# HexChat Perl Interface ## Introduction This is the Perl interface for HexChat. If there are any problems, questions, comments or suggestions please email them to the address on the bottom of this page. ## Constants ###Priorities * **`Xchat::PRI_HIGHEST`** * **`Xchat::PRI_HIGH`** * **`Xchat::PRI_NORM`** * **`Xchat::PRI_LOW`** * **`Xchat::PRI_LOWEST`** ### Return values * **`Xchat::EAT_NONE`** - pass the event along * **`Xchat::EAT_XCHAT`** - don't let HexChat see this event * **`Xchat::EAT_PLUGIN`** - don't let other scripts and plugins see this event but xchat will still see it * **`Xchat::EAT_ALL`** - don't let anything else see this event #### Timer and fd hooks * **`Xchat::KEEP`** - keep the timer going or hook watching the handle * **`Xchat::REMOVE`** - remove the timer or hook watching the handle ### hook\_fd flags * **`Xchat::FD_READ`** - invoke the callback when the handle is ready for reading * **`Xchat::FD_WRITE`** - invoke the callback when the handle is ready for writing * **`Xchat::FD_EXCEPTION`** - invoke the callback if an exception occurs * **`Xchat::FD_NOTSOCKET`** - indicate that the handle being hooked is not a socket ## Functions ### `Xchat::register( $name, $version, [$description,[$callback]] )` * `$name` - The name of this script * `$version` - This script's version * `$description` - A description for this script * `$callback` - This is a function that will be called when the is script unloaded. This can be either a reference to a function or an anonymous sub reference. This is the first thing to call in every script. ### `Xchat::hook_server( $message, $callback, [\%options] )` ### `Xchat::hook_command( $command, $callback, [\%options] )` ### `Xchat::hook_print( $event,$callback, [\%options] )` ### `Xchat::hook_timer( $timeout,$callback, [\%options | $data] )` ### `Xchat::hook_fd( $handle, $callback, [ \%options ] )` These functions can be to intercept various events. hook\_server can be used to intercept any incoming message from the IRC server. hook\_command can be used to intercept any command, if the command doesn't currently exist then a new one is created. hook\_print can be used to intercept any of the events listed in _Setttings_ `->` _Text Events_. hook\_timer can be used to create a new timer * **`$message`** - server message to hook such as PRIVMSG * **`$command`** - command to intercept, without the leading / * **`$event`** - one of the events listed in _Settings_ `->` _Text Events_ * **`$timeout`** - timeout in milliseconds * **`$handle`** - the I/O handle you want to monitor with hook\_fd. This must be something that has a fileno. See perldoc -f fileno or [fileno](http://perldoc.perl.org/functions/fileno.html) * **`$callback`** - callback function, this is called whenever the hooked event is trigged, the following are the conditions that will trigger the different hooks. This can be either a reference to a function or an anonymous sub reference. * **`\%options`** - a hash reference containing addional options for the hooks Valid keys for \%options:
| data | Additional data that is to be associated with the hook. For timer hooks this value can be provided either as Xchat::hook_timer( $timeout, $cb,{data=>$data})or Xchat::hook_timer( $timeout, $cb, $data ).However, this means that hook_timer cannot be provided with a hash reference containing data as a key. example: my $options = { data => [@arrayOfStuff] }; Xchat::hook_timer( $timeout, $cb, $options ); In this example, the timer's data will be [@arrayOfStuff] and not { data => [@arrayOfStuff] } This key is valid for all of the hook functions. Default is undef. |
| priority | Sets the priority for the hook. It can be set to one of the Xchat::PRI_* constants.This key only applies to server, command and print hooks. Default is Xchat::PRI_NORM.
|
| help_text | Text displayed for /help $command. This key only applies to command hooks. Default is "". |
| flags | Specify the flags for a fd hook. See hook fd flags section for valid values. On Windows if the handle is a pipe you specify Xchat::FD_NOTSOCKET in addition to any other flags you might be using. This key only applies to fd hooks. Default is Xchat::FD_READ |
#### When callbacks are invoked Each of the hooks will be triggered at different times depending on the type of hook.
| Hook Type | When the callback will be invoked |
| server hooks | a $message message is
received from the server
|
| command hooks | the $command command is
executed, either by the user or from a script
|
| print hooks | X-Chat is about to print the message for the
$event event
|
| timer hooks | called every $timeout milliseconds
(1000 millisecond is 1 second)the callback will be executed in the same context where the hook_timer was called, if the context no longer exists then it will execute in a random context |
| fd hooks | depends on the flags that were passed to hook_fd See hook_fd flags section. |
| Event | Description |
| "Open Context" | a new context is created |
| "Close Context" | a context has been close |
| "Focus Tab" | when a tab is brought to the front |
| "Focus Window" | when a top level window is focused or the main tab window is focused by the window manager |
| "DCC Chat Text" | when text from a DCC Chat arrives.
$_[0] will have these values$_[0][0] - Address$_[0][1] - Port$_[0][2] - Nick$_[0][3] - Message |
| "Key Press" | used for intercepting key presses $_[0][0] - key value $_[0][1] - state bitfield, 1 - shift, 4 - control, 8 - alt $_[0][2] - string version of the key which might be empty for unprintable keys $_[0][3] - length of the string in $_[0][2] |
| ID | Return value | Associated Command(s) |
| away | away reason or undef if you are not away | AWAY, BACK |
| channel | current channel name | SETTAB |
| charset | character-set used in the current context | CHARSET |
| configdir | HexChat config directory encoded in UTF-8. Examples: /home/user/.config/hexchat C:\Users\user\Appdata\Roaming\HexChat |
|
| event_text <Event Name> | text event format string for <Event name> Example: 1
my $channel_msg_format = Xchat::get_info( "event_text Channel Message" ); |
|
| host | real hostname of the current server | |
| id | connection id | |
| inputbox | contents of the inputbox | SETTEXT |
| libdirfs | the system wide directory where xchat will look for plugins. this string is in the same encoding as the local file system | |
| modes | the current channels modes or undef if not known | MODE |
| network | current network name or undef, this value is taken from the Network List | |
| nick | current nick | NICK |
| nickserv | nickserv password for this network or undef, this value is taken from the Network List | |
| server | current server name (what the server claims to be) undef if not connected |
|
| state\_cursor | current inputbox cursor position in characters | SETCURSOR |
| topic | current channel topic | TOPIC |
| version | xchat version number | |
| win_status | status of the xchat window, possible values are "active", "hidden" and "normal" | GUI |
| win\_ptr | native window pointer, GtkWindow * on Unix, HWND on Win32. On Unix if you have the Glib module installed you can use my $window = Glib::Object->new\_from\_pointer( Xchat::get_info( "win\_ptr" ) ); to get a Gtk2::Window object. Additionally when you have detached tabs, each of the windows will return a different win\_ptr for the different Gtk2::Window objects. See char\_count.pl for a longer example of a script that uses this to show how many characters you currently have in your input box. |
|
| gtkwin_ptr | similar to win_ptr except it will always be a GtkWindow * |
use strict;
use warning;
use Xchat qw(:all);
hook_command( "MODES", sub {
my (undef, $who, $sign, $mode) = @{$_[0]};
my @targets = split /,/, $who;
if( @targets > 1 ) {
send_modes( \@targets, $sign, $mode, 1 );
} else {
send_modes( $who, $sign, $mode );
}
return EAT_XCHAT;
});
### `Xchat::nickcmp( $nick1, $nick2 )`
* **`$nick1, $nick2` - the two nicks or channel names that are to be compared**
The comparsion is based on the current server. Either an [RFC1459](http://www.ietf.org/rfc/rfc1459.txt)
compliant string compare or plain ascii will be using depending on the server. The
comparison is case insensitive.
Returns a number less than, equal to or greater than zero if `$nick1` is
found respectively, to be less than, to match, or be greater than `$nick2`.
### `Xchat::get_list( $name )`
* **`$name` - name of the list, one of the following: "channels", "dcc", "ignore", "notify", "users"**
This function will return a list of hash references. The hash references
will have different keys depend on the list. An empty list is returned
if there is no such list.
"channels" - list of channels, querys and their server
| Key | Description |
| channel | tab name |
| chantypes | channel types supported by the server, typically "#&" |
| context | can be used with set_context |
| flags | Server Bits: 0 - Connected 1 - Connecting 2 - Away 3 - EndOfMotd(Login complete) 4 - Has WHOX 5 - Has IDMSG (FreeNode) The following correspond to the /chanopt command 6 - Hide Join/Part Message (text_hidejoinpart)7 - unused (was for color paste) 8 - Beep on message (alert_beep) 9 - Blink Tray (alert_tray) 10 - Blink Task Bar (alert_taskbar) Example of checking if the current context has Hide Join/Part messages set: 1
2
3
if( Xchat::context_info->{flags} & (1 << 6) ) { Xchat::print( "Hide Join/Part messages is enabled" ); } |
| id | Unique server ID |
| lag | lag in milliseconds |
| maxmodes | Maximum modes per line |
| network | network name to which this channel belongs |
| nickprefixes | Nickname prefixes e.g. "+@" |
| nickmodes | Nickname mode chars e.g. "vo" |
| queue | number of bytes in the send queue |
| server | server name to which this channel belongs |
| type | the type of this context 1 - server 2 - channel 3 - dialog 4 - notices 5 - server notices |
| users | Number of users in this channel |
| Key | Value |
| address32 | address of the remote user(ipv4 address) |
| cps | bytes per second(speed) |
| destfile | destination full pathname |
| file | file name |
| nick | nick of the person this DCC connection is connected to |
| port | TCP port number |
| pos | bytes sent/received |
| poshigh | bytes sent/received, high order 32 bits |
| resume | point at which this file was resumed (zero if it was not resumed) |
| resumehigh | point at which this file was resumed, high order 32 bits |
| size | file size in bytes low order 32 bits |
| sizehigh | file size in bytes, high order 32 bits (when the files is > 4GB) |
| status | DCC Status: 0 - queued 1 - active 2 - failed 3 - done 4 - connecting 5 - aborted |
| type | DCC Type: 0 - send 1 - receive 2 - chatrecv 3 - chatsend |
| Key | Value |
| mask | ignore mask. e.g: *!*@*.aol.com |
| flags | Bit field of flags. 0 - private 1 - notice 2 - channel 3 - ctcp 4 - invite 5 - unignore 6 - nosave 7 - dcc |
| Key | Value |
| networks | comma separated list of networks where you will be notfified about this user's online/offline status or undef if you will be notificed on every network you are connected to |
| nick | nickname |
| flags | 0 = is online |
| on | time when user came online |
| off | time when user went offline |
| seen | time when user was last verified still online |
| Key | Value |
| away | away status(boolean) |
| lasttalk | last time a user was seen talking, this is the an epoch time(number of seconds since a certain date, that date depends on the OS) |
| nick | nick name |
| host | host name in the form: user@host or undef if not known |
| prefix | prefix character, .e.g: @ or + |
| realname | Real name or undef |
| selected | selected status in the user list, only works when retrieving the user list of the focused tab. You can use the /USELECT command to select the nicks |
| Key | Value | ||||||||||||||||
| autojoins | An object with the following methods:
|
||||||||||||||||
| connect_commands | An array reference containing the connect commands for a network. An empty array if there aren't any | ||||||||||||||||
| encoding | the encoding for the network | ||||||||||||||||
| flags |
a hash reference corresponding to the checkboxes in the network edit window
|
||||||||||||||||
| irc_nick1 | Corresponds with the "Nick name" field in the network edit window | ||||||||||||||||
| irc_nick2 | Corresponds with the "Second choice" field in the network edit window | ||||||||||||||||
| irc_real_name | Corresponds with the "Real name" field in the network edit window | ||||||||||||||||
| irc_user_name | Corresponds with the "User name" field in the network edit window | ||||||||||||||||
| network | Name of the network | ||||||||||||||||
| nickserv_password | Corresponds with the "Nickserv password" field in the network edit window | ||||||||||||||||
| selected | Index into the list of servers in the "servers" key, this is used if the "cycle" flag is false | ||||||||||||||||
| server_password | Corresponds with the "Server password" field in the network edit window | ||||||||||||||||
| servers | An array reference of hash references with a "host" and "port" key. If a port is not specified then 6667 will be used. |
use strict;
use warnings;
use Xchat qw(:all); # imports all the functions documented on this page
register( "User Count", "0.1",
"Print out the number of users on the current channel" );
hook_command( "UCOUNT", \&display_count );
sub display_count {
prnt "There are " . context_info()->{users} . " users in this channel.";
return EAT_XCHAT;
}
### `Xchat::strip_code( $string )`
* **`$string` - string to remove codes from**
This function will remove bold, color, beep, reset, reverse and underline codes from `$string`.
It will also remove ANSI escape codes which might get used by certain terminal based clients.
If it is called in void context `$string` will be modified otherwise a modified copy of `$string` is returned.
## Examples
### Asynchronous DNS resolution with hook\_fd
use strict;
use warnings;
use Xchat qw(:all);
use Net::DNS;
hook_command( "BGDNS", sub {
my $host = $_[0][1];
my $resolver = Net::DNS::Resolver->new;
my $sock = $resolver->bgsend( $host );
hook_fd( $sock, sub {
my $ready_sock = $_[0];
my $packet = $resolver->bgread( $ready_sock );
if( $packet->authority && (my @answers = $packet->answer ) ) {
if( @answers ) {
prnt "$host:";
my $padding = " " x (length( $host ) + 2);
for my $answer ( @answers ) {
prnt $padding . $answer->rdatastr . ' ' . $answer->type;
}
}
} else {
prnt "Unable to resolve $host";
}
return REMOVE;
},
{
flags => FD_READ,
});
return EAT_XCHAT;
});
## Contact Information
Contact Lian Wan Situ at <atmcmnky [at] yahoo.com> for questions, comments and
corrections about this page or the Perl plugin itself. You can also find me in #xchat
on freenode under the nick Khisanth.
| X-Chat 2 Perl Interface |