/*
* IDK Game Server by Steve Winfield
* https://github.com/WinfieldSteve
*/
package org.stevewinfield.suja.idk.game.friendstream;
import org.apache.log4j.Logger;
import org.magicwerk.brownies.collections.GapList;
import org.stevewinfield.suja.idk.Bootloader;
import org.stevewinfield.suja.idk.game.players.PlayerInformation;
import org.stevewinfield.suja.idk.network.sessions.Session;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedHashMap;
public class FriendStream {
private static final Logger logger = Logger.getLogger(FriendStream.class);
public Collection<FriendStreamEventData> getEvents() {
return events.values();
}
public GapList<Integer> getFriends() {
this.updateNeeded = false;
return friends;
}
public boolean needsUpdate() {
return updateNeeded;
}
public FriendStream(final int playerId, final GapList<Integer> friends) {
this.playerId = playerId;
this.friends = friends;
this.events = new LinkedHashMap<>();
}
public FriendStream() {
this.events = new LinkedHashMap<>();
}
public void load(final int playerId, final GapList<Integer> friends) {
String queryData = "";
for (final Integer id : friends) {
queryData += " OR player_id=" + id;
}
if (queryData.length() > 0) {
queryData = "WHERE" + queryData.substring(3);
}
this.playerId = playerId;
this.friends = friends;
this.events = new LinkedHashMap<>();
try {
final ResultSet set = Bootloader.getStorage().queryParams("SELECT * FROM friendstream_events " + queryData).executeQuery();
while (set.next()) {
final FriendStreamEventData event = new FriendStreamEventData();
event.set(set);
if (event.getEventType() == FriendStreamEventType.FRIEND_MADE && event.getEventData()[0].equals("" + playerId)) {
continue;
}
events.put(set.getInt("id"), event);
}
} catch (final SQLException e) {
logger.error("SQL Exception", e);
}
}
public void broadcastEvent(final Session session, final int eventType, final int linkType, final String[] eventData) {
this.broadcastEvent(
session.getPlayerInstance().getInformation().getId(),
session.getPlayerInstance().getInformation().getPlayerName(),
session.getPlayerInstance().getInformation().getAvatar(),
session.getPlayerInstance().getInformation().getGender(),
eventType, linkType, eventData
);
}
public void broadcastEvent(final int playerId, final String name, final String avatar, final int gender, final int eventType, final int linkType, final String[] eventData) {
final long timestamp = Bootloader.getTimestamp();
int itemId = 0;
String data = "";
for (final String entry : eventData) {
data += (char) 13 + entry;
}
if (data.length() > 0) {
data = data.substring(1);
}
try {
final PreparedStatement std = Bootloader.getStorage()
.queryParams("INSERT INTO friendstream_events " +
"(player_id, player_name, player_avatar, player_gender, event_type, timestamp, link_type, event_data) " +
"VALUES" + "(" + playerId + ", ?, ?, '" +
(gender == PlayerInformation.MALE_GENDER ? "m" : "f") +
"', " + eventType + ", '" + timestamp +
"', " + linkType + ", ?)"
);
std.setString(1, name);
std.setString(2, avatar);
std.setString(3, data);
std.execute();
std.close();
itemId = Bootloader.getStorage().readLastId("friendstream_events");
} catch (final SQLException e) {
logger.error("SQL Exception", e);
}
final FriendStreamEventData event = new FriendStreamEventData(itemId, playerId, name, gender, avatar, eventType, timestamp, linkType, eventData);
for (final Integer i : this.friends) {
Session friend;
if (!Bootloader.getSessionManager().hasAuthenticatedSession(i) || !(friend = Bootloader.getSessionManager().getAuthenticatedSession(i)).isAuthenticated()) {
continue;
}
friend.getFriendStream().onEvent(event);
}
}
public void addFriend(final int friendId) {
this.friends.add(friendId);
this.load(this.playerId, this.friends);
}
public void removeFriend(final int friendId) {
this.friends.remove(friendId);
this.load(this.playerId, this.friends);
}
public void onEvent(final FriendStreamEventData event) {
this.events.put(event.getId(), event);
this.updateNeeded = true;
}
// fields
private int playerId;
private GapList<Integer> friends;
private boolean updateNeeded;
private LinkedHashMap<Integer, FriendStreamEventData> events;
}