All pastes #284971 Raw Edit

Lua MUC Server

public lua v1 · immutable
#284971 ·published 2006-12-19 14:18 UTC
rendered paste body
--[[ 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