content: -- | GNU Talk Filters
  -- needs: http://www.hyperrealm.com/main.php?s=talkfilters
  -- Edward Kmett 2006
  
  module Lambdabot.Plugin.Novelty.Filter (filterPlugin) where
  
  import Lambdabot.Plugin
  import Lambdabot.Util
  
  import Control.Applicative
  import Data.Maybe
  import System.Directory (findExecutable)
  import System.Process
  
  -- State consists of a map from filter name to executable path
  
  filterPlugin :: Module [(String, FilePath, String)]
  filterPlugin = newModule
      { moduleDefState = catMaybes <$> sequence
          [ do
              mbPath <- io (findExecutable name)
              return $! do
                  path <- mbPath
                  Just (name, path, descr)
          | (name, descr) <- filters
          ]
  
      , moduleCmds = do
          activeFilters <- readMS
          return
              [ (command name)
                  { help = say descr
                  , process = \s -> do
                      case words s of
                              [] -> say ("usage: " ++ name ++ " <phrase>")
                              t -> ios80 (runFilter path (unwords t))
                  }
              | (name, path, descr) <- activeFilters
              ]
      }
  
  filters :: [(String, String)]
  filters =
      [ ("austro",     "austro <phrase>. Talk like Ahhhnold")
      , ("b1ff",       "b1ff <phrase>. B1ff of usenet yore")
      , ("brooklyn",   "brooklyn <phrase>. Yo")
      , ("chef",       "chef <phrase>. Bork bork bork")
      , ("cockney",    "cockney <phrase>. Londoner accent")
      , ("drawl",      "drawl <phrase>. Southern drawl")
      , ("dubya",      "dubya <phrase>. Presidential filter")
      , ("fudd",       "fudd <phrase>. Fudd, Elmer")
      , ("funetak",    "funetak <phrase>. Southern drawl")
      , ("jethro",     "jethro <phrase>. Now listen to a story 'bout a man named Jed...")
      , ("jive",       "jive <phrase>. Slap ma fro")
      , ("kraut",      "kraut <phrase>. German accent")
      , ("pansy",      "pansy <phrase>. Effeminate male")
      , ("pirate",     "pirate <phrase>. Talk like a pirate")
      , ("postmodern", "postmodern <phrase>. Feminazi")
      , ("redneck",    "redneck <phrase>. Deep south")
      , ("valspeak",   "valley <phrase>. Like, ya know?")
      , ("warez",      "warez <phrase>. H4x0r")
      ]
  
  runFilter :: String -> String -> IO String
  runFilter f s = do
      out <- readProcess f [] s
      return $ result out
      where result [] = "Couldn't run the filter."
            result xs = unlines . filter (not . all (==' ')) . lines $ xs
  