2019-07-08 23:35:32 +00:00
/ *
2020-01-09 03:05:42 +00:00
* Copyright ( c ) 2019 - 2020 GeyserMC . http : //geysermc.org
2019-07-08 23:35:32 +00:00
*
2019-07-11 21:30:35 +00:00
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
2019-07-08 23:35:32 +00:00
*
2019-07-11 21:30:35 +00:00
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
2019-07-08 23:35:32 +00:00
*
* @author GeyserMC
* @link https : //github.com/GeyserMC/Geyser
* /
2019-07-10 06:34:10 +00:00
package org.geysermc.connector.network ;
2019-07-08 23:35:32 +00:00
2019-07-21 23:52:30 +00:00
import com.github.steveice10.mc.protocol.data.status.ServerStatusInfo ;
2019-07-08 23:35:32 +00:00
import com.nukkitx.protocol.bedrock.BedrockPong ;
import com.nukkitx.protocol.bedrock.BedrockServerEventHandler ;
import com.nukkitx.protocol.bedrock.BedrockServerSession ;
2019-12-21 17:35:48 +00:00
2020-04-29 20:01:53 +00:00
import org.geysermc.connector.GeyserConfiguration ;
2019-07-08 23:35:32 +00:00
import org.geysermc.connector.GeyserConnector ;
2019-07-10 06:34:10 +00:00
import org.geysermc.connector.network.session.GeyserSession ;
2019-07-21 23:52:30 +00:00
import org.geysermc.connector.utils.MessageUtils ;
2019-07-08 23:35:32 +00:00
import java.net.InetSocketAddress ;
2019-07-10 06:34:10 +00:00
public class ConnectorServerEventHandler implements BedrockServerEventHandler {
2019-07-08 23:35:32 +00:00
private GeyserConnector connector ;
2019-07-10 06:34:10 +00:00
public ConnectorServerEventHandler ( GeyserConnector connector ) {
2019-07-08 23:35:32 +00:00
this . connector = connector ;
}
@Override
public boolean onConnectionRequest ( InetSocketAddress inetSocketAddress ) {
2019-12-21 17:35:48 +00:00
connector . getLogger ( ) . info ( inetSocketAddress + " tried to connect! " ) ;
2019-07-08 23:35:32 +00:00
return true ;
}
@Override
public BedrockPong onQuery ( InetSocketAddress inetSocketAddress ) {
2019-12-21 17:35:48 +00:00
connector . getLogger ( ) . debug ( inetSocketAddress + " has pinged you! " ) ;
2020-04-29 20:01:53 +00:00
GeyserConfiguration config = connector . getConfig ( ) ;
2019-12-21 17:35:48 +00:00
ServerStatusInfo serverInfo = connector . getPassthroughThread ( ) . getInfo ( ) ;
2019-11-02 20:58:50 +00:00
2019-12-21 17:35:48 +00:00
BedrockPong pong = new BedrockPong ( ) ;
pong . setEdition ( " MCPE " ) ;
pong . setGameType ( " Default " ) ;
pong . setNintendoLimited ( false ) ;
2020-01-04 05:25:00 +00:00
pong . setProtocolVersion ( GeyserConnector . BEDROCK_PACKET_CODEC . getProtocolVersion ( ) ) ;
2019-12-21 17:35:48 +00:00
pong . setVersion ( GeyserConnector . BEDROCK_PACKET_CODEC . getMinecraftVersion ( ) ) ;
pong . setIpv4Port ( config . getBedrock ( ) . getPort ( ) ) ;
2020-01-02 18:37:30 +00:00
if ( connector . getConfig ( ) . isPingPassthrough ( ) & & serverInfo ! = null ) {
2020-03-17 22:55:11 +00:00
String [ ] motd = MessageUtils . getBedrockMessage ( serverInfo . getDescription ( ) ) . split ( " \ n " ) ;
String mainMotd = motd [ 0 ] ; // First line of the motd.
String subMotd = ( motd . length ! = 1 ) ? motd [ 1 ] : " " ; // Second line of the motd if present, otherwise blank.
pong . setMotd ( mainMotd . trim ( ) ) ;
pong . setSubMotd ( subMotd . trim ( ) ) ; // Trimmed to shift it to the left, prevents the universe from collapsing on us just because we went 2 characters over the text box's limit.
2019-12-21 17:35:48 +00:00
pong . setPlayerCount ( serverInfo . getPlayerInfo ( ) . getOnlinePlayers ( ) ) ;
pong . setMaximumPlayerCount ( serverInfo . getPlayerInfo ( ) . getMaxPlayers ( ) ) ;
2019-07-21 23:52:30 +00:00
} else {
2019-12-21 17:35:48 +00:00
pong . setPlayerCount ( connector . getPlayers ( ) . size ( ) ) ;
pong . setMaximumPlayerCount ( config . getMaxPlayers ( ) ) ;
pong . setMotd ( config . getBedrock ( ) . getMotd1 ( ) ) ;
pong . setMotd ( config . getBedrock ( ) . getMotd2 ( ) ) ;
2019-07-21 23:52:30 +00:00
}
2020-04-15 04:02:57 +00:00
//Bedrock will not even attempt a connection if the client thinks the server is full
//so we have to fake it not being full
if ( pong . getPlayerCount ( ) > = pong . getMaximumPlayerCount ( ) ) {
pong . setMaximumPlayerCount ( pong . getPlayerCount ( ) + 1 ) ;
}
2019-11-02 20:58:50 +00:00
return pong ;
2019-07-08 23:35:32 +00:00
}
@Override
public void onSessionCreation ( BedrockServerSession bedrockServerSession ) {
2019-07-10 06:34:10 +00:00
bedrockServerSession . setLogging ( true ) ;
bedrockServerSession . setPacketHandler ( new UpstreamPacketHandler ( connector , new GeyserSession ( connector , bedrockServerSession ) ) ) ;
2019-09-13 13:37:31 +00:00
bedrockServerSession . addDisconnectHandler ( disconnectReason - > {
2019-12-21 17:35:48 +00:00
connector . getLogger ( ) . info ( " Bedrock user with ip: " + bedrockServerSession . getAddress ( ) . getAddress ( ) + " has disconnected for reason " + disconnectReason ) ;
2019-09-13 13:37:31 +00:00
2019-10-16 18:55:05 +00:00
GeyserSession player = connector . getPlayers ( ) . get ( bedrockServerSession . getAddress ( ) ) ;
2019-09-13 13:37:31 +00:00
if ( player ! = null ) {
player . disconnect ( disconnectReason . name ( ) ) ;
2019-09-13 14:45:55 +00:00
connector . removePlayer ( player ) ;
2019-09-13 13:37:31 +00:00
}
} ) ;
2019-07-24 22:53:15 +00:00
bedrockServerSession . setPacketCodec ( GeyserConnector . BEDROCK_PACKET_CODEC ) ;
2019-07-08 23:35:32 +00:00
}
}