AeThex-Bot-Master/aethex-bot/utils/trustLevels.js
sirpiglr a1912fc48a Add verification success endpoint and improve trust level system
Adds a POST endpoint `/api/verify-success` to `webServer.js` for handling verification callbacks from aethex.dev, including secret validation and role assignment. Updates `federationProtection.js` and `federation.js` to integrate trust level calculations and benefits. Introduces a new `trustLevels.js` utility file to manage trust level definitions, progression, and related logic.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: aed2e46d-25bb-4b73-81a1-bb9e8437c261
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 98ebd9a6-5755-4d7f-ae64-9ed93f1eae4f
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3bdfff67-975a-46ad-9845-fbb6b4a4c4b5/aed2e46d-25bb-4b73-81a1-bb9e8437c261/3tJ1Z1J
Replit-Helium-Checkpoint-Created: true
2025-12-13 10:11:52 +00:00

195 lines
5.2 KiB
JavaScript

const TRUST_LEVELS = {
bronze: {
name: 'Bronze',
emoji: '🥉',
color: 0xcd7f32,
requirements: {
minMembers: 0,
minDays: 0,
minReputationScore: 0
},
benefits: {
autoAction: 'alert',
severityThreshold: 'critical',
directoryListing: true,
featuredEligible: false,
partnershipLimit: 3
}
},
silver: {
name: 'Silver',
emoji: '🥈',
color: 0xc0c0c0,
requirements: {
minMembers: 100,
minDays: 30,
minReputationScore: 50
},
benefits: {
autoAction: 'kick',
severityThreshold: 'medium',
directoryListing: true,
featuredEligible: false,
partnershipLimit: 5
}
},
gold: {
name: 'Gold',
emoji: '🥇',
color: 0xffd700,
requirements: {
minMembers: 500,
minDays: 90,
minReputationScore: 200
},
benefits: {
autoAction: 'ban',
severityThreshold: 'medium',
directoryListing: true,
featuredEligible: true,
partnershipLimit: 10
}
},
platinum: {
name: 'Platinum',
emoji: '💎',
color: 0xe5e4e2,
requirements: {
minMembers: 1000,
minDays: 180,
minReputationScore: 500
},
benefits: {
autoAction: 'ban',
severityThreshold: 'low',
directoryListing: true,
featuredEligible: true,
partnershipLimit: 20
}
}
};
const TRUST_ORDER = ['bronze', 'silver', 'gold', 'platinum'];
function calculateTrustLevel(serverData) {
const memberCount = serverData.member_count || 0;
const joinedAt = new Date(serverData.joined_federation_at || serverData.joined_at);
const daysInFederation = Math.floor((Date.now() - joinedAt.getTime()) / (1000 * 60 * 60 * 24));
const reputationScore = serverData.reputation_score || 0;
let qualifiedLevel = 'bronze';
for (const level of TRUST_ORDER) {
const reqs = TRUST_LEVELS[level].requirements;
if (memberCount >= reqs.minMembers &&
daysInFederation >= reqs.minDays &&
reputationScore >= reqs.minReputationScore) {
qualifiedLevel = level;
} else {
break;
}
}
return qualifiedLevel;
}
function getTrustLevelInfo(level) {
return TRUST_LEVELS[level] || TRUST_LEVELS.bronze;
}
function getNextTrustLevel(currentLevel) {
const currentIndex = TRUST_ORDER.indexOf(currentLevel);
if (currentIndex === -1 || currentIndex >= TRUST_ORDER.length - 1) {
return null;
}
return TRUST_ORDER[currentIndex + 1];
}
function getProgressToNextLevel(serverData) {
const currentLevel = serverData.trust_level || 'bronze';
const nextLevel = getNextTrustLevel(currentLevel);
if (!nextLevel) {
return { nextLevel: null, progress: {}, allMet: true };
}
const reqs = TRUST_LEVELS[nextLevel].requirements;
const memberCount = serverData.member_count || 0;
const joinedAt = new Date(serverData.joined_federation_at || serverData.joined_at);
const daysInFederation = Math.floor((Date.now() - joinedAt.getTime()) / (1000 * 60 * 60 * 24));
const reputationScore = serverData.reputation_score || 0;
const progress = {
members: {
current: memberCount,
required: reqs.minMembers,
met: memberCount >= reqs.minMembers,
percentage: Math.min(100, Math.floor((memberCount / reqs.minMembers) * 100)) || 0
},
days: {
current: daysInFederation,
required: reqs.minDays,
met: daysInFederation >= reqs.minDays,
percentage: Math.min(100, Math.floor((daysInFederation / reqs.minDays) * 100)) || 0
},
reputation: {
current: reputationScore,
required: reqs.minReputationScore,
met: reputationScore >= reqs.minReputationScore,
percentage: Math.min(100, Math.floor((reputationScore / reqs.minReputationScore) * 100)) || 0
}
};
const allMet = progress.members.met && progress.days.met && progress.reputation.met;
return { nextLevel, nextLevelInfo: TRUST_LEVELS[nextLevel], progress, allMet };
}
function shouldAutoAction(trustLevel, banSeverity, isPremium) {
const levelInfo = getTrustLevelInfo(trustLevel);
const severityOrder = ['low', 'medium', 'high', 'critical'];
const banSeverityIndex = severityOrder.indexOf(banSeverity);
const thresholdIndex = severityOrder.indexOf(levelInfo.benefits.severityThreshold);
if (banSeverityIndex < thresholdIndex) {
if (banSeverity === 'critical') {
return { action: 'ban', reason: 'critical_severity' };
}
return { action: 'alert', reason: 'below_threshold' };
}
if (isPremium) {
return { action: levelInfo.benefits.autoAction, reason: 'premium_protection' };
}
if (banSeverity === 'critical') {
return { action: 'ban', reason: 'critical_severity' };
}
return { action: 'alert', reason: 'free_tier' };
}
function calculateReputationChange(action, successful = true) {
const reputationValues = {
ban_report: successful ? 10 : -5,
report_verified: 15,
false_positive: -20,
event_hosted: 25,
partnership_formed: 10,
monthly_activity: 5
};
return reputationValues[action] || 0;
}
module.exports = {
TRUST_LEVELS,
TRUST_ORDER,
calculateTrustLevel,
getTrustLevelInfo,
getNextTrustLevel,
getProgressToNextLevel,
shouldAutoAction,
calculateReputationChange
};