Mercurial > irccd
annotate lib/irccd/irccd.c @ 975:5ffc8350e84b
irccdctl: add support for rule editing
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 09 Feb 2021 13:00:32 +0100 |
parents | f365e5be1261 |
children | 2da5064d0cff |
rev | line source |
---|---|
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * irccd.c -- main irccd object |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013-2021 David Demelier <markand@malikania.fr> |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
19 #include <config.h> |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
20 |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <assert.h> |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
22 #include <ctype.h> |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <err.h> |
944 | 24 #include <errno.h> |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include <poll.h> |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include <stdlib.h> |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #include <string.h> |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include <unistd.h> |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include "event.h" |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include "irccd.h" |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 #include "log.h" |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 #include "plugin.h" |
946
2ec05b9db2ee
irccd: use net set.h macros
David Demelier <markand@malikania.fr>
parents:
944
diff
changeset
|
34 #include "rule.h" |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 #include "server.h" |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 #include "util.h" |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 struct defer { |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 void (*exec)(void *); |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
40 void *data; |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 }; |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
43 struct irc irc = { |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
44 .servers = LIST_HEAD_INITIALIZER(), |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
45 .plugins = LIST_HEAD_INITIALIZER(), |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
46 .rules = TAILQ_HEAD_INITIALIZER(irc.rules) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
47 }; |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 static int pipes[2]; |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
971
f365e5be1261
misc: remove more stdbool
David Demelier <markand@malikania.fr>
parents:
968
diff
changeset
|
51 static int |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
52 is_command(const struct irc_plugin *p, const struct irc_event *ev) |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
53 { |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
54 const char *cc; |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
55 size_t ccsz; |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
56 |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
57 if (ev->type != IRC_EVENT_MESSAGE) |
971
f365e5be1261
misc: remove more stdbool
David Demelier <markand@malikania.fr>
parents:
968
diff
changeset
|
58 return 0; |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
59 |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
60 /* Get the command prefix (e.g !)*/ |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
61 cc = ev->server->commandchar; |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
62 ccsz = strlen(cc); |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
63 |
957 | 64 return strncmp(ev->message.message, cc, ccsz) == 0 && |
65 strncmp(ev->message.message + ccsz, p->name, strlen(p->name)) == 0; | |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
66 } |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
67 |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
68 static struct irc_event * |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
69 to_command(const struct irc_plugin *p, struct irc_event *ev) |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
70 { |
957 | 71 char *action; |
72 | |
73 /* Convert "!test foo bar" to "foo bar" */ | |
74 action = ev->message.message + strlen(ev->server->commandchar) + strlen(p->name); | |
75 | |
76 while (*action && isspace(*action)) | |
77 ++action; | |
78 | |
79 action = strdup(action); | |
80 free(ev->message.message); | |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
81 |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
82 ev->type = IRC_EVENT_COMMAND; |
957 | 83 ev->message.message = action; |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
84 |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
85 return ev; |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
86 } |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
87 |
971
f365e5be1261
misc: remove more stdbool
David Demelier <markand@malikania.fr>
parents:
968
diff
changeset
|
88 static int |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
89 invokable(const struct irc_plugin *p, const struct irc_event *ev) |
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
90 { |
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
91 switch (ev->type) { |
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
92 case IRC_EVENT_COMMAND: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
93 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 94 ev->message.channel, ev->message.origin, p->name, "onCommand"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
95 case IRC_EVENT_CONNECT: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
96 return irc_rule_matchlist(&irc.rules, ev->server->name, |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
97 NULL, NULL, p->name, "onConnect"); |
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
98 case IRC_EVENT_DISCONNECT: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
99 return irc_rule_matchlist(&irc.rules, ev->server->name, |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
100 NULL, NULL, p->name, "onDisconnect"); |
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
101 case IRC_EVENT_INVITE: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
102 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 103 ev->invite.channel, ev->invite.origin, p->name, "onInvite"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
104 case IRC_EVENT_JOIN: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
105 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 106 ev->join.channel, ev->join.origin, p->name, "onJoin"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
107 case IRC_EVENT_KICK: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
108 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 109 ev->kick.channel, ev->kick.origin, p->name, "onKick"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
110 break; |
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
111 case IRC_EVENT_ME: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
112 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 113 ev->message.channel, ev->message.origin, p->name, "onMe"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
114 case IRC_EVENT_MESSAGE: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
115 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 116 ev->message.channel, ev->message.origin, p->name, "onMessage"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
117 case IRC_EVENT_MODE: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
118 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 119 ev->mode.channel, ev->mode.origin, p->name, "onMode"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
120 case IRC_EVENT_NAMES: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
121 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 122 ev->names.channel, NULL, p->name, "onNames"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
123 case IRC_EVENT_NICK: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
124 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 125 NULL, ev->nick.origin, p->name, "onNick"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
126 case IRC_EVENT_NOTICE: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
127 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 128 ev->notice.channel, ev->notice.origin, p->name, "onNotice"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
129 case IRC_EVENT_PART: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
130 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 131 ev->part.channel, ev->part.origin, p->name, "onPart"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
132 case IRC_EVENT_TOPIC: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
133 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 134 ev->topic.channel, ev->topic.origin, p->name, "onTopic"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
135 case IRC_EVENT_WHOIS: |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
136 return irc_rule_matchlist(&irc.rules, ev->server->name, |
957 | 137 NULL, NULL, p->name, "onWhois"); |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
138 default: |
971
f365e5be1261
misc: remove more stdbool
David Demelier <markand@malikania.fr>
parents:
968
diff
changeset
|
139 return 1; |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
140 } |
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
141 } |
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
142 |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
143 static void |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
144 invoke(struct irc_event *ev) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 { |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
146 struct irc_plugin *p, *tmp, *plgcmd = NULL; |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
147 |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
148 /* |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
149 * Invoke for every plugin the event verbatim. Then, the event may match |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
150 * a plugin name command in that case we need to modify the event but |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
151 * only one plugin can match by its identifier. For example, the |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
152 * following plugins are loaded: |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
153 * |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
154 * - ask |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
155 * - hangman |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
156 * - logger |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
157 * |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
158 * If the message is "!ask will I be reach?" then it will invoke |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
159 * onMessage for hangman and logger but onCommand for ask. As such call |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
160 * hangman and logger first and modify event before ask. |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
161 */ |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
162 LIST_FOREACH_SAFE(p, &irc.plugins, link, tmp) { |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
163 if (is_command(p, ev)) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
164 plgcmd = p; |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
165 else if (invokable(p, ev)) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
166 irc_plugin_handle(p, ev); |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
167 } |
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
168 |
955
9b167c5c4b78
irccd: add rules filtering
David Demelier <markand@malikania.fr>
parents:
954
diff
changeset
|
169 if (plgcmd && invokable(plgcmd, ev)) |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
170 irc_plugin_handle(plgcmd, to_command(plgcmd, ev)); |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 static void |
966
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
174 pipe_flush(const struct pollfd *fd) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 { |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 struct defer df = {0}; |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 if (fd->fd != pipes[0] || !(fd->revents & POLLIN)) |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 return; |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 if (read(fd->fd, &df, sizeof (df)) != sizeof (df)) |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 err(1, "read"); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 df.exec(df.data); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
187 static struct irc_plugin * |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
188 find_plugin(struct irc_plugin_loader *ldr, const char *base, const char *name) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 { |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
190 char path[PATH_MAX], buf[IRC_EXTENSIONS_LEN], *t, *ext; |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
191 struct irc_plugin *p; |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
193 strlcpy(buf, ldr->extensions, sizeof (buf)); |
947
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
194 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
195 for (t = buf; (ext = strtok_r(t, ":", &t)); ) { |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
196 snprintf(path, sizeof (path), "%s/%s.%s", base, name, ext); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
197 irc_log_info("irccd: trying %s", path); |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
199 if ((p = irc_plugin_loader_open(ldr, path))) |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
200 return p; |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
203 return NULL; |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
206 static inline struct irc_plugin * |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
207 open_plugin(struct irc_plugin_loader *ldr, const char *path) |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
208 { |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
209 return irc_plugin_loader_open(ldr, path); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
210 } |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 void |
946
2ec05b9db2ee
irccd: use net set.h macros
David Demelier <markand@malikania.fr>
parents:
944
diff
changeset
|
213 irc_bot_init(void) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 { |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
215 irc_log_to_console(); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 if (pipe(pipes) < 0) |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 err(1, "pipe"); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 void |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
222 irc_bot_server_add(struct irc_server *s) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
223 { |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 assert(s); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
225 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
226 irc_log_info("irccd: added new server: %s", s->name); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
227 |
947
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
228 irc_server_incref(s); |
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
229 irc_server_connect(s); |
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
230 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
231 LIST_INSERT_HEAD(&irc.servers, s, link); |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
232 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
233 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
234 struct irc_server * |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
235 irc_bot_server_get(const char *name) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
236 { |
947
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
237 struct irc_server *s; |
946
2ec05b9db2ee
irccd: use net set.h macros
David Demelier <markand@malikania.fr>
parents:
944
diff
changeset
|
238 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
239 LIST_FOREACH(s, &irc.servers, link) |
947
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
240 if (strcmp(s->name, name) == 0) |
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
241 return s; |
946
2ec05b9db2ee
irccd: use net set.h macros
David Demelier <markand@malikania.fr>
parents:
944
diff
changeset
|
242 |
947
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
243 return NULL; |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
244 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
245 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 void |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
247 irc_bot_server_remove(const char *name) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
248 { |
949
b4e8551e2064
server: several improvements
David Demelier <markand@malikania.fr>
parents:
948
diff
changeset
|
249 struct irc_server *s; |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
250 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
251 if (!(s = irc_bot_server_get(name))) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
252 return; |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
253 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
254 irc_server_disconnect(s); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
255 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
256 /* Don't forget to notify plugins. */ |
954
30643d18a635
irccd: add onCommand support
David Demelier <markand@malikania.fr>
parents:
953
diff
changeset
|
257 invoke(&(struct irc_event) { |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
258 .type = IRC_EVENT_DISCONNECT, |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 .server = s |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 }); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
261 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
262 LIST_REMOVE(s, link); |
947
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
263 irc_server_decref(s); |
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
264 } |
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
265 |
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
266 void |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
267 irc_bot_server_clear(void) |
947
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
268 { |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
269 struct irc_server *s, *tmp; |
947
95201fd9ad88
irccd: servers are now linked lists
David Demelier <markand@malikania.fr>
parents:
946
diff
changeset
|
270 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
271 LIST_FOREACH_SAFE(s, &irc.servers, link, tmp) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
272 irc_bot_server_remove(s->name); |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
273 LIST_INIT(&irc.servers); |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
274 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
275 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
276 void |
961
32f93ef20122
irccd: add Irccd.Util API and other things in server
David Demelier <markand@malikania.fr>
parents:
958
diff
changeset
|
277 irc_bot_plugin_add(struct irc_plugin *p) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
278 { |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
279 assert(p); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
280 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
281 LIST_INSERT_HEAD(&irc.plugins, p, link); |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
282 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
283 irc_log_info("irccd: add new plugin: %s", p->name, p->description); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
284 irc_log_info("irccd: %s: version %s, from %s (%s license)", p->name, |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
285 p->version, p->author, p->license); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
286 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
287 irc_plugin_load(p); |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
288 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
289 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
290 struct irc_plugin * |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
291 irc_bot_plugin_find(const char *name, const char *path) |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
292 { |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
293 assert(name); |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
294 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
295 char buf[IRC_PATHS_LEN], pathbuf[PATH_MAX], *t, *token; |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
296 struct irc_plugin *p = NULL; |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
297 struct irc_plugin_loader *ldr; |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
298 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
299 if (!path) |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
300 irc_log_info("irccd: trying to find plugin %s", name); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
301 else |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
302 irc_log_info("irccd: opening plugin %s", name); |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
303 |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
304 SLIST_FOREACH(ldr, &irc.plugin_loaders, link) { |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
305 if (path) { |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
306 if ((p = open_plugin(ldr, path))) |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
307 break; |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
308 } else { |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
309 /* Copy the paths to tokenize it. */ |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
310 strlcpy(buf, ldr->paths, sizeof (buf)); |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
311 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
312 /* |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
313 * For every directory (separated by colon) call find_plugin |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
314 * which will append the extension and try to open it. |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
315 */ |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
316 for (t = buf; (token = strtok_r(t, ":", &t)); ) { |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
317 if ((p = find_plugin(ldr, token, name))) |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
318 break; |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
319 } |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
320 } |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
321 } |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
322 |
967
8becffd7617a
irccd: initial import of configuration file
David Demelier <markand@malikania.fr>
parents:
966
diff
changeset
|
323 if (!p) |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
324 irc_log_warn("irccd: could not find plugin %s", name); |
967
8becffd7617a
irccd: initial import of configuration file
David Demelier <markand@malikania.fr>
parents:
966
diff
changeset
|
325 |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
326 strlcpy(p->name, name, sizeof (p->name)); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
327 |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
328 /* Set default paths if they are not set. */ |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
329 irc_plugin_set_path(p, "cache", irc_util_printf(pathbuf, sizeof (pathbuf), |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
330 "%s/plugin/%s", IRCCD_CACHEDIR, p->name)); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
331 irc_plugin_set_path(p, "data", irc_util_printf(pathbuf, sizeof (pathbuf), |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
332 "%s/plugin/%s", IRCCD_DATADIR, p->name)); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
333 irc_plugin_set_path(p, "config", irc_util_printf(pathbuf, sizeof (pathbuf), |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
334 "%s/irccd/plugin/%s", IRCCD_SYSCONFDIR, p->name)); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
335 |
967
8becffd7617a
irccd: initial import of configuration file
David Demelier <markand@malikania.fr>
parents:
966
diff
changeset
|
336 return p; |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
337 } |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
338 |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
339 struct irc_plugin * |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
340 irc_bot_plugin_get(const char *name) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
341 { |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
342 struct irc_plugin *p; |
946
2ec05b9db2ee
irccd: use net set.h macros
David Demelier <markand@malikania.fr>
parents:
944
diff
changeset
|
343 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
344 LIST_FOREACH(p, &irc.plugins, link) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
345 if (strcmp(p->name, name) == 0) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
346 return p; |
946
2ec05b9db2ee
irccd: use net set.h macros
David Demelier <markand@malikania.fr>
parents:
944
diff
changeset
|
347 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
348 return NULL; |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
349 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
350 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
351 void |
961
32f93ef20122
irccd: add Irccd.Util API and other things in server
David Demelier <markand@malikania.fr>
parents:
958
diff
changeset
|
352 irc_bot_plugin_remove(const char *name) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
353 { |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
354 struct irc_plugin *p; |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
355 |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
356 if (!(p = irc_bot_plugin_get(name))) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
357 return; |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
358 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
359 irc_plugin_unload(p); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
360 irc_plugin_finish(p); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
361 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
362 LIST_REMOVE(p, link); |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
363 } |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
364 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
365 void |
964
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
366 irc_bot_plugin_loader_add(struct irc_plugin_loader *ldr) |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
367 { |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
368 assert(ldr); |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
369 |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
370 SLIST_INSERT_HEAD(&irc.plugin_loaders, ldr, link); |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
371 } |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
372 |
0dd6afe7386d
irccd: implement plugin loaders
David Demelier <markand@malikania.fr>
parents:
961
diff
changeset
|
373 void |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
374 irc_bot_plugin_clear(void) |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
375 { |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
376 struct irc_plugin *p, *tmp; |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
377 |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
378 LIST_FOREACH_SAFE(p, &irc.plugins, link, tmp) |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
379 irc_bot_plugin_remove(p->name); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
380 LIST_INIT(&irc.plugins); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
381 } |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
382 |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
383 void |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
384 irc_bot_rule_insert(struct irc_rule *rule, size_t index) |
944 | 385 { |
386 assert(rule); | |
387 | |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
388 if (index == 0) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
389 TAILQ_INSERT_HEAD(&irc.rules, rule, link); |
975
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
390 else if (index >= irc_bot_rule_size()) |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
391 TAILQ_INSERT_TAIL(&irc.rules, rule, link); |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
392 else { |
975
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
393 struct irc_rule *pos; |
944 | 394 |
975
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
395 for (pos = TAILQ_FIRST(&irc.rules); --index; ) |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
396 pos = TAILQ_NEXT(pos, link); |
944 | 397 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
398 TAILQ_INSERT_AFTER(&irc.rules, pos, rule, link); |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
399 } |
944 | 400 } |
401 | |
975
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
402 struct irc_rule * |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
403 irc_bot_rule_get(size_t index) |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
404 { |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
405 assert(index < irc_bot_rule_size()); |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
406 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
407 struct irc_rule *rule; |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
408 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
409 for (rule = TAILQ_FIRST(&irc.rules); index-- != 0; ) |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
410 rule = TAILQ_NEXT(rule, link); |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
411 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
412 return rule; |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
413 } |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
414 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
415 void |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
416 irc_bot_rule_move(size_t from, size_t to) |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
417 { |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
418 assert(from < irc_bot_rule_size()); |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
419 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
420 struct irc_rule *f, *t; |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
421 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
422 if (from == to) |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
423 return; |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
424 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
425 f = t = TAILQ_FIRST(&irc.rules); |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
426 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
427 while (from--) |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
428 f = TAILQ_NEXT(f, link); |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
429 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
430 TAILQ_REMOVE(&irc.rules, f, link); |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
431 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
432 if (to == 0) |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
433 TAILQ_INSERT_HEAD(&irc.rules, f, link); |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
434 else { |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
435 while (TAILQ_NEXT(t, link) && to--) |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
436 t = TAILQ_NEXT(t, link); |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
437 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
438 TAILQ_INSERT_AFTER(&irc.rules, t, f, link); |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
439 } |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
440 } |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
441 |
944 | 442 void |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
443 irc_bot_rule_remove(size_t index) |
944 | 444 { |
975
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
445 assert(index < irc_bot_rule_size()); |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
446 |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
447 struct irc_rule *pos = TAILQ_FIRST(&irc.rules); |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
448 |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
449 for (size_t i = 0; i < index; ++i) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
450 pos = TAILQ_NEXT(pos, link); |
944 | 451 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
452 TAILQ_REMOVE(&irc.rules, pos, link); |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
453 } |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
454 |
975
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
455 size_t |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
456 irc_bot_rule_size(void) |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
457 { |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
458 const struct irc_rule *r; |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
459 size_t total = 0; |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
460 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
461 TAILQ_FOREACH(r, &irc.rules, link) |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
462 total++; |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
463 |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
464 return total; |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
465 } |
5ffc8350e84b
irccdctl: add support for rule editing
David Demelier <markand@malikania.fr>
parents:
971
diff
changeset
|
466 |
958
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
467 void |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
468 irc_bot_rule_clear(void) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
469 { |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
470 struct irc_rule *r, *tmp; |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
471 |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
472 TAILQ_FOREACH_SAFE(r, &irc.rules, link, tmp) |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
473 irc_rule_finish(r); |
533639ec5e9c
misc: use sys/queue.h
David Demelier <markand@malikania.fr>
parents:
957
diff
changeset
|
474 TAILQ_INIT(&irc.rules); |
944 | 475 } |
476 | |
966
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
477 size_t |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
478 irc_bot_poll_count(void) |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
479 { |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
480 size_t i = 1; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
481 struct irc_server *s; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
482 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
483 LIST_FOREACH(s, &irc.servers, link) |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
484 ++i; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
485 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
486 return i; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
487 } |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
488 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
489 void |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
490 irc_bot_prepare(struct pollfd *fds) |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
491 { |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
492 assert(fds); |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
493 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
494 struct irc_server *s; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
495 size_t i = 1; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
496 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
497 fds[0].fd = pipes[0]; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
498 fds[0].events = POLLIN; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
499 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
500 LIST_FOREACH(s, &irc.servers, link) |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
501 irc_server_prepare(s, &fds[i++]); |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
502 } |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
503 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
504 void |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
505 irc_bot_flush(const struct pollfd *fds) |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
506 { |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
507 assert(fds); |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
508 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
509 struct irc_server *s; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
510 size_t i = 1; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
511 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
512 pipe_flush(&fds[0]); |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
513 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
514 LIST_FOREACH(s, &irc.servers, link) |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
515 irc_server_flush(s, &fds[i++]); |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
516 } |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
517 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
518 int |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
519 irc_bot_dequeue(struct irc_event *ev) |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
520 { |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
521 struct irc_server *s; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
522 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
523 LIST_FOREACH(s, &irc.servers, link) |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
524 if (irc_server_poll(s, ev)) |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
525 return 1; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
526 |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
527 return 0; |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
528 } |
8172399babb7
irccd: move more lib code
David Demelier <markand@malikania.fr>
parents:
964
diff
changeset
|
529 |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
530 void |
946
2ec05b9db2ee
irccd: use net set.h macros
David Demelier <markand@malikania.fr>
parents:
944
diff
changeset
|
531 irc_bot_post(void (*exec)(void *), void *data) |
941
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
532 { |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
533 struct defer df = { |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
534 .exec = exec, |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
535 .data = data |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
536 }; |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
537 |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
538 if (write(pipes[1], &df, sizeof (df)) != sizeof (df)) |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
539 err(1, "write"); |
e43ccb1f0ace
irccdctl: add basics commands
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
540 } |
968
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
541 |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
542 void |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
543 irc_bot_finish(void) |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
544 { |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
545 struct irc_plugin_loader *ld, *ldtmp; |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
546 |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
547 /* |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
548 * First remove all loaders to mkae sure plugins won't try to load |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
549 * new plugins. |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
550 */ |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
551 SLIST_FOREACH_SAFE(ld, &irc.plugin_loaders, link, ldtmp) |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
552 irc_plugin_loader_finish(ld); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
553 |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
554 irc_bot_server_clear(); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
555 irc_bot_plugin_clear(); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
556 irc_bot_rule_clear(); |
5ded2b4994af
irccd: bring back support to config, templates and paths to plugins
David Demelier <markand@malikania.fr>
parents:
967
diff
changeset
|
557 } |