Mercurial > irccd
comparison irccdctl/watch_cli.cpp @ 528:9daccaeedcce
Irccdctl: split cli.hpp, closes #726
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 16 Nov 2017 23:12:45 +0100 |
parents | |
children | 18e80ec38ac7 |
comparison
equal
deleted
inserted
replaced
527:a88796ed040a | 528:9daccaeedcce |
---|---|
1 /* | |
2 * watch_cli.cpp -- implementation of irccdctl watch | |
3 * | |
4 * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <functional> | |
20 #include <unordered_map> | |
21 | |
22 #include <irccd/json_util.hpp> | |
23 #include <irccd/options.hpp> | |
24 | |
25 #include <irccd/ctl/controller.hpp> | |
26 | |
27 #include <boost/system/system_error.hpp> | |
28 | |
29 #include "watch_cli.hpp" | |
30 | |
31 namespace irccd { | |
32 | |
33 namespace ctl { | |
34 | |
35 namespace { | |
36 | |
37 std::string format(std::vector<std::string> args) | |
38 { | |
39 auto result = option::read(args, { | |
40 { "-f", true }, | |
41 { "--format", true } | |
42 }); | |
43 | |
44 if (result.count("-f") > 0) | |
45 return result.find("-f")->second; | |
46 if (result.count("--format") > 0) | |
47 return result.find("--format")->second; | |
48 | |
49 return "native"; | |
50 } | |
51 | |
52 void onChannelMode(const nlohmann::json &v) | |
53 { | |
54 std::cout << "event: onChannelMode\n"; | |
55 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
56 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
57 std::cout << "mode: " << json_util::pretty(v, "mode") << "\n"; | |
58 std::cout << "argument: " << json_util::pretty(v, "argument") << "\n"; | |
59 } | |
60 | |
61 void onChannelNotice(const nlohmann::json &v) | |
62 { | |
63 std::cout << "event: onChannelNotice\n"; | |
64 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
65 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
66 std::cout << "channel: " << json_util::pretty(v, "channel") << "\n"; | |
67 std::cout << "message: " << json_util::pretty(v, "message") << "\n"; | |
68 } | |
69 | |
70 void onConnect(const nlohmann::json &v) | |
71 { | |
72 std::cout << "event: onConnect\n"; | |
73 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
74 } | |
75 | |
76 void onInvite(const nlohmann::json &v) | |
77 { | |
78 std::cout << "event: onInvite\n"; | |
79 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
80 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
81 std::cout << "channel: " << json_util::pretty(v, "channel") << "\n"; | |
82 } | |
83 | |
84 void onJoin(const nlohmann::json &v) | |
85 { | |
86 std::cout << "event: onJoin\n"; | |
87 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
88 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
89 std::cout << "channel: " << json_util::pretty(v, "channel") << "\n"; | |
90 } | |
91 | |
92 void onKick(const nlohmann::json &v) | |
93 { | |
94 std::cout << "event: onKick\n"; | |
95 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
96 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
97 std::cout << "channel: " << json_util::pretty(v, "channel") << "\n"; | |
98 std::cout << "target: " << json_util::pretty(v, "target") << "\n"; | |
99 std::cout << "reason: " << json_util::pretty(v, "reason") << "\n"; | |
100 } | |
101 | |
102 void onMessage(const nlohmann::json &v) | |
103 { | |
104 std::cout << "event: onMessage\n"; | |
105 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
106 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
107 std::cout << "channel: " << json_util::pretty(v, "channel") << "\n"; | |
108 std::cout << "message: " << json_util::pretty(v, "message") << "\n"; | |
109 } | |
110 | |
111 void onMe(const nlohmann::json &v) | |
112 { | |
113 std::cout << "event: onMe\n"; | |
114 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
115 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
116 std::cout << "target: " << json_util::pretty(v, "target") << "\n"; | |
117 std::cout << "message: " << json_util::pretty(v, "message") << "\n"; | |
118 } | |
119 | |
120 void onMode(const nlohmann::json &v) | |
121 { | |
122 std::cout << "event: onMode\n"; | |
123 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
124 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
125 std::cout << "mode: " << json_util::pretty(v, "mode") << "\n"; | |
126 } | |
127 | |
128 void onNames(const nlohmann::json &v) | |
129 { | |
130 std::cout << "event: onNames\n"; | |
131 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
132 std::cout << "channel: " << json_util::pretty(v, "channel") << "\n"; | |
133 std::cout << "names: " << json_util::pretty(v, "names") << "\n"; | |
134 } | |
135 | |
136 void onNick(const nlohmann::json &v) | |
137 { | |
138 std::cout << "event: onNick\n"; | |
139 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
140 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
141 std::cout << "nickname: " << json_util::pretty(v, "nickname") << "\n"; | |
142 } | |
143 | |
144 void onNotice(const nlohmann::json &v) | |
145 { | |
146 std::cout << "event: onNotice\n"; | |
147 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
148 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
149 std::cout << "message: " << json_util::pretty(v, "message") << "\n"; | |
150 } | |
151 | |
152 void onPart(const nlohmann::json &v) | |
153 { | |
154 std::cout << "event: onPart\n"; | |
155 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
156 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
157 std::cout << "channel: " << json_util::pretty(v, "channel") << "\n"; | |
158 std::cout << "reason: " << json_util::pretty(v, "reason") << "\n"; | |
159 } | |
160 | |
161 void onQuery(const nlohmann::json &v) | |
162 { | |
163 std::cout << "event: onQuery\n"; | |
164 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
165 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
166 std::cout << "message: " << json_util::pretty(v, "message") << "\n"; | |
167 } | |
168 | |
169 void onTopic(const nlohmann::json &v) | |
170 { | |
171 std::cout << "event: onTopic\n"; | |
172 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
173 std::cout << "origin: " << json_util::pretty(v, "origin") << "\n"; | |
174 std::cout << "channel: " << json_util::pretty(v, "channel") << "\n"; | |
175 std::cout << "topic: " << json_util::pretty(v, "topic") << "\n"; | |
176 } | |
177 | |
178 void onWhois(const nlohmann::json &v) | |
179 { | |
180 std::cout << "event: onWhois\n"; | |
181 std::cout << "server: " << json_util::pretty(v, "server") << "\n"; | |
182 std::cout << "nickname: " << json_util::pretty(v, "nickname") << "\n"; | |
183 std::cout << "username: " << json_util::pretty(v, "username") << "\n"; | |
184 std::cout << "host: " << json_util::pretty(v, "host") << "\n"; | |
185 std::cout << "realname: " << json_util::pretty(v, "realname") << "\n"; | |
186 } | |
187 | |
188 const std::unordered_map<std::string, std::function<void (const nlohmann::json&)>> events{ | |
189 { "onChannelMode", onChannelMode }, | |
190 { "onChannelNotice", onChannelNotice }, | |
191 { "onConnect", onConnect }, | |
192 { "onInvite", onInvite }, | |
193 { "onJoin", onJoin }, | |
194 { "onKick", onKick }, | |
195 { "onMessage", onMessage }, | |
196 { "onMe", onMe }, | |
197 { "onMode", onMode }, | |
198 { "onNames", onNames }, | |
199 { "onNick", onNick }, | |
200 { "onNotice", onNotice }, | |
201 { "onPart", onPart }, | |
202 { "onQuery", onQuery }, | |
203 { "onTopic", onTopic }, | |
204 { "onWhois", onWhois } | |
205 }; | |
206 | |
207 void get_event(ctl::controller& ctl, std::string fmt) | |
208 { | |
209 ctl.recv([&ctl, fmt] (auto code, auto message) { | |
210 if (code) | |
211 throw boost::system::system_error(code); | |
212 | |
213 auto it = events.find(json_util::to_string(message["event"])); | |
214 | |
215 if (it != events.end()) { | |
216 if (fmt == "json") | |
217 std::cout << message.dump(4) << std::endl; | |
218 else { | |
219 it->second(message); | |
220 std::cout << std::endl; | |
221 } | |
222 } | |
223 | |
224 get_event(ctl, std::move(fmt)); | |
225 }); | |
226 } | |
227 | |
228 } // !namespace | |
229 | |
230 std::string watch_cli::name() const | |
231 { | |
232 return "watch"; | |
233 } | |
234 | |
235 void watch_cli::exec(ctl::controller& ctl, const std::vector<std::string>& args) | |
236 { | |
237 auto fmt = format(args); | |
238 | |
239 if (fmt != "native" && fmt != "json") | |
240 throw std::invalid_argument("invalid format given: " + fmt); | |
241 | |
242 get_event(ctl, fmt); | |
243 } | |
244 | |
245 } // !ctl | |
246 | |
247 } // !irccd |