annotate examples/sample-plugin.c @ 1162:8278d14e7aaa

irccd: add irc_bot_pollable_add, closes #2529
author David Demelier <markand@malikania.fr>
date Sat, 12 Feb 2022 19:55:57 +0100
parents be767bfa5c2e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * This is a sample plugin in native C API.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Note: we recommend that C plugins should be used as last resort because any
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 * error will crash the whole daemon. It is also less convenient to share and
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * update.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 *
1138
be767bfa5c2e examples: update C plugin
David Demelier <markand@malikania.fr>
parents: 1096
diff changeset
8 * cc sample-plugin.c -o example.so $(pkg-config --libs --cflags irccd)
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * All symbols exported from the file must start with the plugin file basename
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * without its extension and with every non allowed character translated to
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * `_'. For example if the plugin is name `example-stuff' symbol must start
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * with `example_stuff_'. In this example we consider `example_`.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
15
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 * Include convention is using irccd/ prefix.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
19
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <string.h>
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <irccd/event.h>
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <irccd/server.h>
1096
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
24 #include <irccd/util.h>
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 * This is the plugin identifier, every variable are optional.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 */
1096
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
29 const char *example_description = "Example of C plugin";
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 const char *example_version = "0.1.0";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 const char *example_license = "ISC";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 const char *example_author = "Name and optional email";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
1096
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
34 /* Simulate user options. */
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
35 static char my_option_level[16] = "hard";
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
36 static char my_option_language[64] = "fr";
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
37
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
38 /* Simulate user templates. */
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
39 static char my_template_level[64] = "it's #{level}";
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
40 static char my_template_language[64] = "using #{language} as language";
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
41
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 * get_options | get_templates | get_paths
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 * ----------------------------------------------------------------------
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 * The following optional functions indicate to the daemon which keys are
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 * supported as options, templates and paths respectively.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 * Note: even if get_paths is not present or return NULL, irccd allows `cache',
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 * `data' and `config' as standard keys.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 * All three functions should return an array of strings which should be
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 * terminated with a NULL value. They should not be dynamically allocated
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 * because irccd does not assume they are.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
1138
be767bfa5c2e examples: update C plugin
David Demelier <markand@malikania.fr>
parents: 1096
diff changeset
57 const char * const *
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 example_get_options(void)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 /* Indicate to irccd we support options `level' and `language' */
1138
be767bfa5c2e examples: update C plugin
David Demelier <markand@malikania.fr>
parents: 1096
diff changeset
61 static const char * const keys[] = {
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 "level",
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 "language",
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 NULL
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 };
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 return keys;
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
1138
be767bfa5c2e examples: update C plugin
David Demelier <markand@malikania.fr>
parents: 1096
diff changeset
70 const char * const *
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 example_get_templates(void)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 /* Indicate to irccd we support templates `start' and `finish' */
1138
be767bfa5c2e examples: update C plugin
David Demelier <markand@malikania.fr>
parents: 1096
diff changeset
74 static const char * const keys[] = {
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 "start",
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 "finish",
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 NULL
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 };
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 return keys;
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 * get_option | get_template | get_path
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 * ----------------------------------------------------------------------
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 * Those optional functions are analogous to their respective plural form
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 * except they take a key as parameter.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 * The plugin can receive an unknown key from the user, NULL can be returned if
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 * they are not supported.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 * The returned string isn't free'd by irccd so don't allocate any value
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * without storing it somewhere if really needed.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 const char *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 example_get_option(const char *key)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 if (strcmp(key, "level") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 return "hard";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 else if (strcmp(key, "language") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 return "french";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 return NULL;
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 const char *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 example_get_template(const char *key)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 if (strcmp(key, "start") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 return "#{nickname}, the game has started";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 else if (strcmp(key, "finish") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 return "#{nickname}, the game has finished";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 return NULL;
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 * set_option | set_template | set_path
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 * ----------------------------------------------------------------------
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 * Finally the three functions are used to set a new value as options,
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 * templates and paths respectively. Like their `get_*' counterpart, the plugin
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 * may receive a unknown key from the user in that case it should be simply
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 * ignored.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 * Tip: the easiest to manage those is to use global fixed size strings.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
130
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 void
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 example_set_option(const char *key, const char *value)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 /* Assuming my_option_* variable exist. */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 if (strcmp(key, "level") == 0)
1079
8f26ee9cc6dd misc: unconditionnally add BSD->POSIX extensions
David Demelier <markand@malikania.fr>
parents: 1009
diff changeset
136 irc_util_strlcpy(my_option_level, value, sizeof (my_option_level));
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 else if (strcmp(key, "language") == 0)
1079
8f26ee9cc6dd misc: unconditionnally add BSD->POSIX extensions
David Demelier <markand@malikania.fr>
parents: 1009
diff changeset
138 irc_util_strlcpy(my_option_language, value, sizeof (my_option_language));
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 void
1096
c3191ab50cee misc: install public header files
David Demelier <markand@malikania.fr>
parents: 1079
diff changeset
142 example_set_template(const char *key, const char *value)
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 /* Assuming my_template_* variable exist. */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 if (strcmp(key, "level") == 0)
1079
8f26ee9cc6dd misc: unconditionnally add BSD->POSIX extensions
David Demelier <markand@malikania.fr>
parents: 1009
diff changeset
146 irc_util_strlcpy(my_template_level, value, sizeof (my_template_level));
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 else if (strcmp(key, "language") == 0)
1079
8f26ee9cc6dd misc: unconditionnally add BSD->POSIX extensions
David Demelier <markand@malikania.fr>
parents: 1009
diff changeset
148 irc_util_strlcpy(my_template_language, value, sizeof (my_template_language));
1009
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 * event
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 * ----------------------------------------------------------------------
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 * This function is called when an event has been received. The parameter ev
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 * contains a union with every possible supported event, the plugin must not
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 * modify it.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 * Use the ev->type enumeration to read the appropriate union member.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
161
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 void
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 example_event(const struct irc_event *ev)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 /* Simply echo back in case of message. */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 if (ev->type == IRC_EVENT_MESSAGE)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 irc_server_message(ev->server, ev->message.channel, ev->message.message);
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 }