Create room server side on login event

Post here your questions about SFS2X. Here we discuss all server-side matters. For client API questions see the dedicated forums.

Moderators: Lapo, Bax

Skills07
Posts: 103
Joined: 07 Nov 2016, 14:54
Location: Italy

Create room server side on login event

Postby Skills07 » 10 Apr 2017, 08:34

Hello

we're doing a videogame, and we have setted a procedure to create rooms server side.
Now our rooms are created when a player create a clan, and when he has created a clan, we generate a clan room.
When all the members of the clan are disconnected we destroy the room of the clan.
We need this to doing a chat group.
Now to recreate the room we have think to do this.
When a member is login, we research into the database if he has a clan, and then create the clan room if room is not active.
But i have problem to write the procedure server side.
I post my code to show what i need

Code: Select all

public class LoginEventHandler extends BaseServerEventHandler {
   @Override
   public void handleServerEvent(ISFSEvent event) throws SFSException {
      // TODO Auto-generated method stub
      trace("Sto chiedendo al server di loggare un utente");
      // Grab parameters from client request
      String userName = (String) event.getParameter(SFSEventParam.LOGIN_NAME);
       String cryptedPass = (String) event.getParameter(SFSEventParam.LOGIN_PASSWORD);
      //String email = (String)event.getParameter(SFSEventParam.LOGIN_PASSWORD);
      ISession session = (ISession) event.getParameter(SFSEventParam.SESSION);
      trace("Username----------" + userName);
      trace("Password----------" + cryptedPass);
      trace("Session----------" + session);
      
       ISFSObject outData = (ISFSObject) event.getParameter(SFSEventParam.LOGIN_OUT_DATA);
         User user = null;
         // Add data to the object
         
      
      // Get password from DB
      IDBManager dbManager = getParentExtension().getParentZone().getDBManager();
      Connection connection = null;
   

      // Grab a connection from the DBManager connection pool
        try {
         connection = dbManager.getConnection();

         // Build a prepared statement
           PreparedStatement stmt = connection.prepareStatement("SELECT username, password, trofei, gold, gems ,guesswho.users.position, clan_name, guesswho.clan.position as postoclan, trofei_total "
                 + "FROM Users "
                 + "left outer join guesswho.clan on guesswho.users.id_user = guesswho.clan.utente_fondatore "
               + "or guesswho.users.id_user = guesswho.clan.utente_2 "
               + "or guesswho.users.id_user = guesswho.clan.utente_3 "
               + "or guesswho.users.id_user = guesswho.clan.utente_4 "
               + "or guesswho.users.id_user = guesswho.clan.utente_5 "
               + "or guesswho.users.id_user = guesswho.clan.utente_6 "
               + "or guesswho.users.id_user = guesswho.clan.utente_7 "
               + "or guesswho.users.id_user = guesswho.clan.utente_8 "
               + "or guesswho.users.id_user = guesswho.clan.utente_9 "
               + "or guesswho.users.id_user = guesswho.clan.utente_10 "
               + "or guesswho.users.id_user = guesswho.clan.utente_11 "
               + "or guesswho.users.id_user = guesswho.clan.utente_12 "
               + "or guesswho.users.id_user = guesswho.clan.utente_13 "
               + "or guesswho.users.id_user = guesswho.clan.utente_14 "
               + "or guesswho.users.id_user = guesswho.clan.utente_15 "
               + "or guesswho.users.id_user = guesswho.clan.utente_16 "
               + "or guesswho.users.id_user = guesswho.clan.utente_17 "
               + "or guesswho.users.id_user = guesswho.clan.utente_18 "
               + "or guesswho.users.id_user = guesswho.clan.utente_19 "
               + "or guesswho.users.id_user = guesswho.clan.utente_20 "
                 + "where username='"+userName+"'");
          
      
               

          // Execute query
          ResultSet res = stmt.executeQuery();
         
          while(res.next())
         {

            String username = res.getString("username");
            trace(username);
            int trofei = res.getInt("trofei");
            trace(trofei);
            
            int gold = res.getInt("gold");
            trace(gold);
            int gems = res.getInt("gems");
            trace(gems);
            String position = res.getString("position");
            
            if (position == null){
               position = "";
            }
            trace(position);
            
            String clan_name = res.getString("clan_name");
            
            if (clan_name == null){
               clan_name = "";
            }
            trace(clan_name);
            
            String clan_position = res.getString("postoclan");
            
            if(clan_position == null){
               clan_position = "";
            }
            trace(clan_position);
            
            int trofei_clan = res.getInt("trofei_total");
            trace(trofei_clan);
            
            outData.putUtfString("nome_utente", username);
            outData.putInt("trofei", trofei);
            outData.putInt("gold", gold);
            outData.putInt("gems", gems);
            outData.putUtfString("position", position);
            outData.putUtfString("clan_name", clan_name);
            outData.putUtfString("clan_position", clan_position);
            outData.putInt("trofei_clan", trofei_clan);
            
            // createRoom(user,clan_name);
         }
         
          //outData.putInt("number", 100);
         // Verify that one record was found
          if (!res.first())
          {
             // This is the part that goes to the client
             SFSErrorData errData = new SFSErrorData(SFSErrorCode.LOGIN_BAD_USERNAME);
             errData.addParameter(userName);
                trace("mi sono intoppato qui???");
             // Sends response if user gave incorrect user name
             throw new SFSLoginException("Bad user name: " + userName, errData);
             
          }
          
          

          String dbPword = res.getString("password");

         // Verify the secure password
         if (!getApi().checkSecurePassword(session, dbPword, cryptedPass))
         {
            trace("mi sono intoppato dopo???");
            SFSErrorData data = new SFSErrorData(SFSErrorCode.LOGIN_BAD_PASSWORD);
            data.addParameter(userName);
            // Sends response if user gave incorrect password
            throw new SFSLoginException("Login failed for user: "  + userName, data);
         }

        }

        // User name was not found
        catch (SQLException e)
        {
           SFSErrorData errData = new SFSErrorData(SFSErrorCode.GENERIC_ERROR);
           errData.addParameter("SQL Error: " + e.getMessage());
           trace("mi sono intoppato qui 2???");
           // Sends response about mysql errors
           throw new SFSLoginException("A SQL Error occurred: " + e.getMessage(), errData);
        }
        finally {
           try{
              connection.close();
           }catch (SQLException e){
              throw new SFSLoginException("A SQL Error occurred: " + e.getMessage());
           }
        }

    }
   
   private void createRoom(User sender, String clanname){
       String clan_name = clanname;
         //Room myfirstroom = getParentExtension().getParentZone().getRoomByName(clan_name);
         RoomExtensionSettings res = new RoomExtensionSettings("Server","clanserver.ClanExtension");
               CreateRoomSettings crs = new CreateRoomSettings();
              
            
               crs.setName(clan_name);
               crs.setGroupId("clan_name " + clan_name);
               crs.setMaxVariablesAllowed(20);
               crs.setMaxUsers(20);
               crs.setAutoRemoveMode(SFSRoomRemoveMode.NEVER_REMOVE);
               crs.setDynamic(true);
              
               crs.setExtension(res);
              
              
                 
                  ISFSObject reback = SFSObject.newInstance();
                  try {
                     getApi().createRoom(sender.getZone(),crs,sender);
                     reback.putBool("success", true);
                  } catch (SFSCreateRoomException e) {
                     e.printStackTrace();
                     reback.putBool("success", false);
                  }finally{
                     send("createRoom", reback, sender);
                  }
               }
              
            
            



i have problem because the method createRoom needs a user, on the other handler is different because i call the execution when a user is logged in.

How can i do my procedure on my explaination??

Thanks to all for the help
MrHaka
Posts: 4
Joined: 10 Apr 2017, 04:30

Re: Create room server side on login event

Postby MrHaka » 10 Apr 2017, 08:44

After login success, user logged has been join zone. So you can check and recreate room clan in JOIN_ZONE event!
User avatar
Lapo
Site Admin
Posts: 23027
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Create room server side on login event

Postby Lapo » 10 Apr 2017, 09:45

The createRoom requires a User object but it will accept a null value. When you use null the Room is owned by the server itself. So in the end you don't need a User to create a Room.

Hope it helps
Lapo
--
gotoAndPlay()
...addicted to flash games
Skills07
Posts: 103
Joined: 07 Nov 2016, 14:54
Location: Italy

Re: Create room server side on login event

Postby Skills07 » 10 Apr 2017, 10:18

so i can create something like this

User user = null;


and then pass user to my method create room

createRoom(user,clan_name);

where this user is what i declare before in a null value

but if i do this i have this

Code: Select all

10 apr 2017 | 12:27:15,017 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | STATE: WAIT_NEW_PACKET
10 apr 2017 | 12:27:15,017 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | NORMAL SIZED PACKET: 82
10 apr 2017 | 12:27:15,017 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | <<< PACKET COMPLETE >>>
10 apr 2017 | 12:27:15,018 | DEBUG | SFSWorker:Sys:2 | v2.protocol.SFSProtocolCodec |     |
   (sfs_object) p:
      (utf_string) zn: Login
      (utf_string) pw: 966c03add354633bd284ba35aef50448
      (utf_string) un: chry
      
   
   (short) a: 1
   (byte) c: 0
   

10 apr 2017 | 12:27:15,019 | DEBUG | SFSWorker:Sys:2 | controllers.v290.SystemReqController |     | {IN}: Login
10 apr 2017 | 12:27:15,024 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: Sto chiedendo al server di loggare un utente
10 apr 2017 | 12:27:15,026 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: Username----------chry
10 apr 2017 | 12:27:15,028 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: Password----------966c03add354633bd284ba35aef50448
10 apr 2017 | 12:27:15,028 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: Session----------{ Id: 1, Type: DEFAULT, Logged: No, IP: 127.0.0.1:65512 }
10 apr 2017 | 12:27:15,035 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: chry
10 apr 2017 | 12:27:15,037 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 10000
10 apr 2017 | 12:27:15,038 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 1000000
10 apr 2017 | 12:27:15,038 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 20000
10 apr 2017 | 12:27:15,039 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: italy
10 apr 2017 | 12:27:15,039 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 
10 apr 2017 | 12:27:15,039 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 
10 apr 2017 | 12:27:15,040 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 0
10 apr 2017 | 12:27:15,042 | WARN  | SFSWorker:Ext:4 | entities.managers.SFSExtensionManager |     | java.lang.NullPointerException:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Exception: java.lang.NullPointerException
Message: *** Null ***
Description: Error during event handling: java.lang.NullPointerException, Listener: { Ext: Server, Type: JAVA, Lev: ZONE, { Zone: Login }, {} }
+--- --- ---+
Stack Trace:
+--- --- ---+
com.smartfoxserver.v2.api.SFSApi.sendExtensionResponse(SFSApi.java:1511)
com.smartfoxserver.v2.extensions.BaseSFSExtension.send(BaseSFSExtension.java:450)
com.smartfoxserver.v2.extensions.BaseSFSExtension.send(BaseSFSExtension.java:425)
com.smartfoxserver.v2.extensions.BaseServerEventHandler.send(BaseServerEventHandler.java:51)
loginserver.LoginEventHandler.createRoom(LoginEventHandler.java:207)
loginserver.LoginEventHandler.handleServerEvent(LoginEventHandler.java:130)
com.smartfoxserver.v2.extensions.SFSExtension.handleServerEvent(SFSExtension.java:259)
com.smartfoxserver.v2.entities.managers.SFSExtensionManager.dispatchEvent(SFSExtensionManager.java:768)
com.smartfoxserver.v2.entities.managers.SFSExtensionManager.dispatchZoneLevelEvent(SFSExtensionManager.java:689)
com.smartfoxserver.v2.entities.managers.SFSExtensionManager.handleServerEvent(SFSExtensionManager.java:886)
com.smartfoxserver.v2.core.SFSEventManager$SFSEventRunner.run(SFSEventManager.java:65)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

10 apr 2017 | 12:27:46,496 | INFO  | Scheduler1-thread-1 | bitswarm.sessions.DefaultSessionManager |     | Session removed: { Id: 1, Type: DEFAULT, Logged: No, IP: 127.0.0.1:65512 }
10 apr 2017 | 12:27:46,502 | DEBUG | Scheduler1-thread-1 | bitswarm.sessions.DefaultSessionManager |     | Removed idle session: { Id: 1, Type: DEFAULT, Logged: No, IP: 127.0.0.1:65512 }
User avatar
Lapo
Site Admin
Posts: 23027
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Create room server side on login event

Postby Lapo » 10 Apr 2017, 10:34

The error is caused by a send(...) call in your Extension, not by the createRoom() call.
Check your code, as per the stack trace:

Code: Select all

loginserver.LoginEventHandler.createRoom(LoginEventHandler.java:207)
Lapo

--

gotoAndPlay()

...addicted to flash games
Skills07
Posts: 103
Joined: 07 Nov 2016, 14:54
Location: Italy

Re: Create room server side on login event

Postby Skills07 » 10 Apr 2017, 10:41

Lapo wrote:The error is caused by a send(...) call in your Extension, not by the createRoom() call.
Check your code, as per the stack trace:

Code: Select all

loginserver.LoginEventHandler.createRoom(LoginEventHandler.java:207)


the problem is here

Code: Select all

  ISFSObject reback = SFSObject.newInstance();
                  try {
                     getApi().createRoom(sender.getZone(),crs,sender);
                     reback.putBool("success", true);
                  } catch (SFSCreateRoomException e) {
                     e.printStackTrace();
                     reback.putBool("success", false);
                  }finally{
   [b][i][u]                  send("createRoom", reback, sender);[/u][/i][/b]
                  }
               }



on send

how can i solve?
User avatar
Lapo
Site Admin
Posts: 23027
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Create room server side on login event

Postby Lapo » 10 Apr 2017, 10:44

We just said that you need to pass null to the createRoom method, so why are you passing "sender"?
Use null as we said

Code: Select all

getApi().createRoom(sender.getZone(),crs,null);


and make sure the sender variable is not null.
Lapo

--

gotoAndPlay()

...addicted to flash games
Skills07
Posts: 103
Joined: 07 Nov 2016, 14:54
Location: Italy

Re: Create room server side on login event

Postby Skills07 » 10 Apr 2017, 10:50

Lapo wrote:We just said that you need to pass null to the createRoom method, so why are you passing "sender"?
Use null as we said

Code: Select all

getApi().createRoom(sender.getZone(),crs,null);


and make sure the sender variable is not null.


i have replaced the code but same error

Code: Select all

   ISFSObject reback = SFSObject.newInstance();
                  try {
                     //getApi().createRoom(sender.getZone(),crs,sender);
                     getApi().createRoom(sender.getZone(),crs,null);
                     reback.putBool("success", true);
                  } catch (SFSCreateRoomException e) {
                     e.printStackTrace();
                     reback.putBool("success", false);
                  }finally{
                     send("createRoom", reback, sender);
                  }
               }
              



on finally statement
User avatar
Lapo
Site Admin
Posts: 23027
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Create room server side on login event

Postby Lapo » 10 Apr 2017, 10:55

Once again ---> make sure the sender variable is not null.
Lapo

--

gotoAndPlay()

...addicted to flash games
Skills07
Posts: 103
Joined: 07 Nov 2016, 14:54
Location: Italy

Re: Create room server side on login event

Postby Skills07 » 10 Apr 2017, 10:58

Lapo wrote:Once again ---> make sure the sender variable is not null.


Code: Select all

ISFSObject outData = (ISFSObject) event.getParameter(SFSEventParam.LOGIN_OUT_DATA);
         User user = null;
         




User user is null...

and then

Code: Select all

  ResultSet res = stmt.executeQuery();
         
          while(res.next())
         {

            String username = res.getString("username");
            trace(username);
            int trofei = res.getInt("trofei");
            trace(trofei);
            
            int gold = res.getInt("gold");
            trace(gold);
            int gems = res.getInt("gems");
            trace(gems);
            String position = res.getString("position");
            
            if (position == null){
               position = "";
            }
            trace(position);
            
            String clan_name = res.getString("clan_name");
            
            if (clan_name == null){
               clan_name = "";
            }
            trace(clan_name);
            
            String clan_position = res.getString("postoclan");
            
            if(clan_position == null){
               clan_position = "";
            }
            trace(clan_position);
            
            int trofei_clan = res.getInt("trofei_total");
            trace(trofei_clan);
            
            outData.putUtfString("nome_utente", username);
            outData.putInt("trofei", trofei);
            outData.putInt("gold", gold);
            outData.putInt("gems", gems);
            outData.putUtfString("position", position);
            outData.putUtfString("clan_name", clan_name);
            outData.putUtfString("clan_position", clan_position);
            outData.putInt("trofei_clan", trofei_clan);
            
            
            //if(clan_name != null || clan_name != ""){
            createRoom(user,clan_name);
            //}
         }



i'm not istantiate anything, only the declaration to user user = null;
Skills07
Posts: 103
Joined: 07 Nov 2016, 14:54
Location: Italy

Re: Create room server side on login event

Postby Skills07 » 11 Apr 2017, 07:16

i'm doing some tentatives:

The first is this

Code: Select all

 ISFSObject reback = SFSObject.newInstance();
                  try {
                     //getApi().createRoom(sender.getZone(),crs,sender);
                     getApi().createRoom(sender.getZone(),crs,null);
                     reback.putBool("success", true);
                  } catch (SFSCreateRoomException e) {
                     e.printStackTrace();
                     reback.putBool("success", false);
                  }finally{
                     //send("createRoom", reback, sender);
                  }
               }


i have commented the finally statement

and then i have error on this line of code:

Code: Select all

   getApi().createRoom(sender.getZone(),crs,null);


So if i have a null user why it does not accept the null value??

Sender is my user and user is null....

Can someone explain me what i'm doing wrong?

I post the code of all the class of the login

Code: Select all

public class LoginEventHandler extends BaseServerEventHandler {
   @Override
   public void handleServerEvent(ISFSEvent event) throws SFSException {
      // TODO Auto-generated method stub
      trace("Sto chiedendo al server di loggare un utente");
      // Grab parameters from client request
      String userName = (String) event.getParameter(SFSEventParam.LOGIN_NAME);
       String cryptedPass = (String) event.getParameter(SFSEventParam.LOGIN_PASSWORD);
      //String email = (String)event.getParameter(SFSEventParam.LOGIN_PASSWORD);
      ISession session = (ISession) event.getParameter(SFSEventParam.SESSION);
      trace("Username----------" + userName);
      trace("Password----------" + cryptedPass);
      trace("Session----------" + session);
      
       ISFSObject outData = (ISFSObject) event.getParameter(SFSEventParam.LOGIN_OUT_DATA);
         User user = null;
         // Add data to the object
         
      
      // Get password from DB
      IDBManager dbManager = getParentExtension().getParentZone().getDBManager();
      Connection connection = null;
   

      // Grab a connection from the DBManager connection pool
        try {
         connection = dbManager.getConnection();

         // Build a prepared statement
           PreparedStatement stmt = connection.prepareStatement("SELECT username, password, trofei, gold, gems ,guesswho.users.position, clan_name, guesswho.clan.position as postoclan, trofei_total "
                 + "FROM Users "
                 + "left outer join guesswho.clan on guesswho.users.id_user = guesswho.clan.utente_fondatore "
               + "or guesswho.users.id_user = guesswho.clan.utente_2 "
               + "or guesswho.users.id_user = guesswho.clan.utente_3 "
               + "or guesswho.users.id_user = guesswho.clan.utente_4 "
               + "or guesswho.users.id_user = guesswho.clan.utente_5 "
               + "or guesswho.users.id_user = guesswho.clan.utente_6 "
               + "or guesswho.users.id_user = guesswho.clan.utente_7 "
               + "or guesswho.users.id_user = guesswho.clan.utente_8 "
               + "or guesswho.users.id_user = guesswho.clan.utente_9 "
               + "or guesswho.users.id_user = guesswho.clan.utente_10 "
               + "or guesswho.users.id_user = guesswho.clan.utente_11 "
               + "or guesswho.users.id_user = guesswho.clan.utente_12 "
               + "or guesswho.users.id_user = guesswho.clan.utente_13 "
               + "or guesswho.users.id_user = guesswho.clan.utente_14 "
               + "or guesswho.users.id_user = guesswho.clan.utente_15 "
               + "or guesswho.users.id_user = guesswho.clan.utente_16 "
               + "or guesswho.users.id_user = guesswho.clan.utente_17 "
               + "or guesswho.users.id_user = guesswho.clan.utente_18 "
               + "or guesswho.users.id_user = guesswho.clan.utente_19 "
               + "or guesswho.users.id_user = guesswho.clan.utente_20 "
                 + "where username='"+userName+"'");
          
      
               

          // Execute query
          ResultSet res = stmt.executeQuery();
         
          while(res.next())
         {

            String username = res.getString("username");
            trace(username);
            int trofei = res.getInt("trofei");
            trace(trofei);
            
            int gold = res.getInt("gold");
            trace(gold);
            int gems = res.getInt("gems");
            trace(gems);
            String position = res.getString("position");
            
            if (position == null){
               position = "";
            }
            trace(position);
            
            String clan_name = res.getString("clan_name");
            
            if (clan_name == null){
               clan_name = "";
            }
            trace(clan_name);
            
            String clan_position = res.getString("postoclan");
            
            if(clan_position == null){
               clan_position = "";
            }
            trace(clan_position);
            
            int trofei_clan = res.getInt("trofei_total");
            trace(trofei_clan);
            
            outData.putUtfString("nome_utente", username);
            outData.putInt("trofei", trofei);
            outData.putInt("gold", gold);
            outData.putInt("gems", gems);
            outData.putUtfString("position", position);
            outData.putUtfString("clan_name", clan_name);
            outData.putUtfString("clan_position", clan_position);
            outData.putInt("trofei_clan", trofei_clan);
            
            
            if(clan_name != null || clan_name != ""){
            createRoom(user,clan_name);
            }
         }
         
          //outData.putInt("number", 100);
         // Verify that one record was found
          if (!res.first())
          {
             // This is the part that goes to the client
             SFSErrorData errData = new SFSErrorData(SFSErrorCode.LOGIN_BAD_USERNAME);
             errData.addParameter(userName);
                trace("mi sono intoppato qui???");
             // Sends response if user gave incorrect user name
             throw new SFSLoginException("Bad user name: " + userName, errData);
             
          }
          
          

          String dbPword = res.getString("password");

         // Verify the secure password
         if (!getApi().checkSecurePassword(session, dbPword, cryptedPass))
         {
            trace("mi sono intoppato dopo???");
            SFSErrorData data = new SFSErrorData(SFSErrorCode.LOGIN_BAD_PASSWORD);
            data.addParameter(userName);
            // Sends response if user gave incorrect password
            throw new SFSLoginException("Login failed for user: "  + userName, data);
         }

        }

        // User name was not found
        catch (SQLException e)
        {
           SFSErrorData errData = new SFSErrorData(SFSErrorCode.GENERIC_ERROR);
           errData.addParameter("SQL Error: " + e.getMessage());
           trace("mi sono intoppato quiiiiii???");
           // Sends response about mysql errors
           throw new SFSLoginException("A SQL Error occurred: " + e.getMessage(), errData);
        }
        finally {
           try{
              connection.close();
           }catch (SQLException e){
              throw new SFSLoginException("A SQL Error occurred: " + e.getMessage());
           }
        }

    }
   
   private void createRoom(User sender, String clanname){
       String clan_name = clanname;
         //Room myfirstroom = getParentExtension().getParentZone().getRoomByName(clan_name);
         RoomExtensionSettings res = new RoomExtensionSettings("Server","clanserver.ClanExtension");
               CreateRoomSettings crs = new CreateRoomSettings();
              
            
               crs.setName(clan_name);
               crs.setGroupId("clan_name " + clan_name);
               crs.setMaxVariablesAllowed(20);
               crs.setMaxUsers(20);
               crs.setAutoRemoveMode(SFSRoomRemoveMode.NEVER_REMOVE);
               crs.setDynamic(true);
              
               crs.setExtension(res);
              
              
                 
                  ISFSObject reback = SFSObject.newInstance();
                  try {
                     //getApi().createRoom(sender.getZone(),crs,sender);
                     getApi().createRoom(sender.getZone(),crs,null);
                     reback.putBool("success", true);
                  } catch (SFSCreateRoomException e) {
                     e.printStackTrace();
                     reback.putBool("success", false);
                  }finally{
                     //send("createRoom", reback, sender);
                  }
               }
              
            
            



Thanks for the help
User avatar
Lapo
Site Admin
Posts: 23027
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Create room server side on login event

Postby Lapo » 11 Apr 2017, 08:19

i have commented the finally statement

and then i have error on this line of code:

Show me the error please.
Lapo

--

gotoAndPlay()

...addicted to flash games
Skills07
Posts: 103
Joined: 07 Nov 2016, 14:54
Location: Italy

Re: Create room server side on login event

Postby Skills07 » 11 Apr 2017, 08:52

Lapo wrote:
i have commented the finally statement

and then i have error on this line of code:

Show me the error please.



here the log

Code: Select all

11 apr 2017 | 09:18:01,085 | INFO  | main | smartfoxserver.v2.SmartFoxServer |     | Boot sequence starts...
11 apr 2017 | 09:18:01,541 | INFO  | main | v2.core.SFSEventManager |     | AnonymousService-1 initialized
11 apr 2017 | 09:18:01,566 | INFO  | main | vfs.impl.DefaultFileReplicator |     | Using "C:\Users\CHRIST~1\AppData\Local\Temp\vfs_cache" as temporary files store.
11 apr 2017 | 09:18:01,634 | DEBUG | main | entities.managers.SFSExtensionManager |     | Extension Manager started.
11 apr 2017 | 09:18:01,637 | INFO  | main | smartfoxserver.v2.SmartFoxServer |     | License loaded:

==========================================
LICENSE DETAILS
------------------------------------------
Type            : Community Edition
Max users       : 100
==========================================

11 apr 2017 | 09:18:01,642 | INFO  | main | entities.managers.SFSBannedUserStorage |     | BanUserStorage initialized
11 apr 2017 | 09:18:01,659 | INFO  | main | entities.managers.SFSBannedUserManager |     | BanUser data loaded: 0 records.
11 apr 2017 | 09:18:01,661 | DEBUG | main | entities.managers.SFSExtensionManager |     | Extension File Monitor started
11 apr 2017 | 09:18:01,666 | INFO  | main | smartfoxserver.v2.SmartFoxServer |     | Protocol Type is: BINARY
11 apr 2017 | 09:18:01,677 | INFO  | main | v2.config.DefaultConfigLoader |     | Loading: zones\BasicExamples.zone.xml
11 apr 2017 | 09:18:01,716 | INFO  | main | v2.config.DefaultConfigLoader |     | Loading: zones\Login.zone.xml
11 apr 2017 | 09:18:01,756 | INFO  | main | v2.config.DefaultConfigLoader |     | Loading: zones\Register.zone.xml
11 apr 2017 | 09:18:01,774 | INFO  | main | entities.managers.SFSZoneManager |     |

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 >> Zone: BasicExamples
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

11 apr 2017 | 09:18:01,814 | INFO  | main | entities.managers.SFSRoomManager |     | Room created: { Zone: BasicExamples }, [ Room: The Lobby, Id: 0, Group: default, isGame: false ], type = SFSRoom
11 apr 2017 | 09:18:01,815 | INFO  | main | entities.managers.SFSZoneManager |     |

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 >> Zone: Login
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

11 apr 2017 | 09:18:02,190 | DEBUG | main | v2.db.SFSDBManager |     | Execute Query SQL: com.mysql.jdbc.JDBC42PreparedStatement@5b38c1ec: select username from users limit 1
11 apr 2017 | 09:18:02,206 | INFO  | main | entities.managers.SFSRoomManager |     | Room created: { Zone: Login }, [ Room: Queue, Id: 1, Group: default, isGame: false ], type = SFSRoom
11 apr 2017 | 09:18:02,207 | WARN  | main | entities.managers.SFSZoneManager |     | RoomSetting literal not found:
11 apr 2017 | 09:18:02,209 | INFO  | main | entities.managers.SFSRoomManager |     | Room created: { Zone: Login }, [ Room: The Lobby, Id: 2, Group: default, isGame: false ], type = SFSRoom
11 apr 2017 | 09:18:02,312 | INFO  | main | entities.managers.SFSRoomManager |     | Room created: { Zone: Login }, [ Room: Game, Id: 3, Group: default, isGame: false ], type = SFSRoom
11 apr 2017 | 09:18:02,353 | INFO  | main | entities.managers.SFSZoneManager |     |

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 >> Zone: Register
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

11 apr 2017 | 09:18:02,361 | DEBUG | main | v2.db.SFSDBManager |     | Execute Query SQL: com.mysql.jdbc.JDBC42PreparedStatement@7d3e8655: select username from users limit 1
11 apr 2017 | 09:18:02,416 | DEBUG | pool-1-thread-1 | entities.managers.SFSZoneManager$TrafficMeterExecutor |     | Traffic Monitor update: 0.112008ms.
11 apr 2017 | 09:18:02,421 | INFO  | main | entities.managers.SFSRoomManager |     | Room created: { Zone: --=={{{ AdminZone }}}==-- }, [ Room: AdminRoom, Id: 4, Group: default, isGame: false ], type = SFSRoom
11 apr 2017 | 09:18:02,476 | INFO  | main | v2.core.AdminToolService |     | AdminTool Service started
11 apr 2017 | 09:18:02,478 | INFO  | main | entities.managers.SFSPostOffice |     | PostOffice service started
11 apr 2017 | 09:18:02,820 | INFO  | SFSWorker:Sys:1 | smartfoxserver.v2.SmartFoxServer |     | Listening Sockets: { 0.0.0.0:9933, (Tcp) } { 127.0.0.1:9933, (Udp) }
11 apr 2017 | 09:18:02,831 | INFO  | SFSWorker:Sys:1 | smartfoxserver.v2.SmartFoxServer |     | 
 _____ _____ _____    ___ __ __
|   __|   __|   __|  |_  |  |  |
|__   |   __|__   |  |  _|-   -|
|_____|__|  |_____|  |___|__|__|                                         
 _____ _____ _____ ____  __ __
| __  |   __|  _  |    \|  |  |
|    -|   __|     |  |  |_   _|
|__|__|_____|__|__|____/  |_| 
[ 2.12.0 ]

11 apr 2017 | 09:18:02,832 | INFO  | SFSWorker:Sys:1 | smartfoxserver.v2.SmartFoxServer |     | SmartFoxServer 2X (2.12.0) READY!
11 apr 2017 | 09:18:05,048 | INFO  | main | bluebox.v3.SessionFilter |     | BlueBox-2X Service (3.1.0) READY.
11 apr 2017 | 09:19:18,915 | INFO  | SocketReader | bitswarm.sessions.DefaultSessionManager |     | Session created: { Id: 1, Type: DEFAULT, Logged: No, IP: 127.0.0.1:51919 } on Server port: 9933 <---> 51919
11 apr 2017 | 09:19:18,949 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | Binary size: 48
80 00 2D 12 00 03 00 01 63 02 00 00 01 61 03 00    ..-.....c....a..
00 00 01 70 12 00 02 00 03 61 70 69 08 00 05 31    ...p.....api...1
2E 37 2E 32 00 02 63 6C 08 00 05 55 6E 69 74 79    .7.2..cl...Unity

11 apr 2017 | 09:19:18,950 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | STATE: WAIT_NEW_PACKET
11 apr 2017 | 09:19:18,954 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | NORMAL SIZED PACKET: 45
11 apr 2017 | 09:19:18,957 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | <<< PACKET COMPLETE >>>
11 apr 2017 | 09:19:18,962 | DEBUG | SFSWorker:Sys:2 | v2.protocol.SFSProtocolCodec |     |
   (sfs_object) p:
      (utf_string) cl: Unity
      (utf_string) api: 1.7.2
      
   
   (short) a: 0
   (byte) c: 0
   

11 apr 2017 | 09:19:18,965 | DEBUG | SFSWorker:Sys:2 | controllers.v290.SystemReqController |     | {IN}: Handshake
11 apr 2017 | 09:19:18,973 | DEBUG | SFSWorker:Sys:2 | v2.protocol.SFSProtocolCodec |     | {OUT}: Handshake
11 apr 2017 | 09:19:18,975 | DEBUG | SFSWorker:Sys:2 | protocol.binary.BinaryIoHandler |     | Binary size: 77
12 00 03 00 01 70 12 00 03 00 02 63 74 04 00 00    .....p.....ct...
04 00 00 02 6D 73 04 00 07 A1 20 00 02 74 6B 08    ....ms.......tk.
00 20 33 66 30 32 37 31 35 36 34 36 32 39 66 38    ..3f0271564629f8
32 65 39 38 62 38 32 31 35 61 64 35 65 31 65 35    2e98b8215ad5e1e5
30 66 00 01 61 03 00 00 00 01 63 02 00             0f..a.....c..   

11 apr 2017 | 09:19:19,023 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | Binary size: 85
80 00 52 12 00 03 00 01 63 02 00 00 01 61 03 00    ..R.....c....a..
01 00 01 70 12 00 03 00 02 7A 6E 08 00 05 4C 6F    ...p.....zn...Lo
67 69 6E 00 02 75 6E 08 00 04 63 68 72 79 00 02    gin..un...chry..
70 77 08 00 20 65 35 37 35 34 35 63 65 63 34 35    pw...e57545cec45
37 31 33 63 62 63 64 36 64 36 37 33 35 64 31 65    713cbcd6d6735d1e
36 63 38 65 39                                     6c8e9           

11 apr 2017 | 09:19:19,024 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | STATE: WAIT_NEW_PACKET
11 apr 2017 | 09:19:19,025 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | NORMAL SIZED PACKET: 82
11 apr 2017 | 09:19:19,026 | DEBUG | SocketReader | protocol.binary.BinaryIoHandler |     | <<< PACKET COMPLETE >>>
11 apr 2017 | 09:19:19,026 | DEBUG | SFSWorker:Sys:3 | v2.protocol.SFSProtocolCodec |     |
   (sfs_object) p:
      (utf_string) zn: Login
      (utf_string) pw: e57545cec45713cbcd6d6735d1e6c8e9
      (utf_string) un: chry
      
   
   (short) a: 1
   (byte) c: 0
   

11 apr 2017 | 09:19:19,027 | DEBUG | SFSWorker:Sys:3 | controllers.v290.SystemReqController |     | {IN}: Login
11 apr 2017 | 09:19:19,031 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: Sto chiedendo al server di loggare un utente
11 apr 2017 | 09:19:19,033 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: Username----------chry
11 apr 2017 | 09:19:19,033 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: Password----------e57545cec45713cbcd6d6735d1e6c8e9
11 apr 2017 | 09:19:19,034 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: Session----------{ Id: 1, Type: DEFAULT, Logged: No, IP: 127.0.0.1:51919 }
11 apr 2017 | 09:19:19,040 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: chry
11 apr 2017 | 09:19:19,040 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 10000
11 apr 2017 | 09:19:19,041 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 1000000
11 apr 2017 | 09:19:19,041 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 20000
11 apr 2017 | 09:19:19,042 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: italy
11 apr 2017 | 09:19:19,042 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: disney
11 apr 2017 | 09:19:19,042 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: internazionale
11 apr 2017 | 09:19:19,043 | INFO  | SFSWorker:Ext:4 | Extensions |     | {Server}: 20000
11 apr 2017 | 09:19:19,046 | WARN  | SFSWorker:Ext:4 | entities.managers.SFSExtensionManager |     | java.lang.NullPointerException:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Exception: java.lang.NullPointerException
Message: *** Null ***
Description: Error during event handling: java.lang.NullPointerException, Listener: { Ext: Server, Type: JAVA, Lev: ZONE, { Zone: Login }, {} }
+--- --- ---+
Stack Trace:
+--- --- ---+
loginserver.LoginEventHandler.createRoom(LoginEventHandler.java:205)
loginserver.LoginEventHandler.handleServerEvent(LoginEventHandler.java:132)
com.smartfoxserver.v2.extensions.SFSExtension.handleServerEvent(SFSExtension.java:259)
com.smartfoxserver.v2.entities.managers.SFSExtensionManager.dispatchEvent(SFSExtensionManager.java:768)
com.smartfoxserver.v2.entities.managers.SFSExtensionManager.dispatchZoneLevelEvent(SFSExtensionManager.java:689)
com.smartfoxserver.v2.entities.managers.SFSExtensionManager.handleServerEvent(SFSExtensionManager.java:886)
com.smartfoxserver.v2.core.SFSEventManager$SFSEventRunner.run(SFSEventManager.java:65)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

11 apr 2017 | 09:19:53,025 | INFO  | Scheduler1-thread-1 | bitswarm.sessions.DefaultSessionManager |     | Session removed: { Id: 1, Type: DEFAULT, Logged: No, IP: 127.0.0.1:51919 }
11 apr 2017 | 09:19:53,028 | DEBUG | Scheduler1-thread-1 | bitswarm.sessions.DefaultSessionManager |     | Removed idle session: { Id: 1, Type: DEFAULT, Logged: No, IP: 127.0.0.1:51919 }
11 apr 2017 | 09:23:02,418 | DEBUG | pool-1-thread-1 | entities.managers.SFSZoneManager$TrafficMeterExecutor |     | Traffic Monitor update: 0.05355ms.
User avatar
Lapo
Site Admin
Posts: 23027
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Create room server side on login event

Postby Lapo » 11 Apr 2017, 09:03

Thanks.

As you can learn from the error itself the exception is not caused by the SmartFoxServer API. It is caused by your code.
Why?

Because the last entry in the stack trace points to line 205 in your createRoom method from the LoginEventHandler class.
This means that at that line of code you are calling a method on an object that is null.

This has nothing to do with passing null to the SFS2X API createRoom method. If this was the problem you would see a different stack trace, pointing to a line in a class from the SFS2X SDK, which is not the case.

If this is your line 205...

Code: Select all

getApi().createRoom(sender.getZone(),crs,null);

Then it is very likely that your sender object is null and calling getZone() on a null object will cause a NPE.
Lapo

--

gotoAndPlay()

...addicted to flash games
Skills07
Posts: 103
Joined: 07 Nov 2016, 14:54
Location: Italy

Re: Create room server side on login event

Postby Skills07 » 11 Apr 2017, 09:19

Sorry lapo i don't understand one thing.

If method create room needs this

Code: Select all

private void CreateRoom (User sender, ISFSObject Params){
}



and i say that my sender is declared in my LoginHandler like this
User user = null;

and then in my code when i have obtained the clan name i call this method

Code: Select all

if(clan_name != null || clan_name != ""){
            createRoom(user,clan_name);
            }


where user is what i delcared and clan name is what i have obtained in my query
it think is this that calls a nullpointer ext.

I have ask how can i solve, because login handler is different than other handler i've used.

for example in my clanregistrationhandler i have this with the same method to create the room.
i post the code

Code: Select all

public class ClanRegistrationHandler extends BaseClientRequestHandler {
   
   Object obj = null;
   //private SmartFox sfs;
   
   public void handleClientRequest(User user, ISFSObject params){

      trace("Sto chiedendo di registrare un clan al server");
      
      String clan_name = params.getUtfString("name");
        int user_founder = params.getInt("founder");
        String descrizione = params.getUtfString("descr");
        int min_trophy = params.getInt("trophies");
        int type = params.getInt("type");
        String position = params.getUtfString("location");
        int stemma = params.getInt("symbol");
        int minUsers = params.getInt("minUsers");
        int maxUsers = params.getInt("maxUsers");
       
       
      //String email = params.getUtfString("email");

      IDBManager dbmanager = getParentExtension().getParentZone().getDBManager();
      //sfs = null;
      try {
         trace("sono entrato nel primo try");
         //obj = dbmanager.executeQuery(sql2, new Object[] {1});
         obj = dbmanager.executeQuery("SELECT * FROM Clan WHERE  clan_name=?", new Object[] {clan_name});
         
         trace(obj.toString());
         
         SFSArray ar = (SFSArray) obj;
         
         //trace(condition.toString() + "condizione");
         
         if(ar.size() >= 1){
            trace("Errore clan già presente nel sistema");
            ISFSObject error = new SFSObject();
            error.putUtfString("error", "clan già registrato nel database");
            send("clan" , error, user);
            //return;
         }else {
            trace("registriamo il clan nel nostro database");
      //String sql="INSERT into loginprova(name, email) values ('"+name+"','"+email+"')";
      String sql = "INSERT into Clan(clan_name, utente_fondatore, stemma, descrizione, min_trofei, position, tipo, maxUsers, minUsers) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";

      try{
         
      
             obj = dbmanager.executeInsert(sql,
                        new Object[] {clan_name, user_founder, stemma, descrizione, min_trophy, position, type, maxUsers, minUsers});
            
           ISFSObject success = new SFSObject();
            success.putUtfString("success" ,"Clan successfully registrated");
            send("clan", success, user);
            
       createRoom(user,params);
      }
      catch (SQLException e) {
      
      ISFSObject error = new SFSObject();
      error.putUtfString("error", "MySQL update error");
      send("clan" , error, user);
   }

         }   } catch (SQLException e1) {
            ISFSObject error = new SFSObject();
            error.putUtfString("error", "MySQL error");
            send("clan" , error, user);
         }
   
}
   
   private void createRoom(User sender, ISFSObject params){
       String clan_name = params.getUtfString("name");
      //Room myfirstroom = getParentExtension().getParentZone().getRoomByName(clan_name);
      RoomExtensionSettings res = new RoomExtensionSettings("Server","clanserver.ClanExtension");
            CreateRoomSettings crs = new CreateRoomSettings();
           
         
            crs.setName(clan_name);
            crs.setGroupId("clan_name " + clan_name);
            crs.setMaxVariablesAllowed(20);
            crs.setMaxUsers(20);
            crs.setAutoRemoveMode(SFSRoomRemoveMode.NEVER_REMOVE);
            crs.setDynamic(true);
           
            crs.setExtension(res);
           
           
              
               ISFSObject reback = SFSObject.newInstance();
               try {
                  getApi().createRoom(sender.getZone(),crs,sender);
                  reback.putBool("success", true);
               } catch (SFSCreateRoomException e) {
                  e.printStackTrace();
                  reback.putBool("success", false);
               }finally{
                  send("createRoom", reback, sender);
               }
            }
           
         
         

   
}


So here in the delcaration of the class i have (User user, ISFSObject params) and all works properly, but in login handler i have another type of declaration

so user is null.

I hope you can help me, or specify me how can i create a room on a login event

Return to “SFS2X Questions”

Who is online

Users browsing this forum: No registered users and 79 guests