summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--avahi.hs14
-rw-r--r--dht-client.cabal7
-rw-r--r--src/Network/Tox/Avahi.hs60
-rw-r--r--stack.yaml4
4 files changed, 81 insertions, 4 deletions
diff --git a/avahi.hs b/avahi.hs
new file mode 100644
index 00000000..2db3be71
--- /dev/null
+++ b/avahi.hs
@@ -0,0 +1,14 @@
1{-# LANGUAGE NoImplicitPrelude #-}
2
3import BasePrelude
4import Network.Tox.Avahi
5
6exampleNodeId :: NodeId
7exampleNodeId = read $ replicate 43 'a'
8
9main :: IO ()
10main = do
11 [hostname, port, nodeId] <- getArgs
12 void $ announceToxService hostname (fromMaybe 54321 $ readMaybe port) (fromMaybe exampleNodeId $ readMaybe nodeId)
13 void $ queryToxService print
14 void $ getLine
diff --git a/dht-client.cabal b/dht-client.cabal
index bd660a4b..50635be3 100644
--- a/dht-client.cabal
+++ b/dht-client.cabal
@@ -248,6 +248,13 @@ library
248 else 248 else
249 build-depends: cryptonite >= 0.22 249 build-depends: cryptonite >= 0.22
250 250
251executable avahi
252 hs-source-dirs: .
253 main-is: avahi.hs
254 default-language: Haskell2010
255 build-depends: base-prelude, dht-client, avahi, network
256 ghc-options: -fobject-code
257
251executable dht 258executable dht
252 hs-source-dirs: examples 259 hs-source-dirs: examples
253 main-is: dht.hs 260 main-is: dht.hs
diff --git a/src/Network/Tox/Avahi.hs b/src/Network/Tox/Avahi.hs
index 58921744..ba5138bc 100644
--- a/src/Network/Tox/Avahi.hs
+++ b/src/Network/Tox/Avahi.hs
@@ -1,2 +1,58 @@
1module Network.Tox.Avahi where 1{-# LANGUAGE RecordWildCards #-}
2import Network.Avahi 2{-# LANGUAGE ViewPatterns #-}
3module Network.Tox.Avahi
4 ( module Network.Tox.Avahi
5 , NodeInfo(..)
6 , NodeId(..)
7 ) where
8import Data.Foldable
9import GHC.Conc.Sync
10import GHC.Word (Word16)
11import Network.Address
12import Network.Avahi
13import Network.Avahi
14import Network.Socket
15import Network.Tox.NodeId
16import Text.Read
17
18toxServiceName :: String
19toxServiceName = "_tox_dht._udp"
20
21toxServiceDomain :: String
22toxServiceDomain = "local"
23
24(<.>) :: String -> String -> String
25a <.> b = a ++ "." ++ b
26
27toxService :: String -> PortNumber -> NodeId -> Service
28toxService hostname (fromIntegral -> port) (show -> extra) =
29 Service {
30 serviceProtocol = PROTO_UNSPEC,
31 serviceName = "Tox DHT @ " ++ hostname,
32 serviceType = toxServiceName,
33 serviceDomain = toxServiceDomain,
34 serviceHost = if null hostname then "" else hostname <.> toxServiceDomain,
35 serviceAddress = Nothing,
36 servicePort = port,
37 serviceText = extra
38 }
39
40announceToxService :: String -> PortNumber -> NodeId -> IO ThreadId
41announceToxService = ((.).(.).(.)) (forkIO . announce) toxService
42
43queryToxService :: (NodeInfo -> IO ()) -> IO ThreadId
44queryToxService cb =
45 forkIO $
46 browse $
47 BrowseQuery
48 { lookupProtocol = PROTO_UNSPEC
49 , lookupServiceName = toxServiceName
50 , lookupDomain = toxServiceDomain
51 , lookupCallback = runCallback
52 }
53 where
54 runCallback x@Service {..} = do
55 let nid = readMaybe serviceText
56 addr = readMaybe =<< serviceAddress
57 p = fromIntegral servicePort
58 forM_ nid $ \n -> forM_ addr $ \a -> cb (NodeInfo n a p)
diff --git a/stack.yaml b/stack.yaml
index 32715280..6de07aed 100644
--- a/stack.yaml
+++ b/stack.yaml
@@ -9,5 +9,5 @@ extra-package-dbs: []
9extra-deps: 9extra-deps:
10- cryptonite-0.23 10- cryptonite-0.23
11- reference-0.1 11- reference-0.1
12- git: https://github.com/portnov/hs-avahi.git 12- git: https://github.com/afcady/hs-avahi.git
13 commit: d41b179e1163746adcbc1c898e33a77dc8b8174e 13 commit: 5ec3bef32d40652b987b256eea8f85e7e8f2e5bb