comparison irccdctl/cli.cpp @ 359:6d598fea2689

Irccdctl: put back watch missing, closes #591
author David Demelier <markand@malikania.fr>
date Wed, 30 Nov 2016 12:59:08 +0100
parents ace71e2b8e2a
children b81c6fdec22e
comparison
equal deleted inserted replaced
358:d28f54757d4a 359:6d598fea2689
21 #include <json.hpp> 21 #include <json.hpp>
22 22
23 #include "cli.hpp" 23 #include "cli.hpp"
24 #include "elapsed-timer.hpp" 24 #include "elapsed-timer.hpp"
25 #include "irccdctl.hpp" 25 #include "irccdctl.hpp"
26 #include "logger.hpp"
26 #include "options.hpp" 27 #include "options.hpp"
27 #include "util.hpp" 28 #include "util.hpp"
28 29
29 namespace irccd { 30 namespace irccd {
30 31
828 { "channel", args[1] }, 829 { "channel", args[1] },
829 { "topic", args[2] } 830 { "topic", args[2] }
830 })); 831 }));
831 } 832 }
832 833
834 /*
835 * WatchCli.
836 * ------------------------------------------------------------------
837 */
838
839 namespace {
840
841 std::string format(std::vector<std::string> args)
842 {
843 auto result = option::read(args, {
844 { "-f", true },
845 { "--format", true }
846 });
847
848 if (result.count("-f") > 0)
849 return result.find("-f")->second;
850 if (result.count("--format") > 0)
851 return result.find("--format")->second;
852
853 return "native";
854 }
855
856 void onChannelMode(const nlohmann::json &v)
857 {
858 std::cout << "event: onChannelMode\n";
859 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
860 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
861 std::cout << "mode: " << util::json::pretty(v, "mode") << "\n";
862 std::cout << "argument: " << util::json::pretty(v, "argument") << "\n";
863 }
864
865 void onChannelNotice(const nlohmann::json &v)
866 {
867 std::cout << "event: onChannelNotice\n";
868 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
869 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
870 std::cout << "channel: " << util::json::pretty(v, "channel") << "\n";
871 std::cout << "message: " << util::json::pretty(v, "message") << "\n";
872 }
873
874 void onConnect(const nlohmann::json &v)
875 {
876 std::cout << "event: onConnect\n";
877 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
878 }
879
880 void onInvite(const nlohmann::json &v)
881 {
882 std::cout << "event: onInvite\n";
883 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
884 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
885 std::cout << "channel: " << util::json::pretty(v, "channel") << "\n";
886 }
887
888 void onJoin(const nlohmann::json &v)
889 {
890 std::cout << "event: onJoin\n";
891 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
892 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
893 std::cout << "channel: " << util::json::pretty(v, "channel") << "\n";
894 }
895
896 void onKick(const nlohmann::json &v)
897 {
898 std::cout << "event: onKick\n";
899 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
900 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
901 std::cout << "channel: " << util::json::pretty(v, "channel") << "\n";
902 std::cout << "target: " << util::json::pretty(v, "target") << "\n";
903 std::cout << "reason: " << util::json::pretty(v, "reason") << "\n";
904 }
905
906 void onMessage(const nlohmann::json &v)
907 {
908 std::cout << "event: onMessage\n";
909 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
910 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
911 std::cout << "channel: " << util::json::pretty(v, "channel") << "\n";
912 std::cout << "message: " << util::json::pretty(v, "message") << "\n";
913 }
914
915 void onMe(const nlohmann::json &v)
916 {
917 std::cout << "event: onMe\n";
918 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
919 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
920 std::cout << "target: " << util::json::pretty(v, "target") << "\n";
921 std::cout << "message: " << util::json::pretty(v, "message") << "\n";
922 }
923
924 void onMode(const nlohmann::json &v)
925 {
926 std::cout << "event: onMode\n";
927 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
928 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
929 std::cout << "mode: " << util::json::pretty(v, "mode") << "\n";
930 }
931
932 void onNames(const nlohmann::json &v)
933 {
934 std::cout << "event: onNames\n";
935 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
936 std::cout << "channel: " << util::json::pretty(v, "channel") << "\n";
937 std::cout << "names: " << util::json::pretty(v, "names") << "\n";
938 }
939
940 void onNick(const nlohmann::json &v)
941 {
942 std::cout << "event: onNick\n";
943 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
944 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
945 std::cout << "nickname: " << util::json::pretty(v, "nickname") << "\n";
946 }
947
948 void onNotice(const nlohmann::json &v)
949 {
950 std::cout << "event: onNotice\n";
951 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
952 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
953 std::cout << "message: " << util::json::pretty(v, "message") << "\n";
954 }
955
956 void onPart(const nlohmann::json &v)
957 {
958 std::cout << "event: onPart\n";
959 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
960 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
961 std::cout << "channel: " << util::json::pretty(v, "channel") << "\n";
962 std::cout << "reason: " << util::json::pretty(v, "reason") << "\n";
963 }
964
965 void onQuery(const nlohmann::json &v)
966 {
967 std::cout << "event: onQuery\n";
968 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
969 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
970 std::cout << "message: " << util::json::pretty(v, "message") << "\n";
971 }
972
973 void onTopic(const nlohmann::json &v)
974 {
975 std::cout << "event: onTopic\n";
976 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
977 std::cout << "origin: " << util::json::pretty(v, "origin") << "\n";
978 std::cout << "channel: " << util::json::pretty(v, "channel") << "\n";
979 std::cout << "topic: " << util::json::pretty(v, "topic") << "\n";
980 }
981
982 void onWhois(const nlohmann::json &v)
983 {
984 std::cout << "event: onWhois\n";
985 std::cout << "server: " << util::json::pretty(v, "server") << "\n";
986 std::cout << "nickname: " << util::json::pretty(v, "nickname") << "\n";
987 std::cout << "username: " << util::json::pretty(v, "username") << "\n";
988 std::cout << "host: " << util::json::pretty(v, "host") << "\n";
989 std::cout << "realname: " << util::json::pretty(v, "realname") << "\n";
990 }
991
992 const std::unordered_map<std::string, std::function<void (const nlohmann::json &)>> events{
993 { "onChannelMode", onChannelMode },
994 { "onChannelNotice", onChannelNotice },
995 { "onConnect", onConnect },
996 { "onInvite", onInvite },
997 { "onJoin", onJoin },
998 { "onKick", onKick },
999 { "onMessage", onMessage },
1000 { "onMe", onMe },
1001 { "onMode", onMode },
1002 { "onNames", onNames },
1003 { "onNick", onNick },
1004 { "onNotice", onNotice },
1005 { "onPart", onPart },
1006 { "onQuery", onQuery },
1007 { "onTopic", onTopic },
1008 { "onWhois", onWhois }
1009 };
1010
1011 } // !namespace
1012
1013 WatchCli::WatchCli()
1014 : Cli("watch",
1015 "watch irccd events",
1016 "watch [-f|--format json|native]",
1017 "Start watching irccd events.\n\n"
1018 "You can use different output formats, native is human readable format, json is pretty"
1019 "formatted json.\n\n"
1020 "Example:\n"
1021 "\tirccdctl watch\n"
1022 "\tirccdctl watch -f json\n")
1023 {
1024 }
1025
1026 void WatchCli::exec(Irccdctl& client, const std::vector<std::string>& args)
1027 {
1028 std::string fmt = format(args);
1029
1030 if (fmt != "native" && fmt != "json")
1031 throw std::invalid_argument("invalid format given: " + fmt);
1032
1033 auto id = client.client().onEvent.connect([&] (auto ev) {
1034 try {
1035 auto name = ev.find("event");
1036
1037 if (name == ev.end() || !name->is_string())
1038 return;
1039
1040 auto it = events.find(*name);
1041
1042 // Silently ignore to avoid breaking user output.
1043 if (it == events.end())
1044 return;
1045
1046 if (fmt == "json")
1047 std::cout << ev.dump(4) << std::endl;
1048 else {
1049 it->second(ev);
1050 std::cout << std::endl;
1051 }
1052 } catch (...) {
1053 }
1054 });
1055
1056 try {
1057 while (client.client().isConnected()) {
1058 util::poller::poll(500, client);
1059 }
1060 } catch (const std::exception &ex) {
1061 log::warning() << ex.what() << std::endl;
1062 }
1063
1064 client.client().onEvent.disconnect(id);
1065 }
1066
833 } // !cli 1067 } // !cli
834 1068
835 } // !irccd 1069 } // !irccd