feat: Add mining statistics, turtle groups, and session tracking to database schema
This commit is contained in:
@@ -88,6 +88,51 @@ export function initializeDatabase() {
|
|||||||
)
|
)
|
||||||
`);
|
`);
|
||||||
|
|
||||||
|
// Mining statistics table
|
||||||
|
db.exec(`
|
||||||
|
CREATE TABLE IF NOT EXISTS mining_stats (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
turtle_id INTEGER NOT NULL,
|
||||||
|
block_type TEXT NOT NULL,
|
||||||
|
count INTEGER DEFAULT 1,
|
||||||
|
session_start INTEGER NOT NULL,
|
||||||
|
last_mined INTEGER NOT NULL
|
||||||
|
)
|
||||||
|
`);
|
||||||
|
|
||||||
|
// Turtle groups/teams table
|
||||||
|
db.exec(`
|
||||||
|
CREATE TABLE IF NOT EXISTS turtle_groups (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
group_name TEXT NOT NULL UNIQUE,
|
||||||
|
color TEXT DEFAULT '#3b82f6',
|
||||||
|
created_at INTEGER NOT NULL
|
||||||
|
)
|
||||||
|
`);
|
||||||
|
|
||||||
|
// Turtle group membership table
|
||||||
|
db.exec(`
|
||||||
|
CREATE TABLE IF NOT EXISTS turtle_group_members (
|
||||||
|
turtle_id INTEGER NOT NULL,
|
||||||
|
group_id INTEGER NOT NULL,
|
||||||
|
joined_at INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (turtle_id, group_id),
|
||||||
|
FOREIGN KEY (group_id) REFERENCES turtle_groups(id) ON DELETE CASCADE
|
||||||
|
)
|
||||||
|
`);
|
||||||
|
|
||||||
|
// Session tracking table (for time-based statistics)
|
||||||
|
db.exec(`
|
||||||
|
CREATE TABLE IF NOT EXISTS turtle_sessions (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
turtle_id INTEGER NOT NULL,
|
||||||
|
started_at INTEGER NOT NULL,
|
||||||
|
ended_at INTEGER,
|
||||||
|
blocks_mined INTEGER DEFAULT 0,
|
||||||
|
distance_traveled INTEGER DEFAULT 0
|
||||||
|
)
|
||||||
|
`);
|
||||||
|
|
||||||
// Create indexes for better performance
|
// Create indexes for better performance
|
||||||
db.exec(`
|
db.exec(`
|
||||||
CREATE INDEX IF NOT EXISTS idx_world_blocks_discovered
|
CREATE INDEX IF NOT EXISTS idx_world_blocks_discovered
|
||||||
@@ -278,6 +323,138 @@ export function closeMiningArea(areaId) {
|
|||||||
stmt.run(Date.now(), areaId);
|
stmt.run(Date.now(), areaId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mining Statistics
|
||||||
|
export function recordBlockMined(turtleId, blockType) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
INSERT INTO mining_stats (turtle_id, block_type, count, session_start, last_mined)
|
||||||
|
VALUES (?, ?, 1, ?, ?)
|
||||||
|
ON CONFLICT(turtle_id, block_type, session_start)
|
||||||
|
DO UPDATE SET count = count + 1, last_mined = ?
|
||||||
|
`);
|
||||||
|
const now = Date.now();
|
||||||
|
const sessionStart = now - (now % (24 * 60 * 60 * 1000)); // Start of day
|
||||||
|
stmt.run(turtleId, blockType, sessionStart, now, now);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getMiningStats(turtleId = null, days = 7) {
|
||||||
|
const cutoff = Date.now() - (days * 24 * 60 * 60 * 1000);
|
||||||
|
|
||||||
|
if (turtleId) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
SELECT block_type, SUM(count) as total_count
|
||||||
|
FROM mining_stats
|
||||||
|
WHERE turtle_id = ? AND session_start >= ?
|
||||||
|
GROUP BY block_type
|
||||||
|
ORDER BY total_count DESC
|
||||||
|
`);
|
||||||
|
return stmt.all(turtleId, cutoff);
|
||||||
|
} else {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
SELECT turtle_id, block_type, SUM(count) as total_count
|
||||||
|
FROM mining_stats
|
||||||
|
WHERE session_start >= ?
|
||||||
|
GROUP BY turtle_id, block_type
|
||||||
|
ORDER BY turtle_id, total_count DESC
|
||||||
|
`);
|
||||||
|
return stmt.all(cutoff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getTopMiners(limit = 10) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
SELECT turtle_id, SUM(count) as total_blocks
|
||||||
|
FROM mining_stats
|
||||||
|
GROUP BY turtle_id
|
||||||
|
ORDER BY total_blocks DESC
|
||||||
|
LIMIT ?
|
||||||
|
`);
|
||||||
|
return stmt.all(limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Turtle Groups/Teams
|
||||||
|
export function createGroup(groupName, color = '#3b82f6') {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
INSERT INTO turtle_groups (group_name, color, created_at)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
`);
|
||||||
|
const result = stmt.run(groupName, color, Date.now());
|
||||||
|
return result.lastInsertRowid;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAllGroups() {
|
||||||
|
const stmt = db.prepare('SELECT * FROM turtle_groups ORDER BY created_at DESC');
|
||||||
|
return stmt.all();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deleteGroup(groupId) {
|
||||||
|
const stmt = db.prepare('DELETE FROM turtle_groups WHERE id = ?');
|
||||||
|
stmt.run(groupId);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function addTurtleToGroup(turtleId, groupId) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
INSERT OR IGNORE INTO turtle_group_members (turtle_id, group_id, joined_at)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
`);
|
||||||
|
stmt.run(turtleId, groupId, Date.now());
|
||||||
|
}
|
||||||
|
|
||||||
|
export function removeTurtleFromGroup(turtleId, groupId) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
DELETE FROM turtle_group_members
|
||||||
|
WHERE turtle_id = ? AND group_id = ?
|
||||||
|
`);
|
||||||
|
stmt.run(turtleId, groupId);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getGroupMembers(groupId) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
SELECT turtle_id, joined_at
|
||||||
|
FROM turtle_group_members
|
||||||
|
WHERE group_id = ?
|
||||||
|
`);
|
||||||
|
return stmt.all(groupId);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getTurtleGroups(turtleId) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
SELECT g.*, m.joined_at
|
||||||
|
FROM turtle_groups g
|
||||||
|
JOIN turtle_group_members m ON g.id = m.group_id
|
||||||
|
WHERE m.turtle_id = ?
|
||||||
|
`);
|
||||||
|
return stmt.all(turtleId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Session Tracking
|
||||||
|
export function startSession(turtleId) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
INSERT INTO turtle_sessions (turtle_id, started_at)
|
||||||
|
VALUES (?, ?)
|
||||||
|
`);
|
||||||
|
const result = stmt.run(turtleId, Date.now());
|
||||||
|
return result.lastInsertRowid;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function endSession(sessionId, blocksMined, distanceTraveled) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
UPDATE turtle_sessions
|
||||||
|
SET ended_at = ?, blocks_mined = ?, distance_traveled = ?
|
||||||
|
WHERE id = ?
|
||||||
|
`);
|
||||||
|
stmt.run(Date.now(), blocksMined, distanceTraveled, sessionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSessionStats(turtleId, limit = 10) {
|
||||||
|
const stmt = db.prepare(`
|
||||||
|
SELECT * FROM turtle_sessions
|
||||||
|
WHERE turtle_id = ?
|
||||||
|
ORDER BY started_at DESC
|
||||||
|
LIMIT ?
|
||||||
|
`);
|
||||||
|
return stmt.all(turtleId, limit);
|
||||||
|
}
|
||||||
|
|
||||||
// Cleanup function
|
// Cleanup function
|
||||||
export function closeDatabase() {
|
export function closeDatabase() {
|
||||||
db.close();
|
db.close();
|
||||||
|
|||||||
Reference in New Issue
Block a user