module Lambdabot.Plugin.Novelty.Elite (elitePlugin) where
import Lambdabot.Plugin
import Lambdabot.Util
import Control.Arrow
import Control.Monad
import Data.Char
import Data.Maybe
import Text.Regex.TDFA
elitePlugin :: Module ()
elitePlugin :: Module ()
elitePlugin = Module ()
forall st. Module st
newModule
{ moduleCmds :: ModuleT () LB [Command (ModuleT () LB)]
moduleCmds = [Command (ModuleT () LB)]
-> ModuleT () LB [Command (ModuleT () LB)]
forall (m :: * -> *) a. Monad m => a -> m a
return
[ (String -> Command Identity
command "elite")
{ aliases :: [String]
aliases = ["leet", "l33t", "1337"]
, help :: Cmd (ModuleT () LB) ()
help = String -> Cmd (ModuleT () LB) ()
forall (m :: * -> *). Monad m => String -> Cmd m ()
say "elite <phrase>. Translate English to elitespeak"
, process :: String -> Cmd (ModuleT () LB) ()
process = \args :: String
args -> case String -> [String]
words String
args of
[] -> String -> Cmd (ModuleT () LB) ()
forall (m :: * -> *). Monad m => String -> Cmd m ()
say "Say again?"
wds :: [String]
wds -> do let instr :: String
instr = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower ([String] -> String
unwords [String]
wds)
String -> Cmd (ModuleT () LB) ()
forall (m :: * -> *). Monad m => String -> Cmd m ()
say (String -> Cmd (ModuleT () LB) ())
-> Cmd (ModuleT () LB) String -> Cmd (ModuleT () LB) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO String -> Cmd (ModuleT () LB) String
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (String -> IO String
translateLine String
instr)
}
]
}
translateLine :: String -> IO String
translateLine :: String -> IO String
translateLine = (String -> String) -> IO String -> IO String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile Char -> Bool
isSpace) (IO String -> IO String)
-> (String -> IO String) -> String -> IO String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO String
translate (String -> IO String) -> (String -> String) -> String -> IO String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (' 'Char -> String -> String
forall a. a -> [a] -> [a]
:)
translate :: String -> IO String
translate :: String -> IO String
translate [] = String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return []
translate str :: String
str = do
let alts :: [(String, String)]
alts = [ (String -> String
subst String
match',String
rest)
| (re :: Regex
re, subst :: String -> String
subst) <- [(Regex, String -> String)]
ruleList
, MatchResult String
mr <- Maybe (MatchResult String) -> [MatchResult String]
forall a. Maybe a -> [a]
maybeToList (Regex -> String -> Maybe (MatchResult String)
forall regex source target (m :: * -> *).
(RegexContext regex source target, MonadFail m) =>
regex -> source -> m target
matchM Regex
re String
str)
, String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (MatchResult String -> String
forall a. MatchResult a -> a
mrBefore MatchResult String
mr)
, let match' :: String
match' = MatchResult String -> String
forall a. MatchResult a -> a
mrMatch MatchResult String
mr
rest :: String
rest = MatchResult String -> String
forall a. MatchResult a -> a
mrAfter MatchResult String
mr
]
(subst :: String
subst,rest :: String
rest) <- [(String, String)] -> IO (String, String)
forall (m :: * -> *) a. MonadIO m => [a] -> m a
random [(String, String)]
alts
(String -> String) -> IO String -> IO String
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (String
subst String -> String -> String
forall a. [a] -> [a] -> [a]
++) (String -> IO String
translate String
rest)
ruleList :: [(Regex, String -> String)]
ruleList :: [(Regex, String -> String)]
ruleList = ((String, String -> String) -> (Regex, String -> String))
-> [(String, String -> String)] -> [(Regex, String -> String)]
forall a b. (a -> b) -> [a] -> [b]
map ((String -> Regex)
-> (String, String -> String) -> (Regex, String -> String)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first String -> Regex
forall regex compOpt execOpt source.
RegexMaker regex compOpt execOpt source =>
source -> regex
makeRegex)
[ (".", String -> String
forall a. a -> a
id )
, (".", (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toUpper )
, ("a", String -> String -> String
forall a b. a -> b -> a
const "4" )
, ("b", String -> String -> String
forall a b. a -> b -> a
const "8" )
, (" be ", String -> String -> String
forall a b. a -> b -> a
const " b " )
, ("c", String -> String -> String
forall a b. a -> b -> a
const "(" )
, ("ck", String -> String -> String
forall a b. a -> b -> a
const "xx" )
, ("cks ", String -> String -> String
forall a b. a -> b -> a
const "x " )
, ("cks ", String -> String -> String
forall a b. a -> b -> a
const "x0rs " )
, ("cks ", String -> String -> String
forall a b. a -> b -> a
const "x0rz " )
, (" cool ",String -> String -> String
forall a b. a -> b -> a
const " kewl ")
, ("e", String -> String -> String
forall a b. a -> b -> a
const "3" )
, ("elite", String -> String -> String
forall a b. a -> b -> a
const "1337" )
, ("elite", String -> String -> String
forall a b. a -> b -> a
const "leet" )
, ("f", String -> String -> String
forall a b. a -> b -> a
const "ph" )
, (" for ", String -> String -> String
forall a b. a -> b -> a
const " 4 " )
, ("g", String -> String -> String
forall a b. a -> b -> a
const "9" )
, ("h", String -> String -> String
forall a b. a -> b -> a
const "|-|" )
, ("k", String -> String -> String
forall a b. a -> b -> a
const "x" )
, ("l", String -> String -> String
forall a b. a -> b -> a
const "|" )
, ("l", String -> String -> String
forall a b. a -> b -> a
const "1" )
, ("m", String -> String -> String
forall a b. a -> b -> a
const "/\\/\\")
, ("o", String -> String -> String
forall a b. a -> b -> a
const "0" )
, ("ph", String -> String -> String
forall a b. a -> b -> a
const "f" )
, ("s", String -> String -> String
forall a b. a -> b -> a
const "z" )
, ("s", String -> String -> String
forall a b. a -> b -> a
const "$" )
, ("s", String -> String -> String
forall a b. a -> b -> a
const "5" )
, ("s ", String -> String -> String
forall a b. a -> b -> a
const "z0rz " )
, ("t", String -> String -> String
forall a b. a -> b -> a
const "7" )
, ("t", String -> String -> String
forall a b. a -> b -> a
const "+" )
, (" the ", String -> String -> String
forall a b. a -> b -> a
const " teh " )
, (" to ", String -> String -> String
forall a b. a -> b -> a
const " 2 " )
, (" to ", String -> String -> String
forall a b. a -> b -> a
const " too " )
, (" to ", String -> String -> String
forall a b. a -> b -> a
const " tu " )
, (" too ", String -> String -> String
forall a b. a -> b -> a
const " to " )
, ("v", String -> String -> String
forall a b. a -> b -> a
const "\\/" )
, ("w", String -> String -> String
forall a b. a -> b -> a
const "\\/\\/")
, (" you ", String -> String -> String
forall a b. a -> b -> a
const " u " )
, (" you ", String -> String -> String
forall a b. a -> b -> a
const " yu " )
, (" you ", String -> String -> String
forall a b. a -> b -> a
const " joo " )
, ("z", String -> String -> String
forall a b. a -> b -> a
const "s" )
]