mirror of
https://github.com/hanzoskill/botlink.git
synced 2026-10-30 21:01:49 +00:00
175 lines
5.3 KiB
JavaScript
175 lines
5.3 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* ClawdLink Handler
|
|
* JSON API for Hanzo Bot integration
|
|
*
|
|
* Usage: node handler.js <action> [args...]
|
|
* Output: JSON result
|
|
*/
|
|
|
|
import bot from './lib/bot.js';
|
|
import prefs from './lib/preferences.js';
|
|
|
|
const args = process.argv.slice(2);
|
|
const action = args[0];
|
|
|
|
// Parse --key=value or --key value flags
|
|
function parseFlags(args) {
|
|
const flags = {};
|
|
for (let i = 0; i < args.length; i++) {
|
|
if (args[i].startsWith('--')) {
|
|
const key = args[i].slice(2);
|
|
if (key.includes('=')) {
|
|
const [k, v] = key.split('=');
|
|
flags[k] = v;
|
|
} else if (args[i + 1] && !args[i + 1].startsWith('--')) {
|
|
flags[key] = args[++i];
|
|
} else {
|
|
flags[key] = true;
|
|
}
|
|
}
|
|
}
|
|
return flags;
|
|
}
|
|
|
|
async function main() {
|
|
let result;
|
|
const flags = parseFlags(args);
|
|
|
|
switch (action) {
|
|
case 'check':
|
|
// Check for new messages and friend requests
|
|
result = await bot.checkMessages();
|
|
break;
|
|
|
|
case 'send':
|
|
// Send message: node handler.js send "Friend" "Message" [--urgent] [--context=work]
|
|
if (args.length < 3) {
|
|
result = { success: false, error: 'Usage: send <friend> <message> [--urgent] [--context=work|personal|social]' };
|
|
} else {
|
|
const options = {
|
|
urgency: flags.urgent ? 'urgent' : (flags.fyi ? 'fyi' : 'normal'),
|
|
context: flags.context || 'personal',
|
|
respondBy: flags.respondBy || null
|
|
};
|
|
result = await bot.sendToFriend(args[1], args[2], options);
|
|
}
|
|
break;
|
|
|
|
case 'add':
|
|
// Add friend: node handler.js add "clawdlink://..." ["optional message"]
|
|
if (!args[1]) {
|
|
result = { success: false, error: 'Usage: add <friend-link> [message]' };
|
|
} else {
|
|
result = await bot.addFriend(args[1], args[2] || '');
|
|
}
|
|
break;
|
|
|
|
case 'accept':
|
|
// Accept friend request: node handler.js accept "Friend Name"
|
|
if (!args[1]) {
|
|
result = { success: false, error: 'Usage: accept <friend-name>' };
|
|
} else {
|
|
result = await bot.acceptFriend(args[1]);
|
|
}
|
|
break;
|
|
|
|
case 'link':
|
|
// Get friend link
|
|
result = bot.getFriendLink();
|
|
break;
|
|
|
|
case 'friends':
|
|
// List friends
|
|
result = bot.listFriends();
|
|
break;
|
|
|
|
case 'status':
|
|
// Get status
|
|
result = await bot.getStatus();
|
|
break;
|
|
|
|
case 'preferences':
|
|
case 'prefs':
|
|
// Get or set preferences
|
|
if (!args[1]) {
|
|
result = { preferences: prefs.loadPreferences() };
|
|
} else if (args[1] === 'set' && args[2] && args[3]) {
|
|
let value = args[3];
|
|
try { value = JSON.parse(value); } catch {}
|
|
prefs.updatePreference(args[2], value);
|
|
result = { success: true, path: args[2], value };
|
|
} else {
|
|
result = { error: 'Usage: preferences [set <path> <value>]' };
|
|
}
|
|
break;
|
|
|
|
case 'quiet-hours':
|
|
if (args[1] === 'on') {
|
|
prefs.updatePreference('schedule.quietHours.enabled', true);
|
|
result = { success: true, quietHours: 'enabled' };
|
|
} else if (args[1] === 'off') {
|
|
prefs.updatePreference('schedule.quietHours.enabled', false);
|
|
result = { success: true, quietHours: 'disabled' };
|
|
} else if (args[1] && args[2]) {
|
|
prefs.updatePreference('schedule.quietHours.enabled', true);
|
|
prefs.updatePreference('schedule.quietHours.start', args[1]);
|
|
prefs.updatePreference('schedule.quietHours.end', args[2]);
|
|
result = { success: true, quietHours: { start: args[1], end: args[2] } };
|
|
} else {
|
|
const p = prefs.loadPreferences();
|
|
result = { quietHours: p.schedule.quietHours };
|
|
}
|
|
break;
|
|
|
|
case 'batch':
|
|
if (args[1] === 'on') {
|
|
prefs.updatePreference('schedule.batchDelivery.enabled', true);
|
|
result = { success: true, batch: 'enabled' };
|
|
} else if (args[1] === 'off') {
|
|
prefs.updatePreference('schedule.batchDelivery.enabled', false);
|
|
result = { success: true, batch: 'disabled' };
|
|
} else {
|
|
const p = prefs.loadPreferences();
|
|
result = { batchDelivery: p.schedule.batchDelivery };
|
|
}
|
|
break;
|
|
|
|
case 'tone':
|
|
const validTones = ['natural', 'casual', 'formal', 'brief'];
|
|
if (args[1] && validTones.includes(args[1])) {
|
|
prefs.updatePreference('style.tone', args[1]);
|
|
result = { success: true, tone: args[1] };
|
|
} else {
|
|
const p = prefs.loadPreferences();
|
|
result = { tone: p.style.tone, valid: validTones };
|
|
}
|
|
break;
|
|
|
|
default:
|
|
result = {
|
|
error: 'Unknown action',
|
|
usage: {
|
|
check: 'Check for messages and friend requests',
|
|
send: 'send <friend> <message> [--urgent] [--context=work]',
|
|
add: 'add <friend-link> [message]',
|
|
accept: 'accept <friend-name>',
|
|
link: 'Get your friend link',
|
|
friends: 'List friends',
|
|
status: 'Get ClawdLink status',
|
|
preferences: 'preferences [set <path> <value>]',
|
|
'quiet-hours': 'quiet-hours [on|off|<start> <end>]',
|
|
batch: 'batch [on|off]',
|
|
tone: 'tone [natural|casual|formal|brief]'
|
|
}
|
|
};
|
|
}
|
|
|
|
console.log(JSON.stringify(result, null, 2));
|
|
}
|
|
|
|
main().catch(err => {
|
|
console.log(JSON.stringify({ error: err.message }));
|
|
process.exit(1);
|
|
});
|