this repo has no description
1import { channelMappings, userMappings } from "./db"; 2import { slackApp, ircClient } from "./index"; 3 4export function registerCommands() { 5 // Link Slack channel to IRC channel 6 slackApp.command("/irc-bridge-channel", async ({ payload, context }) => { 7 const args = payload.text.trim().split(/\s+/); 8 const ircChannel = args[0]; 9 10 if (!ircChannel || !ircChannel.startsWith("#")) { 11 return { 12 text: "Usage: `/irc-bridge-channel #irc-channel`\nExample: `/irc-bridge-channel #lounge`", 13 }; 14 } 15 16 const slackChannelId = payload.channel_id; 17 18 try { 19 // Create the mapping 20 channelMappings.create(slackChannelId, ircChannel); 21 22 // Join the IRC channel 23 ircClient.join(ircChannel); 24 25 // Join the Slack channel if not already in it 26 await context.client.conversations.join({ 27 channel: slackChannelId, 28 }); 29 30 return { 31 text: `✅ Successfully bridged this channel to ${ircChannel}`, 32 }; 33 } catch (error) { 34 console.error("Error creating channel mapping:", error); 35 return { 36 text: `❌ Failed to bridge channel: ${error}`, 37 }; 38 } 39 }); 40 41 // Unlink Slack channel from IRC 42 slackApp.command("/irc-unbridge-channel", async ({ payload }) => { 43 const slackChannelId = payload.channel_id; 44 45 try { 46 const mapping = channelMappings.getBySlackChannel(slackChannelId); 47 if (!mapping) { 48 return { 49 text: "❌ This channel is not bridged to IRC", 50 }; 51 } 52 53 channelMappings.delete(slackChannelId); 54 55 return { 56 text: `✅ Removed bridge to ${mapping.irc_channel}`, 57 }; 58 } catch (error) { 59 console.error("Error removing channel mapping:", error); 60 return { 61 text: `❌ Failed to remove bridge: ${error}`, 62 }; 63 } 64 }); 65 66 // Link Slack user to IRC nick 67 slackApp.command("/irc-bridge-user", async ({ payload }) => { 68 const args = payload.text.trim().split(/\s+/); 69 const ircNick = args[0]; 70 71 if (!ircNick) { 72 return { 73 text: "Usage: `/irc-bridge-user <irc-nick>`\nExample: `/irc-bridge-user myircnick`", 74 }; 75 } 76 77 const slackUserId = payload.user_id; 78 79 try { 80 userMappings.create(slackUserId, ircNick); 81 console.log(`Created user mapping: ${slackUserId} -> ${ircNick}`); 82 83 return { 84 text: `✅ Successfully linked your account to IRC nick: ${ircNick}`, 85 }; 86 } catch (error) { 87 console.error("Error creating user mapping:", error); 88 return { 89 text: `❌ Failed to link user: ${error}`, 90 }; 91 } 92 }); 93 94 // Unlink Slack user from IRC 95 slackApp.command("/irc-unbridge-user", async ({ payload }) => { 96 const slackUserId = payload.user_id; 97 98 try { 99 const mapping = userMappings.getBySlackUser(slackUserId); 100 if (!mapping) { 101 return { 102 text: "❌ You don't have an IRC nick mapping", 103 }; 104 } 105 106 userMappings.delete(slackUserId); 107 108 return { 109 text: `✅ Removed link to IRC nick: ${mapping.irc_nick}`, 110 }; 111 } catch (error) { 112 console.error("Error removing user mapping:", error); 113 return { 114 text: `❌ Failed to remove link: ${error}`, 115 }; 116 } 117 }); 118 119 // List channel mappings 120 slackApp.command("/irc-bridge-list", async ({ payload }) => { 121 const channelMaps = channelMappings.getAll(); 122 const userMaps = userMappings.getAll(); 123 124 let text = "*Channel Bridges:*\n"; 125 if (channelMaps.length === 0) { 126 text += "None\n"; 127 } else { 128 for (const map of channelMaps) { 129 text += `• <#${map.slack_channel_id}> ↔️ ${map.irc_channel}\n`; 130 } 131 } 132 133 text += "\n*User Mappings:*\n"; 134 if (userMaps.length === 0) { 135 text += "None\n"; 136 } else { 137 for (const map of userMaps) { 138 text += `• <@${map.slack_user_id}> ↔️ ${map.irc_nick}\n`; 139 } 140 } 141 142 return { 143 text, 144 }; 145 }); 146}