diff options
Diffstat (limited to 'xmpp.lua')
-rw-r--r-- | xmpp.lua | 98 |
1 files changed, 64 insertions, 34 deletions
@@ -1,72 +1,102 @@ -local jid = 'wilson@ubq323.website' -local server = 'ubq323.website' -local auth = 'AHdpbHNvbgBncmVnb3J5PDM=' -local resource = 'cheese' - +local xmpp_conf = { + jid='wilson@ubq323.website', + server='ubq323.website', + auth='AHdpbHNvbgBncmVnb3J5PDM=', + resource='cheese', + muc='d@conference.ubq323.website', +} local cqueues = require'cqueues' local socket = require'cqueues.socket' +local xml = require'xml' +local X = xml.X +local xmlify = xml.xmlify +local pprint=require'pprint' +local discord=require'discord' -local function connect() - local sock = assert(socket.connect(server, 5222)) +local function connect(conf) + local sock = assert(socket.connect(conf.server, 5222)) sock:setmode('bn','bn') local start = ([[ -<?xml version='1.0'?><stream:stream from='%s' to='%s' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>]]):format(jid, server) +<?xml version='1.0'?><stream:stream from='%s' to='%s' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>]]):format(conf.jid, conf.server) -- state of the art xml parser local function check_and_send(test, text) local x = sock:read('-2048') - print(x) + assert(x:find(test)) if text then sock:write(text) end end + local function ietf_urn(v) return 'urn:ietf:params:xml:ns:xmpp-'..v end sock:write(start) - check_and_send('starttls', [[<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>]]) + check_and_send('starttls', xmlify(X.starttls{xmlns=ietf_urn"tls"})) check_and_send('proceed', nil) sock:starttls() sock:write(start) check_and_send('PLAIN', - ([[<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>%s</auth>]]):format(auth)) + xmlify(X.auth{xmlns=ietf_urn"sasl", mechanism='PLAIN', conf.auth})) check_and_send('success',start) - check_and_send('bind', ([[<iq type='set' id='aaa'> - <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><resource>%s</resource></bind></iq> - ]]):format(resource)) - check_and_send('jid','<presence/>') + check_and_send('bind', + xmlify(X.iq{type='set', id='aaaa', + X.bind{xmlns=ietf_urn"bind", X.resource{conf.resource}}})) + check_and_send('jid',X.presence{X.show{'chat'}}) return sock end -local mucs = { - 'ja@conference.ubq323.website', - 'a@conference.ubq323.website', -} +-- local mucs = { +-- 'ja@conference.ubq323.website', +-- 'a@conference.ubq323.website', +-- } -local xml = require'xml' -local pprint=require'pprint' -local function run_xmpp() - local sock = connect() +local function run_xmpp(cq) + local sock = connect(xmpp_conf) + + -- sock:write(xmlify( + -- X.presence{to=xmpp_conf.muc..'/wilson', + -- X.x{xmlns='http://jabber.org/protocol/muc', + -- X.history{maxstanzas='0'}}})) + + + -- cq:wrap(function() + -- local n = 1 + -- while true do + -- sock:write(xmlify( + -- X.message{to=xmpp_conf.muc, type='groupchat', + -- id='wilson_episode_'..n, + -- X.body{'i too am in episode '..n}})) + -- n=n+1 + -- cqueues.sleep(60) + -- end + -- end) + + sock:write(xmlify( + X.iq{type='get',to=xmpp_conf.muc, id='info1', + X.query{xmlns='http://jabber.org/protocol/disco#info'}})) - for _, muc in ipairs(mucs) do - sock:write(([[ - <presence to='%s'> - <x xmlns='http://jabber.org/protocol/muc'> - <history maxstanzas='0'/> - </x> - </presence>]]):format(muc .. '/wilson')) - end for x in xml.stanzae(function() return sock:read('-2048') end) do - -- pprint(x) + pprint(x) + print(xmlify(x)) local body = x'body' and x'body'[1] - if x.label == 'message' then pprint('M', x.xarg.from, body) end + if x.label == 'message' then + pprint('M', x.xarg.from, body) + if body == 'hi wilson' then + sock:write(xmlify( + X.message{to=xmpp_conf.muc, type='groupchat', + X.body{'hi '..x.xarg.from..'.'}})) + end + -- discord.grom(x.xarg.from, body or '*(there\'s no body here)*') + end end end local cq = cqueues.new() -cq:wrap(run_xmpp) +cq:wrap(run_xmpp, cq) + pprint(cq:loop()) |