Search in sources :

Example 1 with CombatSelection

use of com.ixale.starparse.domain.CombatSelection in project StarParse by Ixale.

the class CombatDaoImpl method getCombatStats.

private CombatStats getCombatStats(final Combat combat, final CombatSelection combatSel, final String playerName, final boolean realDuration) throws Exception {
    final Map<String, Object> args = new HashMap<>();
    args.put("playerName", playerName == null ? getCharacterName(combat) : playerName);
    final Long timeFrom;
    final String sql;
    if (combatSel == null) {
        sql = SQL_GET_STATS_SUMS_CACHED;
        args.put("combatId", combat.getCombatId());
        timeFrom = null;
    } else {
        final Boundaries bounds = getBoundaries(combat, combatSel);
        // time from
        args.put("timeFrom", bounds.timeFrom);
        args.put("timeTo", bounds.timeTo);
        timeFrom = bounds.timeFrom.getTime();
        // events
        args.put("eventIdFrom", bounds.eventIdFrom);
        args.put("eventIdTo", bounds.eventIdTo);
        // support for custom conditions (for challenges)
        if (combatSel.getSql() != null) {
            sql = SQL_GET_STATS_SUMS.substring(0, SQL_GET_STATS_SUMS.length() - 1) + " AND " + combatSel.getSql() + ")";
            if (combatSel.getArgs() != null) {
                args.putAll(combatSel.getArgs());
            }
        } else {
            sql = SQL_GET_STATS_SUMS;
        }
    }
    try {
        final CombatStats stats = getJdbcTemplate().query(sql, args, rs -> {
            if (!rs.next()) {
                return null;
            }
            int duration;
            if (realDuration) {
                if (getTimestamp(rs, "time_to") != null && timeFrom != null) {
                    duration = (int) Math.max(1000, getTimestamp(rs, "time_to").getTime() - timeFrom);
                } else {
                    duration = 1000;
                }
            } else {
                duration = rs.getInt("duration");
            }
            return new CombatStats(duration, getIntSafe(rs, "actions"), getIntSafe(rs, "damage"), getIntSafe(rs, "heal"), getIntSafe(rs, "effective_heal"), getIntSafe(rs, "damage_taken"), // total = sub-total
            getIntSafe(rs, "damage_taken"), getIntSafe(rs, "absorbed"), // total = sub-total
            getIntSafe(rs, "absorbed"), getIntSafe(rs, "heal_taken"), getIntSafe(rs, "effective_heal_taken"), // total = sub-total
            getIntSafe(rs, "effective_heal_taken"), getIntSafe(rs, "threat"), // not used in total statistics
            getIntSafe(rs, "threat_positive"), rs.getString("discipline") != null ? CharacterDiscipline.valueOf(rs.getString("discipline")) : null);
        });
        if (stats == null && combatSel == null) {
            // NPC perspective = no cached sums
            return getCombatStats(combat, new CombatSelection(combat.getEventIdFrom(), combat.getEventIdTo(), null, null), playerName, realDuration);
        }
        return stats;
    } catch (Exception e) {
        throw new Exception("Unable to get combat summary (" + args + "): " + e.getMessage(), e);
    }
}
Also used : CombatSelection(com.ixale.starparse.domain.CombatSelection) CombatStats(com.ixale.starparse.domain.stats.CombatStats) HashMap(java.util.HashMap) DataAccessException(org.springframework.dao.DataAccessException) SQLException(java.sql.SQLException) EmptyResultDataAccessException(org.springframework.dao.EmptyResultDataAccessException)

Example 2 with CombatSelection

use of com.ixale.starparse.domain.CombatSelection in project StarParse by Ixale.

the class CombatDaoImpl method getCombatChallengeStats.

@Override
public List<ChallengeStats> getCombatChallengeStats(final Combat combat, final CombatSelection combatSel, final String playerName) throws Exception {
    if ((combat.getBoss() == null) || ((availableChallenges = combat.getBoss().getRaid().getChallenges(combat.getBoss())) == null)) {
        return null;
    }
    phasesToChallenges.clear();
    for (final CombatChallenge ch : availableChallenges) {
        phasesToChallenges.put(ch.getPhaseName(), ch);
    }
    final Map<String, Object> args = new HashMap<>();
    args.put("combatId", combat.getCombatId());
    args.put("tickFrom", combatSel != null && combatSel.getTickFrom() != null ? combatSel.getTickFrom() : 0);
    args.put("tickTo", combatSel != null && combatSel.getTickTo() != null ? combatSel.getTickTo() : Integer.MAX_VALUE);
    args.put("phaseNames", new ArrayList<>(phasesToChallenges.keySet()));
    return getJdbcTemplate().query(SQL_GET_COMBAT_CHALLENGES, args, new RowMapper<ChallengeStats>() {

        Long tickFrom, tickTo;

        boolean noCache = false;

        @Override
        public ChallengeStats mapRow(ResultSet rs, int rowNum) {
            try {
                noCache = false;
                if (combatSel != null) {
                    if (combatSel.getTickFrom() != null && (combatSel.getTickFrom() > rs.getLong("tick_from"))) {
                        tickFrom = combatSel.getTickFrom();
                        noCache = true;
                    } else {
                        tickFrom = rs.getLong("tick_from");
                    }
                    if (combatSel.getTickTo() != null && (getValueOrNull(rs, rs.getLong("tick_to")) == null || context.getTickTo() < rs.getLong("tick_to"))) {
                        tickTo = combatSel.getTickTo();
                        noCache = true;
                    } else {
                        tickTo = getValueOrNull(rs, rs.getLong("tick_to"));
                        noCache = noCache || tickTo == null;
                    }
                } else {
                    tickFrom = rs.getLong("tick_from");
                    tickTo = getValueOrNull(rs, rs.getLong("tick_to"));
                }
                if (!noCache && cachedChallenges.containsKey(combat.getCombatId())) {
                    if (cachedChallenges.get(combat.getCombatId()).containsKey(playerName)) {
                        if (cachedChallenges.get(combat.getCombatId()).get(playerName).containsKey(rs.getLong("tick_from"))) {
                            return cachedChallenges.get(combat.getCombatId()).get(playerName).get(rs.getLong("tick_from"));
                        // NOTREACHED
                        }
                    }
                }
                final CombatSelection challengeCombatSel = new CombatSelection(rs.getInt("event_id_from"), getValueOrNull(rs, rs.getInt("event_id_to")), tickFrom, tickTo, phasesToChallenges.get(rs.getString("name")).getArgs(), phasesToChallenges.get(rs.getString("name")).getSql());
                final CombatStats stats = getCombatStats(combat, challengeCombatSel, playerName, true);
                final ChallengeStats challengeStats = new ChallengeStats(phasesToChallenges.get(rs.getString("name")).getChallengeName(), tickFrom, tickFrom + stats.getTick(), stats.getDamage(), stats.getHeal(), stats.getEffectiveHeal());
                if (!noCache && (getValueOrNull(rs, rs.getLong("tick_to")) != null)) {
                    if (!cachedChallenges.containsKey(combat.getCombatId())) {
                        cachedChallenges.put(combat.getCombatId(), new HashMap<>());
                    }
                    if (!cachedChallenges.get(combat.getCombatId()).containsKey(playerName)) {
                        cachedChallenges.get(combat.getCombatId()).put(playerName, new HashMap<>());
                    }
                    cachedChallenges.get(combat.getCombatId()).get(playerName).put(rs.getLong("tick_from"), challengeStats);
                }
                return challengeStats;
            } catch (Exception e) {
                logger.error("Unable to get combat challenge: " + e.getMessage(), e);
                return null;
            }
        }
    });
}
Also used : CombatSelection(com.ixale.starparse.domain.CombatSelection) HashMap(java.util.HashMap) ChallengeStats(com.ixale.starparse.domain.stats.ChallengeStats) DataAccessException(org.springframework.dao.DataAccessException) SQLException(java.sql.SQLException) EmptyResultDataAccessException(org.springframework.dao.EmptyResultDataAccessException) CombatChallenge(com.ixale.starparse.domain.CombatChallenge) CombatStats(com.ixale.starparse.domain.stats.CombatStats) ResultSet(java.sql.ResultSet)

Example 3 with CombatSelection

use of com.ixale.starparse.domain.CombatSelection in project StarParse by Ixale.

the class RaidPresenter method getDeathRecap.

private List<Event> getDeathRecap(final RaidRequest request, final String playerName) throws Exception {
    final long timestamp = request.getParams().getTimestamp();
    final Integer combatId = context.findCombatIdByCombatEvent(Event.Type.DEATH, timestamp, playerName);
    Combat combat = null;
    if (combatId != null) {
        combat = eventService.findCombat(combatId);
    }
    if (combat == null) {
        // no longer valid (another log maybe?)
        return null;
    }
    final long deathTick = timestamp - combat.getTimeFrom();
    final CombatSelection combatSel = new CombatSelection(combat.getEventIdFrom(), combat.getEventIdTo(), // last 10 seconds
    deathTick > 10000 ? deathTick - 10000 : 0, deathTick);
    return eventService.getCombatEvents(combat, Collections.singleton(Event.Type.SIMPLIFIED), null, null, null, combatSel, playerName).stream().filter((e) -> playerName.equals(e.getSource().getName()) || playerName.equals(e.getTarget().getName())).collect(Collectors.toList());
}
Also used : Button(javafx.scene.control.Button) Pos(javafx.geometry.Pos) Arrays(java.util.Arrays) RaidBossName(com.ixale.starparse.domain.RaidBossName) TimerManager(com.ixale.starparse.timer.TimerManager) URL(java.net.URL) LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) RaidService(com.ixale.starparse.service.RaidService) VBox(javafx.scene.layout.VBox) CombatStats(com.ixale.starparse.domain.stats.CombatStats) RaidManager(com.ixale.starparse.raid.RaidManager) Map(java.util.Map) Helpers(com.ixale.starparse.parser.Helpers) TableView(javafx.scene.control.TableView) NumberCellFactory(com.ixale.starparse.gui.table.NumberCellFactory) HBox(javafx.scene.layout.HBox) PropertyValueFactory(javafx.scene.control.cell.PropertyValueFactory) CombatEventStats(com.ixale.starparse.domain.stats.CombatEventStats) RaidPullTimer(com.ixale.starparse.timer.TimerManager.RaidPullTimer) Collection(java.util.Collection) RaidItem(com.ixale.starparse.gui.table.item.RaidItem) Collectors(java.util.stream.Collectors) RankService(com.ixale.starparse.service.RankService) RaidRequestMessage(com.ixale.starparse.ws.RaidRequestMessage) Platform(javafx.application.Platform) FXML(javafx.fxml.FXML) RaidCombatMessage(com.ixale.starparse.ws.RaidCombatMessage) SortType(javafx.scene.control.TableColumn.SortType) List(java.util.List) CombatSelection(com.ixale.starparse.domain.CombatSelection) ObservableList(javafx.collections.ObservableList) Config(com.ixale.starparse.gui.Config) RankType(com.ixale.starparse.service.RankService.RankType) RaidBreakTimer(com.ixale.starparse.timer.TimerManager.RaidBreakTimer) AbsorptionStats(com.ixale.starparse.domain.stats.AbsorptionStats) RaidRequest(com.ixale.starparse.domain.RaidRequest) FXCollections(javafx.collections.FXCollections) Format(com.ixale.starparse.gui.Format) HashMap(java.util.HashMap) TableColumn(javafx.scene.control.TableColumn) ArrayList(java.util.ArrayList) Inject(javax.inject.Inject) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) CharacterCellFactory(com.ixale.starparse.gui.table.CharacterCellFactory) RankClass(com.ixale.starparse.domain.RankClass) ResourceBundle(java.util.ResourceBundle) Event(com.ixale.starparse.domain.Event) Callback(javafx.util.Callback) Tooltip(javafx.scene.control.Tooltip) TimeUtils(com.ixale.starparse.time.TimeUtils) RaidNotesListener(com.ixale.starparse.gui.dialog.RaidNotesDialogPresenter.RaidNotesListener) Label(javafx.scene.control.Label) Logger(org.slf4j.Logger) Iterator(java.util.Iterator) Combat(com.ixale.starparse.domain.Combat) Node(javafx.scene.Node) TableRow(javafx.scene.control.TableRow) CheckBox(javafx.scene.control.CheckBox) RaidTimeCellFactory(com.ixale.starparse.gui.table.RaidTimeCellFactory) File(java.io.File) RaidNotesDialogPresenter(com.ixale.starparse.gui.dialog.RaidNotesDialogPresenter) RankCellFactory(com.ixale.starparse.gui.table.RankCellFactory) Consumer(java.util.function.Consumer) ActionEvent(javafx.event.ActionEvent) Type(com.ixale.starparse.gui.FlashMessage.Type) TableResizer(com.ixale.starparse.gui.table.TableResizer) ChallengeStats(com.ixale.starparse.domain.stats.ChallengeStats) Comparator(java.util.Comparator) Collections(java.util.Collections) RaidNotesPopoutPresenter(com.ixale.starparse.gui.popout.RaidNotesPopoutPresenter) BaseItem(com.ixale.starparse.gui.table.item.BaseItem) RequestIncomingCallback(com.ixale.starparse.ws.RaidClient.RequestIncomingCallback) CombatSelection(com.ixale.starparse.domain.CombatSelection) Combat(com.ixale.starparse.domain.Combat)

Example 4 with CombatSelection

use of com.ixale.starparse.domain.CombatSelection in project StarParse by Ixale.

the class CombatDaoImpl method storeCombat.

private void storeCombat(final Combat c, boolean create, boolean close) throws Exception {
    // resolve name
    final String combatName = close ? getJdbcTemplate().query(SQL_GET_NAME, new Object[] { c.getEventIdFrom(), c.getEventIdTo() != null ? c.getEventIdTo() : Integer.MAX_VALUE }, rs -> rs.next() ? rs.getString("combat_name") : null) : null;
    final Timestamp fromTs = new Timestamp(c.getTimeFrom());
    Integer selfTick = null;
    for (final Map.Entry<Actor, CharacterDiscipline> entry : context.getCombatInfo().get(c.getCombatId()).getCombatPlayers().entrySet()) {
        // gather statistics
        final CombatStats stats = getCombatStats(c, new CombatSelection(c.getEventIdFrom(), c.getEventIdTo(), null, null), entry.getKey().getName());
        // insert or update (same structure)
        final Timestamp toTs = new Timestamp(c.getTimeTo() != null ? c.getTimeTo() : c.getTimeFrom() + stats.getTick());
        if (selfTick == null) {
            // take first encountered (== this player)
            selfTick = stats.getTick();
        }
        getJdbcTemplate().update(create ? SQL_INSERT_STATS : SQL_UPDATE_STATS, new Object[] { c.getEventIdFrom(), c.getEventIdTo(), fromTs, toTs, stats.getActions(), stats.getApm(), stats.getDamage(), stats.getDps(), stats.getHeal(), stats.getHps(), stats.getEffectiveHeal(), stats.getEhps(), stats.getEhpsPercent(), stats.getDamageTaken(), stats.getDtps(), stats.getAbsorbed(), stats.getAps(), stats.getHealTaken(), stats.getHpsTaken(), stats.getEhpsTaken(), stats.getEffectiveHealTakenTotal(), stats.getThreat(), stats.getThreatPositive(), stats.getTps(), entry.getValue() != null ? entry.getValue().name() : null, c.getCombatId(), entry.getKey().getName() });
    }
    getJdbcTemplate().update(create ? SQL_INSERT : SQL_UPDATE, new Object[] { c.getLogId(), c.getEventIdFrom(), c.getEventIdTo(), fromTs, new Timestamp(c.getTimeTo() != null ? c.getTimeTo() : c.getTimeFrom() + (selfTick == null ? 1000 : selfTick)), c.getBoss() != null ? c.getBoss().getRaid().getName() : null, c.getBoss() != null ? c.getBoss().toString() : null, combatName, c.isPvp() != null ? c.isPvp() : null, !close, c.getCombatId() });
}
Also used : CharacterDiscipline(com.ixale.starparse.domain.CharacterDiscipline) AbsorptionStats(com.ixale.starparse.domain.stats.AbsorptionStats) DamageDealtStats(com.ixale.starparse.domain.stats.DamageDealtStats) DataAccessException(org.springframework.dao.DataAccessException) CombatChallenge(com.ixale.starparse.domain.CombatChallenge) CombatMitigationStats(com.ixale.starparse.domain.stats.CombatMitigationStats) CombatTickStats(com.ixale.starparse.domain.stats.CombatTickStats) HealingDoneStats(com.ixale.starparse.domain.stats.HealingDoneStats) LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) SimpleDateFormat(java.text.SimpleDateFormat) HashMap(java.util.HashMap) CombatDao(com.ixale.starparse.service.dao.CombatDao) ArrayList(java.util.ArrayList) Effect(com.ixale.starparse.domain.Effect) SQLException(java.sql.SQLException) Calendar(java.util.Calendar) EntityGuid(com.ixale.starparse.domain.EntityGuid) CombatStats(com.ixale.starparse.domain.stats.CombatStats) ResultSet(java.sql.ResultSet) Map(java.util.Map) Event(com.ixale.starparse.domain.Event) Helpers(com.ixale.starparse.parser.Helpers) Repository(org.springframework.stereotype.Repository) TimeUtils(com.ixale.starparse.time.TimeUtils) EmptyResultDataAccessException(org.springframework.dao.EmptyResultDataAccessException) Logger(org.slf4j.Logger) Combat(com.ixale.starparse.domain.Combat) Timestamp(java.sql.Timestamp) Set(java.util.Set) DamageTakenStats(com.ixale.starparse.domain.stats.DamageTakenStats) HealingTakenStats(com.ixale.starparse.domain.stats.HealingTakenStats) List(java.util.List) CombatSelection(com.ixale.starparse.domain.CombatSelection) ChallengeStats(com.ixale.starparse.domain.stats.ChallengeStats) RowMapper(org.springframework.jdbc.core.RowMapper) Actor(com.ixale.starparse.domain.Actor) Collections(java.util.Collections) CombatSelection(com.ixale.starparse.domain.CombatSelection) CombatStats(com.ixale.starparse.domain.stats.CombatStats) CharacterDiscipline(com.ixale.starparse.domain.CharacterDiscipline) Actor(com.ixale.starparse.domain.Actor) Timestamp(java.sql.Timestamp) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

CombatSelection (com.ixale.starparse.domain.CombatSelection)4 CombatStats (com.ixale.starparse.domain.stats.CombatStats)4 HashMap (java.util.HashMap)4 ChallengeStats (com.ixale.starparse.domain.stats.ChallengeStats)3 SQLException (java.sql.SQLException)3 DataAccessException (org.springframework.dao.DataAccessException)3 EmptyResultDataAccessException (org.springframework.dao.EmptyResultDataAccessException)3 Combat (com.ixale.starparse.domain.Combat)2 CombatChallenge (com.ixale.starparse.domain.CombatChallenge)2 Event (com.ixale.starparse.domain.Event)2 AbsorptionStats (com.ixale.starparse.domain.stats.AbsorptionStats)2 Helpers (com.ixale.starparse.parser.Helpers)2 TimeUtils (com.ixale.starparse.time.TimeUtils)2 Actor (com.ixale.starparse.domain.Actor)1 CharacterDiscipline (com.ixale.starparse.domain.CharacterDiscipline)1 Effect (com.ixale.starparse.domain.Effect)1 EntityGuid (com.ixale.starparse.domain.EntityGuid)1 RaidBossName (com.ixale.starparse.domain.RaidBossName)1 RaidRequest (com.ixale.starparse.domain.RaidRequest)1 RankClass (com.ixale.starparse.domain.RankClass)1