You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-}
-- | Manages all about reminders module Commands.Reminds where
import Conf ( ) import qualified Control.Event as E import Control.Monad ( void ) import Control.Monad.IO.Unlift ( MonadUnliftIO(withRunInIO) ) import Data.Convertible ( ConvertResult , Convertible(safeConvert) ) import qualified Data.Text as T import Data.Time ( UTCTime ) import qualified Database.HDBC as DB import qualified Database.HDBC.Sqlite3 as DB.SQ3 import Discord ( DiscordHandler , restCall ) import Discord.Interactions ( ) import Discord.Requests ( ChannelRequest(CreateMessage) ) import Discord.Types ( Snowflake(..) , DiscordId(..) , ChannelId(..) , UserId(..) )
data Remind = Remind { rmdUser :: UserId , rmdChannel :: ChannelId , rmdMessage :: T.Text , rmdDatetime :: UTCTime }
instance Convertible Snowflake DB.SqlValue where safeConvert (Snowflake v) = safeConvert v
setupRemindDb :: IO () setupRemindDb = do conn <- DB.SQ3.connectSqlite3 "db.sqlite3" DB.run conn "CREATE TABLE IF NOT EXISTS reminds\ \(id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,\ \user INTEGER NOT NULL,\ \channel INTEGER NOT NULL,\ \message INTEGER NOT NULL,\ \dt DATETIME);"
[] DB.commit conn DB.disconnect conn
scheduleRemind :: E.EventSystem -> Remind -> DiscordHandler () scheduleRemind ev Remind {..} = do void $ withRunInIO $ \runInIo -> E.addEvent ev rmdDatetime $ void $ runInIo $ restCall $ CreateMessage rmdChannel $ "<@" <> T.pack (show rmdUser) <> "> **Reminder**\n" <> rmdMessage
registerRemind :: Remind -> IO () registerRemind Remind {..} = do conn <- DB.SQ3.connectSqlite3 "db.sqlite3" DB.run conn "INSERT INTO reminds(user, channel, message, dt)\ \VALUES (?,?,?,?)"
[ DB.toSql $ unId rmdUser , DB.toSql $ unId rmdChannel , DB.toSql rmdMessage , DB.toSql rmdDatetime ] DB.commit conn DB.disconnect conn
|