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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
64 return strncmp(ev->message.message, cc, ccsz) == 0 &&
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
71 char *action;
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
72
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
73 /* Convert "!test foo bar" to "foo bar" */
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
74 action = ev->message.message + strlen(ev->server->commandchar) + strlen(p->name);
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
75
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
76 while (*action && isspace(*action))
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
77 ++action;
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
78
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
79 action = strdup(action);
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
3167c51f0c84 irccd: rework events
David Demelier <markand@malikania.fr>
parents: 955
diff changeset
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
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
385 {
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
386 assert(rule);
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
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
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
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
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
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
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
400 }
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
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
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
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
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
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
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
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
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
475 }
d63a360811dd irccd: add rules
David Demelier <markand@malikania.fr>
parents: 941
diff changeset
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 }