You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
6.4 KiB
TypeScript

import { sendMessage } from '../utils/messaging';
import { createTask, assignTask, completeTask, getPendingTasks } from '../../services/taskService';
import { setRemindersEnabled } from '../../services/userService';
function formatTaskList(tasks: any[]) {
if (tasks.length === 0) {
return 'No tienes tareas pendientes.';
}
return tasks.map((task) => {
return `- Tarea ${task.id}: ${task.description}${task.dueDate ? ` (para el ${task.dueDate})` : ''}`;
}).join('\n');
}
export function handleTaskCommand(body: string, sender: string, groupId: string, linkedGroups: Set<string>) {
if (groupId && linkedGroups.has(groupId)) {
if (body.startsWith('/tarea')) {
const command = body.replace('/tarea', '').trim();
const [action, ...args] = command.split(' ');
const description = args.join(' ');
// Extract WhatsApp mention (format: @<phone_number>)
const assignedUserMatch = description.match(/@\d+/);
const assignedUser = assignedUserMatch ? assignedUserMatch[0] : null;
// Validate phone number format
if (assignedUser && !/^@\d{8,}$/.test(assignedUser)) {
sendMessage(sender, 'Formato de mención inválido. Usa @ seguido del número de teléfono');
return;
}
const dueDateMatch = description.match(/\d{4}-\d{2}-\d{2}/);
const dueDate = dueDateMatch ? dueDateMatch[0] : null;
const cleanDescription = description
.replace(/@\w+/g, '')
.replace(/\d{4}-\d{2}-\d{2}/g, '')
.trim();
if (!action || action === 'mostrar') {
// Handle bare /tarea or /tarea mostrar
const user = `@${sender.split('@')[0]}`; // Default to the sender
const tasks = getPendingTasks(user);
if (tasks.length === 0) {
sendMessage(sender, 'No tienes tareas pendientes.');
} else {
const taskList = formatTaskList(tasks);
sendMessage(sender, `Tus tareas pendientes:\n${taskList}`);
}
} else if (action === 'nueva') {
try {
const finalAssignedUser = assignedUser || `@${sender.split('@')[0]}`;
const task = createTask(sender, {
description: cleanDescription,
assignedTo: finalAssignedUser,
dueDate: dueDate || undefined
});
let message = `✅ Tarea creada:\nID: ${task.id}\nDescripción: ${task.description}`;
if (task.assignedTo) message += `\nAsignada a: ${task.assignedTo}`;
if (task.dueDate) message += `\nFecha límite: ${task.dueDate}`;
message += `\nCreada: ${task.createdAt}`;
// Send confirmation privately to creator
sendMessage(sender, message);
// Also notify assignee if different from creator
if (assignedUser && assignedUser !== `@${sender.split('@')[0]}`) {
sendMessage(assignedUser, `📝 Se te ha asignado una nueva tarea:\n${message}`);
}
} catch (error) {
console.error('Error creating task:', error);
sendMessage(sender, `❌ Error al crear la tarea: ${error.message}`);
}
} else if (action === 'asignar') {
try {
const taskId = validateTaskId(args[0]);
if (!assignedUser) {
throw new Error('Debes mencionar a un usuario para asignar la tarea. Ejemplo: /tarea asignar 1 @12345678');
}
assignTask(taskId, assignedUser);
// Send confirmation privately to the person who assigned
sendMessage(sender, `✅ Tarea ${taskId} asignada a ${assignedUser}`);
// Notify the new assignee privately
sendMessage(assignedUser, `📝 Se te ha asignado la tarea ${taskId}`);
} catch (error) {
console.error('Error assigning task:', error);
sendMessage(sender, `❌ Error al asignar tarea: ${error.message}`);
}
} else if (action === 'lista' || (!action && args.length === 1)) {
// Handle both /tarea lista 14 and /tarea 14
try {
const taskId = validateTaskId(args[0]);
const task = getTaskById(taskId);
if (!task) {
sendMessage(sender, `Tarea ${taskId} no encontrada`);
return;
}
// Check if task is assigned to current user
const currentUser = `@${sender.split('@')[0]}`;
if (task.assignedTo !== currentUser) {
sendMessage(sender, `No puedes completar la tarea ${taskId} porque no está asignada a ti`);
return;
}
completeTask(taskId);
// Send confirmation privately to the user who completed
sendMessage(sender, `✅ Tarea ${taskId} completada: ${task.description}`);
// Notify the task creator if different from completer
if (task.createdBy && task.createdBy !== sender) {
sendMessage(task.createdBy, `✅ Tarea ${taskId} completada por @${sender.split('@')[0]}: ${task.description}`);
}
} catch (error) {
console.error('Error completing task:', error);
sendMessage(sender, `❌ Error al completar tarea: ${error.message}`);
}
} else if (action === 'mostrar' || !action) {
// Handle /tarea or /tarea mostrar
const user = `@${sender.split('@')[0]}`; // Default to the sender
const tasks = getPendingTasks(user);
if (tasks.length === 0) {
sendMessage(sender, 'No tienes tareas pendientes.');
} else {
const taskList = tasks.map((task) => {
return `- Tarea ${task.id}: ${task.description}${task.dueDate ? ` (para el ${task.dueDate})` : ''}`;
}).join('\n');
// Always send task list privately
sendMessage(sender, `Tus tareas pendientes:\n${taskList}`);
}
} else if (action === 'recordatorios') {
const enable = args[0]?.toLowerCase();
if (enable === 'on' || enable === 'off') {
const phoneNumber = sender.split('@')[0];
setRemindersEnabled(phoneNumber, enable === 'on');
// Send reminder settings confirmation privately
sendMessage(sender, `Recordatorios ${enable === 'on' ? 'activados' : 'desactivados'}`);
} else {
sendMessage(sender, 'Usa /tarea recordatorios on|off para gestionar tus recordatorios');
}
} else {
sendMessage(sender, 'Acción no reconocida. Usa /tarea nueva, /tarea asignar, /tarea completar, /tarea mostrar, o /tarea recordatorios.');
}
}
}
}