mirror of
https://github.com/ZoiteChat/zoitechat.git
synced 2026-09-01 12:49:24 +00:00
854 lines
26 KiB
ReStructuredText
854 lines
26 KiB
ReStructuredText
|
|
ZoiteChat Python Interface
|
|||
|
|
========================
|
|||
|
|
|
|||
|
|
.. default-domain:: py
|
|||
|
|
|
|||
|
|
Features
|
|||
|
|
--------
|
|||
|
|
|
|||
|
|
Here are some of the features of the python plugin interface:
|
|||
|
|
|
|||
|
|
- Comprehensive, consistent and straightforward API
|
|||
|
|
- Load, unload, reload, and autoload support
|
|||
|
|
- Per plugin independent interpreter state
|
|||
|
|
- Python interactive console
|
|||
|
|
- Python interactive command execution
|
|||
|
|
- Full thread support
|
|||
|
|
- Stdout and stderr redirected to ZoiteChat console
|
|||
|
|
- Dynamic list management
|
|||
|
|
- Nice context treatment
|
|||
|
|
- Plugin preferences
|
|||
|
|
|
|||
|
|
|
|||
|
|
Only Python 3 is supported
|
|||
|
|
~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|
|||
|
|
HexChat supported both Python 2 and 3, but ZoiteChat only supports Python 3.
|
|||
|
|
If you want to use an old Python 2 HexChat script, you may be able to port it
|
|||
|
|
following the standards below.
|
|||
|
|
|
|||
|
|
Commands
|
|||
|
|
--------
|
|||
|
|
|
|||
|
|
The Python plugin comes with a :command:`py` command that takes these arguments.
|
|||
|
|
|
|||
|
|
.. program:: py
|
|||
|
|
|
|||
|
|
.. option:: load <file>
|
|||
|
|
|
|||
|
|
Load a script with given filename.
|
|||
|
|
:command:`/load` will also work.
|
|||
|
|
|
|||
|
|
.. option:: unload <filename\|module name>
|
|||
|
|
|
|||
|
|
Unload module with given filename, or module name.
|
|||
|
|
:command:`/unload` will also work.
|
|||
|
|
|
|||
|
|
.. option:: reload <filename\|module name>
|
|||
|
|
|
|||
|
|
Reload module with given filename, or module name.
|
|||
|
|
:command:`/reload` will also work.
|
|||
|
|
|
|||
|
|
.. option:: list
|
|||
|
|
|
|||
|
|
List Python scripts loaded
|
|||
|
|
|
|||
|
|
.. option:: exec <command>
|
|||
|
|
|
|||
|
|
Execute given Python command interactively. For example::
|
|||
|
|
|
|||
|
|
/py exec import zoitechat; print(zoitechat.get_info('channel'))
|
|||
|
|
|
|||
|
|
.. option:: console
|
|||
|
|
|
|||
|
|
Open the Python interactive console in a query
|
|||
|
|
``>>python<<``. Every message sent will be intercepted by the Python
|
|||
|
|
plugin interface, and interpreted interactively. Notice that the
|
|||
|
|
console and /py exec commands live in the same interpreter state.
|
|||
|
|
|
|||
|
|
.. option:: about
|
|||
|
|
|
|||
|
|
Show some information about the Python plugin interface.
|
|||
|
|
|
|||
|
|
Autoloading modules
|
|||
|
|
-------------------
|
|||
|
|
|
|||
|
|
If you want some module to be autoloaded together with the Python plugin
|
|||
|
|
interface (which usually loads at startup time), just make sure it has a
|
|||
|
|
``.py`` extension and put it in the :file:`addons` subdir
|
|||
|
|
of ZoiteChat's `config directory <settings.html#config-files>`_.
|
|||
|
|
|
|||
|
|
Context theory
|
|||
|
|
--------------
|
|||
|
|
|
|||
|
|
Before starting to explain what the API offers, I'll do a short
|
|||
|
|
introduction about the ZoiteChat context concept. Not because it's
|
|||
|
|
something hard to understand, but because you'll understand better the
|
|||
|
|
API explanations if you know what I'm talking about.
|
|||
|
|
|
|||
|
|
You can think about a context as an ZoiteChat channel, server, or query
|
|||
|
|
tab. Each of these tabs, has its own context, and is related to a given
|
|||
|
|
server and channel (queries are a special kind of channel).
|
|||
|
|
|
|||
|
|
The *current* context is the one where ZoiteChat passes control to the
|
|||
|
|
module. For example, when ZoiteChat receives a command in a specific
|
|||
|
|
channel, and you have asked ZoiteChat to tell you about this event, the
|
|||
|
|
current context will be set to this channel before your module is
|
|||
|
|
called.
|
|||
|
|
|
|||
|
|
Text Formatting
|
|||
|
|
---------------
|
|||
|
|
|
|||
|
|
- Bold: ``'\002'``
|
|||
|
|
- Color: ``'\003'``
|
|||
|
|
- Hidden: ``'\010'``
|
|||
|
|
- Underline: ``'\037'``
|
|||
|
|
- Original Attributes: ``'\017'``
|
|||
|
|
- Reverse Color: ``'\026'``
|
|||
|
|
- Beep: ``'\007'``
|
|||
|
|
- Italics: ``'\035'`` (2.10.0+)
|
|||
|
|
- Strikethrough: ``'\036'`` (2.16.0+)
|
|||
|
|
|
|||
|
|
For example this will print underlined red text:
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
print('\037\00304Text!')
|
|||
|
|
|
|||
|
|
|
|||
|
|
Bit fields
|
|||
|
|
----------
|
|||
|
|
|
|||
|
|
Some lists return bit fields which many Python scripters may not be familair with
|
|||
|
|
so here is an example of how to use one:
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
# We know its the 15th bit field we want, this will get that value
|
|||
|
|
text_strip = 1 << 15
|
|||
|
|
text_strip_unset = 1 << 16 # If this is set use the global option
|
|||
|
|
|
|||
|
|
def get_chanopt (channel, option):
|
|||
|
|
for chan in zoitechat.get_list('channels'):
|
|||
|
|
if chan.channel == channel:
|
|||
|
|
return bool(chan.flags & option)
|
|||
|
|
|
|||
|
|
if get_chanopt('#zoitechat', text_strip_unset):
|
|||
|
|
stripped = bool(zoitechat.get_prefs('text_stripcolor_msg'))
|
|||
|
|
else:
|
|||
|
|
stripped = get_chanopt ('#zoitechat', text_strip)
|
|||
|
|
|
|||
|
|
print('Color stripping in #zoitechat is: {}'.format(stripped))
|
|||
|
|
|
|||
|
|
|
|||
|
|
Hello world
|
|||
|
|
-----------
|
|||
|
|
|
|||
|
|
Here is the traditional *hello world* example.
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
__module_name__ = "helloworld"
|
|||
|
|
__module_version__ = "1.0"
|
|||
|
|
__module_description__ = "Python module example"
|
|||
|
|
|
|||
|
|
print("Hello world!")
|
|||
|
|
|
|||
|
|
This module will print "Hello world!" in the ZoiteChat console, and sleep
|
|||
|
|
forever until it's unloaded. It's a simple module, but already
|
|||
|
|
introduces some concepts. Notice how the module information is set. This
|
|||
|
|
information is obligatory, and will be shown when listing the loaded
|
|||
|
|
ZoiteChat modules.
|
|||
|
|
|
|||
|
|
.. module:: zoitechat
|
|||
|
|
|
|||
|
|
zoitechat module
|
|||
|
|
--------------
|
|||
|
|
|
|||
|
|
The zoitechat module is your passport to every ZoiteChat functionality offered
|
|||
|
|
by the Python plugin interface. Here's a simple example:
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
import zoitechat
|
|||
|
|
zoitechat.prnt("Hi everyone!")
|
|||
|
|
|
|||
|
|
The following functions are available in the zoitechat module.
|
|||
|
|
|
|||
|
|
Constants and Attributes
|
|||
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|
|||
|
|
.. data:: PRI_HIGHEST
|
|||
|
|
PRI_HIGH
|
|||
|
|
PRI_NORM
|
|||
|
|
PRI_LOW
|
|||
|
|
PRI_LOWEST
|
|||
|
|
|
|||
|
|
Priority given to hooks.
|
|||
|
|
|
|||
|
|
.. data:: EAT_PLUGIN
|
|||
|
|
EAT_ZOITECHAT
|
|||
|
|
EAT_ALL
|
|||
|
|
EAT_NONE
|
|||
|
|
|
|||
|
|
Used as return values for callbacks.
|
|||
|
|
|
|||
|
|
.. attribute:: __version__
|
|||
|
|
|
|||
|
|
Tuple of (MAJOR_VERSION, MINOR_VERSION)
|
|||
|
|
|
|||
|
|
Generic functions
|
|||
|
|
~~~~~~~~~~~~~~~~~
|
|||
|
|
|
|||
|
|
.. function:: prnt(string)
|
|||
|
|
|
|||
|
|
This function will print string in the current context. It's mainly
|
|||
|
|
useful as a parameter to pass to some other function, since the usual
|
|||
|
|
print statement will have the same results. You have a usage example
|
|||
|
|
above.
|
|||
|
|
|
|||
|
|
This function is badly named because ``"print"`` is a reserved keyword
|
|||
|
|
of the Python language until Python 3.
|
|||
|
|
|
|||
|
|
.. function:: emit_print(event_name, *args)
|
|||
|
|
|
|||
|
|
This function will generate a *print event* with the given arguments. To
|
|||
|
|
check which events are available, and the number and meaning of
|
|||
|
|
arguments, have a look at the :menuselection:`Settings --> Text Events` window.
|
|||
|
|
Here is one example:
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
zoitechat.emit_print("Channel Message", "John", "Hi there", "@")
|
|||
|
|
|
|||
|
|
With plugin version 1.0+ this function takes keywords for certain attributes such as *time*.
|
|||
|
|
|
|||
|
|
.. function:: command(string)
|
|||
|
|
|
|||
|
|
Execute the given command in the current *context*. This has the same
|
|||
|
|
results as executing a command in the ZoiteChat window, but notice that
|
|||
|
|
the ``/`` prefix is not used. Here is an example:
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
zoitechat.command("server irc.openprojects.net")
|
|||
|
|
|
|||
|
|
A list of commands is provided here: :ref:`commands_list`.
|
|||
|
|
|
|||
|
|
.. function:: nickcmp(s1, s2)
|
|||
|
|
|
|||
|
|
This function will do an RFC1459 compliant string comparison
|
|||
|
|
and is useful to compare channels and nicknames.
|
|||
|
|
|
|||
|
|
:returns: Returns 0 if they match and less than or greater than 0 if s1 is less than or greather than s2
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
if zoitechat.nickcmp(nick, "mynick") == 0:
|
|||
|
|
print("They are the same!")
|
|||
|
|
|
|||
|
|
.. function:: strip(text[, length=-1, flags=3])
|
|||
|
|
|
|||
|
|
This function can strip colors and attributes from text.
|
|||
|
|
|
|||
|
|
:param length: -1 for entire string
|
|||
|
|
:param flags:
|
|||
|
|
1: Strip Colors
|
|||
|
|
2: Strip Attributes
|
|||
|
|
3: Strip All
|
|||
|
|
:returns: Stripped String
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
text = '\00304\002test' # Bold red text
|
|||
|
|
print(text)
|
|||
|
|
print(zoitechat.strip(text, len(text), 1)) # Bold uncolored text
|
|||
|
|
|
|||
|
|
Information retrieving functions
|
|||
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|
|||
|
|
.. function:: get_info(type)
|
|||
|
|
|
|||
|
|
Retrieve the information specified by the ``type`` string in the current
|
|||
|
|
context. At the moment of this writing, the following information types
|
|||
|
|
are available to be queried:
|
|||
|
|
|
|||
|
|
- **away:** Away reason or None if you are not away.
|
|||
|
|
- **channel:** Channel name of the current context.
|
|||
|
|
- **charset:** Charset in current context.
|
|||
|
|
- **configdir:** ZoiteChat config directory e.g.: "~/.config/zoitechat".
|
|||
|
|
- **event\_text NAME:** Returns text event string for requested event.
|
|||
|
|
- **gtkwin\_ptr:** Returns hex representation of the pointer to the current Gtk window.
|
|||
|
|
- **host:** Real hostname of the server you connected to.
|
|||
|
|
- **inputbox:** Contents of inputbox.
|
|||
|
|
- **network:** Current network name or None.
|
|||
|
|
- **nick:** Your current nick name.
|
|||
|
|
- **nickserv:** Current networks password or None (**password** is the same with clearer name).
|
|||
|
|
- **modes:** Current channel modes or None.
|
|||
|
|
- **password:** Current networks password or None.
|
|||
|
|
- **server:** Current server name (what the server claims to be) or
|
|||
|
|
None if you are not connected.
|
|||
|
|
- **topic:** Current channel topic.
|
|||
|
|
- **version:** ZoiteChat version number.
|
|||
|
|
- **win\_status:** Returns status of window: 'active', 'hidden', or
|
|||
|
|
'normal'.
|
|||
|
|
|
|||
|
|
Example:
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
if zoitechat.get_info("network") == 'freenode':
|
|||
|
|
zoitechat.prnt('connected!')
|
|||
|
|
|
|||
|
|
You can also get the format of Text Events by using *event_text* and the event:
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
print(zoitechat.get_info("event_text Channel Message"))
|
|||
|
|
|
|||
|
|
.. function:: get_prefs(name)
|
|||
|
|
|
|||
|
|
Retrieve the ZoiteChat setting information specified by the ``name``
|
|||
|
|
string, as available by the ``/set`` command.
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
print("Current preferred nick: " + zoitechat.get_prefs("irc_nick1"))
|
|||
|
|
|
|||
|
|
A list of settings is provided here: :ref:`settings_list`.
|
|||
|
|
|
|||
|
|
On top of that there are a few special preferences:
|
|||
|
|
|
|||
|
|
- **id**: unique server id
|
|||
|
|
- **state_cursor**: location of cursor in input box
|
|||
|
|
|
|||
|
|
|
|||
|
|
.. function:: get_list(type)
|
|||
|
|
|
|||
|
|
With this function you may retrieve a list containing the selected
|
|||
|
|
information from the current context, like a DCC list, a channel list, a
|
|||
|
|
user list, etc. Each list item will have its attributes set dynamically
|
|||
|
|
depending on the information provided by the list type.
|
|||
|
|
|
|||
|
|
The example below is a rewrite of the example provided with ZoiteChat's
|
|||
|
|
plugin API documentation. It prints a list of every DCC transfer
|
|||
|
|
happening at the moment. Notice how similar the interface is to the C
|
|||
|
|
API provided by ZoiteChat.
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
list = zoitechat.get_list("dcc")
|
|||
|
|
if list:
|
|||
|
|
print("--- DCC LIST ------------------")
|
|||
|
|
print("File To/From KB/s Position")
|
|||
|
|
for i in list:
|
|||
|
|
print("%6s %10s %.2f %d" % (i.file, i.nick, i.cps/1024, i.pos))
|
|||
|
|
|
|||
|
|
Below you will find what each list type has to offer.
|
|||
|
|
|
|||
|
|
List Types
|
|||
|
|
''''''''''
|
|||
|
|
|
|||
|
|
channels
|
|||
|
|
^^^^^^^^
|
|||
|
|
|
|||
|
|
The channels list type gives you access to the channels, queries and
|
|||
|
|
their servers. The following attributes are available in each list item:
|
|||
|
|
|
|||
|
|
- **channel:** Channel or query name.
|
|||
|
|
- **channelkey:** Channel key. (2.9.6+)
|
|||
|
|
- **chanmodes:** Channel modes e.g. beI,k,l. (2.12.2+)
|
|||
|
|
- **chantypes:** Channel types e.g. #!&.
|
|||
|
|
- **context:** A context object, giving access to that channel/server.
|
|||
|
|
- **id:** Unique server id.
|
|||
|
|
- **lag:** Latency in milliseconds.
|
|||
|
|
- **maxmodes:** Max modes per line.
|
|||
|
|
- **network:** Network name to which this channel belongs.
|
|||
|
|
- **nickprefixes:** Nickname prefixes e.g. @%+.
|
|||
|
|
- **nickmodes:** Nickname mode chars e.g. ov.
|
|||
|
|
- **queue:** Number of bytes in the send-queue.
|
|||
|
|
- **server:** Server name to which this channel belongs.
|
|||
|
|
- **users:** Number of users in the channel.
|
|||
|
|
- **type:** Type of context.
|
|||
|
|
|
|||
|
|
- 1: Server
|
|||
|
|
- 2: Channel
|
|||
|
|
- 3: Dialog
|
|||
|
|
- 4: Notices
|
|||
|
|
- 5: SNotices
|
|||
|
|
|
|||
|
|
- **flags:** Bit field of flags:
|
|||
|
|
|
|||
|
|
- 0: Connected
|
|||
|
|
- 1: Connecting
|
|||
|
|
- 2: Away
|
|||
|
|
- 3: End of MOTD (Login Complete)
|
|||
|
|
- 4: Has WHOX
|
|||
|
|
- 5: Has IDMSG
|
|||
|
|
- 6: Join/Parts hidden
|
|||
|
|
- 7: Join/Parts hidden unset
|
|||
|
|
- 8: Beep on Message
|
|||
|
|
- 9: Blink Tray
|
|||
|
|
- 10: Blink Task Bar
|
|||
|
|
- 11: Logging (This and the following are 2.10.0+)
|
|||
|
|
- 12: Logging unset
|
|||
|
|
- 13: Scrollback
|
|||
|
|
- 14: Scrollback unset
|
|||
|
|
- 15: Strip Colors
|
|||
|
|
- 16: Strip Colors unset
|
|||
|
|
|
|||
|
|
dcc
|
|||
|
|
^^^
|
|||
|
|
|
|||
|
|
The dcc list type gives you access to a list of DCC file transfers. The
|
|||
|
|
following attributes are available in each list item:
|
|||
|
|
|
|||
|
|
- **address32:** Address of the remote user (ipv4 address, as an int).
|
|||
|
|
- **cps:** Bytes per second (speed).
|
|||
|
|
- **destfile:** Destination full pathname.
|
|||
|
|
- **file:** Filename.
|
|||
|
|
- **nick:** Nickname of person who the file is from/to.
|
|||
|
|
- **port:** TCP port number.
|
|||
|
|
- **pos:** Bytes sent/received.
|
|||
|
|
- **resume:** Point at which this file was resumed (or zero if it was
|
|||
|
|
not resumed).
|
|||
|
|
- **size:** File size in bytes.
|
|||
|
|
- **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
|
|||
|
|
|
|||
|
|
users
|
|||
|
|
^^^^^
|
|||
|
|
|
|||
|
|
The users list type gives you access to a list of users in the current
|
|||
|
|
channel. The following attributes are available in each list item:
|
|||
|
|
|
|||
|
|
- **account:** Account name or None (2.9.6+)
|
|||
|
|
- **away:** Away status.
|
|||
|
|
- **host:** Host name in the form user\@host (or None, if not known).
|
|||
|
|
- **lasttalk:** Time they last talked (2.9.6+)
|
|||
|
|
- **nick:** Nick name.
|
|||
|
|
- **prefix:** Prefix character, .e.g: @ or +. Points to a single char.
|
|||
|
|
- **realname:** Real name.
|
|||
|
|
- **selected:** Selected status in the userlist.
|
|||
|
|
|
|||
|
|
ignore
|
|||
|
|
^^^^^^
|
|||
|
|
|
|||
|
|
The ignore list type gives you access to the current ignored list. The
|
|||
|
|
following attributes are available in each list item:
|
|||
|
|
|
|||
|
|
- **mask:** Ignore mask (for example, "\*\!\*\@\*.aol.com").
|
|||
|
|
- **flags:** Bit field of flags:
|
|||
|
|
|
|||
|
|
- 0: private
|
|||
|
|
- 1: notice
|
|||
|
|
- 2: channel
|
|||
|
|
- 3: ctcp
|
|||
|
|
- 4: invite
|
|||
|
|
- 5: unignore
|
|||
|
|
- 6: nosave
|
|||
|
|
- 7: dcc
|
|||
|
|
|
|||
|
|
notify
|
|||
|
|
^^^^^^
|
|||
|
|
|
|||
|
|
The notify list shows users on your friends list and their status:
|
|||
|
|
|
|||
|
|
- **nick:** Users nickname
|
|||
|
|
- **networks:** Networks they are setup to notify on (None for all)
|
|||
|
|
- **flags:** 0 is offline, 1 is online
|
|||
|
|
- **on:** Time when user last came on (2.9.6+)
|
|||
|
|
- **off:** Time when user last logged off (2.9.6+)
|
|||
|
|
- **seen:** Time when user was last seen (2.9.6+)
|
|||
|
|
|
|||
|
|
Hook functions
|
|||
|
|
~~~~~~~~~~~~~~
|
|||
|
|
|
|||
|
|
These functions allow one to hook into ZoiteChat events.
|
|||
|
|
|
|||
|
|
Parameters
|
|||
|
|
''''''''''
|
|||
|
|
|
|||
|
|
callback
|
|||
|
|
^^^^^^^^
|
|||
|
|
|
|||
|
|
A callback is the function that will be called when the event happens.
|
|||
|
|
|
|||
|
|
The callback supposed to return one of the EAT\_\* `constants <script_python.html#constants-and-attributes>`_,
|
|||
|
|
it is able control how ZoiteChat will proceed after the callback returns. These
|
|||
|
|
are the available constants, and their meanings:
|
|||
|
|
|
|||
|
|
- :data:`EAT_PLUGIN`: Don't let any other plugin receive this event.
|
|||
|
|
- :data:`EAT_ZOITECHAT`: Don't let ZoiteChat treat this event as usual.
|
|||
|
|
- :data:`EAT_ALL`: Eat the event completely.
|
|||
|
|
- :data:`EAT_NONE`: Let everything happen as usual.
|
|||
|
|
|
|||
|
|
.. Note:: Returning ``None`` is the same as returning :data:`EAT\_NONE`.
|
|||
|
|
|
|||
|
|
userdata
|
|||
|
|
^^^^^^^^
|
|||
|
|
|
|||
|
|
The parameter userdata, if given, allows you to pass a custom object to
|
|||
|
|
your callback.
|
|||
|
|
|
|||
|
|
attributes
|
|||
|
|
^^^^^^^^^^
|
|||
|
|
|
|||
|
|
If you create a hook with :func:`hook_server_attrs` or :func:`hook_print_attrs` the last
|
|||
|
|
argument in the callback will be an `Attribute` object.
|
|||
|
|
|
|||
|
|
.. object:: Attribute
|
|||
|
|
|
|||
|
|
.. attribute:: Attribute.time
|
|||
|
|
|
|||
|
|
The time the event occurred (from server-time) or 0
|
|||
|
|
|
|||
|
|
priority
|
|||
|
|
^^^^^^^^
|
|||
|
|
|
|||
|
|
When a priority keyword parameter is accepted, it means that this
|
|||
|
|
callback may be hooked with five different priorities which are
|
|||
|
|
`constants <script_python.html#constants-and-attributes>`_ will define the
|
|||
|
|
order in which your plugin will be called. Most of the time, you won't
|
|||
|
|
want to change its default value (:data:`PRI_NORM`).
|
|||
|
|
|
|||
|
|
word and word\_eol
|
|||
|
|
^^^^^^^^^^^^^^^^^^
|
|||
|
|
|
|||
|
|
These parameters, when available in a command or server callback, are lists of strings
|
|||
|
|
which contain the parameters the user entered for the particular
|
|||
|
|
command. For example, if you executed::
|
|||
|
|
|
|||
|
|
/command NICK Hi there!
|
|||
|
|
|
|||
|
|
- **word[0]** is ``command``
|
|||
|
|
- **word[1]** is ``NICK``
|
|||
|
|
- **word[2]** is ``Hi``
|
|||
|
|
- **word[3]** is ``there!``
|
|||
|
|
- **word\_eol[0]** is ``command NICK Hi there!``
|
|||
|
|
- **word\_eol[1]** is ``NICK Hi there!``
|
|||
|
|
- **word\_eol[2]** is ``Hi there!``
|
|||
|
|
- **word\_eol[3]** is ``there!``
|
|||
|
|
|
|||
|
|
These parameters are also used in print events. When created by these events
|
|||
|
|
they have a completely different meaning though. Text events (:menuselection:`Settings --> Text events`)
|
|||
|
|
have numbered arguments associated with them, these apply to the item in the **word** list.
|
|||
|
|
For example on a "Channel Message" event:
|
|||
|
|
|
|||
|
|
[23:29:26] <@Nick> hello everyone
|
|||
|
|
|
|||
|
|
- **word[0]** is ``Nick``
|
|||
|
|
- **word[1]** is ``hello everyone``
|
|||
|
|
- **word[2]** is ``@``
|
|||
|
|
- **word_eol[0]** is ``Nick hello everyone @``
|
|||
|
|
- **word_eol[1]** is ``hello everyone @``
|
|||
|
|
- **word_eol[2]** is ``@``
|
|||
|
|
|
|||
|
|
.. function:: hook_command(name, callback[, userdata=None, priority=PRI_NORM, help=None])
|
|||
|
|
|
|||
|
|
This function allows you to hook into the name ZoiteChat command. It means
|
|||
|
|
that everytime you type ``/name ...``, ``callback`` will be called.
|
|||
|
|
Parameters ``userdata`` and ``priority`` have their meanings explained
|
|||
|
|
above, and the parameter help, if given, allows you to pass a help text
|
|||
|
|
which will be shown when ``/help name`` is executed. If the command starts
|
|||
|
|
with a period it will not show up in ``/help`` though.
|
|||
|
|
|
|||
|
|
You may also hook an empty string to capture every message a user sends,
|
|||
|
|
either when they hit enter or use ``/say``.
|
|||
|
|
|
|||
|
|
:returns: New Hook Handler
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
def onotice_cb(word, word_eol, userdata):
|
|||
|
|
if len(word) < 2:
|
|||
|
|
print("Second arg must be the message!")
|
|||
|
|
else:
|
|||
|
|
zoitechat.command("NOTICE @{} {}".format(zoitechat.get_info("channel"), word_eol[1]))
|
|||
|
|
return zoitechat.EAT_ALL
|
|||
|
|
|
|||
|
|
zoitechat.hook_command("ONOTICE", onotice_cb, help="/ONOTICE <message> Sends a notice to all ops")
|
|||
|
|
|
|||
|
|
You may return one of ``EAT_*`` constants in the callback, to control
|
|||
|
|
ZoiteChat's behavior, as explained above.
|
|||
|
|
|
|||
|
|
.. function:: hook_print(name, callback[, userdata=None, priority=PRI_NORM])
|
|||
|
|
|
|||
|
|
This function allows you to register a callback to trap any print
|
|||
|
|
events. The event names are available in the :menuselection:`Settings --> Text Events` window.
|
|||
|
|
Parameters ``userdata`` and ``priority`` have their meanings explained
|
|||
|
|
above.
|
|||
|
|
|
|||
|
|
:param name: event name (see :menuselection:`Settings --> Text Events`)
|
|||
|
|
:returns: New Hook Handler
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
def youpart_cb(word, word_eol, userdata):
|
|||
|
|
print("You have left channel " + word[2])
|
|||
|
|
return zoitechat.EAT_ZOITECHAT # Don't let ZoiteChat do its normal printing
|
|||
|
|
|
|||
|
|
zoitechat.hook_print("You Part", youpart_cb)
|
|||
|
|
|
|||
|
|
Along with Text Events there are a handfull of *special* events you can hook with this:
|
|||
|
|
|
|||
|
|
- **Open Context**: Called when a new context is created.
|
|||
|
|
- **Close Context**: Called when a context is closed.
|
|||
|
|
- **Focus Tab**: Called when a tab is brought to front.
|
|||
|
|
- **Focus Window**: Called a toplevel window is focused, or the main tab-window is focused by the window manager.
|
|||
|
|
- **DCC Chat Text**: Called when some text from a DCC Chat arrives. It provides these elements in the word list:
|
|||
|
|
|
|||
|
|
- Address
|
|||
|
|
- Port
|
|||
|
|
- Nick
|
|||
|
|
- Message
|
|||
|
|
|
|||
|
|
- **Key Press**: Called when some keys are pressed in the input box. It provides these elements in the word list:
|
|||
|
|
|
|||
|
|
- Key Value
|
|||
|
|
- State Bitfield (shift, capslock, alt)
|
|||
|
|
- String version of the key
|
|||
|
|
- Length of the string (may be 0 for unprintable keys)
|
|||
|
|
|
|||
|
|
.. function:: hook_print_attrs(name, callback[, userdata=None, priority=PRI_NORM])
|
|||
|
|
|
|||
|
|
This function is the same as :func:`hook_print` except its callback will have a new
|
|||
|
|
`Attribute` argument.
|
|||
|
|
|
|||
|
|
:returns: New Hook Handler
|
|||
|
|
|
|||
|
|
.. versionadded:: 1.0
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
def youpart_cb(word, word_eol, userdata, attributes):
|
|||
|
|
if attributes.time: # Time may be 0 if server-time is not enabled.
|
|||
|
|
print("You have left channel {} at {}".format(word[2], attributes.time))
|
|||
|
|
return zoitechat.EAT_ZOITECHAT
|
|||
|
|
|
|||
|
|
zoitechat.hook_print_attrs("You Part", youpart_cb)
|
|||
|
|
|
|||
|
|
.. function:: hook_server(name, callback[, userdata=None, priority=PRI_NORM])
|
|||
|
|
|
|||
|
|
This function allows you to register a callback to be called when a
|
|||
|
|
certain server event occurs. You can use this to trap ``PRIVMSG``,
|
|||
|
|
``NOTICE``, ``PART``, a server numeric, etc. Parameters ``userdata`` and
|
|||
|
|
``priority`` have their meanings explained above.
|
|||
|
|
|
|||
|
|
You can hook the special event "RAW LINE" to capture all server events.
|
|||
|
|
|
|||
|
|
:returns: New Hook Handler
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
def kick_cb(word, word_eol, userdata):
|
|||
|
|
print('{} was kicked from {} ({})'.format(word[3], word[2], word_eol[4]))
|
|||
|
|
# Don't eat this event, let other plugins and ZoiteChat see it too
|
|||
|
|
return zoitechat.EAT_NONE
|
|||
|
|
|
|||
|
|
zoitechat.hook_server("KICK", kick_cb)
|
|||
|
|
|
|||
|
|
.. function:: hook_server_attrs(name, callback[, userdata=None, priority=PRI_NORM])
|
|||
|
|
|
|||
|
|
This function is the same as :func:`hook_server` Except its callback will have a new
|
|||
|
|
`Attribute` argument.
|
|||
|
|
|
|||
|
|
:returns: New Hook Handler
|
|||
|
|
|
|||
|
|
.. versionadded:: 1.0
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
def kick_cb(word, word_eol, userdata, attributes):
|
|||
|
|
if attributes.time: # Time may be 0 if server-time is not enabled.
|
|||
|
|
print('He was kicked at {}'.format(attributes.time))
|
|||
|
|
return zoitechat.EAT_NONE
|
|||
|
|
|
|||
|
|
zoitechat.hook_server_attrs("KICK", kick_cb)
|
|||
|
|
|
|||
|
|
.. function:: hook_timer(timeout, callback[, userdata=None])
|
|||
|
|
|
|||
|
|
This function allows you to register a callback to be called every
|
|||
|
|
timeout milliseconds. Parameters userdata and priority have their
|
|||
|
|
meanings explained above. If the callback returns ``True`` the timer
|
|||
|
|
will repeat otherwise returning ``False`` will stop it.
|
|||
|
|
|
|||
|
|
:returns: New Hook Handler
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
myhook = None
|
|||
|
|
|
|||
|
|
def stop_cb(word, word_eol, userdata):
|
|||
|
|
global myhook
|
|||
|
|
if myhook is not None:
|
|||
|
|
zoitechat.unhook(myhook)
|
|||
|
|
myhook = None
|
|||
|
|
print("Timeout removed!")
|
|||
|
|
return zoitechat.EAT_ALL
|
|||
|
|
|
|||
|
|
def timeout_cb(userdata):
|
|||
|
|
print("Annoying message every 5 seconds! Type /STOP to stop it.")
|
|||
|
|
return True # Keep the timeout going
|
|||
|
|
|
|||
|
|
myhook = zoitechat.hook_timer(5000, timeout_cb)
|
|||
|
|
zoitechat.hook_command("STOP", stop_cb)
|
|||
|
|
|
|||
|
|
.. function:: hook_unload(callback[, userdata=None])
|
|||
|
|
|
|||
|
|
This function allows you to register a callback to be called when the
|
|||
|
|
plugin is going to be unloaded. Parameters ``userdata`` and ``priority``
|
|||
|
|
have their meanings explained above.
|
|||
|
|
|
|||
|
|
:returns: New Hook Handler
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
def unload_cb(userdata):
|
|||
|
|
print("We're being unloaded!")
|
|||
|
|
|
|||
|
|
zoitechat.hook_unload(unload_cb)
|
|||
|
|
|
|||
|
|
.. function:: unhook(handler)
|
|||
|
|
|
|||
|
|
Unhooks any hook registered with the hook functions above.
|
|||
|
|
|
|||
|
|
:param handler: Handler returned from :func:`hook_print`, :func:`hook_command`, :func:`hook_server` or :func:`hook_timer`
|
|||
|
|
|
|||
|
|
As of version 1.0 of the plugin hooks from :func:`hook_print` and :func:`hook_command` can be unhooked by their names.
|
|||
|
|
|
|||
|
|
Plugin preferences
|
|||
|
|
~~~~~~~~~~~~~~~~~~
|
|||
|
|
|
|||
|
|
You can use pluginpref to easily store and retrieve settings.
|
|||
|
|
|
|||
|
|
.. function:: set_pluginpref(name, value)
|
|||
|
|
|
|||
|
|
Stores settings in addon\_python.conf in the config dir.
|
|||
|
|
|
|||
|
|
:returns:
|
|||
|
|
- False: Failure
|
|||
|
|
- True: Success
|
|||
|
|
|
|||
|
|
.. versionadded:: 0.9
|
|||
|
|
|
|||
|
|
.. note:: Until the plugin uses different a config file per script it's
|
|||
|
|
recommened to use 'scriptname_settingname' to avoid conflicts.
|
|||
|
|
|
|||
|
|
.. function:: get_pluginpref(name)
|
|||
|
|
|
|||
|
|
This will return the value of the variable of that name. If there is
|
|||
|
|
none by this name it will return ``None``.
|
|||
|
|
|
|||
|
|
:returns: String or Integer of stored setting or None if it does not exist.
|
|||
|
|
|
|||
|
|
.. note:: Strings of numbers and booleans are always returned as Integers.
|
|||
|
|
|
|||
|
|
.. versionadded:: 0.9
|
|||
|
|
|
|||
|
|
.. function:: del_pluginpref(name)
|
|||
|
|
|
|||
|
|
Deletes the specified variable.
|
|||
|
|
|
|||
|
|
:returns:
|
|||
|
|
- False: Failure
|
|||
|
|
- True: Success (or never existing),
|
|||
|
|
|
|||
|
|
.. versionadded:: 0.9
|
|||
|
|
|
|||
|
|
.. function:: list_pluginpref()
|
|||
|
|
|
|||
|
|
Returns a list of all currently set preferences.
|
|||
|
|
|
|||
|
|
:rtype: List of Strings
|
|||
|
|
|
|||
|
|
.. versionadded:: 0.9
|
|||
|
|
|
|||
|
|
Context handling
|
|||
|
|
~~~~~~~~~~~~~~~~
|
|||
|
|
|
|||
|
|
Below you will find information about how to work with contexts.
|
|||
|
|
|
|||
|
|
Context objects
|
|||
|
|
'''''''''''''''
|
|||
|
|
|
|||
|
|
As explained in the Context theory session above, contexts give access
|
|||
|
|
to a specific channel/query/server tab of ZoiteChat. Every function
|
|||
|
|
available in the xchat module will be evaluated in the current context,
|
|||
|
|
which will be specified by ZoiteChat itself before passing control to the
|
|||
|
|
module. Sometimes you may want to work in a specific context, and that's
|
|||
|
|
where `context` objects come into play.
|
|||
|
|
|
|||
|
|
You may create a context object using :func:`get_context` or :func:`find_context`
|
|||
|
|
functions as explained below, or trough the :func:`get_list` function, as explained above.
|
|||
|
|
|
|||
|
|
|
|||
|
|
.. function:: get_context()
|
|||
|
|
|
|||
|
|
:rtype: `context`
|
|||
|
|
|
|||
|
|
.. function:: find_context(server=None, channel=None)
|
|||
|
|
|
|||
|
|
Finds a context based on a channel and servername or if no parameters are given returns
|
|||
|
|
the current (front) context.
|
|||
|
|
|
|||
|
|
:keyword server: if None only looks for channel name
|
|||
|
|
:keyword channel: if None looks for front context of given server
|
|||
|
|
:rtype: `context`
|
|||
|
|
|
|||
|
|
.. code-block:: python
|
|||
|
|
|
|||
|
|
cnc = zoitechat.find_context(channel='#conectiva')
|
|||
|
|
cnc.command('whois niemeyer')
|
|||
|
|
|
|||
|
|
|
|||
|
|
.. object:: context
|
|||
|
|
|
|||
|
|
The context object returned by the functions listed above has these methods:
|
|||
|
|
|
|||
|
|
.. method:: context.set()
|
|||
|
|
|
|||
|
|
Changes the current context to be the one represented by this context object.
|
|||
|
|
|
|||
|
|
.. method:: context.prnt(string)
|
|||
|
|
|
|||
|
|
Does the same as the :func:`prnt` function but in the given context.
|
|||
|
|
|
|||
|
|
.. method:: context.emit_print(event_name, \*args)
|
|||
|
|
|
|||
|
|
Does the same as the :func:`emit_print` function but in the given context.
|
|||
|
|
|
|||
|
|
.. method:: context.command(string)
|
|||
|
|
|
|||
|
|
Does the same as the :func:`command` function but in the given context
|
|||
|
|
|
|||
|
|
.. method:: context.get_info(type)
|
|||
|
|
|
|||
|
|
Does the same as the :func:`get_info` function but in the given context.
|
|||
|
|
|
|||
|
|
.. method:: context.get_list(type)
|
|||
|
|
|
|||
|
|
Does the same as the :func:`get_list` function but in the given context.
|
|||
|
|
|
|||
|
|
--------------
|
|||
|
|
|
|||
|
|
Maintained by: TingPing
|
|||
|
|
|
|||
|
|
Original Author: Gustavo Niemeyer
|
|||
|
|
`gustavo@niemeyer.net <mailto:gustavo@niemeyer.net>`_
|