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 |
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 * | |
hexchatdir | HexChat config directory encoded in UTF-8 examples: /home/user/.config/hexchat C:\Users\user\Appdata\Roaming\HexChat |
|
hexchatdirfs | same as hexchatdir except encoded in the locale file system encoding |
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 |