[ CREATING ROOMS ]
An interesting feature planned for this tutorial is the creation
of new rooms.
Before we dive in the code I'd like to talk a little bit more
about rooms and how they work in SmartFoxServer.
Basically everything in SmartFox is a Room. Every time you're interacting
with other users you're doing this in a room, whether there're 2
users only or 200, whether you're chatting, playing a game or drawing
on a whiteboard.
There are essentially two types of Rooms: rooms created by the
server (static) and rooms created by the clients
(dynamic).
Static rooms
The first type represents the default set of rooms for your application
and they will be always present in your zone; they're created
when at server boot and you won't be able to delete or alter them
unless you modify the config file and restart the server.
Open the config.xml located in the root of the SmartFoxServer
folder and you will find something like this code:
<Zone name="simpleChat">
<Rooms>
<Room name="The Hall" maxUsers="70" isPrivate="false" isTemp="false" isGame="false"
autoJoin="true" />
<Room name="The Kitchen" maxUsers="70" isPrivate="false" isTemp="false" isGame="false"/>
<Room name="The Garden" maxUsers="70" isPrivate="false" isTemp="false" isGame="false" />
<Room name="The Bathroom" maxUsers="70" isPrivate="false" isTemp="false" isGame="false" />
<Room name="The Garage" maxUsers="70" isPrivate="false" isTemp="false" isGame="false" />
<Room name="The Living Room" maxUsers="50" isPrivate="true" isTemp="false" pwd="piddu"
isGame="false" />
</Rooms>
</Zone>
Here's represented a zone named "simplechat"
and its set of default rooms that will be created as the server
is launched.
Every room tag can have the following attributes:
name = a unique room name (unique in this zone)
maxUsers = max capacity of the room
isPrivate = set to "true" if the room is password protected
isTemp = set to "true" if the room is temporary. All
dynamic rooms are set to "true"
isGame = set to "true" if the room holds a game
pwd = the room password
The only one mandatory attribute is the name, all the others can
also be skipped.
If you don't specify a maxUser value the default of 30 will be
used and the boolean parameters will be all set to "false".
The changes made to this config file won't be applied until you
restart the server.
Dynamic rooms
The second type of rooms can be dynamically created at runtime
by the client using the SmartFoxClient API.
These rooms can be destroyed by the server when there're no more
users inside, and its creator isn't logged anymore in the zone.
This means that if all users have logged out of the room but its
creator is still present in the zone the room will not be removed.
A dynamic room is created using the SmartFoxClient createRoom()
method like this:
- createRoom(roomObj)
The roomObj argument is an object with the following
properties:
name = a unique room name (unique in this zone)
maxUsers = max capacity of the room
isGame = set to "true" if the room holds a game
password = the room password
The code used in the "Advanced Chat"
to create a new room is the following:
- function makeNewRoom()
- {
- showWindow("newRoomWindow")
- }
-
- function createRoom(name, pwd, max)
- {
- hideWindow("newRoomWindow")
-
- var roomObj = new Object()
-
- roomObj.name = name
- roomObj.password = pwd
- roomObj.maxUsers = max
-
- smartfox.createRoom(roomObj)
- }
First we call the makeNewRoom function to show
a dialog box where the user will input the room name, password and
maximum capacity of the new room. When the "OK" button
in the window is pressed the createRoom() method
is called passing the values submitted by the user.
Finally the roomObj is passed to the SmartFoxClient
API mehtod, createRoom().
NOTE:
we have here two methods with the same name that may create a little
confusion. However is worth noticing that one exist in the main
timeline and the other exist only in the SmartFoxClient object called
smartfox. This is why there's no problem with using two identical
method names.
If the room is created succesfully it will immediately appear in
your room list. If something goes wrong (i.e. you've chosen a room
name that already exist) a onCreateRoomError will
be fired.
Here's how we handled it in the sample application:
- smartfox.onCreateRoomError = function(errorMsg)
- {
- var win = showWindow("errorWindow")
- win.errorMsg.text = errorMsg
- }
The handler shows an error dialog box and dynamically attaches
the error message sent by the server in the errorMsg text box.
[ PRIVATE MESSAGES ]
The last feature we have to talk about is how to send private
messages. PMs are very useful in a chat when you want to privately
talk for a while with another user. All private messages are exclusively
exchanged between two users, so no one else in the room can read
them.
In the previous part of the article we said that the PM function
was going to be activated when a user clicks on a name in the
user list component.
Here's the code from the source FLA:
- function userSelected()
- {
- uid = userList_lb.getSelectedItem().data
-
- // If it's not me...
- if (uid != smartfox.myUserId)
- {
- // store the recipient for later use
- _global.pmUid = uid
-
- var win = showWindow("pmWindow")
-
- var uList = smartfox.getActiveRoom().getUserList()
- var targetUsr = uList[uid]
-
- win.title_txt.text = "Send
a private message to " + targetUsr.getName()
- }
- }
You will notice that this function behaves pretty much like the
one we used for loggin in another room.
First of all we get the user id from the listbox data property
and we check that the id clicked is not our current user id. Then
we store this identifier in a _global variable for later use and
we show a dialog box where the user can write the message.
If you wish to inspect the window open the library (F11) and check
the clip called "pmWindow" in the "_windows"
folder.
When the "OK" button is clicked this code is executed:
- function sendMessage()
- {
- var m = message.text
- if (m.length > 0)
- {
- _parent.sendPrivateMessage(m, _global.pmUid)
- message.text = ""
- }
- }
The sendPrivateMessage() method takes two arguments:
the text of the message and the recipient id.
[ LOG OUT ]
We still have one control in the GUI which we didn't
talk about: the "Exit" button.
You can press this button at any time to log out of the chat, also
we have to handle another less predictable
possibility: an unexpected disconnection.
There are many factors that can lead to an abrupt server disconnection
like slow network connections, timeouts, server crashes, etc...
Whatever it will happen we have to deal with this problem:
- smartfox.onConnectionLost = function()
- {
- gotoAndStop("connect")
- }
The onConnectionLost is fired by the client API
when the socket connection is closed and the user will be sent back
to the login screen. The "EXIT" button is also handled
by the above function: when you will click on it a smartfox.disconnect()
command will be issued which in turn will close the socket connection.
By closing the connection the onConnectionLost
handler will be invoked.
Ok, that's almost all about the "Advanced Chat"
tutorial. At this point you should be able to start writing your
own variations on the "chat" theme as well as add new
interesting features to the applications seen so far.
Take your time with the code shown in these pages and try to experiment
on your own: it's always one of the best method to learn new things!
In the next chapters we will discuss more advanced topics like
"User variables" and we will build a simple Avatar Chat.
Stay tuned.
Lapo
|