From dcfd184a6bb497e3eefbab3feb27b3f8d3c8d571 Mon Sep 17 00:00:00 2001 From: borja Date: Mon, 24 Mar 2025 11:57:25 +0100 Subject: [PATCH] =?UTF-8?q?pues=20yo=20qu=C3=A9=20s=C3=A9=20se=20ha=20carg?= =?UTF-8?q?ado=20un=20mont=C3=B3n=20de=20archivos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/notificationService.ts | 54 ----------------- src/services/reminderService.ts | 49 --------------- src/utils/communityUtils.ts | 45 -------------- src/utils/userUtils.ts | 93 +++++++++++++++-------------- 4 files changed, 48 insertions(+), 193 deletions(-) delete mode 100644 src/services/notificationService.ts delete mode 100644 src/services/reminderService.ts delete mode 100644 src/utils/communityUtils.ts diff --git a/src/services/notificationService.ts b/src/services/notificationService.ts deleted file mode 100644 index 98fbf7c..0000000 --- a/src/services/notificationService.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { sendMessage } from '../bot/utils/messaging.ts' -import { formatUserMention } from '../utils/userUtils'; -import { Task } from '../models/task'; - -export function notifyTaskCreation(task: Task) { - const creatorMention = formatUserMention(task.createdBy); - const assigneeMention = task.assignedTo ? formatUserMention(task.assignedTo) : 'ninguno'; - - // Notify creator - let message = `✅ Tarea creada:\nID: ${task.id}\nDescripción: ${task.description}`; - if (task.assignedTo) { - message += `\nAsignada a: ${assigneeMention}`; - } - if (task.dueDate) { - message += `\nFecha límite: ${task.dueDate}`; - } - sendMessage(task.createdBy, message); - - // Notify assignee if different from creator - if (task.assignedTo && task.assignedTo !== task.createdBy) { - const assigneeMessage = `📝 ${creatorMention} te ha asignado una nueva tarea:\n` + - `ID: ${task.id}\nDescripción: ${task.description}` + - (task.dueDate ? `\nFecha límite: ${task.dueDate}` : ''); - sendMessage(task.assignedTo, assigneeMessage, [task.assignedTo.split('@')[0]]); - } -} - -export function notifyTaskAssignment(task: Task, assignedBy: string) { - const assignerMention = formatUserMention(assignedBy); - const assigneeMention = formatUserMention(task.assignedTo); - - // Notify assigner - sendMessage(assignedBy, `✅ Tarea ${task.id} asignada a ${assigneeMention}`); - - // Notify assignee - const assigneeMessage = `📝 ${assignerMention} te ha asignado la tarea:\n` + - `ID: ${task.id}\nDescripción: ${task.description}` + - (task.dueDate ? `\nFecha límite: ${task.dueDate}` : ''); - sendMessage(task.assignedTo, assigneeMessage); -} - -export function notifyTaskCompletion(task: Task, completedBy: string) { - const completerMention = formatUserMention(completedBy); - - // Notify completer - sendMessage(completedBy, `✅ Tarea completada:\nID: ${task.id}\nDescripción: ${task.description}`); - - // Notify creator if different from completer - if (task.createdBy && task.createdBy !== completedBy) { - const creatorMessage = `✅ ${completerMention} ha completado la tarea:\n` + - `ID: ${task.id}\nDescripción: ${task.description}`; - sendMessage(task.createdBy, creatorMessage); - } -} diff --git a/src/services/reminderService.ts b/src/services/reminderService.ts deleted file mode 100644 index 591e329..0000000 --- a/src/services/reminderService.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { query } from '../database/db'; -import { sendMessage } from '../bot/utils/messaging'; -import { Task } from '../models/task'; -import { getUserPreferences } from './userService'; - -export function getTasksNeedingReminders(): Task[] { - const now = new Date().toISOString(); - const tasks = query(` - SELECT t.* - FROM tasks t - JOIN user_preferences up ON t.assigned_to = up.phone_number - WHERE t.completed = FALSE - AND (t.due_date IS NULL OR t.due_date > ?) - AND (t.last_reminder IS NULL OR t.last_reminder < datetime(?, '-1 day')) - AND up.reminders_enabled = TRUE - `, [now, now]); - - // Also include tasks for users who haven't set preferences yet - const newUsersTasks = query(` - SELECT t.* - FROM tasks t - LEFT JOIN user_preferences up ON t.assigned_to = up.phone_number - WHERE t.completed = FALSE - AND (t.due_date IS NULL OR t.due_date > ?) - AND (t.last_reminder IS NULL OR t.last_reminder < datetime(?, '-1 day')) - AND up.phone_number IS NULL - `, [now, now]); - - return [...tasks, ...newUsersTasks]; -} - -export async function sendTaskReminder(task: Task) { - if (!task.assignedTo) return; - - const message = `🔔 Recordatorio de tarea:\n` + - `ID: ${task.id}\n` + - `Descripción: ${task.description}\n` + - (task.dueDate ? `Fecha límite: ${task.dueDate}\n` : '') + - `Creada: ${task.createdAt}\n\n` + - `Usa /tarea completar ${task.id} cuando la termines.`; - - try { - await sendMessage(task.assignedTo, message); - // Update last reminder timestamp - query('UPDATE tasks SET last_reminder = CURRENT_TIMESTAMP WHERE id = ?', [task.id]); - } catch (error) { - console.error('Error sending reminder:', error); - } -} diff --git a/src/utils/communityUtils.ts b/src/utils/communityUtils.ts deleted file mode 100644 index 249faee..0000000 --- a/src/utils/communityUtils.ts +++ /dev/null @@ -1,45 +0,0 @@ -import axios from 'axios'; -import dotenv from 'dotenv'; - -dotenv.config(); - -const API_URL = process.env.API_URL; -const INSTANCE_NAME = process.env.INSTANCE_NAME; -const API_KEY = process.env.API_KEY; - -export async function isUserInCommunity(userJid: string, groupJids: Set): Promise { - try { - // Check each group for the user - for (const groupJid of groupJids) { - const response = await axios.get( - `${API_URL}/group/participants/${INSTANCE_NAME}`, - { - params: { - groupJid: groupJid - }, - headers: { - apikey: API_KEY - } - } - ); - - // Check if user is in this group's participants - const participants = response.data?.participants || []; - console.log('Participants:', participants); - - // Check both JID and phone number formats - const userPhone = userJid.split('@')[0]; - if (participants.some(p => { - // Handle both string and object participant formats - const participantJid = typeof p === 'string' ? p : p?.id; - return participantJid === userJid || participantJid?.startsWith?.(userPhone); - })) { - return true; - } - } - return false; - } catch (error) { - console.error('Error checking community membership:', error); - return false; - } -} diff --git a/src/utils/userUtils.ts b/src/utils/userUtils.ts index bfeec10..d35c380 100644 --- a/src/utils/userUtils.ts +++ b/src/utils/userUtils.ts @@ -1,53 +1,56 @@ export function normalizeUserIdentifier(input: string): string { - console.log('Normalizing user identifier:', input); - - // Handle group JID format (120363418564126395@g.us) - if (input.endsWith('@g.us')) { - return input; // Return group JID as-is - } - - // Handle user JID format (12345678@s.whatsapp.net) - if (input.includes('@s.whatsapp.net')) { - const [phone, domain] = input.split('@'); - const cleanPhone = phone.replace(/\D/g, ''); - return `${cleanPhone}@${domain}`; - } - - // Handle raw input (phone number or @mention) - const cleanInput = input.startsWith('@') ? input.slice(1) : input; - const phoneNumber = cleanInput.replace(/\D/g, ''); - - // Validate phone number length - if (phoneNumber.length < 8 || phoneNumber.length > 15) { - throw new Error('Número de teléfono inválido'); - } - - const jid = `${phoneNumber}@s.whatsapp.net`; - console.log('Normalized JID:', jid); - return jid; + console.log('Normalizing user identifier:', input); + + // Handle group JID format (120363418564126395@g.us) + if (input.endsWith('@g.us')) { + return input; // Return group JID as-is + } + + // Handle user JID format (12345678@s.whatsapp.net) + // if (input.includes('@s.whatsapp.net')) { + // const [phone, domain] = input.split('@'); + // const cleanPhone = phone.replace(/\D/g, ''); + // return `${cleanPhone}@${domain}`; + // } + if (input.includes('@s.whatsapp.net')) { + return input.split('@')[0]; + } + + // Handle raw input (phone number or @mention) + const cleanInput = input.startsWith('@') ? input.slice(1) : input; + const phoneNumber = cleanInput.replace(/\D/g, ''); + + // Validate phone number length + if (phoneNumber.length < 8 || phoneNumber.length > 15) { + throw new Error('Número de teléfono inválido'); + } + + const jid = `${phoneNumber}@s.whatsapp.net`; + console.log('Normalized JID:', jid); + return jid; } export function extractUserFromJid(jid: string): string { - // Extract phone number from JID (format: 12345678@s.whatsapp.net) - const phoneNumber = jid.split('@')[0]; - return normalizeUserIdentifier(phoneNumber); + // Extract phone number from JID (format: 12345678@s.whatsapp.net) + const phoneNumber = jid.split('@')[0]; + return normalizeUserIdentifier(phoneNumber); } export function formatUserMention(phoneNumber?: string): string { - if (!phoneNumber) { - return '@unknown'; - } - - // Handle full JID format - if (phoneNumber.includes('@s.whatsapp.net')) { - return `@${phoneNumber.split('@')[0]}`; - } - - // Handle already formatted mentions - if (phoneNumber.startsWith('@')) { - return phoneNumber; - } - - // Handle raw numbers - return `@${phoneNumber.replace(/\D/g, '')}`; + if (!phoneNumber) { + return '@unknown'; + } + + // Handle full JID format + if (phoneNumber.includes('@s.whatsapp.net')) { + return `@${phoneNumber.split('@')[0]}`; + } + + // Handle already formatted mentions + if (phoneNumber.startsWith('@')) { + return phoneNumber; + } + + // Handle raw numbers + return `@${phoneNumber.replace(/\D/g, '')}`; }