summaryrefslogtreecommitdiff
path: root/fig-bridge-irc-discord/src/Fig/Bridge/IRCDiscord.hs
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2024-04-19 02:08:00 -0400
committerLLLL Colonq <llll@colonq>2024-04-19 02:08:00 -0400
commit432ff585d9fa0aafcf898a2e8e8be2d5b4524874 (patch)
tree0518eab5945ade61fefae3fc5843b3e7f5647834 /fig-bridge-irc-discord/src/Fig/Bridge/IRCDiscord.hs
parent9d875ab8fb539246e3aea0aae58d2c9f227c8276 (diff)
Multi-bridge functionality
Diffstat (limited to 'fig-bridge-irc-discord/src/Fig/Bridge/IRCDiscord.hs')
-rw-r--r--fig-bridge-irc-discord/src/Fig/Bridge/IRCDiscord.hs51
1 files changed, 38 insertions, 13 deletions
diff --git a/fig-bridge-irc-discord/src/Fig/Bridge/IRCDiscord.hs b/fig-bridge-irc-discord/src/Fig/Bridge/IRCDiscord.hs
index b1e6c43..c3232cb 100644
--- a/fig-bridge-irc-discord/src/Fig/Bridge/IRCDiscord.hs
+++ b/fig-bridge-irc-discord/src/Fig/Bridge/IRCDiscord.hs
@@ -4,11 +4,14 @@ module Fig.Bridge.IRCDiscord where
import Fig.Prelude
+import qualified Data.List as List
+
+import Fig.Bridge.IRCDiscord.Utils
import Fig.Utils.SExpr
import Fig.Bus.Client
-bridge :: (Text, Text) -> IO ()
-bridge busAddr = do
+bridge :: Config -> (Text, Text) -> IO ()
+bridge cfg busAddr = do
busClient busAddr
(\cmds -> do
cmds.subscribe [sexp|(monitor irc chat incoming)|]
@@ -16,17 +19,39 @@ bridge busAddr = do
)
(\cmds d -> do
case d of
- SExprList [ev, user, _, msg]
- | ev == [sexp|(monitor irc chat incoming)|] ->
- cmds.publish [sexp|(monitor discord chat outgoing)|]
- [ user
- , msg
- ]
- | ev == [sexp|(monitor discord chat incoming)|] ->
- cmds.publish [sexp|(monitor irc chat outgoing)|]
- [ user
- , msg
- ]
+ SExprList [ev, tchan, user, _, msg]
+ | ev == [sexp|(monitor irc chat incoming)|]
+ , SExprString chan <- tchan ->
+ case List.find ((== chan) . snd) cfg.mapping of
+ Nothing -> log $ mconcat
+ [ "Message on unmapped IRC channel: " <> tshow chan
+ ]
+ Just (dchan, _) -> do
+ log $ mconcat
+ [ "Incoming message on IRC channel " <> tshow chan
+ , ", bridging to Discord channel " <> tshow dchan
+ ]
+ cmds.publish [sexp|(monitor discord chat outgoing)|]
+ [ SExprInteger $ fromIntegral dchan
+ , user
+ , msg
+ ]
+ | ev == [sexp|(monitor discord chat incoming)|]
+ , SExprInteger chan <- tchan ->
+ case List.find ((== fromInteger chan) . fst) cfg.mapping of
+ Nothing -> log $ mconcat
+ [ "Message on unmapped Discord channel: " <> tshow chan
+ ]
+ Just (_, ichan) -> do
+ log $ mconcat
+ [ "Incoming message on Discord channel " <> tshow chan
+ , ", bridging to IRC channel " <> ichan
+ ]
+ cmds.publish [sexp|(monitor irc chat outgoing)|]
+ [ SExprString ichan
+ , user
+ , msg
+ ]
_ -> log $ "Invalid message: " <> tshow d
)
(pure ())