After disconnect, user is still logged in to zone/sfsAPI
Posted: 28 Dec 2025, 21:22
Im facing an issue where after a user disconnects, the server traces the message from internal sfsAPI that the session and user have been disconnected as expected.
However when the same user then tries to login, he gets a user already logged in error:
Login code, I dont think this is the issue, it just works as intended:
Disconnect code, this gets called after client API calls _sfs.Disconnect() as recommended in the docs and unity examples, OnApplicationQuit -> call sfs.Disconnect(), which then makes this event fire on server side as expected but somehow it isnt actually logging out our user:
Cheers
However when the same user then tries to login, he gets a user already logged in error:
Code: Select all
// FIRST LOGIN:
22:09:56,138 INFO [SocketReader] sessions.DefaultSessionManager - Session created: { Id: 1, Type: DEFAULT, Logged: No, IP: 127.0.0.1:65489 } on Server port: 9933 <---> 65489
22:09:56,189 INFO [SFSWorker:Ext:3] Extensions - {__lib__}: tester4@example.com
22:09:56,196 INFO [SFSWorker:Ext:3] Extensions - {__lib__}: Found join token in db, for user: tester4@example.com
22:09:56,196 INFO [SFSWorker:Ext:3] Extensions - {__lib__}: SUCCESS: Received join token matches and is not expired.
22:09:56,200 INFO [SFSWorker:Ext:3] Extensions - {__lib__}: Stored account_id 3 in session for email tester4@example.com
22:09:56,237 INFO [SFSWorker:Ext:3] api.SFSApi - User login: { Zone: MainZone }, ( User Name: tester4@example.com, Id: 0, Priv: 0, Sess: 127.0.0.1:65489 ) , Type: Unity
22:09:56,238 INFO [SFSWorker:Ext:3] Extensions - {ZoneExtension}: User joined zone.
22:09:56,282 INFO [SFSWorker:Ext:1] Extensions - {ZoneExtension}: Sent back to client: Characters
22:09:57,387 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: Character 3 selected and marked online.
22:09:57,388 INFO [SFSWorker:Ext:2] Extensions - {ZoneExtension}: Character selected
22:09:57,390 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: BaseDamage: 40
22:09:57,390 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: AttackDamageBonus: 1.0
22:09:57,391 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: Speed: 5.0
22:09:57,391 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: HealthMax: 200 -> 0 + 0
22:09:57,394 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: HealthMax+= 5
22:09:57,394 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: AttackDamageBonus: 1.0
22:09:57,395 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: Speed: 5.0
22:09:57,396 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: HealthMax: 352 -> 0 + 5
22:09:57,396 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: AttackDamageBonus: 1.04
22:09:57,397 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: Speed: 5.78
22:09:57,398 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: HealthMax: 657 -> 10 + 5
22:09:57,399 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: Added character for user : 0
22:09:58,587 INFO [SFSWorker:Ext:1] api.SFSApi - Room joined: [ MMORoom: Tutorial, Id: 1, Group: default, AOI: (50.0, 1.0, 50.0) ], { Zone: MainZone }, ( User Name: wolof, Id: 0, Priv: 0, Sess: 127.0.0.1:65489 ) , asSpect: false
22:09:58,587 INFO [SFSWorker:Ext:1] Extensions - {ZoneExtension}: joined into room in internal user room list?: [ MMORoom: Tutorial, Id: 1, Group: default, AOI: (50.0, 1.0, 50.0) ]
22:09:58,589 INFO [SFSWorker:Ext:4] Extensions - {RoomExtension}: Activated Node with index 1 and perimeter: X[0, 140], Y[-140, 0]
22:09:58,592 INFO [SFSWorker:Ext:4] Extensions - {RoomExtension}: User 0 entered room Tutorial
// FIRST LOGOUT ---> Session and User removed internally by sfsAPI and logged into our terminal(this is done by internal sfs api code):
22:10:00,012 INFO [SocketReader] sessions.DefaultSessionManager - Session removed: { Id: 1, Type: DEFAULT, Logged: Yes, IP: 127.0.0.1:65489 }
22:10:00,014 INFO [SFSWorker:Sys:4] api.SFSApi - User disconnected: { Zone: MainZone }, ( User Name: wolof, Id: 0, Priv: 0, Sess: 127.0.0.1:65489 ) , SessionLen: 3778, Type: Unity
// My own logout traces (not sfsAPI)
22:10:00,015 INFO [SFSWorker:Ext:1] Extensions - {ZoneExtension}: User 0 disconnect server event.
22:10:00,015 INFO [SFSWorker:Ext:1] Extensions - {__lib__}: Removing character from user : 0
22:10:00,047 INFO [SFSWorker:Ext:1] Extensions - {__lib__}: Character wolof (PID: 0 | dbId: 3) saved successfully.
22:10:00,054 INFO [SFSWorker:Ext:1] Extensions - {__lib__}: Logout: Marked character_id 3 offline. Rows updated: 1
22:10:00,058 INFO [SFSWorker:Ext:1] Extensions - {__lib__}: Logout: Logged event for character_id 3 (outcome: manual - time online: 00:00:02)
22:10:39,028 INFO [pool-1-thread-4] Extensions - {__lib__}: Periodic character save completed.
// SECOND LOGIN ATTEMPT ---> failed: api.SFSApi - Login error: Another user is already logged with the same name: tester4@example.com.
22:10:42,176 INFO [SocketReader] sessions.DefaultSessionManager - Session created: { Id: 2, Type: DEFAULT, Logged: No, IP: 127.0.0.1:65497 } on Server port: 9933 <---> 65497
22:10:42,208 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: tester4@example.com
22:10:42,208 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: ERROR: User is still logged in!
22:10:42,212 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: Found join token in db, for user: tester4@example.com
22:10:42,212 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: SUCCESS: Received join token matches and is not expired.
22:10:42,213 INFO [SFSWorker:Ext:2] Extensions - {__lib__}: Stored account_id 3 in session for email tester4@example.com
22:10:42,219 INFO [SFSWorker:Ext:2] api.SFSApi - Login error: Another user is already logged with the same name: tester4@example.com. Requested by: { Id: 2, Type: DEFAULT, Logged: No, IP: 127.0.0.1:65497 }
22:10:42,229 INFO [SocketReader] sessions.DefaultSessionManager - Session removed: { Id: 2, Type: DEFAULT, Logged: No, IP: 127.0.0.1:65497 }
Code: Select all
package event;
import com.smartfoxserver.bitswarm.sessions.ISession;
import com.smartfoxserver.v2.core.ISFSEvent;
import com.smartfoxserver.v2.core.SFSEventParam;
import com.smartfoxserver.v2.entities.data.SFSObject;
import com.smartfoxserver.v2.exceptions.SFSException;
import com.smartfoxserver.v2.exceptions.SFSLoginException;
import com.smartfoxserver.v2.extensions.BaseServerEventHandler;
import database.DatabaseManager;
import manager.StaticResources;
public class LoginEventHandler extends BaseServerEventHandler
{
@Override
public void handleServerEvent(ISFSEvent event) throws SFSException
{
// Grab parameters from client request
String email = (String) event.getParameter(SFSEventParam.LOGIN_NAME);
var loggedInUser = getApi().getUserByName(email);
StaticResources.Trace(email);
if (loggedInUser != null)
{
// getParentExtension().getParentZone().removeUser(email); // doesnt work either
StaticResources.Trace("ERROR: User is still logged in!");
// getApi().logout(loggedInUser); // this doesnt work either, subsequent login attempts still fail...
}
var extraData = (SFSObject) event.getParameter(SFSEventParam.LOGIN_IN_DATA);
short serverId = extraData.getShort("serverId");
String token = (String) extraData.getUtfString("join_token");
ISession session = (ISession) event.getParameter(SFSEventParam.SESSION);
try
{
DatabaseManager.Login(session, email, token, serverId); // just updates db values
}
catch (SFSLoginException e)
{
// Rethrow SFSLoginException to propagate to client
throw e;
}
catch (Exception e)
{
// Catch any unexpected exception and wrap in SFSLoginException
throw new SFSLoginException("An unexpected error occurred during login: " + e.getMessage());
}
}
}
Disconnect code, this gets called after client API calls _sfs.Disconnect() as recommended in the docs and unity examples, OnApplicationQuit -> call sfs.Disconnect(), which then makes this event fire on server side as expected but somehow it isnt actually logging out our user:
Code: Select all
package event;
import com.smartfoxserver.v2.extensions.BaseServerEventHandler;
import database.DatabaseManager;
import manager.CharacterManager;
import manager.StaticResources;
import manager.ZoneManager;
import com.smartfoxserver.v2.core.ISFSEvent;
import com.smartfoxserver.v2.core.SFSEventParam;
import com.smartfoxserver.v2.entities.User;
import com.smartfoxserver.v2.exceptions.SFSException;
public class DisconnectEventHandler extends BaseServerEventHandler
{
@Override
public void handleServerEvent(ISFSEvent event) throws SFSException
{
User user = (User) event.getParameter(SFSEventParam.USER);
trace("User " + user.getId() + " disconnect server event.");
ZoneManager.RemoveFromRoom(user); // remove from custom mapping, doesnt affect sfsAPI at all
CharacterManager.RemoveCharacter(user);
DatabaseManager.Logout(user, "manual");
// getParentExtension().getParentZone().removeUser(user); // also doesnt work
// StaticResources.Trace(user.getDump());
}
}