diff plugins/tcl/TCL-HOWTO @ 6694:2d2f04c5c7d2

[gaim-migrate @ 7220] Sean probably won't think this is contact support. This is in fact a Tcl script plugin loader. That's probably what he'll think it is. committer: Tailor Script <tailor@pidgin.im>
author Ethan Blanton <elb@pidgin.im>
date Tue, 02 Sep 2003 03:34:37 +0000
parents
children 1adc71ed6d45
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/tcl/TCL-HOWTO	Tue Sep 02 03:34:37 2003 +0000
@@ -0,0 +1,310 @@
+Gaim Tcl plugin-writing HOWTO
+
+INTRODUCTION
+
+The Gaim Tcl interface provides a Tcl API for many useful gaim
+functions.  Like the perl API, the Tcl API does not provide access to
+every corner of gaim exposed by the C interface.  It does, however,
+provide a very powerful interface to many of Gaim's functions through
+a simple to learn and extend scripting language.
+
+If you are not familiar with Tcl, you will probably find it somewhat
+different from what you are used to.  Despite being somewhat unique
+(more akin to shell programming than other traditional scripting
+languages such as perl or python), it is simple to learn for beginners
+and experienced programmers alike.  There are numerous books on the
+subject, we will not discuss it any further here.
+
+GETTING STARTED
+
+The only requirement placed on a Gaim Tcl script by Gaim is the
+existence of a procedure called 'plugin_init'.  This procedure has
+some limitations placed upon it; it will be parsed and evaluated
+before the rest of the Tcl script, so it cannot reference any other
+variables or procedures declared in the script.  In practice this is
+not a problem, as the only thing this procedure should do is return a
+simple list containing five items: the name of the script, its version
+number, a short description, the author, and a web page.  For example:
+
+proc plugin_init { } {
+  return [ list "Example Plugin" \
+                "1.0" \
+		"Example of how to register a plugin for the Tcl HOWTO" \
+		"Ethan Blanton <eblanton@cs.purdue.edu>" \
+		"http://gaim.sf.net/" ]
+}
+
+The rest of the script will generally be registration to recieve
+notification of various Gaim signals (more about this below) and
+definitions of procedures to be executed when those signals occur.
+
+INTERPRETER DETAILS
+
+Gaim initializes and drives the Tcl event loop (similar to Tk),
+meaning that commands like fileevent and after are available and
+do not require 'vwait' etc.  'vwait' actually seems to be somewhat
+broken due to a bug somewhere in the Tcl/Glib event loop glue, and it
+should not be used for now.
+
+The gaim-specific functions are provided in a statically-linked
+package called 'gaim'; this means that if you spawn a child
+interpreter and wish to use the gaim-specific functions, you will need
+to execute 'load {} gaim' in that interpreter.
+
+GAIM INTERNAL PROCEDURES AND VARIABLES
+
+All of the information provided for your use by Gaim will be in the
+::gaim namespace.  This means that in order to access it you will
+either have to import the gaim namespace (e.g. via the command
+'namespace import gaim::*') or reference it explicitly.  The following
+descriptions will reference it explicitly for clarity.
+
+* Variables
+
+gaim::version
+
+  This contains the version of the gaim process which loaded the
+  script.
+
+* Commands
+
+gaim::account alias account
+gaim::account connect account
+gaim::account connection account
+gaim::account disconnect account
+gaim::account find username protocol
+gaim::account handle
+gaim::account isconnected account
+gaim::account list ?option?
+gaim::account protocol account
+gaim::account username account
+
+  The 'gaim::account' command consists of a set of subcommands
+  pertaining to gaim accounts.
+
+  'alias' returns the alias for the account 'account'.  If there is no
+  alias for the given account, it returns the empty string.
+
+  The subcommand 'connect' connects the named account if it is not
+  connected, and does nothing if it is.  In either case, it returns
+  the gc for the account.
+
+  'connection' returns the gc of the given account if it is connected,
+  or 0 if it is not.  This gc is the gc used by gaim::connection and
+  other functions.
+
+  'disconnect' disconnects the given account if it is connected, or
+  does nothing if it is.
+
+  'find' finds an account by its username and protocol (as returned by
+  'gaim::account username' and 'gaim::account protocol') and returns
+  the account if found, or 0 otherwise.
+
+  'handle' returns the instance handle required to connect to account
+  signals.  (See 'gaim::signal connect').
+
+  The 'isconnected' query returns true if the given account is
+  connected and false otherwise.
+
+  The 'list' subcommand returns a list of all of the accounts known to
+  Gaim.  The elements of this lists are accounts appropriate for the
+  'account' argument of the other subcommands.  The '-all' option
+  (default) returns all accounts, while the '-online' option returns
+  only those accounts which are online.
+
+  The 'protocol' subcommand returns the protocol ID (e.g. "prpl-msn")
+  for the given account.
+
+  The 'username' subcommand returns the username for the account
+  'account'.
+
+gaim::buddy alias buddy
+gaim::buddy handle
+gaim::buddy info ( buddy | account username )
+gaim::buddy list
+
+  'gaim::buddy' is a set of commands for retrieving information about
+  buddies and manipulating the buddy list.  For the purposes of Tcl,
+  a "buddy" is currently a list of several elements, the first of
+  which being the type.  The currently recognized types are "group",
+  "buddy", and "chat".  A group node looks like:
+	{ group name { buddies } }
+  A buddy node is:
+	{ buddy name account }
+  And a chat node is:
+	{ chat alias account }
+
+  The 'alias' subcommand returns the alias for the given buddy if it
+  exists, or the empty string if it does not.
+
+  'handle' returns the blist handle for the purposes of connecting
+  signals to buddy list events.  (See 'gaim::signal connect').
+
+  'info' causes gaim to display the info dialog for the given buddy.
+  Since it is possible to request user info for a buddy not in your
+  buddy list, you may also specify a buddy by his or her username and
+  the account through which you wish to retrieve info.
+
+  'list' returns a list of 'group' structures, filled out with buddies
+  and chats as described above.
+
+gaim::connection account gc
+gaim::connection handle
+gaim::connection list
+
+  'gaim::connection' is a collection of subcommands pertaining to
+  account connections.
+
+  'account' returns the Gaim account associated with 'gc'.  This
+  account is the same account used by gaim::account and other
+  commands.
+
+  'handle' returns the gaim connections instance handle.  (See
+  'gaim::signal connect').
+
+  'list' returns a list of all known connections.  The elements of
+  this list are appropriate as 'gc' arguments to the other
+  gaim::connection subcommands or other commands requiring a gc.
+
+
+gaim::conv_send account who text
+
+  'gaim::conv' is simply a convenience wrapper for 'gaim::send_im' and
+  'gaim::conversation write'.  It sends the IM, determines the from
+  and to arguments for 'gaim::conversation write', and prints the text
+  sent to the conversation as one would expect.  For the curious, you
+  may view the source for it by typing 'info body gaim::conv_send' at
+  a Gaim Commander prompt.
+
+  Note that an error in either gaim::send_im or 'gaim::conversation
+  write' will not be caught by this procedure, and will be propagated
+  to the caller.
+
+gaim::conversation find ?-account account? name
+gaim::conversation handle
+gaim::conversation list
+gaim::conversation new ?-chat? ?-im? account name
+gaim::conversation write conversation style from to text
+
+  'gaim::conversation' provides an API for dealing with conversations.
+  Given that Gaim is an instant messenger program, you'll probably
+  spend a lot of time here.
+
+  The command 'find' attempts to find an existing conversation with
+  username 'name'.  If the '-account' option is given, it refines its
+  search to include only conversations on that account.
+
+  'handle' returns the conversations instance handle for the purposes
+  of signal connection.  (See 'gaim::signal connect').
+
+  'list' returns a list of all currently open conversations.
+
+  The 'new' subcommand can be used to create a new conversation with
+  a specified user on a specified account if one does not exist, or
+  retrieve the existing conversation if it does.  The '-chat' and
+  '-im' options specify whether the created conversation should be a
+  chat or a standard IM, respectively.
+
+  'write' is used to write to the specified conversation.  The 'style'
+  argument specifies how the text should be printed -- as text coming
+  from the gaim user (style 'send'), being sent to the gaim user
+  (style 'recv'), or as a system message (such as "so-and-so has
+  signed off", style 'system').  From is the name to whom the text
+  should be attributed -- you probably want to check for aliases here,
+  lest you confuse the user.  'text' is the text to print.
+
+gaim::core handle
+gaim::core quit
+
+  This command exposes functionality provided by the gaim core API.
+
+  'gaim::core handle' returns a handle to the gaim core for signal
+  connection.  (See 'gaim::signal connect').
+
+  'quit' exits gaim cleanly, and should be used in preference to the
+  tcl 'exit' command.  (Note that 'exit' has not been removed,
+  however.)
+
+gaim::debug level category message
+
+  Equivalent to the C gaim_debug function, this command outputs
+  debugging information to the gaim debug window (or stdout if gaim is
+  invoked with -n).  The valid levels are, in increasing level of
+  severity, -misc, -info, -warning, and -error.  'category' is a short
+  (a few characters ... for instance, "tcl" or "tcl plugin") "topic"
+  type name for this message, and 'message' is the text of the
+  message. In the style of Tcl 'puts' (and differing from gaim_debug),
+  no trailing \n is required.  (However, embedded newlines may be
+  generated with \n).
+
+gaim::notify ?type? title primary secondary
+
+  Also a direct equivalent to a C function, gaim_notify, this command
+  causes gaim to present the provided notification information to the
+  user via some appropriate UI method.  The 'type' argument, if
+  present, must be one of -error, -warning, or -info. The following
+  three arguments' absolute meanings may vary with the Gaim UI being
+  used (presently only a Gtk2 UI is available), but 'title' should
+  generally be the title of the window, and 'primary' and 'secondary'
+  text within that window; in the Gtk2 UI, 'primary' is slightly
+  larger than 'secondary' and displayed in a boldface font.
+
+gaim::send_im gc who text
+
+  This sends an IM in the fashion of serv_send_im.  'gc' is the GC of
+  the connection on which you wish to send (as returned by most event
+  handlers), 'who' is the nick of the buddy to which you wish to send,
+  and 'text' is the text of the message.
+
+gaim::signal connect instance signal args proc
+gaim::signal disconnect instance signal
+
+  'gaim::signal' is a set of subcommands for dealing with gaim signals
+  (known as "events" prior to gaim 0.68).
+
+  The 'connect' subcommand registers the procedure 'proc' as a handler
+  for the signal 'signal' on the instance 'instance'.  'instance'
+  should be an instance handle as returned by one of the 'handle'
+  commands from the various parts of gaim. 'args' and 'proc' are as in
+  the Tcl 'proc' command; note that the number of arguments in 'args'
+  must match the number of arguments emitted by the signal exactly,
+  although you need not use them all.  The procedure 'proc' may be
+  either a simple command or a procedure in curly brackets.  Note that
+  only one procedure may be associated with each signal; an attempt to
+  connect a second procedure to the same signal will remove the
+  existing binding and replace it with the new procedure.
+  'gaim::signal connect' returns 0 on success and 1 on failure.
+
+  'disconnect' removes any existing signal handler for the named
+  signal and instance.
+
+gaim::unload
+
+  This unloads the current plugin.  Note that preferences will not be
+  updated (yet).
+
+SIGNALS
+
+Check the file SIGNALS for the meaning of these signals; this is
+intended to be a list only of their arguments.  Signal callbacks will
+be made in their own namespace, and arguments to those signal
+callbacks will live in the namespace 'event' underneath that
+namespace.  To briefly illustrate, the signal received-im-msg is
+provided with three arguments; the account on which the IM was
+received, the screen name of the user sending the IM, and the text of
+the IM.  These arguments live in the variables event::account,
+event::sender, and event::buffer, respectively.  Therefore a callback
+which notifies the user of an incoming IM containing the word 'shizzle'
+might look like this:
+
+gaim::add_event_handler received-im-msg {
+	if {[ string match "*shizzle*" $event::buffer ]} {
+		gaim::notify -info "tcl plugin" "Fo' shizzle" \
+			"$event::sender is down with the shizzle"
+	}
+}
+
+Note that for some signals (notably received-im-msg, sending-im-msg,
+and their chat counterparts), changes to the event arguments will
+change the message itself from Gaim's vantage.  For those signals
+whose return value is meaningful, returning a value from the Tcl event