import Component from "@glimmer/component"; import { get } from "@ember/helper"; import { action } from "@ember/object"; import didInsert from "@ember/render-modifiers/modifiers/did-insert"; import willDestroy from "@ember/render-modifiers/modifiers/will-destroy"; import { service } from "@ember/service"; import number from "discourse/helpers/number"; import { i18n } from "discourse-i18n"; export default class AiUsage extends Component { @service currentUser; matrixInterval = null; get totalRequests() { return this.args.report.data.total_requests ?? 0; } get totalTokens() { return this.args.report.data.total_tokens ?? 0; } get successRate() { return this.args.report.data.success_rate ?? 0; } get featureUsage() { return Object.entries(this.args.report.data.feature_usage ?? {}) .filter(([name]) => name && name.trim().length > 0) .slice(0, 3); } get modelUsage() { return Object.entries(this.args.report.data.model_usage ?? {}) .filter(([name]) => name && name.trim().length > 0) .slice(0, 3); } @action formatFeatureName(featureName) { return featureName.replace(/_/g, " "); } @action setupMatrix(element) { const canvas = element; const ctx = canvas.getContext("2d"); canvas.width = element.offsetWidth; canvas.height = element.offsetHeight; const characters = "01アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン"; const fontSize = 14; const columns = Math.floor(canvas.width / fontSize); const drops = Array(columns).fill(1); const draw = () => { ctx.fillStyle = "rgba(0, 0, 0, 0.05)"; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = "#0f0"; ctx.font = `${fontSize}px monospace`; for (let i = 0; i < drops.length; i++) { const char = characters[Math.floor(Math.random() * characters.length)]; const x = i * fontSize; const y = drops[i] * fontSize; ctx.fillText(char, x, y); if (y > canvas.height && Math.random() > 0.975) { drops[i] = 0; } drops[i]++; } }; this.matrixInterval = setInterval(draw, 33); } @action cleanupMatrix() { if (this.matrixInterval) { clearInterval(this.matrixInterval); } } }