All,
I'm sure I'm doing something wrong, but I've been banging up against the most frustrating problem having a bot create a chat room, and I've found some unusual behavior by looking at debugging output from the Exodus client. To begin with, I know that MUC is properly installed on my server because I can create conference rooms on the fly using Exodus.
I've been using the Net::Jabber Perl library to have a bot connect using MUCJoin (I have v1.28). The following is an outline of my code:
$jabber = new Net::Jabber::Client();
my ($status) = $jabber->Connect(hostname=>$j_server, port=>$j_port);
my (@result) = $jabber->AuthSend(username=>$user, password=>$pass, resource=>$resource);
$jabber->MUCJoin(room=>$room_name, server=>$j_chat_server, nick=>$chat_nickname);
If I look in the ".../jabber/spool/<chat server name>/" directory I don't see any files created, and I can't get another client to connect to that room (keep getting a "Forbidden" message in Exodus). Frustratingly, I have to restart the Jabber server before I can try to create this room with Exodus, which is annoying but not necessary for my project. I assume this is because the room is in some half-created state and the server is not allowing anyone else to create a room with the same name.
So I looked at the debug output from the Exodus connection/creation of the conference room and found that if I do what it does everything works fine. This amounts to the following, which as you can see is ugly and undesirable:
$jabber = new Net::Jabber::Client();
my ($status) = $jabber->Connect(hostname=>$j_server, port=>$j_port);
my (@result) = $jabber->AuthSend(username=>$user, password=>$pass, resource=>$resource);
$jabber->MUCJoin(room=>$room_name, server=>$j_chat_server, nick=>$chat_nickname);
# this is the first part of the hack protocol, which will send back a config "form",
# which describes the room's settings
my ($iq) = new Net::Jabber::IQ();
$iq->SetIQ(to=>$room_name.'@'.$j_chat_server, type=>"get");
my ($iq_type) = $iq->NewQuery();
$iq_type->SetXMLNS("http://jabber.org/protocol/muc#owner");
$jabber->Send($iq, 1);
# this is the second part of the hack that just accepts the default settings
my ($msg) =<<EOL;
<iq to="$room_name\@$j_chat_server" type="set"><query xmlns="http://jabber.org/protocol/muc#owner"><x type="submit" xmlns="jabber:x:data"><title>Room configuration</title><field var="logformat"><value>text</value></field><field var="logging"><value>0</value></field><field var="whois"><value>admins</value></field><field var="password"><value>0</value></field><field var="invites"><value>0</value></field><field var="invitation"><value>0</value></field><field var="privmsg"><value>0</value></field><field var="defaulttype"><value>0</value></field><field var="moderated"><value>0</value></field><field var="legacy"><value>1</value></field><field var="persistant"><value>0</value></field><field var="public"><value>1</value></field><field var="privacy"><value>1</value></field><field var="participants"><value>30</value></field><field var="subject"><value>0</value></field><field var="rename"><value>is now known as</value></field><field var="join"><value>has become available</value></field><field var="leave"><value>has left</value></field><field var="title"><value>t1</value></field><field var="form"><value>config</value></field></x></query></iq>
EOL
$jabber->Send($msg);
Now, this creates the room (by which I mean I see a file in ".../jabber/spool/<chat server name>/") which other clients can connect to. There are a couple of things I don't understand:
1) If I send any less than the complete registration form ("$msg" above) it doesn't work
2) Why do I have to take those extra steps at all? Shouldn't MUCJoin take care of all this for me? Does this imply a problem or is this expected behavior?
I've seen some unrelated posts about joining a MUC so my apologies if this is a known problem that I wasn't able to find.
-Vinny
