Mercurial > prosody-modules
comparison mod_vcard_command/mod_vcard_command.lua @ 3025:5b8983e100da
mod_vcard_command: a simplistic way to get and set vcard data for registered users
Use "prosodyctl get user@example.com" to print the XML to stdout, and
"prosodyctl set user@example.com /file/name" to set the vcard info from
an xml file.
| author | Stefan `Sec` Zehl <sec@42.org> |
|---|---|
| date | Tue, 08 Oct 2013 16:38:40 +0000 |
| parents | |
| children | b2c9b832612b |
comparison
equal
deleted
inserted
replaced
| 3024:f54c80404ad3 | 3025:5b8983e100da |
|---|---|
| 1 ----------------------------------------------------------- | |
| 2 -- mod_vcard_command: Manage vcards through prosodyctl | |
| 3 -- version 0.02 | |
| 4 ----------------------------------------------------------- | |
| 5 -- Copyright (C) 2013 Stefan `Sec` Zehl | |
| 6 -- | |
| 7 -- This project is MIT/X11 licensed. Please see the | |
| 8 -- COPYING file in the source package for more information. | |
| 9 ----------------------------------------------------------- | |
| 10 | |
| 11 if not rawget(_G, "prosodyctl") then | |
| 12 module:log("error", "Do not load this module in Prosody"); | |
| 13 module.host = "*"; | |
| 14 return; | |
| 15 end | |
| 16 | |
| 17 | |
| 18 -- Workaround for lack of util.startup... | |
| 19 _G.bare_sessions = _G.bare_sessions or {}; | |
| 20 | |
| 21 local storagemanager = require "core.storagemanager"; | |
| 22 local datamanager = require "util.datamanager"; | |
| 23 local xml = require "util.xml"; | |
| 24 local jid = require "util.jid"; | |
| 25 local warn = prosodyctl.show_warning; | |
| 26 local st = require "util.stanza" | |
| 27 -- local vcards = module:open_store("vcard"); | |
| 28 | |
| 29 -- Print anything - including nested tables | |
| 30 function table_print (tt, indent, done) | |
| 31 done = done or {} | |
| 32 indent = indent or 0 | |
| 33 if type(tt) == "table" then | |
| 34 for key, value in pairs (tt) do | |
| 35 io.write(string.rep (" ", indent)) -- indent it | |
| 36 if type (value) == "table" and not done [value] then | |
| 37 done [value] = true | |
| 38 io.write(string.format("[%s] => table\n", tostring (key))); | |
| 39 io.write(string.rep (" ", indent+4)) -- indent it | |
| 40 io.write("(\n"); | |
| 41 table_print (value, indent + 7, done) | |
| 42 io.write(string.rep (" ", indent+4)) -- indent it | |
| 43 io.write(")\n"); | |
| 44 else | |
| 45 io.write(string.format("[%s] => %s\n", | |
| 46 tostring (key), tostring(value))) | |
| 47 end | |
| 48 end | |
| 49 else | |
| 50 io.write(tt .. "\n") | |
| 51 end | |
| 52 end | |
| 53 | |
| 54 -- Make a *one-way* subscription. User will see when contact is online, | |
| 55 -- contact will not see when user is online. | |
| 56 function vcard_get(user_jid) | |
| 57 local user_username, user_host = jid.split(user_jid); | |
| 58 if not hosts[user_host] then | |
| 59 warn("The host '%s' is not configured for this server.", user_host); | |
| 60 return; | |
| 61 end | |
| 62 storagemanager.initialize_host(user_host); | |
| 63 local vCard; | |
| 64 vCard = st.deserialize(datamanager.load(user_username, user_host, "vcard")); | |
| 65 if vCard then | |
| 66 print(vCard); | |
| 67 else | |
| 68 warn("The user '%s' has no vCard configured.",user_jid); | |
| 69 end | |
| 70 end | |
| 71 | |
| 72 function vcard_set(user_jid, file) | |
| 73 local user_username, user_host = jid.split(user_jid); | |
| 74 if not hosts[user_host] then | |
| 75 warn("The host '%s' is not configured for this server.", user_host); | |
| 76 return; | |
| 77 end | |
| 78 storagemanager.initialize_host(user_host); | |
| 79 local f = io.input(file); | |
| 80 local xmldata=io.read("*all"); | |
| 81 io.close(f); | |
| 82 | |
| 83 local vCard=st.preserialize(xml.parse(xmldata)); | |
| 84 | |
| 85 if vCard then | |
| 86 datamanager.store(user_username, user_host, "vcard", vCard); | |
| 87 else | |
| 88 warn("Could not parse the file."); | |
| 89 end | |
| 90 end | |
| 91 | |
| 92 function vcard_delete(user_jid) | |
| 93 local user_username, user_host = jid.split(user_jid); | |
| 94 if not hosts[user_host] then | |
| 95 warn("The host '%s' is not configured for this server.", user_host); | |
| 96 return; | |
| 97 end | |
| 98 storagemanager.initialize_host(user_host); | |
| 99 datamanager.store(user_username, user_host, "vcard", nil); | |
| 100 end | |
| 101 | |
| 102 function module.command(arg) | |
| 103 local command = arg[1]; | |
| 104 if not command then | |
| 105 warn("Valid subcommands: get | set | delete "); | |
| 106 return 0; | |
| 107 end | |
| 108 table.remove(arg, 1); | |
| 109 if command == "get" then | |
| 110 vcard_get(arg[1]); | |
| 111 return 0; | |
| 112 elseif command == "set" then | |
| 113 vcard_set(arg[1], arg[2]); | |
| 114 return 0; | |
| 115 elseif command == "delete" then | |
| 116 vcard_delete(arg[1]); | |
| 117 return 0; | |
| 118 else | |
| 119 warn("Unknown command: %s", command); | |
| 120 return 1; | |
| 121 end | |
| 122 return 0; | |
| 123 end |
