clix.message: Add -i/--interactive to allow piping stdin over XMPP (like sendxmpp)

Thu, 07 Jan 2010 02:08:50 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 07 Jan 2010 02:08:50 +0000
changeset 9
c1d591488695
parent 8
df4cb4a73549
child 10
49b83fa1f6fd

clix.message: Add -i/--interactive to allow piping stdin over XMPP (like sendxmpp)

clix/message.lua file | annotate | diff | comparison | revisions
--- a/clix/message.lua	Thu Jan 07 02:05:48 2010 +0000
+++ b/clix/message.lua	Thu Jan 07 02:08:50 2010 +0000
@@ -1,10 +1,32 @@
+short_opts.i = "interactive";
+
 return function (opts, arg)
-	if #arg == 0 or opts.help then
+	if (#arg == 0 or opts.help) and not opts.interactive then
 		return 0;
 	end
 	local function on_connect(conn)
-		conn:send(verse.message({ to = opts.to, type = opts.type or "chat" }):body(table.concat(arg, " ")));
-		conn:close();
+		local function send_message(_, text)
+			conn:send(verse.message({ to = opts.to, type = opts.type or "chat" }):body(text));
+		end
+		if opts.interactive then
+			-- Fake socket object around stdin
+			local stdin = {
+				getfd = function () return 0; end;
+				dirty = function (self) return false; end;
+				settimeout = function () end;
+				send = function (_, d) return #d, 0; end;
+				close = function () end;
+				receive = function (_, patt)
+					local data = io.stdin:read(patt);
+					io.write(data, patt == "*l" and "\n" or "");
+					return data;
+				end
+			};
+			stdin = require "net.server".wrapclient(stdin, "stdin", 0, { onincoming = send_message, ondisconnect = function () end }, "*l");
+		else
+			send_message(nil, table.concat(arg, " "));
+			conn:close();
+		end
 	end
 	clix_connect(opts, on_connect);
 end

mercurial