--[[ Lua MUC Component by Matthew Wild (MattJ) ]]rooms = { };function onPresence(msg) local room; room,server,nick = msg.to:match("^(.+)@(.+)/(.+)$"); if not (room and nick) then return; end -- We need to send an error if not rooms[room] then rooms[room] = { people = {} }; end BroadcastPresence(rooms[room].people, msg.to, msg.type); print("Type: "..msg.type.." type of type: "..type(msg.type),"\n"); if msg.type == "available" or msg.type == "" and not rooms[room].people[nick] then rooms[room].people[nick] = { ["nick"] = nick, ["jid"] = msg.fromFull, ["presence"] = msg.type }; for id, person in pairs(rooms[room].people) do SendPresence(msg.fromFull, person.presence, "", room.."@"..server.."/"..person.nick); end elseif msg.type == "unavailable" then RemoveFromRoom(rooms[room], msg.fromFull); end SendPresence(msg.fromFull, msg.type, "", msg.to);endfunction onMessage(msg) if msg.ntype == MSG_ERROR then return nil; end room, server = msg.to:match("^(.+)@(.+)$"); if not (room and server) then print("ERROR! Malformed JID? "..msg.to.."\n"); return nil; end --TODO: Reply with error server = server:lower(); if not rooms[room] then return; end BroadcastMessage(rooms[room].people, room.."@"..server.."/"..GetOccupantNick(room, msg.fromFull), msg.body); return nil;endfunction BroadcastPresence(people, from, ptype, text) for nick, t in pairs(people) do SendPresence(t.jid, ptype or "available", text or "", from); endendfunction BroadcastMessage(people, from, text, mtype) for id, t in pairs(people) do SendMessage(t.jid, from, text or "", "groupchat"); endendfunction GetOccupantNick(room, from) for id, t in pairs(rooms[room].people) do if CompareJIDs(t.jid, from) then return t.nick; end end return "Unknown Sender";endfunction CompareJIDs(j1, j2) j1node, j1server, j1res = j1:match("^(.+)@([%a%.]+)/?(.*)$"); j2node, j2server, j2res = j2:match("^(.+)@([%a%.]+)/?(.*)$"); if j1node == j2node and j1server:lower() == j2server:lower() and (j1res == j2res or j1res == "" or j2res == "") then return true; end return false;endfunction RemoveFromRoom(room, jid) for id, t in pairs(room.people) do if CompareJIDs(t.jid, from) then room.people[id] = nil; end endend