diff irccdctl/command-watch.cpp @ 0:1158cffe5a5e

Initial import
author David Demelier <markand@malikania.fr>
date Mon, 08 Feb 2016 16:43:14 +0100
parents
children a5f2d5d41994
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/irccdctl/command-watch.cpp	Mon Feb 08 16:43:14 2016 +0100
@@ -0,0 +1,236 @@
+/*
+ * command-watch.cpp -- implementation of irccdctl watch
+ *
+ * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <iostream>
+
+#include "command-watch.h"
+
+namespace irccd {
+
+namespace command {
+
+namespace {
+
+void onChannelMode(const json::Value &v)
+{
+	std::cout << "event:       onChannelMode\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "mode:        " << v.valueOr("mode", "").toString() << "\n";
+	std::cout << "argument:    " << v.valueOr("argument", "").toString() << "\n";
+}
+
+void onChannelNotice(const json::Value &v)
+{
+	std::cout << "event:       onChannelNotice\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "channel:     " << v.valueOr("channel", "").toString() << "\n";
+	std::cout << "notice:      " << v.valueOr("notice", "").toString() << "\n";
+}
+
+void onConnect(const json::Value &v)
+{
+	std::cout << "event:       onConnect\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+}
+
+void onInvite(const json::Value &v)
+{
+	std::cout << "event:       onInvite\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "channel:     " << v.valueOr("channel", "").toString() << "\n";
+}
+
+void onJoin(const json::Value &v)
+{
+	std::cout << "event:       onJoin\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "channel:     " << v.valueOr("channel", "").toString() << "\n";
+}
+
+void onKick(const json::Value &v)
+{
+	std::cout << "event:       onKick\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "channel:     " << v.valueOr("channel", "").toString() << "\n";
+	std::cout << "target:      " << v.valueOr("target", "").toString() << "\n";
+	std::cout << "reason:      " << v.valueOr("reason", "").toString() << "\n";
+}
+
+void onMessage(const json::Value &v)
+{
+	std::cout << "event:       onMessage\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "channel:     " << v.valueOr("channel", "").toString() << "\n";
+	std::cout << "message:     " << v.valueOr("message", "").toString() << "\n";
+}
+
+void onMe(const json::Value &v)
+{
+	std::cout << "event:       onMe\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "target:      " << v.valueOr("target", "").toString() << "\n";
+	std::cout << "message:     " << v.valueOr("message", "").toString() << "\n";
+}
+
+void onMode(const json::Value &v)
+{
+	std::cout << "event:       onMode\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "mode:        " << v.valueOr("mode", "").toString() << "\n";
+}
+
+void onNames(const json::Value &v)
+{
+	std::cout << "event:       onNames\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "channel:     " << v.valueOr("channel", "").toString() << "\n";
+	std::cout << "names:       " << v.valueOr("names", "").toJson(0) << "\n";
+}
+
+void onNick(const json::Value &v)
+{
+	std::cout << "event:       onNick\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "nickname:    " << v.valueOr("nickname", "").toString() << "\n";
+}
+
+void onNotice(const json::Value &v)
+{
+	std::cout << "event:       onNotice\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "notice:      " << v.valueOr("notice", "").toString() << "\n";
+}
+
+void onPart(const json::Value &v)
+{
+	std::cout << "event:       onPart\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "channel:     " << v.valueOr("channel", "").toString() << "\n";
+	std::cout << "reason:      " << v.valueOr("reason", "").toString() << "\n";
+}
+
+void onQuery(const json::Value &v)
+{
+	std::cout << "event:       onQuery\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "message:     " << v.valueOr("message", "").toString() << "\n";
+}
+
+void onTopic(const json::Value &v)
+{
+	std::cout << "event:       onTopic\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "origin:      " << v.valueOr("origin", "").toString() << "\n";
+	std::cout << "channel:     " << v.valueOr("channel", "").toString() << "\n";
+	std::cout << "topic:       " << v.valueOr("topic", "").toString() << "\n";
+}
+
+void onWhois(const json::Value &v)
+{
+	std::cout << "event:       onWhois\n";
+	std::cout << "server:      " << v.valueOr("server", "").toString() << "\n";
+	std::cout << "nickname:    " << v.valueOr("nickname", "").toString() << "\n";
+	std::cout << "username:    " << v.valueOr("username", "").toString() << "\n";
+	std::cout << "host:        " << v.valueOr("host", "").toString() << "\n";
+	std::cout << "realname:    " << v.valueOr("realname", "").toString() << "\n";
+}
+
+const std::unordered_map<std::string, std::function<void (const json::Value &)>> events{
+	{ "onChannelMode",	onChannelMode		},
+	{ "onChannelNotice",	onChannelNotice		},
+	{ "onConnect",		onConnect		},
+	{ "onInvite",		onInvite		},
+	{ "onJoin",		onJoin			},
+	{ "onKick",		onKick			},
+	{ "onMessage",		onMessage		},
+	{ "onMe",		onMe			},
+	{ "onMode",		onMode			},
+	{ "onNames",		onNames			},
+	{ "onNick",		onNick			},
+	{ "onNotice",		onNotice		},
+	{ "onPart",		onPart			},
+	{ "onQuery",		onQuery			},
+	{ "onTopic",		onTopic			},
+	{ "onWhois",		onWhois			}
+};
+
+} // !namespace
+
+void Watch::usage(Irccdctl &) const
+{
+	log::warning() << "usage: " << sys::programName() << " watch [-f|--format native|json]\n\n";
+	log::warning() << "Start watching irccd events. You can use different output formats, native\n";
+	log::warning() << "is human readable format, json is pretty formatted json.\n\n";
+	log::warning() << "Example:\n";
+	log::warning() << "\t " << sys::programName() << " watch -f json" << std::endl;
+}
+
+void Watch::exec(Irccdctl &ctl, const std::vector<std::string> &args) const
+{
+	std::vector<std::string> copy(args);
+	std::string format("native");
+
+	parser::Options options{
+		{ "-f",		true },
+		{ "--format",	true }
+	};
+
+	for (const auto &o : parser::read(copy, options))
+		if (o.first == "-f" || o.first == "--format")
+			format = o.second;
+
+	if (format != "native" && format != "json")
+		throw std::invalid_argument("invalid format given: " + format);
+
+	while (ctl.connection().isConnected()) {
+		try {
+			auto object = ctl.connection().next(-1);
+			auto it = events.find(object.valueOr("event", "").toString());
+
+			/* Silently ignore to avoid breaking user output */
+			if (it == events.end())
+				continue;
+
+			if (format == "json") {
+				std::cout << object.toJson() << std::endl;
+			} else {
+				it->second(object);
+				std::cout << std::endl;
+			}
+		} catch (...) {
+		}
+	}
+
+	throw std::runtime_error("connection lost");
+}
+
+} // !command
+
+} // !irccd