1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
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 writting 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(char *message);
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(char *source)
{
if (!stricmp(source, 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.
Note that all events are emitted AFTER the action has taken place, so
any deleted nick/channel/etc won't exist anymore when your function is
being run.
|------------------------|-------------------------------------------|
| Event Hook | Event Argument |
|------------------------|-------------------------------------------|
| EVENT_DB_SAVING | EVENT_START, EVENT_STOP |
| EVENT_NEWNICK | Nick that just connected to the network |
| EVENT_BOT_UNASSIGN | Channel name the bot is on |
| EVENT_BOT_JOIN | Channel name the bot is on |
| EVENT_BOT_CREATE | Nick of the bot involved |
| EVENT_BOT_CHANGE | Nick of the bot involved |
| EVENT_BOT_DEL | Nick of the bot involved |
| EVENT_BOT_ASSIGN | Nick of the bot involved |
| EVENT_TOPIC_UPDATED | Channel name of the channel involved |
| EVENT_CHAN_EXPIRE | Channel name of the channel involved |
| EVENT_CHAN_REGISTERED | Channel name of the channel involved |
| EVENT_CHAN_DROP | Channel name of the channel involved |
| EVENT_CHAN_FORBIDDEN | Channel name of the channel involved |
| EVENT_CHAN_SUSPENDED | Channel name of the channel involved |
| EVENT_CONNECT | EVENT_START, EVENT_STOP |
| EVENT_DB_EXPIRE | EVENT_START, EVENT_STOP |
| EVENT_RESTART | EVENT_START |
| EVENT_SHUTDOWN | EVENT_START, EVENT_STOP |
| EVENT_SIGNAL | Quit message sent |
| EVENT_NICK_REGISTERED | Nick of the account involved |
| EVENT_NICK_DROPPED | Nick of the account involved |
| EVENT_NICK_FORBIDDEN | Nick of the account involved |
| EVENT_NICK_EXPIRE | Nick of the account involved |
| EVENT_CHANGE_NICK | Nick of the user involved |
| EVENT_USER_LOGOFF | Nick of the user involved |
|------------------------|-------------------------------------------|
|