0
|
1 require "verse"
|
|
2 require "verse.client"
|
|
3
|
|
4 local command = arg[1];
|
|
5
|
|
6 if not command then
|
|
7 print("Command Line XMPP, available commands:");
|
|
8 for module in pairs(package.preload) do
|
|
9 if module:match("^clix%.") then
|
|
10 local m = require(module);
|
|
11 m{ "--short-help" };
|
|
12 end
|
|
13 end
|
|
14 return 0;
|
|
15 end
|
|
16
|
|
17 local ok, m = pcall(require, "clix."..command);
|
|
18 if not ok then
|
|
19 print("Error running command '"..command.."' (run with --debug to see full error)");
|
|
20 if arg[2] == "--debug" then
|
|
21 print(m);
|
|
22 end
|
|
23 return 1;
|
|
24 end
|
|
25
|
|
26 if type(m) ~= "function" then
|
|
27 print(command.." is not a valid command");
|
|
28 return 1;
|
|
29 end
|
|
30
|
|
31 local accounts = { default = {} };
|
|
32 local current_account;
|
|
33 for line in io.lines(os.getenv("HOME").."/.clix") do
|
|
34 line = line:match("^%s*(.-)%s*$");
|
|
35 if line:match("^%[") then
|
|
36 current_account = line:match("^%[(.-)%]");
|
|
37 accounts[current_account] = {};
|
|
38 if not current_account then -- This is the first defined account
|
|
39 accounts.default = accounts[current_account];
|
|
40 end
|
|
41 elseif current_account then
|
|
42 local k,v = line:match("^(%w+)%s*[:=]%s*(.+)$");
|
|
43 accounts[current_account or "default"][k] = v;
|
|
44 end
|
|
45 end
|
|
46
|
|
47 function clix_connect(opts, on_connect)
|
|
48 local account = accounts[opts.account or "default"];
|
|
49 if not (account and account.jid) then
|
|
50 io.stderr:write("The specified account (", opts.account or "default", ") wasn't found in the config file\n");
|
|
51 return nil;
|
|
52 end
|
|
53
|
|
54 local conn = verse.new();
|
|
55 conn:hook("authentication-failure", function (err)
|
|
56 io.stderr:write("Authentication failure (",err.condition or "unknown error", ")", err.text and (": "..err.text) or "", "\n");
|
|
57 end);
|
|
58 conn:hook("binding-success", function () io.stderr:write("Connected: ", tostring(conn), "\n"); return on_connect(conn); end);
|
|
59 conn:hook("binding-failure", function (err)
|
|
60 io.stderr:write("Authentication failure (",err.condition or "unknown error", ")", err.text and (": "..err.text) or "", "\n");
|
|
61 end);
|
|
62 conn:hook("disconnected", function (info)
|
|
63 if info.reason then
|
|
64 io.stderr:write("Disconnecting: ", tostring(info.reason), "\n");
|
|
65 end
|
|
66 verse.quit();
|
|
67 end);
|
|
68 -- Optional config parameters
|
|
69 conn.connect_host = account.address;
|
|
70 conn.connect_port = account.port;
|
|
71 -- Connect!
|
|
72 conn:connect_client(account.jid, account.password);
|
|
73 return verse.loop();
|
|
74 end
|
|
75
|
|
76 table.remove(arg,1);
|
|
77
|
|
78 local short_opts = { v = "verbose", t = "to", f = "from", e = "type", a = "account", p = "password" }
|
|
79 local opts = {};
|
|
80
|
|
81 local args_handled_up_to;
|
|
82 for i, opt in ipairs(arg) do
|
|
83 if opt:match("^%-") and opt ~= "--" then
|
|
84 local name = opt:match("^%-%-?([^%s=]+)()")
|
|
85 name = (short_opts[name] or name):gsub("%-+", "_");
|
|
86 if name:match("^no_") then
|
|
87 name = name:sub(4, -1);
|
|
88 opts[name] = false;
|
|
89 else
|
|
90 opts[name] = opt:match("=(.*)$") or true;
|
|
91 end
|
|
92 else
|
|
93 args_handled_up_to = i-1;
|
|
94 break;
|
|
95 end
|
|
96 end
|
|
97
|
|
98 -- Remove all the handled args from the arg array
|
|
99 for n=(args_handled_up_to or #arg),1,-1 do
|
|
100 table.remove(arg, n);
|
|
101 end
|
|
102
|
|
103 return m(opts, arg) or 0;
|
|
104
|