Mercurial > irccd
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 |