annotate examples/sample-plugin.c @ 1028:98791cc6b4b4

irccd: add channel prefixes in server-info command
author David Demelier <markand@malikania.fr>
date Thu, 25 Feb 2021 20:10:00 +0100
parents 637a98de3910
children 8f26ee9cc6dd
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 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * You can use CMake to build and install it to appropriate place using the
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 * following code:
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * find_package(irccd REQUIRED)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * irccd_define_c_plugin(
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * MAME myplugin
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * SOURCES muplugin.c
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 * You can also compile by hand using the pkg-config irccd file.
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 * cc myplugin.c -o myplugin.so $(pkg-config --libs --cflags irccd)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 * 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
22 * without its extension and with every non allowed character translated to
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 * `_'. 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
24 * with `example_stuff_'. In this example we consider `example_`.
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 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 * Include convention is using irccd/ prefix.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 * The compat.h header contains additional BSD/POSIX extensions that may be
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 * missing on your system. It is optional unless you explicitly use them.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include <string.h>
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include <irccd/compat.h>
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #include <irccd/event.h>
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 #include <irccd/server.h>
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 * This is the plugin identifier, every variable are optional.
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 const char *example_description = "Example of C plugin"
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 const char *example_version = "0.1.0";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 const char *example_license = "ISC";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 const char *example_author = "Name and optional email";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
47
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 * get_options | get_templates | get_paths
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 * ----------------------------------------------------------------------
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 * The following optional functions indicate to the daemon which keys are
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 * supported as options, templates and paths respectively.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 * 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
56 * `data' and `config' as standard keys.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 * 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
59 * terminated with a NULL value. They should not be dynamically allocated
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 * because irccd does not assume they are.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 const char **
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 example_get_options(void)
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 /* Indicate to irccd we support options `level' and `language' */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 static const char *keys[] = {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 "level",
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 "language",
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 NULL
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 };
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 return keys;
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 const char **
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 example_get_templates(void)
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 /* Indicate to irccd we support templates `start' and `finish' */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 static const char *keys[] = {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 "start",
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 "finish",
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 NULL
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 };
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 return keys;
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
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 * get_option | get_template | get_path
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 * ----------------------------------------------------------------------
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 * Those optional functions are analogous to their respective plural form
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * except they take a key as parameter.
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 * 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
97 * they are not supported.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 * 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
100 * without storing it somewhere if really needed.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 const char *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 example_get_option(const char *key)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 if (strcmp(key, "level") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 return "hard";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 else if (strcmp(key, "language") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 return "french";
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 return NULL;
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 const char *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 example_get_template(const char *key)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 if (strcmp(key, "start") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 return "#{nickname}, the game has started";
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 else if (strcmp(key, "finish") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 return "#{nickname}, the game has finished";
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 return NULL;
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 * set_option | set_template | set_path
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 *
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 * 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
130 * templates and paths respectively. Like their `get_*' counterpart, the plugin
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 * 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
132 * ignored.
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 * 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
135 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 void
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 example_set_option(const char *key, const char *value)
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 /* Assuming my_option_* variable exist. */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 if (strcmp(key, "level") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 strlcpy(my_option_level, value, sizeof (my_option_level));
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 else if (strcmp(key, "language") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 strlcpy(my_option_language, value, sizeof (my_option_language));
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 void
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 example_set_template(const char *key)
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 /* Assuming my_template_* variable exist. */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 if (strcmp(key, "level") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 strlcpy(my_template_level, value, sizeof (my_template_level));
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 else if (strcmp(key, "language") == 0)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 strlcpy(my_template_language, value, sizeof (my_template_language));
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 }
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
156
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 /*
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 * event
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 * ----------------------------------------------------------------------
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 * 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
162 * 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
163 * modify it.
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 * Use the ev->type enumeration to read the appropriate union member.
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
167
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 void
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 example_event(const struct irc_event *ev)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 {
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 /* Simply echo back in case of message. */
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 if (ev->type == IRC_EVENT_MESSAGE)
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 irc_server_message(ev->server, ev->message.channel, ev->message.message);
637a98de3910 misc: add more examples
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 }