Anope Internal Events --------------------- 1) Intro 2) Complex Events 3) Triggered Events 4) Triggered Events List 1) Introduction to Internal Events Internal Events are setup to give module developers more information about what the core is doing at different times. This information can be as complex as data we are feeding to the uplink, to simple triggered events such as the databases being saved. A list of triggered events can be found below. Additional there is a module included with the core which can provide some clue as to how to use the code in your modules. The rest of this document assumes that you are used to writing modules. 2) Complex Events This type of events are based around what happens when we talk to the IRCd, much like MESSAGE events that the IRCD sends to us. The events are triggered when Anope writes to the ircd. To watch for these events you must have some knowledge of how the IRCd command system works. In our example we will trap for NICK events. A) All functions most be formatted as: int functioname(char *source, int ac, char **av); B) In AnopeInit you must declare EvtMessage in some fashion, it is into this variable that we will create the event handler. Here is what the base AnopeInit should look like at this point: int AnopeInit(int argc, char **argv) { EvtMessage *msg = NULL; int status; moduleAddAuthor(AUTHOR); moduleAddVersion(VERSION); return MOD_CONT; } Note that AUTHOR and VERSION should be defined above the AnopeInit function, just like you should do with any module. C) Pass "createEventHandler" the name of the message in this case NICK, and the function that was created in Step A. At this point you should assign the return of "createEventHandler" to the EvtMessage variable. msg = createEventHandler("NICK", my_nick); D) The Handler is not ready for use yet; now you must add it to the hash with "moduleAddEventHandler". You will want to pass to this function the return of "createEventHandler". status = moduleAddEventHandler(msg); It will return the same module error codes as adding a regular message, which you can use to confirm it was added correctly. E) With that setup in your function you will be passed 3 items. The source most of the time this will be set to ServerName or NULL; consult our IRCd documentation about how messages are formatted. AC is the count of variables you will find in AV. int my_nick(char *source, int ac, char **av) { alog("Internal Event - nick is %s",av[0]); return MOD_CONT; } 3) Triggered Events These events also known as "event hooks" are internal events such as expiring of nicks to the saving of databases. A) All functions most be formatted as: int functioname(int argc, char **argv); B) In AnopeInit you must declare EvtHook in some fashion; it is into this variable that we will create the event handler. Here is what the base AnopeInit should look like at this point: int AnopeInit(int argc, char **argv) { EvtHook *hook = NULL; int status; moduleAddAuthor(AUTHOR); moduleAddVersion(VERSION); return MOD_CONT; } C) Pass "createEventHook" the name of the event. In this case we are going to hook to the saving of databases, "EVENT_DB_SAVING". hook = createEventHook(EVENT_DB_SAVING, my_save); D) The Handler is not ready for use yet; now you must add it to the hash with "moduleAddEventHook". You will want to pass to this function the return of "createEventHook" status = moduleAddEventHook(hook); It will return the same module error codes as adding a regular message, which you can use to confirm it was added correctly. E) With that setup in your function you will be passed 1 item. The message is very simple; it could be as simple as a start, stop or message. In the case of saving it has a start and stop. int my_save(int argc, char **argv) { if (argc < 1) { return MOD_CONT; } if (!stricmp(argv[0], EVENT_START)) { alog("Saving the databases! has started"); } else { alog("Saving the databases is complete"); } return MOD_CONT; } 4) Triggered Events List Here's a list of all event hooks we currently offer, with a description of what argument is being passed to the event functions for this type of event. All arguments are plain-text strings (char *). The list is sorted in alphabetical order. Note that all events are emitted AFTER the action has taken place, so any deleted nick/channel/etc won't exist anymore and any created one will exist when your function is being run, unless noted otherwise. Also note that EVENT_START and EVENT_STOP should not be matched with an equal sign, but with string comparision. See the bundled events module for an example on how to do this. The arguments are given as av[0] for the first argument, av[1] for the second argument, and so on. If av[0] and av[1] are given, the event has two arguments, and argc should be 2. EVENT_ACCESS_ADD An user has been added to a channel access list. av[0] Name of the channel the user has been added to. av[1] The nickname of the user that has just added an entry to the access list. av[2] The nickname of the user that has been added to the access list. av[3] The level number the user has been added with. EVENT_ACCESS_CHANGE An user level has been changed on a channel access list. av[0] Name of the channel the access list has been modified which. av[1] The nickname of the user that has just modified the access list of the channel. av[2] The nickname of the user wich his access level has just been modified. av[3] The new access level for the user. EVENT_ACCESS_CLEAR A channel access list has been cleared. av[0] Name of the channel the access list has been cleared of av[1] The nickname of the user that has cleared the access list EVENT_ACCESS_DEL An user has been deleted of a channel access list. av[0] Name of the channel the access entry has been deleted which. av[1] The nickname of the user that has just deleted the access entry. av[2] [OPTIONAL] The nickname of the user wich his access level has just been removed. Not present if numbers were used (e.g. /cs access del 7). EVENT_BOT_ASSIGN A BotServ bot has been assigned to a channel. av[0] Name of the channel the bot has been assigned to. av[1] The nickname of the bot that has been assigned to the channel. EVENT_BOT_BAN A BotServ bot has banned a user, e.g. kickers. av[0] The nick of the user banned. av[1] The Channel the user was banned from. av[2] The mask that was banned. EVENT_BOT_CHANGE The properties of a BotServ bot have been changed. av[0] The nickname of the bot involved. EVENT_BOT_CREATE A new BotServ bot has been created, and is ready to use. av[0] The nickname of the newly created bot. EVENT_BOT_DEL A BotServ bot is being deleted from BotServ. This event is being sent just before the actual deletion is performed. av[0] The nickname of the bot being deleted. EVENT_BOT_FANTASY A fantasy command of the bot has been triggered. This event should be used to create your own fantasy commands. av[0] The fantasy command that has been triggered without leading '!'. av[1] The nickname of the user that has triggered the fantasy command. av[2] The name of the channel the fantasy command has been triggered on. av[3] Contains any optional paramenters passed after the fantasy command. If none are present, this will not exist, and argc will will be 3. EVENT_BOT_FANTASY_NO_ACCESS A fantasy command of the bot has been triggered by someone without access to BotServ FANTASY commands on the channel. This will NOT trigger if someone with access has triggered a fantasy command; use EVENT_BOT_FANTASY for those. Hook to both events to catch both event triggers. av[0] The fantasy command that has been triggered without leading '!'. av[1] The nickname of the user that has triggered the fantasy command. av[2] The name of the channel the fantasy command has been triggered on. av[3] Contains any optional paramenters passed after the fantasy command. If none are present, this will not exist, and argc will will be 3. EVENT_BOT_JOIN A BotServ bot has joined a channel and opped itself. av[0] The channel name the bot has just joined. av[1] The nickname of the bot that has joined the channel. EVENT_BOT_KICK A BotServ bot has kicked a user from a channel. av[0] The name of the user that has been kicked. av[1] The name of the channel the user was kicked from. av[2] The reason for the kick. EVENT_BOT_UNASSIGN A BotServ bot is being unassigned from a channel. This event is being sent before the actual removing of the bot is done. av[0] The channel name the bot has been unassigned from. av[1] The nickname of the bot that has been unassigned. EVENT_CHAN_DROP A channel has been dropped and deleted. av[0] The name of the channel that has been dropped. EVENT_CHAN_EXPIRE A channel has been expired and will be deleted. The event will be emitted just before the actual channel deletion happens. av[0] The name of the channel that has been expired. EVENT_CHAN_FORBIDDEN A channel has been forbidden (ChanServ FORBID). av[0] The name of the channel that has been forbidden. EVENT_CHAN_KICK Someone has just been kicked from a channel. av[0] The nick of the user that has been kicked. av[1] The channel the user has been kicked from. EVENT_CHAN_REGISTERED A new channel has been registered. av[0] The name of the channel that has been registered. EVENT_NICK_REQUESTED A new nick has been requested, and mail has been sent to confirm the nick. av[0] The name of the nick that was requested EVENT_CHAN_SUSPENDED A channel has been suspended (ChanServ SUSPEND). av[0] The name of the channel that has been suspended. EVENT_CHAN_UNSUSPEND A channel has been unsuspended (ChanServ UNSUSPEND). av[0] The name of the channel that has been unsuspended. EVENT_CHANGE_NICK A user has just changed its nick. av[0] The new nickname of the user. Event is called after the user has been changed to this nickname. av[1] The old nickname of the user. EVENT_CONNECT This event is emitted when the connection to our uplink hub is being made. av[0] EVENT_START or EVENT_STOP, to indicate if it's emitted before or after the connection has been made. EVENT_STOP is emitted before our burst is being sent over the link. EVENT_DB_EXPIRE This event is emitted when the expiry routines for all things that can expire in Anope are being run. av[0] EVENT_START or EVENT_STOP, to indicate if it's being emitted before or after the expiry routines have been run. EVENT_DB_SAVING This event is emitted when the databases are being saved. av[0] EVENT_START or EVENT_STOP, to indicate if it's emitted before or after the saving routines have been run. EVENT_DB_BACKUP This event is emitted when the databases are backed up. av[0] EVENT_START when the backup commences, and EVENT_STOP when it finishes. EVENT_DEFCON_LEVEL The DefCon level has just been changed. This event is emitted before any DefCon-related action is taken. The internal DefConLevel has already been raised at this point. av[0] The new level of DefCon being invoked. EVENT_GROUP A user has grouped its nickname to another user group. av[0] The nickname of the user that joined the group. EVENT_JOIN_CHANNEL A user joins a channel. av[0] EVENT_START or EVENT_STOP. EVENT_START when the user has passed all access checks and is allowed to join, but has not yet joined the channel. EVENT_STOP when the user has joined and all needed modes are set etc. av[1] The nickname of the user joining the channel. av[2] The name of the channel the user has joined. EVENT_NEWNICK A new user has been introduced on the network. av[0] The nickname of the newly introduced user. EVENT_NICK_DROPPED A user's nick has just been dropped. Note that the nickname information has already been deleted! av[0] The nickname of the user that has just been dropped. EVENT_NICK_EXPIRE A user's nick has just expired. Note that, as with EVENT_NICK_DROPPED, the nickname information has already been deleted! av[0] The nickname of the user that has just expired. EVENT_NICK_FORBIDDEN A user's nick has just been forbidden. av[0] The nickname that has just been forbidden. EVENT_CORE_DROPPED A NickCore will be dropped. Usually send when the last alias is dopped. This is send BEFORE the event that confirms deletion of the alias. Note that this event is send before the core data is removed. av[0] The display nickname of the core that is being dropped. EVENT_CORE_NEWDISPLAY The display nick of a NickCore is being changed. This is send BEFORE the actual change is made in the database. av[0] The old display nickname of the core. av[1] The new display nickname of the core. EVENT_NICK_GHOSTED A user has just been ghosted. av[0] EVENT_START or EVENT_STOP. EVENT_START when the user is about to be removed from the network, EVENT_STOP when this has been done. av[1] The nickname of the user doing the ghosting. av[2] The nickname being ghosted. EVENT_NICK_IDENTIFY A user has just identified for its nickname with NickServ. av[0] The nickname of the user that just identified. EVENT_NICK_LOGOUT A user has just (been) logged out. av[0] The nickname of the user that has (been) logged out. EVENT_NICK_RECOVERED A user's nickname has just been recovered. av[0] EVENT_START or EVENT_STOP. EVENT_START when the user is about to be recovered, EVENT_STOP when this has been done. av[1] The nickname of the user doing the recovery. av[2] The nickname being recovered. EVENT_NICK_REGISTERED A new user has just registered its nickname. This event is being emitted when the registration is completed, but the user modes have not yet been set. av[0] The nickname of the newly registered user. EVENT_NICK_SUSPENDED A user's nick has just been suspended. av[0] The nickname that has just been suspended. EVENT_NICK_UNSUSPEND A user's nick has just been unsuspended. av[0] The nickname that has just been unsuspended. EVENT_PART_CHANNEL A user parts a channel. av[0] EVENT_START or EVENT_STOP. EVENT_START when the user is about to be removed from the channel internally, EVENT_STOP when this has been done. av[1] The nickname of the user parting the channel. av[2] The name of the channel the user has parted. av[3] The reason the user parted the channel, this is not always sent so check the count to make sure it was passed. (ac == 4) EVENT_RELOAD This event is emitted after the configuration file has been reloaded. av[0] Always EVENT_START. EVENT_RESTART This event is emitted before the services are being restarted. av[0] Always EVENT_START. EVENT_SERVER_CONNECT A new server has just connected to the network. av[0] The name of the new server. EVENT_SERVER_SQUIT A server has sent an SQUIT and is about to be removed from the network. This event is being sent before the server is actually removed from the network. av[0] The name of the server that is being removed. EVENT_SHUTDOWN This event is emitted when Anope is being shut down. av[0] EVENT_START or EVENT_STOP, to indicate where in the process of restarting the core is. With EVENT_START, services are still fully online and operating. With EVENT_STOP, every internal clean up has been done already, and the SQUIT has been sent; the only thing done after emitting the event is closing the socket to the uplink hub. EVENT_SIGNAL This event is emitted when Anope is quitting because of a signal it received. av[0] The quit message that will be sent with the SQUIT for this shutdown. EVENT_TOPIC_UPDATED A channel topic has been succesfully updated. Note that this event is only emitted if the new topic has been fully accepted and set by the Anope core. av[0] The name of the channel involved. av[1] The new topic set on the channel. EVENT_USER_LOGOFF A user has left the network. This event is emitted before the internal removal is performed, so the user still exists internally. av[0] The nickname of the user leaving the network. EVENT_MODLOAD A module has been loaded. This event is emitted after the loading sequence has been finished: AnopeInit() has been called and the module has already been added to the modules table. av[0] Name of the loaded module. EVENT_MODUNLOAD A module has been unloaded. This event is emitted when the unloading sequence is almost complete: AnopeFini() has been called and all commands, hooks and callbacks have been removed. The module itself is still in memory however. av[0] Name of the unloaded module. EVENT_ADDCOMMAND A command hook has been added to anopes command table. Note that the command may have previously existed and merely a new hook was added before or after an existing command hook. av[0] Name of the module adding the command. av[1] Name of the command hook that was added. EVENT_DELCOMMAND A command hook has been removed from anopes command table. Note that the command may still exist in anopes command table if other modules have hooks for the same command. av[0] Name of the module deleting the command. av[1] Name of the command hook that was removed.