Copy ExampleBot over as InfoBot
This commit is contained in:
parent
675e88a105
commit
5292fd9883
6 changed files with 110 additions and 11 deletions
|
|
@ -1,4 +1,9 @@
|
||||||
module Main where
|
module Main where
|
||||||
|
|
||||||
|
import Control.Monad
|
||||||
|
|
||||||
|
import Haboli.Bots.InfoBot
|
||||||
|
import Haboli.Euphoria
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = putStrLn "Nothing to see here!"
|
main = void $ runClient defaultConfig $ infoBot Nothing
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ cabal-version: 1.12
|
||||||
--
|
--
|
||||||
-- see: https://github.com/sol/hpack
|
-- see: https://github.com/sol/hpack
|
||||||
--
|
--
|
||||||
-- hash: cbb37543f441c735429df4c7e5caec2cf786ed7d2e27cd612cb81c71f5c1be0b
|
-- hash: 7c1fd2d5312d7a2c2d70aed2270863ae9ee89af790c2eeb279d800f89d110ba1
|
||||||
|
|
||||||
name: haboli-infobot
|
name: haboli-infobot
|
||||||
version: 0.1.0.0
|
version: 0.1.0.0
|
||||||
|
|
@ -25,13 +25,19 @@ source-repository head
|
||||||
location: https://github.com/Garmelon/haboli-bot-collection
|
location: https://github.com/Garmelon/haboli-bot-collection
|
||||||
|
|
||||||
library
|
library
|
||||||
|
exposed-modules:
|
||||||
|
Haboli.Bots.InfoBot
|
||||||
other-modules:
|
other-modules:
|
||||||
Paths_haboli_infobot
|
Paths_haboli_infobot
|
||||||
hs-source-dirs:
|
hs-source-dirs:
|
||||||
src
|
src
|
||||||
build-depends:
|
build-depends:
|
||||||
base >=4.7 && <5
|
base >=4.7 && <5
|
||||||
|
, containers
|
||||||
, haboli
|
, haboli
|
||||||
|
, microlens-platform
|
||||||
|
, text
|
||||||
|
, time
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
||||||
executable haboli-infobot
|
executable haboli-infobot
|
||||||
|
|
@ -43,6 +49,10 @@ executable haboli-infobot
|
||||||
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||||
build-depends:
|
build-depends:
|
||||||
base >=4.7 && <5
|
base >=4.7 && <5
|
||||||
|
, containers
|
||||||
, haboli
|
, haboli
|
||||||
, haboli-infobot
|
, haboli-infobot
|
||||||
|
, microlens-platform
|
||||||
|
, text
|
||||||
|
, time
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,11 @@ extra-source-files:
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- base >= 4.7 && < 5
|
- base >= 4.7 && < 5
|
||||||
|
- containers
|
||||||
- haboli
|
- haboli
|
||||||
|
- microlens-platform
|
||||||
|
- text
|
||||||
|
- time
|
||||||
|
|
||||||
library:
|
library:
|
||||||
source-dirs: src
|
source-dirs: src
|
||||||
|
|
|
||||||
80
haboli-infobot/src/Haboli/Bots/InfoBot.hs
Normal file
80
haboli-infobot/src/Haboli/Bots/InfoBot.hs
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
|
module Haboli.Bots.InfoBot
|
||||||
|
( infoBot
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Control.Concurrent
|
||||||
|
import Control.Monad
|
||||||
|
import Control.Monad.IO.Class
|
||||||
|
import Data.List
|
||||||
|
import qualified Data.Map.Strict as Map
|
||||||
|
import qualified Data.Text as T
|
||||||
|
import Data.Time
|
||||||
|
import Lens.Micro.Platform
|
||||||
|
|
||||||
|
import Haboli.Euphoria
|
||||||
|
import Haboli.Euphoria.Botrulez
|
||||||
|
|
||||||
|
data BotState = BotState
|
||||||
|
{ _botStartTime :: UTCTime
|
||||||
|
, _botListing :: Listing
|
||||||
|
} deriving (Show)
|
||||||
|
|
||||||
|
makeLenses ''BotState
|
||||||
|
|
||||||
|
-- | A small example bot. Takes a room password as its first argument. You can
|
||||||
|
-- run this bot in [&test](https://euphoria.io/room/test) like this:
|
||||||
|
--
|
||||||
|
-- > runClient defaultConfig $ exampleBot Nothing
|
||||||
|
infoBot :: Maybe T.Text -> Client T.Text ()
|
||||||
|
infoBot mPasswd = do
|
||||||
|
startTime <- liftIO getCurrentTime
|
||||||
|
initialEvents <- untilConnected $
|
||||||
|
respondingToBounce mPasswd $
|
||||||
|
respondingToPing nextEvent
|
||||||
|
let initialState = BotState startTime $ newListing initialEvents
|
||||||
|
stateVar <- liftIO $ newMVar initialState
|
||||||
|
preferNickVia botListing stateVar "InfoBot"
|
||||||
|
botMain stateVar
|
||||||
|
|
||||||
|
botMain :: MVar BotState -> Client T.Text ()
|
||||||
|
botMain stateVar = forever $ do
|
||||||
|
event <- respondingToCommands (getCommands stateVar) $
|
||||||
|
respondingToPing nextEvent
|
||||||
|
updateFromEventVia botListing stateVar event
|
||||||
|
|
||||||
|
getCommands :: MVar BotState -> Client e [Command T.Text]
|
||||||
|
getCommands stateVar = do
|
||||||
|
state <- liftIO $ readMVar stateVar
|
||||||
|
let name = state ^. botListing . lsSelfL . svNickL
|
||||||
|
pure
|
||||||
|
[ botrulezPingGeneral
|
||||||
|
, botrulezPingSpecific name
|
||||||
|
, botrulezHelpSpecific name
|
||||||
|
"I am an example bot for https://github.com/Garmelon/haboli/."
|
||||||
|
, botrulezUptimeSpecific name $ state ^. botStartTime
|
||||||
|
, botrulezKillSpecific name
|
||||||
|
, cmdSpecific "hug" name $ \msg -> void $ reply msg "/me hugs back"
|
||||||
|
, cmdHello
|
||||||
|
, cmdNick stateVar name
|
||||||
|
, cmdWho stateVar
|
||||||
|
]
|
||||||
|
|
||||||
|
cmdHello :: Command e
|
||||||
|
cmdHello = cmdGeneral "hello" $ \msg -> do
|
||||||
|
let mention = nickMention $ svNick $ msgSender msg
|
||||||
|
void $ reply msg $ "Hi there, @" <> mention <> "!"
|
||||||
|
|
||||||
|
cmdNick :: MVar BotState -> T.Text -> Command e
|
||||||
|
cmdNick stateVar name = cmdSpecificArgs "nick" name $ \msg args -> do
|
||||||
|
preferNickVia botListing stateVar args
|
||||||
|
void $ reply msg "Is this better?"
|
||||||
|
|
||||||
|
cmdWho :: MVar BotState -> Command e
|
||||||
|
cmdWho stateVar = cmdGeneral "who" $ \msg -> do
|
||||||
|
state <- liftIO $ readMVar stateVar
|
||||||
|
let people = state ^. botListing . lsOthersL
|
||||||
|
nicks = sort $ map svNick $ Map.elems people
|
||||||
|
void $ reply msg $ T.intercalate "\n" nicks
|
||||||
|
|
@ -5,4 +5,4 @@ packages:
|
||||||
|
|
||||||
extra-deps:
|
extra-deps:
|
||||||
- github: Garmelon/haboli
|
- github: Garmelon/haboli
|
||||||
commit: ad393a67f67a97c4e74ce038b773c5bcead5ff10
|
commit: 86b6134c00d23b0e2e80208079a1975ac0c91f9a
|
||||||
|
|
|
||||||
|
|
@ -5,19 +5,19 @@
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
- completed:
|
- completed:
|
||||||
size: 14086
|
size: 19510
|
||||||
url: https://github.com/Garmelon/haboli/archive/ad393a67f67a97c4e74ce038b773c5bcead5ff10.tar.gz
|
url: https://github.com/Garmelon/haboli/archive/86b6134c00d23b0e2e80208079a1975ac0c91f9a.tar.gz
|
||||||
cabal-file:
|
cabal-file:
|
||||||
size: 1263
|
size: 1576
|
||||||
sha256: b47acf31bb12e802de480983637998761ee56d5e4a2ac0cc251c02f4388cb814
|
sha256: d3dea9408d036abe5aa663343b63ffd39cb5fbf14d80773248dab42c607b69b6
|
||||||
name: haboli
|
name: haboli
|
||||||
version: 0.3.1.0
|
version: 0.3.1.0
|
||||||
sha256: eb0ca0f08fc3c3caaf730c72aaaae31f582cef8dd30b8fc461b11e8e16115166
|
sha256: c137c08d5ccb6c55c6cd3f03b6d50cc073cb885050e4f5815242b11fb2da2307
|
||||||
pantry-tree:
|
pantry-tree:
|
||||||
size: 677
|
size: 1193
|
||||||
sha256: fd8200eeae76d312f0bb5799873235c410f7274018903c936f73942441f0ac73
|
sha256: 7d7f3fe4fdd753fd6022c1c5f56b30333318130e40b53e0c202f3ea897ff6e79
|
||||||
original:
|
original:
|
||||||
url: https://github.com/Garmelon/haboli/archive/ad393a67f67a97c4e74ce038b773c5bcead5ff10.tar.gz
|
url: https://github.com/Garmelon/haboli/archive/86b6134c00d23b0e2e80208079a1975ac0c91f9a.tar.gz
|
||||||
snapshots:
|
snapshots:
|
||||||
- completed:
|
- completed:
|
||||||
size: 491389
|
size: 491389
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue