annotate plugins/links/links.cpp @ 767:a2db884f2e4b

Plugin links: log only in case of 'ok', closes #918 @20m
author David Demelier <markand@malikania.fr>
date Tue, 23 Oct 2018 13:18:21 +0200
parents 80e2d5284b4a
children d8bf53170fb6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * links.cpp -- links plugin
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2018 David Demelier <markand@malikania.fr>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <memory>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <regex>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <sstream>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <string>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <variant>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <boost/dll.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <boost/asio.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <boost/asio/ssl.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include <boost/beast.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include <irccd/string_util.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include <irccd/daemon/irc.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include <irccd/daemon/irccd.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include <irccd/daemon/plugin.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #include <irccd/daemon/server.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 using boost::asio::async_connect;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 using boost::asio::deadline_timer;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 using boost::asio::io_context;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 using boost::asio::ip::tcp;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 using boost::asio::ssl::context;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 using boost::asio::ssl::stream;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 using boost::asio::ssl::stream_base;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 using boost::beast::flat_buffer;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 using boost::beast::http::async_read;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 using boost::beast::http::async_write;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 using boost::beast::http::empty_body;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 using boost::beast::http::field;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 using boost::beast::http::request;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 using boost::beast::http::response;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 using boost::beast::http::string_body;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 using boost::beast::http::verb;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 using boost::beast::http::status;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 using boost::posix_time::seconds;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 using boost::system::error_code;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 using std::get;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 using std::enable_shared_from_this;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 using std::monostate;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 using std::move;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 using std::regex;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 using std::regex_match;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 using std::regex_search;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 using std::shared_ptr;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 using std::smatch;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 using std::string;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 using std::variant;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 namespace irccd {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 namespace {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 // {{{ globals
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 // User options.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 struct config {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 static inline unsigned timeout{30U};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 // User formats.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 struct formats {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 static inline string info{"#{title}"};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 // {{{ url
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 struct url {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 string protocol;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 string host;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 string path{"/"};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 static auto parse(const string&) -> url;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 auto url::parse(const string& link) -> url
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 static const regex regex("^(https?):\\/\\/([^\\/\\?]+)(.*)$");
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 url ret;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 if (smatch match; regex_match(link, match, regex)) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 ret.protocol = match[1];
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 ret.host = match[2];
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 if (match.length(3) > 0)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 ret.path = match[3];
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 if (ret.path[0] != '/')
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 ret.path.insert(ret.path.begin(), '/');
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 return ret;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 // {{{ requester
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 class requester : public enable_shared_from_this<requester> {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 private:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 using socket = variant<monostate, tcp::socket, stream<tcp::socket>>;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
766
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
128 unsigned level_{0U};
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
129
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 shared_ptr<server> server_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 string channel_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 string origin_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 url url_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 context ctx_{context::sslv23};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 socket socket_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 flat_buffer buffer_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 request<empty_body> req_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 response<string_body> res_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 deadline_timer timer_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 tcp::resolver resolver_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 void notify(const string&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 void parse();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 void handle_read(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 void read();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 void handle_write(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 void write();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 void handle_handshake(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 void handshake();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 void handle_connect(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 void connect(const tcp::resolver::results_type&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 void handle_resolve(const error_code&, const tcp::resolver::results_type&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 void resolve();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 void handle_timer(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 void timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 void start();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
766
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
159 requester(unsigned, io_context&, shared_ptr<server>, string, string, url);
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
160
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 public:
766
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
162 static void run(unsigned, io_context&, shared_ptr<server>, string, string, string);
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 void requester::notify(const string& title)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 string_util::subst subst;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 subst.keywords.emplace("channel", channel_);
750
1e1eb83a3f0b Irccd: IRC code cleanup
David Demelier <markand@malikania.fr>
parents: 732
diff changeset
170 subst.keywords.emplace("nickname", irc::user::parse(origin_).nick);
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 subst.keywords.emplace("origin", origin_);
732
e53b013c8938 Irccd: server style and cleanup
David Demelier <markand@malikania.fr>
parents: 731
diff changeset
172 subst.keywords.emplace("server", server_->get_id());
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 subst.keywords.emplace("title", title);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 server_->message(channel_, format(formats::info, subst));
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 void requester::parse()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 /*
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 * Use a regex because Boost's XML parser is strict and many web pages may
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 * have invalid or broken tags.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 */
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 static const regex regex("<title>([^<]+)<\\/title>");
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 string data(res_.body().data());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 smatch match;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 if (regex_search(data, match, regex))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 notify(match[1]);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
192
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 void requester::handle_read(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 if (code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 return;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
199
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 // Request again in case of relocation.
712
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
201 if (const auto it = res_.find(field::location); it != res_.end()) {
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
202 const string location(it->value().data(), it->value().size());
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
766
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
204 if (level_ < 32U)
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
205 run(++level_, timer_.get_io_service(), server_, origin_, channel_, location);
767
a2db884f2e4b Plugin links: log only in case of 'ok', closes #918 @20m
David Demelier <markand@malikania.fr>
parents: 766
diff changeset
206 } else if (res_.result() == status::ok)
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 parse();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 void requester::read()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 const auto wrap = [self] (auto code, auto) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 self->handle_read(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 async_read(get<1>(socket_), buffer_, res_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 async_read(get<2>(socket_), buffer_, res_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 void requester::handle_write(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 read();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
238
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 void requester::write()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 req_.version(11);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 req_.method(verb::get);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 req_.target(url_.path);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 req_.set(field::host, url_.host);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 req_.set(field::user_agent, BOOST_BEAST_VERSION_STRING);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
246
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 const auto wrap = [self] (auto code, auto) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 self->handle_write(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
251
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
253
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 async_write(get<1>(socket_), req_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 async_write(get<2>(socket_), req_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
265
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 void requester::handle_handshake(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
269
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 write();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
273
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 void requester::handshake()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
277
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
279
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 handle_handshake(error_code());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 get<2>(socket_).async_handshake(stream_base::client, [self] (auto code) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 self->handle_handshake(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 });
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 void requester::handle_connect(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
297
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 handshake();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
301
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 void requester::connect(const tcp::resolver::results_type& eps)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 const auto wrap = [self] (auto code, auto) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 self->handle_connect(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
308
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
310
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 async_connect(get<1>(socket_), eps, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 async_connect(get<2>(socket_).lowest_layer(), eps, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
322
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 void requester::handle_resolve(const error_code& code, const tcp::resolver::results_type& eps)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
326
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 connect(eps);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
330
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 void requester::resolve()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
334
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 resolver_.async_resolve(url_.host, url_.protocol, [self] (auto code, auto eps) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 self->handle_resolve(code, eps);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 });
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
340
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 void requester::handle_timer(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 // Force close sockets to cancel all pending operations.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 if (code && code != boost::asio::error::operation_aborted)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 socket_.emplace<monostate>();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
347
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 void requester::timer()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
351
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 timer_.expires_from_now(seconds(config::timeout));
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 timer_.async_wait([self] (auto code) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 self->handle_timer(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 });
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
357
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 void requester::start()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 if (url_.protocol == "http")
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 socket_.emplace<tcp::socket>(resolver_.get_io_service());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 else
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 socket_.emplace<stream<tcp::socket>>(resolver_.get_io_service(), ctx_);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
364
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 resolve();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
367
766
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
368 requester::requester(unsigned level,
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
369 io_context& io,
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 shared_ptr<server> server,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 string channel,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 string origin,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 url url)
766
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
374 : level_(level)
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
375 , server_(move(server))
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 , channel_(move(channel))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 , origin_(move(origin))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 , url_(move(url))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 , timer_(io)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 , resolver_(io)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
383
766
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
384 void requester::run(unsigned level,
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
385 io_context& io,
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
386 shared_ptr<server> server,
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
387 string origin,
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
388 string channel,
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
389 string link)
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 {
712
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
391 auto url = url::parse(link);
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
392
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 if (url.protocol.empty() || url.host.empty())
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 return;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
395
766
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
396 shared_ptr<requester>(new requester(level, io, server, channel, origin, move(url)))->start();
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
398
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
400
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 // {{{ links_plugin
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
402
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 class links_plugin : public plugin {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 public:
731
9d13aabfd63a Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents: 722
diff changeset
405 using plugin::plugin;
9d13aabfd63a Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents: 722
diff changeset
406
722
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
407 auto get_name() const noexcept -> std::string_view override;
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
408
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
409 auto get_author() const noexcept -> std::string_view override;
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
410
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
411 auto get_license() const noexcept -> std::string_view override;
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
412
722
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
413 auto get_summary() const noexcept -> std::string_view override;
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
414
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
415 auto get_version() const noexcept -> std::string_view override;
716
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
416
722
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
417 void set_options(const map&) override;
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
418
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
419 void set_formats(const map&) override;
716
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
420
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 void handle_message(irccd&, const message_event&) override;
716
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
422
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
423 static auto abi() -> version;
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
424
731
9d13aabfd63a Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents: 722
diff changeset
425 static auto init(std::string) -> std::unique_ptr<plugin>;
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
427
722
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
428 auto links_plugin::get_name() const noexcept -> std::string_view
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
429 {
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
430 return "links";
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
431 }
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
432
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
433 auto links_plugin::get_author() const noexcept -> std::string_view
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
434 {
722
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
435 return "David Demelier <markand@malikania.fr>";
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
436 }
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
437
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
438 auto links_plugin::get_license() const noexcept -> std::string_view
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
439 {
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
440 return "ISC";
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
442
722
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
443 auto links_plugin::get_summary() const noexcept -> std::string_view
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
444 {
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
445 return "show webpage title";
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
446 }
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
447
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
448 auto links_plugin::get_version() const noexcept -> std::string_view
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
449 {
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
450 return IRCCD_VERSION;
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
451 }
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
452
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
453 void links_plugin::set_options(const map& conf)
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
454 {
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
455 if (const auto it = conf.find("timeout"); it != conf.end())
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
456 if (const auto v = string_util::to_uint(it->second); v)
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
457 config::timeout = *v;
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
458 }
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
459
3e816cebed2c Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents: 716
diff changeset
460 void links_plugin::set_formats(const map& formats)
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
461 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
462 if (const auto it = formats.find("info"); it != formats.end())
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 formats::info = it->second;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
465
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
466 void links_plugin::handle_message(irccd& irccd, const message_event& ev)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
467 {
766
80e2d5284b4a Plugin links: make maximum count, closes #904 @20m
David Demelier <markand@malikania.fr>
parents: 750
diff changeset
468 requester::run(0U, irccd.get_service(), ev.server, ev.origin, ev.channel, ev.message);
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
469 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
470
716
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
471 auto links_plugin::abi() -> version
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
472 {
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
473 return version();
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
474 }
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
475
731
9d13aabfd63a Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents: 722
diff changeset
476 auto links_plugin::init(std::string id) -> std::unique_ptr<plugin>
716
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
477 {
731
9d13aabfd63a Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents: 722
diff changeset
478 return std::make_unique<links_plugin>(std::move(id));
716
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
479 }
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
480
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
481 BOOST_DLL_ALIAS(links_plugin::abi, irccd_abi_links)
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
482 BOOST_DLL_ALIAS(links_plugin::init, irccd_init_links)
16e83b636cb8 Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents: 712
diff changeset
483
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
484 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
485
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
486 } // !namespace
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
487
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
488 } // !irccd