GrowlNotify 0.1 → 0.2
raw patch · 3 files changed
+91/−80 lines, 3 files
Files
- GrowlNotify.cabal +3/−2
- Network/GrowlNotify.hs +80/−0
- growlnotify.hs +8/−78
GrowlNotify.cabal view
@@ -1,5 +1,5 @@ Name: GrowlNotify-Version: 0.1+Version: 0.2 Author: Nick Burlett Maintainer: nickburlett@mac.com Description: Notification utility for Growl.@@ -9,7 +9,8 @@ Category: Network Build-Depends: base, network, haskell98, Crypto, binary-+Exposed-modules:+ Network.GrowlNotify Executable: growlnotify Main-Is: growlnotify.hs Extra-libraries:
+ Network/GrowlNotify.hs view
@@ -0,0 +1,80 @@+module Network.GrowlNotify + ( registrationPacket+ , notificationPacket+ , addMD5Sum+ , sendMessage + )+where+ +import Data.Word+import Data.Binary.Put+import qualified Data.ByteString.Lazy as B+import qualified Char+import Data.Digest.MD5+import Network.Socket+++growl_udp_port=9887+growl_protocol_version=1+growl_type_registration=0+growl_type_notification=1++makeBS s = B.pack $ map (fromIntegral . Char.ord) s++putString :: String -> Put+putString = do putLazyByteString . makeBS++-- register this application and its notification with growl+-- any notifications will be on by default+registrationPacket :: String -> [String] -> B.ByteString+registrationPacket appName notiNames = runPut $ do+ putWord8 growl_protocol_version+ putWord8 growl_type_registration+ putWord16be $ fromIntegral $ length appName+ putWord8 $ fromIntegral $ lengthnames+ putWord8 $ fromIntegral $ lengthnames+ putString appName+ mapM_ addNotification notiNames+ mapM_ putWord8 [0..(fromIntegral lengthnames)-1]+ where+ addNotification :: String -> Put+ addNotification s = do+ putWord16be $ fromIntegral $ length s+ putLazyByteString $ makeBS s+ lengthnames = length notiNames++-- make a notification+notificationPacket :: String -> String -> String -> String -> B.ByteString+notificationPacket appName notification title description = runPut $ do+ putWord8 growl_protocol_version+ putWord8 growl_type_notification+ putWord16be 0+ putLength notification+ putLength title+ putLength description+ putLength appName+ putString notification+ putString title+ putString description+ putString appName+ where+ putLength = putWord16be . fromIntegral . length++addMD5Sum :: String -> B.ByteString -> B.ByteString+addMD5Sum password message = B.append message s+ where+ s = B.pack $ hash $ map fromIntegral $ B.unpack $ B.append message bspassword+ bspassword = makeBS password++sendMessage :: String -> B.ByteString -> IO ()+sendMessage server m = do+ let d = map (Char.chr . fromIntegral) $ B.unpack m+ s <- socket AF_INET Datagram 0+ write server s d+ sClose s+ +write :: String -> Socket -> String -> IO ()+write server sock s = do+ addr <- inet_addr server+ sendTo sock s (SockAddrInet (fromIntegral growl_udp_port) addr) + return ()
growlnotify.hs view
@@ -1,84 +1,14 @@-import Data.Word-import Data.Binary.Put-import qualified Data.ByteString.Lazy as B-import qualified Char-import Data.Digest.MD5-import Network.Socket+import Network.GrowlNotify import System (getArgs) --growl_udp_port=9887-growl_protocol_version=1-growl_type_registration=0-growl_type_notification=1--makeBS s = B.pack $ map (fromIntegral . Char.ord) s--putString :: String -> Put-putString = do putLazyByteString . makeBS---- register this application and its notification with growl--- any notifications will be on by default-registrationPacket :: String -> [String] -> B.ByteString-registrationPacket appName notiNames = runPut $ do- putWord8 growl_protocol_version- putWord8 growl_type_registration- putWord16be $ fromIntegral $ length appName- putWord8 $ fromIntegral $ lengthnames- putWord8 $ fromIntegral $ lengthnames- putString appName- mapM_ addNotification notiNames- mapM_ putWord8 [0..(fromIntegral lengthnames)-1]- where- addNotification :: String -> Put- addNotification s = do- putWord16be $ fromIntegral $ length s- putLazyByteString $ makeBS s- lengthnames = length notiNames---- make a notification-notificationPacket :: String -> String -> String -> String -> B.ByteString-notificationPacket appName notification title description = runPut $ do- putWord8 growl_protocol_version- putWord8 growl_type_notification- putWord16be 0- putLength notification- putLength title- putLength description- putLength appName- putString notification- putString title- putString description- putString appName- where- putLength = putWord16be . fromIntegral . length--addMD5Sum :: String -> B.ByteString -> B.ByteString-addMD5Sum password message = B.append message s- where- s = B.pack $ hash $ map fromIntegral $ B.unpack $ B.append message bspassword- bspassword = makeBS password- main = do args <- getArgs- (server,title, message) <- case args of- server:title:message -> return $ (server, title, message)- _ -> error "Usage: server title message"+ (server, password, title, message) <- case args of+ server:password:title:message -> return $ (server, password, title, message)+ _ -> error "Usage: server password title message" let b = registrationPacket "growlnotify" ["Command-Line Growl Notification"]- let m = addMD5Sum "None" b+ let m = addMD5Sum password b let b2 = notificationPacket "growlnotify" "Command-Line Growl Notification" title (unwords message)- let m2 = addMD5Sum "None" b2- doit server m - doit server m2- where- port = 9887- doit server m = do- let d = map (Char.chr . fromIntegral) $ B.unpack m- s <- socket AF_INET Datagram 0- write server s d- sClose s- write :: String -> Socket -> String -> IO ()- write server sock s = do- addr <- inet_addr server- sendTo sock s (SockAddrInet (fromIntegral port) addr) - return ()+ let m2 = addMD5Sum password b2+ sendMessage server m + sendMessage server m2