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