Software / code / clix
Annotate
clix.lua @ 33:f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sat, 29 May 2010 21:13:27 +0100 |
| parent | 32:cda6a004ff79 |
| child | 34:d4f8fc71d936 |
| rev | line source |
|---|---|
|
4
ead275885948
clix.lua: Add shebang for people who don't use squish
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
1 #!/usr/bin/env lua |
|
5
7209e1f8e66b
clix.lua, COPYING: Add COPYING file with MIT license, add copyright header to clix.lua
Matthew Wild <mwild1@gmail.com>
parents:
4
diff
changeset
|
2 -- Clix -- Command-line XMPP |
|
7209e1f8e66b
clix.lua, COPYING: Add COPYING file with MIT license, add copyright header to clix.lua
Matthew Wild <mwild1@gmail.com>
parents:
4
diff
changeset
|
3 -- Copyright (C) 2008-2010 Matthew Wild |
|
7209e1f8e66b
clix.lua, COPYING: Add COPYING file with MIT license, add copyright header to clix.lua
Matthew Wild <mwild1@gmail.com>
parents:
4
diff
changeset
|
4 -- |
|
7209e1f8e66b
clix.lua, COPYING: Add COPYING file with MIT license, add copyright header to clix.lua
Matthew Wild <mwild1@gmail.com>
parents:
4
diff
changeset
|
5 -- This project is MIT/X11 licensed. Please see the |
|
7209e1f8e66b
clix.lua, COPYING: Add COPYING file with MIT license, add copyright header to clix.lua
Matthew Wild <mwild1@gmail.com>
parents:
4
diff
changeset
|
6 -- COPYING file in the source package for more information. |
|
7209e1f8e66b
clix.lua, COPYING: Add COPYING file with MIT license, add copyright header to clix.lua
Matthew Wild <mwild1@gmail.com>
parents:
4
diff
changeset
|
7 -- |
| 0 | 8 require "verse" |
| 9 require "verse.client" | |
| 10 | |
|
8
df4cb4a73549
clix: Make short_opts table global, to allow commands to add their own short options
Matthew Wild <mwild1@gmail.com>
parents:
7
diff
changeset
|
11 -- Global to allow commands to add to it |
|
23
c5f04bdc7c64
clix, clix.raw: Move 'Connected as' to clix_connect(), and suppress on -q/--quiet
Matthew Wild <mwild1@gmail.com>
parents:
21
diff
changeset
|
12 short_opts = { v = "verbose", q = "quiet", t = "to", f = "from", e = "type", |
|
c5f04bdc7c64
clix, clix.raw: Move 'Connected as' to clix_connect(), and suppress on -q/--quiet
Matthew Wild <mwild1@gmail.com>
parents:
21
diff
changeset
|
13 a = "account", p = "password", r = "resource", o = "presence", c = "chatroom" } |
|
8
df4cb4a73549
clix: Make short_opts table global, to allow commands to add their own short options
Matthew Wild <mwild1@gmail.com>
parents:
7
diff
changeset
|
14 |
|
33
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
15 if #arg < 1 then |
| 0 | 16 print("Command Line XMPP, available commands:"); |
| 17 for module in pairs(package.preload) do | |
| 18 if module:match("^clix%.") then | |
| 19 local m = require(module); | |
|
28
c2998f70dfd4
clix: Pass short_help option to modules correctly
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
20 io.write("\t", module:gsub("^clix%.", ""), ": "); |
|
c2998f70dfd4
clix: Pass short_help option to modules correctly
Matthew Wild <mwild1@gmail.com>
parents:
23
diff
changeset
|
21 m({ short_help = true }, {}); |
| 0 | 22 end |
| 23 end | |
| 24 return 0; | |
| 25 end | |
| 26 | |
| 27 local accounts = { default = {} }; | |
| 28 local current_account; | |
|
32
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
29 |
|
33
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
30 local config_path = (os.getenv("XDG_CONFIG_HOME") or (os.getenv("HOME").."/.config")); |
|
32
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
31 local config_file, err = io.open(config_path.."/.clixrc") or io.open(config_path.."/.clix"); |
|
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
32 |
|
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
33 if not config_file then |
|
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
34 print("Unable to open config file... looked for "..config_path.."/.clixrc"); |
|
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
35 if err then print(err); end |
|
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
36 os.exit(1); |
|
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
37 end |
|
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
38 |
|
cda6a004ff79
clix.lua: Report when config file couldn't be found, change name to .clixrc and comply with fd.o's base directory specifications (now usually ~/.config/.clixrc)
Matthew Wild
parents:
28
diff
changeset
|
39 for line in config_file:lines() do |
| 0 | 40 line = line:match("^%s*(.-)%s*$"); |
| 41 if line:match("^%[") then | |
| 42 current_account = line:match("^%[(.-)%]"); | |
| 43 accounts[current_account] = {}; | |
| 44 if not current_account then -- This is the first defined account | |
| 45 accounts.default = accounts[current_account]; | |
| 46 end | |
| 47 elseif current_account then | |
| 48 local k,v = line:match("^(%w+)%s*[:=]%s*(.+)$"); | |
| 49 accounts[current_account or "default"][k] = v; | |
| 50 end | |
| 51 end | |
| 52 | |
| 53 function clix_connect(opts, on_connect) | |
| 54 local account = accounts[opts.account or "default"]; | |
| 55 if not (account and account.jid) then | |
| 56 io.stderr:write("The specified account (", opts.account or "default", ") wasn't found in the config file\n"); | |
| 57 return nil; | |
| 58 end | |
|
7
6078e8d2b59d
clix: Enable global Verse logger when verbose is enabled
Matthew Wild <mwild1@gmail.com>
parents:
5
diff
changeset
|
59 verse.set_logger(opts.verbose and print or function () end); |
|
2
fd77e75c4891
clix: Make more use of Verse's new logging controls
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
60 local conn = verse.new(verse.logger()); |
|
fd77e75c4891
clix: Make more use of Verse's new logging controls
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
61 conn.log.debug = opts.verbose; |
| 0 | 62 conn:hook("authentication-failure", function (err) |
|
2
fd77e75c4891
clix: Make more use of Verse's new logging controls
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
63 conn:error("Authentication failure ("..(err.condition or "unknown error")..")"..(err.text and (": "..err.text) or "")); |
|
14
1e927484c6ec
clix: Close connection after fatal error during login
Matthew Wild <mwild1@gmail.com>
parents:
13
diff
changeset
|
64 conn:close(); |
| 0 | 65 end); |
|
17
fa9efbef8a0c
Move presence sending into clix_connect(), and control with -o/--presence
Matthew Wild <mwild1@gmail.com>
parents:
15
diff
changeset
|
66 conn:hook("binding-success", function () |
|
23
c5f04bdc7c64
clix, clix.raw: Move 'Connected as' to clix_connect(), and suppress on -q/--quiet
Matthew Wild <mwild1@gmail.com>
parents:
21
diff
changeset
|
67 if not opts.quiet then |
|
c5f04bdc7c64
clix, clix.raw: Move 'Connected as' to clix_connect(), and suppress on -q/--quiet
Matthew Wild <mwild1@gmail.com>
parents:
21
diff
changeset
|
68 io.stderr:write("clix: connected as ", conn.jid, "\n"); |
|
c5f04bdc7c64
clix, clix.raw: Move 'Connected as' to clix_connect(), and suppress on -q/--quiet
Matthew Wild <mwild1@gmail.com>
parents:
21
diff
changeset
|
69 end |
|
21
cdeb02d9546d
clix, clix.send: Support for chatrooms (-c/--chatroom with --nick=somenick)
Matthew Wild <mwild1@gmail.com>
parents:
20
diff
changeset
|
70 if opts.chatroom then |
|
cdeb02d9546d
clix, clix.send: Support for chatrooms (-c/--chatroom with --nick=somenick)
Matthew Wild <mwild1@gmail.com>
parents:
20
diff
changeset
|
71 conn:send(verse.presence{to=opts.to.."/"..(opts.nick or "clix")}); |
|
cdeb02d9546d
clix, clix.send: Support for chatrooms (-c/--chatroom with --nick=somenick)
Matthew Wild <mwild1@gmail.com>
parents:
20
diff
changeset
|
72 end |
|
17
fa9efbef8a0c
Move presence sending into clix_connect(), and control with -o/--presence
Matthew Wild <mwild1@gmail.com>
parents:
15
diff
changeset
|
73 if opts.presence then |
|
fa9efbef8a0c
Move presence sending into clix_connect(), and control with -o/--presence
Matthew Wild <mwild1@gmail.com>
parents:
15
diff
changeset
|
74 conn:send(verse.presence()); |
|
fa9efbef8a0c
Move presence sending into clix_connect(), and control with -o/--presence
Matthew Wild <mwild1@gmail.com>
parents:
15
diff
changeset
|
75 end |
|
fa9efbef8a0c
Move presence sending into clix_connect(), and control with -o/--presence
Matthew Wild <mwild1@gmail.com>
parents:
15
diff
changeset
|
76 return on_connect(conn); |
|
fa9efbef8a0c
Move presence sending into clix_connect(), and control with -o/--presence
Matthew Wild <mwild1@gmail.com>
parents:
15
diff
changeset
|
77 end); |
| 0 | 78 conn:hook("binding-failure", function (err) |
|
2
fd77e75c4891
clix: Make more use of Verse's new logging controls
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
79 conn:error("Resource binding failure ("..(err.condition or "unknown error")..")"..(err.text and (": "..err.text) or "")); |
|
14
1e927484c6ec
clix: Close connection after fatal error during login
Matthew Wild <mwild1@gmail.com>
parents:
13
diff
changeset
|
80 conn:close(); |
| 0 | 81 end); |
| 82 conn:hook("disconnected", function (info) | |
| 83 if info.reason then | |
|
2
fd77e75c4891
clix: Make more use of Verse's new logging controls
Matthew Wild <mwild1@gmail.com>
parents:
0
diff
changeset
|
84 conn:warn("Disconnecting: %s", tostring(info.reason)); |
| 0 | 85 end |
| 86 verse.quit(); | |
| 87 end); | |
| 88 -- Optional config parameters | |
| 89 conn.connect_host = account.address; | |
| 90 conn.connect_port = account.port; | |
|
13
751db005032e
clix: Allow specifying the resource with -r/--resource
Matthew Wild <mwild1@gmail.com>
parents:
11
diff
changeset
|
91 |
| 0 | 92 -- Connect! |
|
15
54314164a2a3
clix: Allow -p/--password to specify the login password
Matthew Wild <mwild1@gmail.com>
parents:
14
diff
changeset
|
93 conn:connect_client(account.jid, opts.password or account.password); |
|
11
a502c905527c
clix: Handle errors (including 'interrupted!') in verse.loop()
Matthew Wild <mwild1@gmail.com>
parents:
8
diff
changeset
|
94 |
|
13
751db005032e
clix: Allow specifying the resource with -r/--resource
Matthew Wild <mwild1@gmail.com>
parents:
11
diff
changeset
|
95 if type(opts.resource) == "string" then |
|
751db005032e
clix: Allow specifying the resource with -r/--resource
Matthew Wild <mwild1@gmail.com>
parents:
11
diff
changeset
|
96 conn.resource = opts.resource; |
|
751db005032e
clix: Allow specifying the resource with -r/--resource
Matthew Wild <mwild1@gmail.com>
parents:
11
diff
changeset
|
97 end |
|
751db005032e
clix: Allow specifying the resource with -r/--resource
Matthew Wild <mwild1@gmail.com>
parents:
11
diff
changeset
|
98 |
|
11
a502c905527c
clix: Handle errors (including 'interrupted!') in verse.loop()
Matthew Wild <mwild1@gmail.com>
parents:
8
diff
changeset
|
99 local ok, ret = pcall(verse.loop); |
|
a502c905527c
clix: Handle errors (including 'interrupted!') in verse.loop()
Matthew Wild <mwild1@gmail.com>
parents:
8
diff
changeset
|
100 if not ok and not ret:match("interrupted!$") then |
|
a502c905527c
clix: Handle errors (including 'interrupted!') in verse.loop()
Matthew Wild <mwild1@gmail.com>
parents:
8
diff
changeset
|
101 io.stderr:write("Fatal error: ", ret, "\n"); |
|
a502c905527c
clix: Handle errors (including 'interrupted!') in verse.loop()
Matthew Wild <mwild1@gmail.com>
parents:
8
diff
changeset
|
102 return 1; |
|
a502c905527c
clix: Handle errors (including 'interrupted!') in verse.loop()
Matthew Wild <mwild1@gmail.com>
parents:
8
diff
changeset
|
103 end |
|
a502c905527c
clix: Handle errors (including 'interrupted!') in verse.loop()
Matthew Wild <mwild1@gmail.com>
parents:
8
diff
changeset
|
104 return err or 0; |
| 0 | 105 end |
| 106 | |
| 107 table.remove(arg,1); | |
| 108 | |
| 109 local opts = {}; | |
| 110 | |
| 111 local args_handled_up_to; | |
| 112 for i, opt in ipairs(arg) do | |
| 113 if opt:match("^%-") and opt ~= "--" then | |
| 114 local name = opt:match("^%-%-?([^%s=]+)()") | |
| 115 name = (short_opts[name] or name):gsub("%-+", "_"); | |
| 116 if name:match("^no_") then | |
| 117 name = name:sub(4, -1); | |
| 118 opts[name] = false; | |
| 119 else | |
| 120 opts[name] = opt:match("=(.*)$") or true; | |
| 121 end | |
| 122 else | |
| 123 args_handled_up_to = i-1; | |
| 124 break; | |
| 125 end | |
| 126 end | |
| 127 | |
| 128 -- Remove all the handled args from the arg array | |
| 129 for n=(args_handled_up_to or #arg),1,-1 do | |
| 130 table.remove(arg, n); | |
| 131 end | |
| 132 | |
|
33
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
133 local command = arg[1]; |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
134 |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
135 local ok, m = pcall(require, "clix."..command); |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
136 if not ok then |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
137 local is_debug; |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
138 for i=1,#arg do |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
139 if arg[i] == "--debug" then |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
140 is_debug = true; break; |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
141 end |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
142 end |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
143 print("Error running command '"..command..(is_debug and "" or "' (run with --debug to see full error)")); |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
144 if is_debug then |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
145 print(m); |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
146 end |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
147 return 1; |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
148 end |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
149 |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
150 if type(m) ~= "function" then |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
151 print(command.." is not a valid command"); |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
152 return 1; |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
153 end |
|
f1901c9de891
clix.lua: Improvements to argument handling and command detection. In particular options may now precede commands.
Matthew Wild <mwild1@gmail.com>
parents:
32
diff
changeset
|
154 |
| 0 | 155 return m(opts, arg) or 0; |
| 156 |