2018-07-06 15:30:00 +02:00
package com.eu.habbo.habbohotel.messenger ;
import com.eu.habbo.Emulator ;
2019-04-22 01:42:00 +02:00
import com.eu.habbo.habbohotel.achievements.Achievement ;
import com.eu.habbo.habbohotel.achievements.AchievementManager ;
2018-07-06 15:30:00 +02:00
import com.eu.habbo.habbohotel.users.Habbo ;
import com.eu.habbo.habbohotel.users.HabboInfo ;
import com.eu.habbo.habbohotel.users.HabboManager ;
import com.eu.habbo.messages.outgoing.friends.UpdateFriendComposer ;
import com.eu.habbo.plugin.events.users.friends.UserAcceptFriendRequestEvent ;
import gnu.trove.map.hash.THashMap ;
import gnu.trove.set.hash.THashSet ;
2018-11-17 14:28:00 +01:00
import org.apache.commons.lang3.StringUtils ;
2018-07-06 15:30:00 +02:00
import java.sql.Connection ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
import java.sql.SQLException ;
import java.util.Map ;
import java.util.concurrent.ConcurrentHashMap ;
public class Messenger
{
//Configuration. Loaded from database & updated accordingly.
public static boolean SAVE_PRIVATE_CHATS = false ;
public static int MAXIMUM_FRIENDS = 200 ;
2019-04-22 01:42:00 +02:00
public static int MAXIMUM_FRIENDS_HC = 500 ;
2018-07-06 15:30:00 +02:00
private final ConcurrentHashMap < Integer , MessengerBuddy > friends ;
private final THashSet < FriendRequest > friendRequests ;
public Messenger ( )
{
2018-09-28 21:25:00 +02:00
this . friends = new ConcurrentHashMap < > ( ) ;
this . friendRequests = new THashSet < > ( ) ;
2018-07-06 15:30:00 +02:00
}
public void loadFriends ( Habbo habbo )
{
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ;
PreparedStatement statement = connection . prepareStatement ( " SELECT " +
" users.id, " +
" users.username, " +
" users.gender, " +
" users.online, " +
" users.look, " +
" users.motto, " +
" messenger_friendships.* FROM messenger_friendships INNER JOIN users ON messenger_friendships.user_two_id = users.id WHERE user_one_id = ? " ) )
{
statement . setInt ( 1 , habbo . getHabboInfo ( ) . getId ( ) ) ;
try ( ResultSet set = statement . executeQuery ( ) )
{
while ( set . next ( ) )
{
this . friends . putIfAbsent ( set . getInt ( " id " ) , new MessengerBuddy ( set ) ) ;
}
}
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
}
public MessengerBuddy loadFriend ( Habbo habbo , int userId )
{
MessengerBuddy buddy = null ;
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " SELECT " +
" users.id, " +
" users.username, " +
" users.gender, " +
" users.online, " +
" users.look, " +
" users.motto, " +
" messenger_friendships.* FROM messenger_friendships INNER JOIN users ON messenger_friendships.user_two_id = users.id WHERE user_one_id = ? AND user_two_id = ? LIMIT 1 " ) )
{
statement . setInt ( 1 , habbo . getHabboInfo ( ) . getId ( ) ) ;
statement . setInt ( 2 , userId ) ;
try ( ResultSet set = statement . executeQuery ( ) )
{
while ( set . next ( ) )
{
buddy = new MessengerBuddy ( set ) ;
this . friends . putIfAbsent ( set . getInt ( " id " ) , buddy ) ;
}
}
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
return buddy ;
}
public void loadFriendRequests ( Habbo habbo )
{
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " SELECT users.id, users.username, users.look FROM messenger_friendrequests INNER JOIN users ON user_from_id = users.id WHERE user_to_id = ? " ) )
{
statement . setInt ( 1 , habbo . getHabboInfo ( ) . getId ( ) ) ;
try ( ResultSet set = statement . executeQuery ( ) )
{
while ( set . next ( ) )
{
2019-03-18 02:22:00 +01:00
this . friendRequests . add ( new FriendRequest ( set ) ) ;
2018-07-06 15:30:00 +02:00
}
}
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
}
public void removeBuddy ( int id )
{
this . friends . remove ( id ) ;
}
public void removeBuddy ( Habbo habbo )
{
this . friends . remove ( habbo . getHabboInfo ( ) . getId ( ) ) ;
}
public static void unfriend ( int userOne , int userTwo )
{
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " DELETE FROM messenger_friendships WHERE (user_one_id = ? AND user_two_id = ?) OR (user_one_id = ? AND user_two_id = ?) " ) )
{
statement . setInt ( 1 , userOne ) ;
statement . setInt ( 2 , userTwo ) ;
statement . setInt ( 3 , userTwo ) ;
statement . setInt ( 4 , userOne ) ;
statement . execute ( ) ;
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
}
public THashSet < MessengerBuddy > getFriends ( String username )
{
2018-09-28 21:25:00 +02:00
THashSet < MessengerBuddy > users = new THashSet < > ( ) ;
2018-07-06 15:30:00 +02:00
for ( Map . Entry < Integer , MessengerBuddy > map : this . friends . entrySet ( ) )
{
2018-11-17 14:28:00 +01:00
if ( StringUtils . containsIgnoreCase ( map . getValue ( ) . getUsername ( ) , username ) )
2018-07-06 15:30:00 +02:00
{
users . add ( map . getValue ( ) ) ;
}
}
return users ;
}
public static THashSet < MessengerBuddy > searchUsers ( String username )
{
2018-09-28 21:25:00 +02:00
THashSet < MessengerBuddy > users = new THashSet < > ( ) ;
2019-03-18 02:22:00 +01:00
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " SELECT * FROM users WHERE username LIKE ? ORDER BY username ASC LIMIT " + Emulator . getConfig ( ) . getInt ( " hotel.messenger.search.maxresults " ) ) )
2018-07-06 15:30:00 +02:00
{
statement . setString ( 1 , username + " % " ) ;
try ( ResultSet set = statement . executeQuery ( ) )
{
while ( set . next ( ) )
{
users . add ( new MessengerBuddy ( set , false ) ) ;
}
}
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
return users ;
}
public void connectionChanged ( Habbo owner , boolean online , boolean inRoom )
{
if ( owner ! = null )
{
for ( Map . Entry < Integer , MessengerBuddy > map : this . getFriends ( ) . entrySet ( ) )
{
if ( map . getValue ( ) . getOnline ( ) = = 0 )
continue ;
Habbo habbo = Emulator . getGameServer ( ) . getGameClientManager ( ) . getHabbo ( map . getKey ( ) ) ;
if ( habbo ! = null )
{
if ( habbo . getMessenger ( ) ! = null )
{
MessengerBuddy buddy = habbo . getMessenger ( ) . getFriend ( owner . getHabboInfo ( ) . getId ( ) ) ;
if ( buddy ! = null )
{
buddy . setOnline ( online ) ;
buddy . inRoom ( inRoom ) ;
buddy . setLook ( owner . getHabboInfo ( ) . getLook ( ) ) ;
buddy . setGender ( owner . getHabboInfo ( ) . getGender ( ) ) ;
buddy . setUsername ( owner . getHabboInfo ( ) . getUsername ( ) ) ;
2019-03-18 02:22:00 +01:00
habbo . getClient ( ) . sendResponse ( new UpdateFriendComposer ( buddy ) ) ;
2018-07-06 15:30:00 +02:00
}
}
}
}
}
}
public void deleteAllFriendRequests ( int userTo )
{
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " DELETE FROM messenger_friendrequests WHERE user_to_id = ? " ) )
{
statement . setInt ( 1 , userTo ) ;
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
}
public int deleteFriendRequests ( int userFrom , int userTo )
{
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " DELETE FROM messenger_friendrequests WHERE (user_to_id = ? AND user_from_id = ?) OR (user_to_id = ? AND user_from_id = ?) " ) )
{
statement . setInt ( 1 , userTo ) ;
statement . setInt ( 2 , userFrom ) ;
statement . setInt ( 4 , userTo ) ;
statement . setInt ( 3 , userFrom ) ;
return statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
return 0 ;
}
//TODO Needs redesign. userFrom is redundant.
public void acceptFriendRequest ( int userFrom , int userTo )
{
2019-03-18 02:22:00 +01:00
int count = this . deleteFriendRequests ( userFrom , userTo ) ;
2018-07-06 15:30:00 +02:00
if ( count > 0 )
{
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " INSERT INTO messenger_friendships (user_one_id, user_two_id, friends_since) VALUES (?, ?, ?) " ) )
{
statement . setInt ( 1 , userFrom ) ;
statement . setInt ( 2 , userTo ) ;
statement . setInt ( 3 , Emulator . getIntUnixTimestamp ( ) ) ;
statement . execute ( ) ;
statement . setInt ( 1 , userTo ) ;
statement . setInt ( 2 , userFrom ) ;
statement . setInt ( 3 , Emulator . getIntUnixTimestamp ( ) ) ;
statement . execute ( ) ;
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
Habbo habboTo = Emulator . getGameServer ( ) . getGameClientManager ( ) . getHabbo ( userTo ) ;
Habbo habboFrom = Emulator . getGameServer ( ) . getGameClientManager ( ) . getHabbo ( userFrom ) ;
if ( habboTo ! = null & & habboFrom ! = null )
{
MessengerBuddy to = new MessengerBuddy ( habboFrom , habboTo . getHabboInfo ( ) . getId ( ) ) ;
MessengerBuddy from = new MessengerBuddy ( habboTo , habboFrom . getHabboInfo ( ) . getId ( ) ) ;
habboTo . getMessenger ( ) . friends . putIfAbsent ( habboFrom . getHabboInfo ( ) . getId ( ) , to ) ;
habboFrom . getMessenger ( ) . friends . putIfAbsent ( habboTo . getHabboInfo ( ) . getId ( ) , from ) ;
if ( Emulator . getPluginManager ( ) . fireEvent ( new UserAcceptFriendRequestEvent ( habboTo , from ) ) . isCancelled ( ) )
{
this . removeBuddy ( userTo ) ;
return ;
}
2019-03-18 02:22:00 +01:00
habboTo . getClient ( ) . sendResponse ( new UpdateFriendComposer ( to ) ) ;
habboFrom . getClient ( ) . sendResponse ( new UpdateFriendComposer ( from ) ) ;
2018-07-06 15:30:00 +02:00
}
else if ( habboTo ! = null )
{
2019-03-18 02:22:00 +01:00
habboTo . getClient ( ) . sendResponse ( new UpdateFriendComposer ( this . loadFriend ( habboTo , userFrom ) ) ) ;
2018-07-06 15:30:00 +02:00
}
else if ( habboFrom ! = null )
{
2019-03-18 02:22:00 +01:00
habboFrom . getClient ( ) . sendResponse ( new UpdateFriendComposer ( this . loadFriend ( habboFrom , userTo ) ) ) ;
2018-07-06 15:30:00 +02:00
}
}
}
public static boolean canFriendRequest ( Habbo habbo , String friend )
{
Habbo user = Emulator . getGameEnvironment ( ) . getHabboManager ( ) . getHabbo ( friend ) ;
HabboInfo habboInfo ;
if ( user ! = null )
{
habboInfo = user . getHabboInfo ( ) ;
}
else
{
habboInfo = HabboManager . getOfflineHabboInfo ( friend ) ;
}
if ( habboInfo = = null )
{
return false ;
}
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " SELECT * FROM messenger_friendrequests WHERE (user_to_id = ? AND user_from_id = ?) OR (user_to_id = ? AND user_from_id = ?) LIMIT 1 " ) )
{
statement . setInt ( 1 , habbo . getHabboInfo ( ) . getId ( ) ) ;
statement . setInt ( 2 , habboInfo . getId ( ) ) ;
statement . setInt ( 3 , habboInfo . getId ( ) ) ;
statement . setInt ( 4 , habbo . getHabboInfo ( ) . getId ( ) ) ;
try ( ResultSet set = statement . executeQuery ( ) )
{
if ( ! set . next ( ) )
{
return true ;
}
}
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
return false ;
}
public static boolean friendRequested ( int userFrom , int userTo )
{
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " SELECT * FROM messenger_friendrequests WHERE user_to_id = ? AND user_from_id = ? LIMIT 1 " ) )
{
statement . setInt ( 1 , userFrom ) ;
statement . setInt ( 2 , userTo ) ;
try ( ResultSet set = statement . executeQuery ( ) )
{
if ( set . next ( ) )
{
return true ;
}
}
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
return false ;
}
public static void makeFriendRequest ( int userFrom , int userTo )
{
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " INSERT INTO messenger_friendrequests (user_to_id, user_from_id) VALUES (?, ?) " ) )
{
statement . setInt ( 1 , userTo ) ;
statement . setInt ( 2 , userFrom ) ;
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
}
public static int getFriendCount ( int userId )
{
Habbo habbo = Emulator . getGameServer ( ) . getGameClientManager ( ) . getHabbo ( userId ) ;
if ( habbo ! = null )
return habbo . getMessenger ( ) . getFriends ( ) . size ( ) ;
int count = 0 ;
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " SELECT count(id) as count FROM messenger_friendships WHERE user_one_id = ? " ) )
{
statement . setInt ( 1 , userId ) ;
try ( ResultSet set = statement . executeQuery ( ) )
{
if ( set . next ( ) )
count = set . getInt ( " count " ) ;
}
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
return count ;
}
public static THashMap < Integer , THashSet < MessengerBuddy > > getFriends ( int userId )
{
2018-09-28 21:25:00 +02:00
THashMap < Integer , THashSet < MessengerBuddy > > map = new THashMap < > ( ) ;
map . put ( 1 , new THashSet < > ( ) ) ;
map . put ( 2 , new THashSet < > ( ) ) ;
map . put ( 3 , new THashSet < > ( ) ) ;
2018-07-06 15:30:00 +02:00
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; PreparedStatement statement = connection . prepareStatement ( " SELECT users.id, users.look, users.username, messenger_friendships.relation FROM messenger_friendships INNER JOIN users ON users.id = messenger_friendships.user_two_id WHERE user_one_id = ? ORDER BY RAND() LIMIT 50 " ) )
{
statement . setInt ( 1 , userId ) ;
try ( ResultSet set = statement . executeQuery ( ) )
{
while ( set . next ( ) )
{
if ( set . getInt ( " relation " ) = = 0 )
continue ;
MessengerBuddy buddy = new MessengerBuddy ( set . getInt ( " id " ) , set . getString ( " username " ) , set . getString ( " look " ) , ( short ) set . getInt ( " relation " ) , userId ) ;
map . get ( ( int ) buddy . getRelation ( ) ) . add ( buddy ) ;
}
}
}
catch ( SQLException e )
{
Emulator . getLogging ( ) . logSQLException ( e ) ;
}
return map ;
}
public ConcurrentHashMap < Integer , MessengerBuddy > getFriends ( )
{
return this . friends ;
}
public THashSet < FriendRequest > getFriendRequests ( )
{
synchronized ( this . friendRequests )
{
return this . friendRequests ;
}
}
public FriendRequest findFriendRequest ( String username )
{
synchronized ( this . friendRequests )
{
for ( FriendRequest friendRequest : this . friendRequests )
{
if ( friendRequest . getUsername ( ) . equalsIgnoreCase ( username ) )
{
return friendRequest ;
}
}
}
return null ;
}
public MessengerBuddy getFriend ( int id )
{
return this . friends . get ( id ) ;
}
public void dispose ( )
{
synchronized ( this . friends )
{
this . friends . clear ( ) ;
}
synchronized ( this . friendRequests )
{
this . friendRequests . clear ( ) ;
}
}
2019-04-22 01:42:00 +02:00
public static int friendLimit ( Habbo habbo )
{
if ( habbo . hasPermission ( " acc_infinite_friends " ) )
{
return Integer . MAX_VALUE ;
}
if ( habbo . getHabboStats ( ) . hasActiveClub ( ) )
{
return MAXIMUM_FRIENDS_HC ;
}
return MAXIMUM_FRIENDS ;
}
public static void checkFriendSizeProgress ( Habbo habbo )
{
int progress = habbo . getHabboStats ( ) . getAchievementProgress ( Emulator . getGameEnvironment ( ) . getAchievementManager ( ) . getAchievement ( " FriendListSize " ) ) ;
int toProgress = 1 ;
Achievement achievement = Emulator . getGameEnvironment ( ) . getAchievementManager ( ) . getAchievement ( " FriendListSize " ) ;
if ( achievement = = null )
return ;
if ( progress > 0 )
{
toProgress = habbo . getMessenger ( ) . getFriends ( ) . size ( ) - progress ;
if ( toProgress < 0 )
{
return ;
}
}
AchievementManager . progressAchievement ( habbo , achievement , toProgress ) ;
}
2018-07-06 15:30:00 +02:00
}