I need to show for user why they got disconnected especially when they was log out by the system by other user with same username is logged in to zone.
The disconnect reason referenced by documentation for this case is UNKNOW so I decide to implement a custom login handler
Code: Select all
public void handleServerEvent(ISFSEvent event) throws SFSException
{
String name = (String) event.getParameter(SFSEventParam.LOGIN_NAME);
User user = getApi().getUserByName(name);
if (user != null)
{
trace("USER ALREADY EXISTING --> DISCONNECTING");
SFSObject data = new SFSObject();
data.putUtfString("username", user.getName());
sendForceDisconnect(data, user);
// getApi().disconnectUser(user);
}
else {
trace("Welcome new user: " + name);
}
}
public void sendForceDisconnect(SFSObject data, User user) {
trace("Sending force disconnect");
ArrayList<User> us = new ArrayList<>();
us.add(user);
getApi().sendExtensionResponse("force_disconnect", data, us, portalRoom,false);
}
17:23:02,558 INFO [SFSWorker:Ext:1] Extensions - {Portal}: Welcome new user: 1
17:23:02,563 INFO [SFSWorker:Ext:1] api.SFSApi - User login: { Zone: PortalRoom }, ( User Name: 1, Id: 0, Priv: 0, Sess: 127.0.0.1:56960 ) , Type: Unity / .Net
17:23:02,650 INFO [SFSWorker:Sys:2] api.SFSApi - Room joined: [ Room: PortalRoom, Id: 1, Group: default, isGame: false ], { Zone: PortalRoom }, ( User Name: 1, Id: 0, Priv: 0, Sess: 127.0.0.1:56960 ) , asSpect: false
17:23:07,552 INFO [SocketReader] sessions.DefaultSessionManager - Session created: { Id: 2, Type: DEFAULT, Logged: No, IP: 127.0.0.1:56966 } on Server port: 9933 <---> 56966
17:23:07,647 INFO [SFSWorker:Ext:1] Extensions - {Portal}: USER ALREADY EXISTING --> DISCONNECTING
17:23:07,647 INFO [SFSWorker:Ext:1] Extensions - {Portal}: Sending force disconnect
17:23:07,648 INFO [SFSWorker:Ext:1] scala.DefLI - User already logged in. Disconnecting previous instance : ( User Name: 1, Id: 0, Priv: 0, Sess: 127.0.0.1:56960 )
17:23:07,649 INFO [SFSWorker:Ext:1] sessions.DefaultSessionManager - Session removed: { Id: 1, Type: DEFAULT, Logged: Yes, IP: 127.0.0.1:56960 }
17:23:07,649 INFO [SFSWorker:Ext:1] api.SFSApi - User disconnected: { Zone: PortalRoom }, ( User Name: 1, Id: 0, Priv: 0, Sess: 127.0.0.1:56960 ) , SessionLen: 5086, Type: Unity / .Net
17:23:09,653 INFO [pool-1-thread-4] api.SFSApi - User login: { Zone: PortalRoom }, ( User Name: 1, Id: 1, Priv: 0, Sess: 127.0.0.1:56966 ) , Type: Unity / .Net
17:23:09,675 INFO [SFSWorker:Sys:2] api.SFSApi - Room joined: [ Room: PortalRoom, Id: 1, Group: default, isGame: false ], { Zone: PortalRoom }, ( User Name: 1, Id: 1, Priv: 0, Sess: 127.0.0.1:56966 ) , asSpect: false
And with this implement I got this log. But the device with user that logged in first not received the "force_disconnect" response from server.
Are there any reliable way to achieve this kind of behaviors? How do the first client know they got disconnect by this type of event?
FYI: I got my own server to validate user loggin but it's just API gate for request response and I decided to user smartfox as mechanic to detect realtime disconnecting events since I use it's for my online game in the apps