From 2eb90cbca1c5a45243008912684cd9ea71d304c6 Mon Sep 17 00:00:00 2001 From: Griffin Smith Date: Sat, 11 Jul 2020 21:32:12 -0400 Subject: feat(owothia): Add owothia Add owothia, an irc bot that picks a random verb out of a random subset of messages and replies with a message of the form " me owo". it's incredibly messy, full of warnings, includes a *number* of harcoded things, but also is hilarious. Change-Id: I73cacd533bbbff9e753d1e542308da25247a7034 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1063 Tested-by: BuildkiteCI Reviewed-by: lukegb --- users/glittershark/owothia/src/Main.hs | 97 ++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 users/glittershark/owothia/src/Main.hs (limited to 'users/glittershark/owothia/src/Main.hs') diff --git a/users/glittershark/owothia/src/Main.hs b/users/glittershark/owothia/src/Main.hs new file mode 100644 index 0000000000..315f07492b --- /dev/null +++ b/users/glittershark/owothia/src/Main.hs @@ -0,0 +1,97 @@ +{-# LANGUAGE TemplateHaskell #-} +module Main where + +import Network.IRC.Client +import Control.Lens +import NLP.POS +import NLP.Types (POSTagger) +import NLP.Types.Tree +import qualified NLP.Types.Tree +import qualified NLP.Corpora.Conll as Conll +import NLP.Corpora.Conll (Tag) +import qualified Data.ByteString as BS +import qualified Data.Text as T +import System.Random +import System.Envy +-------------------------------------------------------------------------------- + +data Config = Config + { _nickservPassword :: Text + } + deriving stock (Show, Eq, Generic) + deriving anyclass (FromEnv) +makeLenses ''Config + +verbs :: POSTagger Tag -> Text -> [Text] +verbs tagger s = mapMaybe pickVerb $ tag tagger s >>= \(TaggedSent ps) -> ps + where + pickVerb (POS Conll.VB (Token verb)) = Just verb + pickVerb (POS Conll.VBD (Token verb)) = Just verb + pickVerb (POS Conll.VBG (Token verb)) = Just verb + pickVerb (POS Conll.VBN (Token verb)) = Just verb + pickVerb (POS Conll.VBZ (Token verb)) = Just verb + pickVerb _ = Nothing + +randomVerb :: POSTagger Tag -> Text -> IO (Maybe Text) +randomVerb tagger txt = do + let vs = verbs tagger txt + i <- randomRIO (0, length vs - 1) + pure $ vs ^? ix i + +owo :: Text -> Text +owo = (<> " me owo") + +owoChance = 10 + +doOwo :: MonadIO m => m Bool +doOwo = do + n <- liftIO (randomRIO @Int (0, owoChance)) + liftIO $ putStrLn $ "rolled " <> show n + pure $ n == 0 + +owothiaHandler :: Config -> IORef Bool -> POSTagger Tag -> EventHandler s +owothiaHandler conf state tagger = EventHandler Just $ \src ev -> do + hasIdentified <- readIORef state + when (not hasIdentified) $ do + nickservAuth + send $ Join "##tvl" + writeIORef state True + + when ("You are now identified" `BS.isInfixOf` (ev ^. raw)) $ + send $ Join "##tvl" + + case (src, ev ^. message) of + (Channel "##tvl" nick, Privmsg _ (Right m)) -> do + willOwo <- doOwo + when willOwo $ owoMessage m + _ -> pure () + + pure () + + where + owoMessage m = do + mVerb <- liftIO $ randomVerb tagger m + for_ mVerb $ \verb -> send $ Privmsg "##tvl" $ Right $ owo verb + nickservAuthMsg = "IDENTIFY " <> myNick <> " " <> conf ^. nickservPassword + nickservAuth = send $ Privmsg "NickServ" $ Right nickservAuthMsg + +myNick :: Text +myNick = "owothia" + +run :: ByteString -> Int -> IO () +run host port = do + Right conf <- decodeEnv + tagger <- defaultTagger + state <- newIORef False + let conn = + plainConnection host port + & logfunc .~ stdoutLogger + cfg = + defaultInstanceConfig myNick + & channels .~ ["##tvl"] + & handlers %~ (owothiaHandler conf state tagger : ) + runClient conn cfg () + +main :: IO () +main = do + run "irc.freenode.net" 6667 -- cgit 1.4.1