diff options
-rw-r--r-- | avahi.hs | 14 | ||||
-rw-r--r-- | dht-client.cabal | 7 | ||||
-rw-r--r-- | src/Network/Tox/Avahi.hs | 60 | ||||
-rw-r--r-- | stack.yaml | 4 |
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 | |||
3 | import BasePrelude | ||
4 | import Network.Tox.Avahi | ||
5 | |||
6 | exampleNodeId :: NodeId | ||
7 | exampleNodeId = read $ replicate 43 'a' | ||
8 | |||
9 | main :: IO () | ||
10 | main = 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 | ||
251 | executable 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 | |||
251 | executable dht | 258 | executable 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 @@ | |||
1 | module Network.Tox.Avahi where | 1 | {-# LANGUAGE RecordWildCards #-} |
2 | import Network.Avahi | 2 | {-# LANGUAGE ViewPatterns #-} |
3 | module Network.Tox.Avahi | ||
4 | ( module Network.Tox.Avahi | ||
5 | , NodeInfo(..) | ||
6 | , NodeId(..) | ||
7 | ) where | ||
8 | import Data.Foldable | ||
9 | import GHC.Conc.Sync | ||
10 | import GHC.Word (Word16) | ||
11 | import Network.Address | ||
12 | import Network.Avahi | ||
13 | import Network.Avahi | ||
14 | import Network.Socket | ||
15 | import Network.Tox.NodeId | ||
16 | import Text.Read | ||
17 | |||
18 | toxServiceName :: String | ||
19 | toxServiceName = "_tox_dht._udp" | ||
20 | |||
21 | toxServiceDomain :: String | ||
22 | toxServiceDomain = "local" | ||
23 | |||
24 | (<.>) :: String -> String -> String | ||
25 | a <.> b = a ++ "." ++ b | ||
26 | |||
27 | toxService :: String -> PortNumber -> NodeId -> Service | ||
28 | toxService 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 | |||
40 | announceToxService :: String -> PortNumber -> NodeId -> IO ThreadId | ||
41 | announceToxService = ((.).(.).(.)) (forkIO . announce) toxService | ||
42 | |||
43 | queryToxService :: (NodeInfo -> IO ()) -> IO ThreadId | ||
44 | queryToxService 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) | ||
@@ -9,5 +9,5 @@ extra-package-dbs: [] | |||
9 | extra-deps: | 9 | extra-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 |