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}