Software /
code /
clix
File
clix.coro.lua @ 0:ae83411a89c9
Initial commit
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 06 Jan 2010 03:50:37 +0000 |
line wrap: on
line source
require "verse" require "verse.client" local command = arg[1]; if not command then print("Command Line XMPP, available commands:"); for module in pairs(package.preload) do if module:match("^clix%.") then local m = require(module); m{ "--short-help" }; end end return 0; end local ok, m = pcall(require, "clix."..command); if not ok then print("Error running command '"..command.."' (run with --debug to see full error)"); if arg[2] == "--debug" then print(m); end return 1; end if type(m) ~= "function" then print(command.." is not a valid command"); return 1; end local accounts = { default = {} }; local current_account; for line in io.lines(os.getenv("HOME").."/.clix") do line = line:match("^%s*(.-)%s*$"); if line:match("^%[") then current_account = line:match("^%[(.-)%]"); accounts[current_account] = {}; if not current_account then -- This is the first defined account accounts.default = accounts[current_account]; end elseif current_account then local k,v = line:match("^(%w+)%s*[:=]%s*(.+)$"); accounts[current_account or "default"][k] = v; end end function clix_connect(opts) local account = accounts[opts.account or "default"]; if not (account and account.jid) then io.stderr:write("The specified account (", opts.account or "default", ") wasn't found in the config file\n"); return nil; end local conn = verse.new(); local co_verse = coroutine.create(verse.loop); function conn:go(...) return coroutine.resume(co_verse, ...); end conn:hook("authentication-failure", function (err) io.stderr:write("Authentication failure (",err.condition or "unknown error", ")", err.text and (": "..err.text) or "", "\n"); coroutine.yield(nil, "authentication-failure"); end); conn:hook("binding-success", function () io.stderr:write("Connected: ", tostring(conn), "\n"); coroutine.yield(conn); end); conn:hook("binding-failure", function (err) io.stderr:write("Authentication failure (",err.condition or "unknown error", ")", err.text and (": "..err.text) or "", "\n"); coroutine.yield(nil, "authentication-failure"); end); -- Optional config parameters conn.connect_host = account.address; conn.connect_port = account.port; -- Connect! conn:connect_client(account.jid, account.password); return coroutine.resume(co_verse); end table.remove(arg,1); local short_opts = { v = "verbose", t = "to", f = "from", e = "type", a = "account", p = "password" } local opts = {}; for i, opt in ipairs(arg) do if opt:match("^%-") and opt ~= "--" then local name = opt:match("^%-%-?([^%s=]+)()") name = (short_opts[name] or name):gsub("%-+", "_"); if name:match("^no_") then name = name:sub(4, -1); opts[name] = false; else opts[name] = opt:match("=(.*)$") or true; end else -- Remove all the handled args from the arg array for n=1,(i-1) do table.remove(arg, n); end break; end end return m(opts, arg) or 0;