/*
* IDK Game Server by Steve Winfield
* https://github.com/WinfieldSteve
*/
package org.stevewinfield.suja.idk.communication.handshake.readers;
import org.apache.log4j.Logger;
import org.stevewinfield.suja.idk.Bootloader;
import org.stevewinfield.suja.idk.IDK;
import org.stevewinfield.suja.idk.Translations;
import org.stevewinfield.suja.idk.communication.IMessageReader;
import org.stevewinfield.suja.idk.communication.MessageReader;
import org.stevewinfield.suja.idk.communication.QueuedMessageWriter;
import org.stevewinfield.suja.idk.communication.achievement.writers.AchievementDataListWriter;
import org.stevewinfield.suja.idk.communication.friendstream.writers.FriendStreamEventWriter;
import org.stevewinfield.suja.idk.communication.handshake.writers.AuthenticatedWriter;
import org.stevewinfield.suja.idk.communication.inventory.writers.AvatarEffectListWriter;
import org.stevewinfield.suja.idk.communication.moderation.writers.ModerationToolWriter;
import org.stevewinfield.suja.idk.communication.player.writers.*;
import org.stevewinfield.suja.idk.game.friendstream.FriendStreamEventData;
import org.stevewinfield.suja.idk.game.levels.ClubSubscriptionLevel;
import org.stevewinfield.suja.idk.game.miscellaneous.NotifyType;
import org.stevewinfield.suja.idk.network.sessions.Session;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class AuthenticatePlayerReader implements IMessageReader {
private static final Logger logger = Logger.getLogger(AuthenticatePlayerReader.class);
@Override
public void parse(final Session session, final MessageReader reader) {
if (session.isAuthenticated()) {
return;
}
if (!session.tryAuthenticate(reader.readUTF())) {
session.sendNotification(NotifyType.MULTI_ALERT, Translations.getTranslation("fail_authenticate"));
return;
}
if (IDK.DEBUG) {
logger.debug(session.getPlayerInstance().getInformation().getPlayerName() + " logged in.");
}
final QueuedMessageWriter queue = new QueuedMessageWriter();
queue.push(new AuthenticatedWriter());
queue.push(new LevelRightsListWriter(session.getPlayerInstance().hasVIP(), session.getPlayerInstance().hasClub(), session.getPlayerInstance().hasRight("hotel_admin")));
queue.push(new AvatarEffectListWriter(session.getPlayerInstance().getInventory().getAvatarEffects()));
queue.push(new PlayerFavoriteRoomsWriter(session.getPlayerInstance().getFavoriteRooms()));
queue.push(new AchievementDataListWriter(Bootloader.getGame().getAchievementManager().getAchievements().values()));
if (session.getPlayerInstance().hasRight("moderation_tool")) {
queue.push(new ModerationToolWriter(session.getPlayerInstance(), Bootloader.getGame().getModerationManager().getPresetMessages().values(), Bootloader.getGame().getModerationManager().getPresetActions()));
}
queue.push(new AvailabilityStatusWriter());
queue.push(new InfoFeedEnableMessageWriter(true)); // TODO
queue.push(new ActivityPointsWriter(session.getPlayerInstance().getInformation().getPixelsBalance(), session.getPlayerInstance().getInformation().getShellsBalance()));
final long timestamp = Bootloader.getTimestamp();
final long diff[] = new long[]{0, 0, 0, 0, 0};
if (session.getPlayerInstance().getSubscriptionManager().getExpireTime() >= timestamp) {
long diffInSeconds = (session.getPlayerInstance().getSubscriptionManager().getExpireTime() - timestamp);
diff[4] = (diffInSeconds >= 60 ? diffInSeconds % 60 : diffInSeconds);
diff[3] = (diffInSeconds = (diffInSeconds / 60)) >= 60 ? diffInSeconds % 60 : diffInSeconds;
diff[2] = (diffInSeconds = (diffInSeconds / 60)) >= 24 ? diffInSeconds % 24 : diffInSeconds;
diff[1] = (diffInSeconds = (diffInSeconds / 24));
diff[0] = (diffInSeconds = (diffInSeconds / 30)) >= 12 ? diffInSeconds % 12 : diffInSeconds;
diff[0] = (long) Math.floor(diff[0] / 31.0);
}
final int days = (int) (diff[1] - (31 * diff[0]));
queue.push(new SubscriptionInfoWriter("club_habbo", days, (session.getPlayerInstance().getSubscriptionManager().getBaseLevel() != ClubSubscriptionLevel.NONE && days > 5 ? 2 : 0), (session.getPlayerInstance().getSubscriptionManager().getBaseLevel() == ClubSubscriptionLevel.VIP), session.getPlayerInstance().getSubscriptionManager().getBaseLevel() == ClubSubscriptionLevel.NONE, IDK.CATA_CLUB_OFFER_PRICE_REGULAR, IDK.CATA_CLUB_OFFER_PRICE_NOW));
if (session.getPlayerInstance().getInformation().isStreamEnabled()) {
final List<FriendStreamEventData> events = new ArrayList<>(session.getFriendStream().getEvents());
Collections.reverse(events);
queue.push(new FriendStreamEventWriter(events));
}
session.writeMessage(queue);
session.writeMessage(new PlayerHomeRoomWriter(session.getPlayerInstance().getInformation().getHomeRoom()));
session.getPlayerInstance().getInventory().checkEffectExpiry(session);
}
}