BitchX Plugins Written by Colten Edwards (c) 1997 Plugins can be created for BitchX quite easily. All plugins you create will have a startup function which is based on the filename of the plugin and _Init appended to it. So for a module like cavlink.so we have a startup function called Cavlink_Init(). Cavlink_Init is defined as the following int Cavlink_Init(IrcCommandDll **interp) { } returning a 0 indicates successful installation, any other return is an error. You can add various commands, variables, functions, tcl functions, and ctcp to the main client itself. You have complete access to ALL variables defined within BitchX itself. There is also a functions that may or may not be defined by you called the fini function. Once again it's based on the filename appended with _Cleanup to give us int Cavlink_Cleanup(IrcCommandDll **interp) { } If you make a cleanup function, you are responsible for removing all traces of your dll from the client. Adding a new command/function/var in a plugin is made easier with a function that I wrote to add them to BitchX while keeping track of what's loaded. add_module_proc(type, module name, command name, description, id, flag, function1, function2); type can be any of the following COMMAND_PROC (internal /command) ALIAS_PROC (internal function) CTCP_PROC (ctcp procedure) VAR_PROC (a /set variable) HOOK_PROC (like a /on hook) RAW_PROC (lowlevel access to server output) DCC_PROC (new /dcc commands) WINDOW_PROC (new /window commands) OUTPUT_PROC (replacement output procedure) module name is for internal bookkeeping practices. It's displayed when we list the loaded plugins, and is also used for finding what to remove in the event of a /unloaddll. command name is the name of the procedure we are adding to the client. or How we will call the procedure. description is just a description for display in a usage() function. It can be NULL as well. id is used in a VAR_PROC HOOK_PROC and CTCP_PROC to identify some aspect of the procedure. each "type" uses id differantly. A VAR_PROC uses this to identify the type of variable being introduced ie. STR_TYPE_VAR, INT_TYPE_VAR, BOOL_TYPE_VAR. A CTCP_PROC can be set to -1. HOOK_PROC uses this to identify the hook to add this to. A negative number means this is a server numberic to add too. A non-negative value is used to indicate a particular hook. You can use the enumerated list of hooks in hook.h to make this easier ie. CHANNEL_SYNCH_LIST. flag is used in the same procedures as id. a VAR_PROC uses this as the default INT/BOOL value for the variable. CTCP_PROC uses this to tell the client what todo when we recieve one of these ctcp's. CTCP_SPECIAL, CTCP_TELLUSER, CTCP_REPLY, CTCP_INLINE, CTCP_NOLIMIT are possible values. These can be or'd together as well. HOOK_PROC uses this as the "noise" of this event. function1 is the function to call for this particular command. This always needs to be supplied for all the various procedures.. Even a VAR_PROC can have a function associated with it. function2 is the reply function for CTCP_PROC. It can be NULL. Depending on the nature of the procedure your adding, determines what the return from that procedure should be. a $function should return a string for example. a command or a var procedure returns nothing. void command_proc(IrcCommandDll *, char *, char *, char *, char *); void var_proc(Window *, char *, int); char *alias_proc(char *); char *ctcp_proc(CtcpEntryDll *, char *, char *, char *); void hook_proc(int hook, char *buffer, char *); void hook_proc(char *name, char *buffer, char *); int raw_proc(char *num, char *from, char *userhost, char **Args); void dcc_func(char *name, char *args); Window *window_proc(Window *, char **args, char *help); void output_proc(Window *, const unsigned char *str); Tcl commands can be added from a module quite easily. Just make sure that that you call Tcl_DeleteCommand() when unloading the module. This means you need to use a Cleanup function. A output procedure can be defined. It replaces ALL output procedures for ALL screens and windows. You will need to handle everything that the current add_to_window() function in screen.c does by yourself. You can however use any or all of the BitchX functions. When removing this procedure, ALL screens and windows are reset back to the default output procedure.