annotate plugins/links/links.c @ 988:2e02fbb8b32b

irccd: load metadata from native plugins
author David Demelier <markand@malikania.fr>
date Wed, 10 Feb 2021 17:45:55 +0100
parents 685b85367c8e
children daaf92c097e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
987
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * links.c -- links plugin
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <compat.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <assert.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <ctype.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <err.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <errno.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <regex.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <stdio.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <stdlib.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <string.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include <curl/curl.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include <irccd/irccd.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include <irccd/limits.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include <irccd/server.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include <irccd/subst.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include <irccd/util.h>
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 /*
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 * Since most websites are now bloated, we need a very large page size to
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 * analyse. Use 5MB for now.
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 #define PAGE_MAX 5242880
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 struct req {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 pthread_t thr;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 CURL *curl;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 struct irc_server *server;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 int status;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 char *link;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 char *chan;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 char *nickname;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 char *origin;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 FILE *fp;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 char buf[];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 enum {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 TPL_INFO
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 static char templates[][512] = {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 [TPL_INFO] = "#{nickname}, voici le lien: #{title}"
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 static size_t
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 callback(char *ptr, size_t size, size_t nmemb, struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 fprintf(req->fp, "%.*s", (int)(size * nmemb), ptr);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 if (feof(req->fp) || ferror(req->fp))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 return 0;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 return size * nmemb;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 static const char *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 parse(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 regex_t regex;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 regmatch_t match[2];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 char *ret = NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 if (regcomp(&regex, "<title>([^<]+)<\\/title>", REG_EXTENDED | REG_ICASE) != 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 if (regexec(&regex, req->buf, 2, match, 0) == 0) {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 ret = &req->buf[match[1].rm_so];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 ret[match[1].rm_eo - match[1].rm_so] = '\0';
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 regfree(&regex);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 return ret;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 static const char *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 fmt(const struct req *req, const char *title)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 static char line[IRC_MESSAGE_LEN];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 struct irc_subst subst = {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 .time = time(NULL),
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 .flags = IRC_SUBST_DATE | IRC_SUBST_KEYWORDS | IRC_SUBST_IRC_ATTRS,
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 .keywords = (struct irc_subst_keyword []) {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 { "channel", req->chan },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 { "nickname", req->nickname },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 { "origin", req->origin },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 { "server", req->server->name },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 { "title", title }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 },
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 .keywordsz = 5
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 irc_subst(line, sizeof (line), templates[TPL_INFO], &subst);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 return line;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 req_finish(struct req *);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 complete(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 const char *title;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
125
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 if (req->status && (title = parse(req)))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 irc_server_message(req->server, req->chan, fmt(req, title));
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
128
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 pthread_join(req->thr, NULL);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 req_finish(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 /*
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 * This function is running in a separate thread.
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 static void *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 routine(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 typedef void (*func_t)(void *);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 if (curl_easy_perform(req->curl) == 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 req->status = 1;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 irc_bot_post((func_t)complete, req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 req_finish(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 assert(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
153
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 if (req->server)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 irc_server_decref(req->server);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 if (req->curl)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 curl_easy_cleanup(req->curl);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 if (req->fp)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 fclose(req->fp);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
160
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 free(req->chan);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 free(req->nickname);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 free(req->origin);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 free(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 static struct req *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 req_new(struct irc_server *server, const char *origin, const char *channel, char *link)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 assert(link);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
171
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 struct req *req;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 struct irc_server_user user;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 if (!(req = calloc(1, sizeof (*req) + PAGE_MAX + 1))) {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 free(link);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 if (!(req->curl = curl_easy_init()))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 goto enomem;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 if (!(req->fp = fmemopen(req->buf, PAGE_MAX, "w")))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 goto enomem;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 irc_server_incref(server);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 irc_server_split(origin, &user);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 req->link = link;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 req->server = server;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 req->chan = strdup(channel);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 req->nickname = strdup(user.nickname);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 req->origin = strdup(origin);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 curl_easy_setopt(req->curl, CURLOPT_URL, link);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 curl_easy_setopt(req->curl, CURLOPT_FOLLOWLOCATION, 1L);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 curl_easy_setopt(req->curl, CURLOPT_WRITEFUNCTION, callback);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 curl_easy_setopt(req->curl, CURLOPT_WRITEDATA, req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 return req;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 enomem:
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 errno = ENOMEM;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 req_finish(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 static void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 req_start(struct req *req)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 typedef void *(*func_t)(void *);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 if (pthread_create(&req->thr, NULL, (func_t)routine, req) != 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 req_finish(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
214
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 links_event(const struct irc_event *ev)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 struct req *req;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 char *loc, *link, *end;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 if (ev->type != IRC_EVENT_MESSAGE)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 return;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 /* Parse link. */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 if (!(loc = strstr(ev->message.message, "http://")) &&
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 !(loc = strstr(ev->message.message, "https://")))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 return;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 /* Compute end to allocate only what's needed. */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 for (end = loc; *end && !isspace(*end); )
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 ++end;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
232
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 link = irc_util_strndup(loc, end - loc);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
234
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 /* If the function fails, link is free'd anyway. */
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 if (!(req = req_new(ev->server, ev->message.origin, ev->message.channel, link)))
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 return;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
238
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 req_start(req);
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
241
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 void
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 links_set_template(const char *key, const char *value)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 if (strcmp(key, "info") == 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 strlcpy(templates[TPL_INFO], value, sizeof (templates[TPL_INFO]));
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
248
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 const char *
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 links_get_template(const char *key)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 if (strcmp(key, "info") == 0)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 return templates[TPL_INFO];
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
254
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 return NULL;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 }
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
257
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 const char **
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 links_get_templates(void)
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 {
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 static const char *keys[] = { "info", NULL };
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
262
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 return keys;
685b85367c8e plugin logger: resurrect
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 }
988
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
265
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
266 const char *links_description = "Parse links from messages";
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
267 const char *links_version = IRCCD_VERSION;
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
268 const char *links_license = "ISC";
2e02fbb8b32b irccd: load metadata from native plugins
David Demelier <markand@malikania.fr>
parents: 987
diff changeset
269 const char *links_author = "David Demelier <markand@malikania.fr>";