Hi Scott...
I understood now how handlePresence works.. :)
and what happens for not working before was that my receiver user
was on-line but his status was 'Invisible' at gtalk page, so because
that handlePresence was not called.
thanks a lot
Cristiano
On 27/07/11 17:59, Scott Lewis wrote:
Hi Christiano,
On 7/27/2011 11:08 AM, Cristiano Gavião wrote:
Hi Scott,
yep, you are right... but I have change the ID because I'm
trying to following some tips from this thread: http://community.igniterealtime.org/thread/35976
Now I'm connecting... :D I think that my mistake was to setup
the ids on the product file instead of the launcher... because
the launcher is not updated once created... :(
but the ChatRobotApplication still not working properly...
The method handlePresence is trying to do something that is not
working. It is putting the fromChatId inside the rosterUsers:
public void handlePresence(ID fromID,
IPresence presence) {
System.out.println("handlePresence fromID="+fromID+"
presence="+presence);
IChatID fromChatID = (IChatID)
fromID.getAdapter(IChatID.class);
if (fromChatID != null) {
rosterUsers.put(fromChatID.getUsername() + "@" +
fromChatID.getHostname(), fromID);
}
and later rosterUsers is being compared with the TargetId that
I've setup... If my target is different from my sender, it will
never work... right ?
No...the handlePresence method is/should be called when your
*receiver* is added to your sender's roster after connection (i.e.
and is online/present). For example, if your sender/robot is
identified as
cvgaviao@xxxxxxxxx then the
sender (c4bizconsulting@xxxxxxxxx)
should have this method called
public void handlePresence(ID fromID, Presence presence) {
ID == cvgaviao@xxxxxxxxx
...(put cvgaviao@xxxxxxxxx into
rosterUsers
}
Then in the code that actually does the send...i.e.
// Get desired user ID from rosterUsers map. This is just
looking for a user that's active and on our contacts list
ID targetID = (ID) rosterUsers.get(originalArgs[2]);
This sets the targetID to the value that was put into rosterUsers
by the handlePresence method (should be ID=cvgaviao@xxxxxxxxx).
This simply builds in the assumption that the receiver is *on the
sender's contact list, and is active/present*. So you might need
to add cvgaviao@xxxxxxxxx to c4bizconsulting@xxxxxxxxx's
roster (if it's not already).
If you want to remove this restriction, and have the sender just
send to any receiver...i.e. one that may or may not be on your
contact list (if that's allowed by the service...I'm not sure
whether gtalk allows delivery of messages to arbitrary receivers
or not these days), then you could change the code to be like
this:
ID targetID =
IDFactory.getDefauilt().createID(client.getConnectNamespace(),originalArgs[2]);
// Construct message
String msgToSend = (message==null)?"Hi, I'm an ECF chat
robot.":message;
System.out.println("ECF chat robot example sending to
targetAccount=" + originalArgs[2] + " message="+msgToSend);
// Send message to targetID
client.sendChat(targetID, msgToSend);
Does this make sense? The reason this restriction was put in
place was that sometimes the services restrict message delivery
only to receivers that are on the sender's contact list (to reduce
IM spam, I'm sure).
Scott
|