last_fetched = 0 xeps_by_number = {} xeps_by_shortname = {} function parse_xeps(body) for xep_string in body:gmatch(".-") do local number = xep_string:match("(.+)") local name = xep_string:match("(.+)") local xeptype = xep_string:match("(.+)") local status = xep_string:match("(.+)") local updated = xep_string:match("(.+)") local shortname = xep_string:match("(.+)") local abstract = xep_string:match("(.+)"):gsub("\n", "") xep = {number=number, name=name, type=xeptype, status=status, updated=updated, shortname=shortname, abstract=abstract} xeps_by_number[tonumber(number)] = xep xeps_by_shortname[shortname:upper()] = xep end end function update_xeps() local http = require("socket.http") http.TIMEOUT = 5 if os.time() > (last_fetched + 30 * 60) then b, c, h = http.request("http://xmpp.org/extensions/xeps.xml") if c == 200 then last_fetched = os.time() parse_xeps(b) end end end function xep_to_string(xep) return "XEP-"..xep["number"].."(Shortname "..xep["shortname"].."): "..xep["name"].."\n"..xep["type"].."/"..xep["status"].." Updated: "..xep["updated"] end function xep_command(command, params, message) update_xeps() local xep_number = tonumber(params) local xep if xep_number then xep = xeps_by_number[xep_number] else xep = xeps_by_shortname[params:upper()] end local reply if xep then reply = xep_to_string(xep) else reply = "Sorry, that XEP doesn't seem to exist" end swiftob_reply_to(message, reply) end swiftob_register_command("xep", "Anyone", "Lookup XEP data", xep_command)