/* * IDK Game Server by Steve Winfield * https://github.com/WinfieldSteve */ package org.stevewinfield.suja.idk.game.messenger; import org.apache.log4j.Logger; import org.stevewinfield.suja.idk.Bootloader; import org.stevewinfield.suja.idk.communication.messenger.writers.MessageReceivedWriter; import org.stevewinfield.suja.idk.communication.messenger.writers.MessengerInviteReceived; import org.stevewinfield.suja.idk.communication.messenger.writers.MessengerUpdateListWriter; import org.stevewinfield.suja.idk.game.players.PlayerInformation; import org.stevewinfield.suja.idk.network.sessions.Session; import java.sql.ResultSet; import java.sql.SQLException; import java.util.concurrent.ConcurrentHashMap; public class Messenger { private static final Logger logger = Logger.getLogger(Messenger.class); // getters public PlayerInformation getPlayerInformation() { return player; } public ConcurrentHashMap<Integer, MessengerRequest> getRequests() { return requests; } public ConcurrentHashMap<Integer, MessengerBuddy> getBuddies() { return buddies; } public ConcurrentHashMap<Integer, MessengerBuddy> getOnlineBuddies() { return onlineBuddies; } public void onMessageReceived(final int buddyId, final String message) { if (this.getBuddies().containsKey(buddyId)) { this.session.writeMessage(new MessageReceivedWriter(buddyId, message)); } } public void onInviteReceived(final int buddyId, final String message) { if (this.getBuddies().containsKey(buddyId)) { this.session.writeMessage(new MessengerInviteReceived(buddyId, message)); } } public void onStatusChanged(final int buddyId) { if (this.onlineBuddies.containsKey(buddyId)) { this.buddies.get(buddyId).update(); this.session.writeMessage(new MessengerUpdateListWriter(this.buddies.get(buddyId))); } } public void onStatusChanged(final int buddyId, final boolean goes) { if (this.onlineBuddies.containsKey(buddyId) && !goes) { this.onlineBuddies.get(buddyId).setSession(null); this.onlineBuddies.remove(buddyId); this.session.writeMessage(new MessengerUpdateListWriter(this.buddies.get(buddyId))); } else if (!this.onlineBuddies.containsKey(buddyId) && goes) { this.buddies.get(buddyId).setSession(Bootloader.getSessionManager().getAuthenticatedSession(buddyId)); this.onlineBuddies.put(buddyId, this.buddies.get(buddyId)); this.session.writeMessage(new MessengerUpdateListWriter(this.buddies.get(buddyId))); } } public Messenger(final Session session, final PlayerInformation info) { this.session = session; this.player = info; this.buddies = new ConcurrentHashMap<>(); this.onlineBuddies = new ConcurrentHashMap<>(); this.requests = new ConcurrentHashMap<>(); try { final ResultSet row = Bootloader.getStorage().queryParams( "SELECT * FROM player_friends WHERE player_req_id = " + this.player.getId() + " OR player_acc_id = " + this.player.getId() + " ORDER BY id" ).executeQuery(); while (row.next()) { if (row.getInt("is_request") == 1) { if (row.getInt("player_req_id") != player.getId() && !this.requests.containsKey(row.getInt("player_req_id"))) { final MessengerRequest request = new MessengerRequest(); request.set(row); this.requests.put(row.getInt("player_req_id"), request); } continue; } int playerId; if (row.getInt("player_acc_id") != player.getId()) { playerId = row.getInt("player_acc_id"); } else { playerId = row.getInt("player_req_id"); } if (playerId > 0 && !this.buddies.containsKey(playerId)) { final ResultSet userInfo = Bootloader.getStorage().queryParams( "SELECT id, nickname, figurecode, motto FROM players WHERE id = " + playerId ).executeQuery(); if (userInfo.next()) { final MessengerBuddy buddy = new MessengerBuddy(); buddy.set(userInfo); this.buddies.put(playerId, buddy); if (buddy.isOnline()) { this.onlineBuddies.put(playerId, buddy); } } userInfo.close(); } } row.close(); for (final MessengerBuddy buddy : this.getOnlineBuddies().values()) { buddy.getSession().getPlayerMessenger().onStatusChanged(info.getId(), true); } } catch (final SQLException ex) { logger.error("SQL Exception", ex); } } // fields private final Session session; private final PlayerInformation player; private final ConcurrentHashMap<Integer, MessengerBuddy> buddies; private final ConcurrentHashMap<Integer, MessengerBuddy> onlineBuddies; private final ConcurrentHashMap<Integer, MessengerRequest> requests; }