mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-22 15:43:49 +01:00
RE'd putAdd_ud_point (FUN_114fd490) and putAdd_ud_tactics_point (FUN_114fe9c0) from the ZZ client DLL via Ghidra decompilation. MsgMhfAddUdPoint fields: QuestPoints (sum of 11 category accumulators earned per quest) and BonusPoints (kiju prayer song multiplier extra). MsgMhfAddUdTacticsPoint fields: QuestID and TacticsPoints. Adds diva_points table (migration 0009) for per-character per-event point tracking, with UPSERT-based atomic accumulation in the handler.
78 lines
2.6 KiB
Go
78 lines
2.6 KiB
Go
package channelserver
|
|
|
|
import (
|
|
"github.com/jmoiron/sqlx"
|
|
)
|
|
|
|
// DivaRepository centralizes all database access for diva defense events.
|
|
type DivaRepository struct {
|
|
db *sqlx.DB
|
|
}
|
|
|
|
// NewDivaRepository creates a new DivaRepository.
|
|
func NewDivaRepository(db *sqlx.DB) *DivaRepository {
|
|
return &DivaRepository{db: db}
|
|
}
|
|
|
|
// DeleteEvents removes all diva events.
|
|
func (r *DivaRepository) DeleteEvents() error {
|
|
_, err := r.db.Exec("DELETE FROM events WHERE event_type='diva'")
|
|
return err
|
|
}
|
|
|
|
// InsertEvent creates a new diva event with the given start epoch.
|
|
func (r *DivaRepository) InsertEvent(startEpoch uint32) error {
|
|
_, err := r.db.Exec("INSERT INTO events (event_type, start_time) VALUES ('diva', to_timestamp($1)::timestamp without time zone)", startEpoch)
|
|
return err
|
|
}
|
|
|
|
// DivaEvent represents a diva event row with ID and start_time epoch.
|
|
type DivaEvent struct {
|
|
ID uint32 `db:"id"`
|
|
StartTime uint32 `db:"start_time"`
|
|
}
|
|
|
|
// GetEvents returns all diva events with their ID and start_time epoch.
|
|
func (r *DivaRepository) GetEvents() ([]DivaEvent, error) {
|
|
var result []DivaEvent
|
|
err := r.db.Select(&result, "SELECT id, (EXTRACT(epoch FROM start_time)::int) as start_time FROM events WHERE event_type='diva'")
|
|
return result, err
|
|
}
|
|
|
|
// AddPoints atomically adds quest and bonus points for a character in a diva event.
|
|
func (r *DivaRepository) AddPoints(charID, eventID, questPoints, bonusPoints uint32) error {
|
|
_, err := r.db.Exec(`
|
|
INSERT INTO diva_points (char_id, event_id, quest_points, bonus_points, updated_at)
|
|
VALUES ($1, $2, $3, $4, now())
|
|
ON CONFLICT (char_id, event_id) DO UPDATE
|
|
SET quest_points = diva_points.quest_points + EXCLUDED.quest_points,
|
|
bonus_points = diva_points.bonus_points + EXCLUDED.bonus_points,
|
|
updated_at = now()`,
|
|
charID, eventID, questPoints, bonusPoints)
|
|
return err
|
|
}
|
|
|
|
// GetPoints returns the accumulated quest and bonus points for a character in an event.
|
|
func (r *DivaRepository) GetPoints(charID, eventID uint32) (int64, int64, error) {
|
|
var qp, bp int64
|
|
err := r.db.QueryRow(
|
|
"SELECT quest_points, bonus_points FROM diva_points WHERE char_id=$1 AND event_id=$2",
|
|
charID, eventID).Scan(&qp, &bp)
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
return qp, bp, nil
|
|
}
|
|
|
|
// GetTotalPoints returns the sum of all players' quest and bonus points for an event.
|
|
func (r *DivaRepository) GetTotalPoints(eventID uint32) (int64, int64, error) {
|
|
var qp, bp int64
|
|
err := r.db.QueryRow(
|
|
"SELECT COALESCE(SUM(quest_points),0), COALESCE(SUM(bonus_points),0) FROM diva_points WHERE event_id=$1",
|
|
eventID).Scan(&qp, &bp)
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
return qp, bp, nil
|
|
}
|