Denora:Events

From Denora Wiki

Jump to: navigation, search

Contents

[edit] Internal Events

[edit] 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.

[edit] 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 Denora 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 DenoraInit you must declare EvtMessage in some fashion, it is into this variable that we will create the event handler. Here is what the base DenoraInit should look like at this point:
       int DenoraInit(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 DenoraInit 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(LOG_NORMAL, "Internal Event - nick is %s",av[0]);
           return MOD_CONT;
       }

[edit] 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 DenoraInit you must declare EvtHook in some fashion; it is into this variable that we will create the event handler. Here is what the base DenoraInit should look like at this point:
       int DenoraInit(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 (!stricmp(argv[0], EVENT_START)) {
               alog("Saving the databases! has started");
           } else {
               alog("Saving the databases is complete");
           }
           return MOD_CONT;
       }

[edit] 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.


   EVENT_CHAN_PRIVMSG
       Sent when a PRIVMSG is received in a channel
       Argument 1 - Sender
       Argument 2 - Channel
       Argument 3 - Message
   EVENT_CHANGE_NICK
       A user has just changed it's nick.
       Argument 1 - Old Nick
       Argument 2 - New Nick
   EVENT_CHANNEL_MODE
       This event is sent when a changed mode is changed or updated. 
       Argument 1 - EVENT_MODE_ADD or EVENT_MODE_REMOVE
       Argument 2 - Channel
       Argument 3 - Mode
       Argument 4 - extra data not always sent
   EVENT_CHAN_KICK
       Someone has just been kicked from a channel.
       Argument 1  The nick of the user that has been kicked.
       Argument 2  The channel the user has been kicked from.
   EVENT_CHANNEL_TOPIC
       The topic of the channel has been set/changed
       Argument 1  The channel name
       Argument 2  The topic setter
       Argument 3  The topic that was set (this can be NULL)
   EVENT_CONNECT
       This event is emitted when the connection to our uplink hub is being made.
       The argument is either 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_CTCP_VERSION
       A new user has been introduced on the network, and has replied to CTCP version requests.
       Argument 1 - Users nick
       Argument 2 - CTCP Version
   EVENT_DB_SAVING
       This event is emitted when the databases are being saved.
       The argument is either EVENT_START or EVENT_STOP, to indicate if it's emitted before or after the saving routines.
   EVENT_FANTASY
       This event is sent when a user in a chanstats channel uses a ! command
       Argument 1 - Fantasy Command
       Argument 2 - User sending command
       Argument 3 - Channel
       Argument 4 - Parameters (not always sent)
    EVENT_GLOBAL_KILL
       This event is sent when a ircop kills off a user from the network
       Argument 1 - Person who set it
       Argument 2 - Person whom was affected
       Argument 3 - Reason
   EVENT_NEWNICK
       A new user has been introduced on the network.
       Argument 1 - contains the nickname of the newly introduced user.
   EVENT_RESTART
       This event is emitted before the stats are being restarted.
       The argument is always EVENT_START.
   EVENT_RELOAD
       This event is emitted before the stats are being reloaded.
       Argument 1 - EVENT_START or EVENT_STOP
   EVENT_SENT_CTCP_VERSION
       The core has sent a request for the client to respond to ctcp version, since clients can ignore this request, the event EVENT_CTCP_VERSION may
       never be triggered.
       Argument 1 - Nick
   EVENT_SERVER
       A new server has been introduced to Denora.
       Argument 1 - server name
   EVENT_JUPE_SERVER
       A new jupe server has been introduced to Denora.
       Argument 1 - server name
   EVENT_SERVER_KILL
       This event is sent when a server kills off a user from the network
       Argument 1 - Server who set it
       Argument 2 - Person whom was affected
       Argument 3 - Reason
   EVENT_SHUTDOWN
       This event is emitted when Denora is being shut down.
       The argument is either EVENT_START or EVENT_STOP, to indicate where in the process of restarting the core is. With EVENT_START, stats 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_SQUIT
      This event is sent when Denora received a SQUIT or is SQUITing itself
      Argument 1 - Server Name
      Argument 2 - Message
   EVENT_SIGNAL
       This event is emitted when Denora is quitting because of a signal it
       received.
       Argument 1 - Signal type
       Argument 2 - contains the quit message that will be sent with the SQUIT for this shutdown.
   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.
       Argument 1 - contains the nickname of the user leaving the network.
   EVENT_USER_JOIN
       A user joined a channel.
       Argument 1 - Users Nick
       Argument 2 - Channel Name
   EVENT_USER_MODE
       This event is sent when a users mode is changed or updated. 
       Argument 1 - EVENT_MODE_ADD or EVENT_MODE_REMOVE
       Arugment 2 - Nick
       Argument 3 - Mode
       Argument 4 - extra data not always sent
   EVENT_USER_PART
       A user left a channel.
       Argument 1 - Users Nick
       Argument 2 - Channel Name
       Argument 3 - Part Message (optional)
   EVENT_UPLINK_SYNC_COMPLETE
       The uplink server has completed syncing
       Argument 1 - server name
   EVENT_SERVER_SYNC_COMPLETE
       This server has finisehd syncing
       Arguement 1 - Server name

[edit] Cron Events

[edit] Introduction to CRON Events

Cron Events are setup to give module developers the ablitiy to have code run at given times without having to figure out the time in seconds for which their event is to be trigggered. A list of time events can be found below. The rest of this document assumes that you are used to writing modules.

[edit] Cron Events

  • A) All functions most be formatted as:
       int functioname(char *name);
  • B) In DenoraInit you must declare CronEvent in some fashion; it is into this variable that we will create the cron event handler. Here is what the base DenoraInit should look like at this point:
       int DenoraInit(int argc, char **argv)
       {
           CronEvent *cevt = NULL;
           int status;
           moduleAddAuthor(AUTHOR);
           moduleAddVersion(VERSION);
           return MOD_CONT;
       }
  • C) Pass "createCronEvent" the name of the event. In this case we are going to hook time event of midnight, "CRON_MIDNIGHT".
       cevt = createCronEventHook(CRON_MIDNIGHT, midnight_check);
  • D) The Handler is not ready for use yet; now you must add it to the hash with "AddCronEvent". You will want to pass to this function the return of "createCronEvent"
       status = moduleAddCronEvent(cevt);

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 midnight_check(char *name)
       {
        /* its midnight transfer current users over to daily users */
          stats->daily_users = stats_users;
           return MOD_CONT;
       }

[edit] 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.

   CRON_MIDNIGHT
       Run at midnight, every night
   CRON_WEEKLY_SUNDAY
       Run at midnight, Sunday, this is helpful for weekly stats
   CRON_WEEKLY_MONDAY
       Run at midnight, Monday, this is helpful for weekly stats
   CRON_WEEKLY_TUESDAY
       Run at midnight, Tuesday, this is helpful for weekly stats
   CRON_WEEKLY_WEDNESDAY
       Run at midnight, Wednesday, this is helpful for weekly stats
   CRON_WEEKLY_THURSDAY
       Run at midnight, Thursday, this is helpful for weekly stats
   CRON_WEEKLY_FRIDAY
       Run at midnight, Friday, this is helpful for weekly stats
   CRON_WEEKLY_SATURDAY
       Run at midnight, Saturday, this is helpful for weekly stats
   CRON_MONTHLY
       Run at Midnight on the first of the Month
   CRON_HOUR_1
       Run at 1am, every day
   CRON_HOUR_2
       Run at 2am, every day
   CRON_HOUR_3
       Run at 3am, every day
       
   CRON_HOUR_4
       Run at 2am, every day
       
   CRON_HOUR_5
       Run at 5 am, every day
   CRON_HOUR_6
       Run at 6 am, every day
   CRON_HOUR_7
       Run at 7 am, every day
   CRON_HOUR_8
       Run at 8 am, every day
   CRON_HOUR_9
       Run at 9 am, every day
   CRON_HOUR_10
       Run at 10 am, every day
   CRON_HOUR_11
       Run at 11 am, every day
   CRON_HOUR_12
       Run at 12 noon every day
   CRON_HOUR_13
       Run at 1 pm, every day
   CRON_HOUR_14
       Run at 2 pm, every day
   CRON_HOUR_15
       Run at 3 pm, every day
   CRON_HOUR_16
       Run at 4 pm, every day
   CRON_HOUR_17
       Run at 5 pm, every day
   CRON_HOUR_18
       Run at 6 pm, every day
   CRON_HOUR_19
       Run at 7 pm, every day
   CRON_HOUR_20
       Run at 8 pm, every day
   CRON_HOUR_21
       Run at 9 pm, every day
   CRON_HOUR_22
       Run at 10 pm, every day
   CRON_HOUR_23
       Run at 11 pm, every day
Personal tools