packages feed

Nomyx-0.1.0: src/Web/Login.hs

{-# LANGUAGE OverloadedStrings, ExtendedDefaultRules#-}

module Web.Login where


import Prelude hiding (div)
import Text.Blaze.Html5 hiding (map, label, br)
import Text.Blaze.Html5.Attributes hiding (dir, label)
import qualified Text.Blaze.Html5 as H
import Web.Routes.RouteT
import Text.Blaze.Internal
import Control.Monad.State
import Control.Concurrent.STM
import Language.Nomyx.Expression
import Utils
import Text.Reform.Happstack
import Text.Reform
import Debug.Trace.Helpers
import Happstack.Server
import Types
import Multi --TODO to remove
import Web.Common
import Web.Settings
import Web.Routes.Happstack()
import Control.Applicative
import Text.Reform.Blaze.String hiding (form)
import Data.Text hiding (map, zip, concatMap)
default (Integer, Double, Data.Text.Text)


loginForm :: Maybe LoginPass -> NomyxForm LoginPass
loginForm (Just (LoginPass login _)) = loginForm' login
loginForm Nothing = loginForm' ""

loginForm' :: String -> NomyxForm LoginPass
loginForm' login = LoginPass <$> br ++> label "Please enter your login and password (if you don't have one, just invent it):" ++> br ++> br
                   ++>  label "Login: " ++> (inputText login) <*> label "    Password: " ++> inputPassword <++ label " "


loginPage :: RoutedNomyxServer Html
loginPage = do
   link <- showURL PostLogin
   lf  <- lift $ viewForm "user" $ loginForm Nothing
   mainPage (blazeForm lf link)
             "Login to Nomyx"
             "Login to Nomyx"
             True

newPlayerPage :: LoginPass -> RoutedNomyxServer Html
newPlayerPage lp = do
   link <- showURL $ NewPlayerLogin lp
   lf  <- lift $ viewForm "user" $ loginForm (Just lp)
   mf  <- lift $ viewForm "user" $ settingsForm Nothing
   mainPage (do
                lf ! (disabled "")
                H.br >> H.br
                "New Player? Welcome!" >> H.br
                (blazeForm mf link))
             "Login to Nomyx"
             "New Player"
             True


newPlayerLogin :: (TVar Multi) -> LoginPass -> RoutedNomyxServer Html
newPlayerLogin tm (LoginPass login password) = do
    methodM POST
    liftRouteT $ lift $ putStrLn $ "newPlayerLogin"
    r <- liftRouteT $ eitherForm environment "user" $ settingsForm Nothing
    case r of
       (Right ms) -> do
          mpn <- evalCommand tm $ checkLoginWeb login password
          case mpn of
             LoginOK pn -> do
                link <- showURL $ Noop pn
                webCommand tm pn $ MultiMailSettings ms pn
                seeOther link $ string "Redirecting..."
             WrongPassword -> do
                link <- showURL $ Login
                seeOther link $ string "Redirecting..."
             NewLogin -> do
                pn <- evalCommand tm $ getNewPlayerNumber
                link <- showURL $ Noop pn
                webCommand tm pn $ MultiNewPlayer PlayerMulti { mPlayerNumber = pn, mPlayerName = login, mPassword = password, inGame = Nothing, mMail = defaultMailSettings, lastRule = Nothing}
                webCommand tm pn $ MultiMailSettings ms pn
                seeOther link $ string "Redirecting..."
       (Left _) -> seeOther ("/Login?status=fail" :: String) $ string "Redirecting..."



postLogin :: (TVar Multi) -> RoutedNomyxServer Html
postLogin tm = do
    methodM POST
    r <- liftRouteT $ eitherForm environment "user" $ loginForm Nothing
    case r of
       (Right lp) -> checkLoginPassword lp tm
       (Left _) -> seeOther ("/Login?status=fail" :: String) $ string "Redirecting..."

checkLoginPassword :: LoginPass -> (TVar Multi) -> RoutedNomyxServer Html
checkLoginPassword lp@(LoginPass login password) tm = do
          liftRouteT $ lift $ putStrLn $ "login:" ++ login
          liftRouteT $ lift $ putStrLn $ "password:" ++ password
          mpn <- evalCommand tm $ checkLoginWeb login password
          case mpn of
             LoginOK pn -> do
                link <- showURL $ Noop pn
                seeOther link $ string "Redirecting..."
             WrongPassword -> do
                link <- showURL $ Login
                seeOther link $ string "Redirecting..."
             NewLogin -> do
                link <- showURL $ NewPlayer lp
                seeOther link $ string "Redirecting..."

data LoginResult = LoginOK PlayerNumber | WrongPassword | NewLogin

checkLoginWeb :: PlayerName -> PlayerPassword -> State Multi LoginResult
checkLoginWeb name pwd = do
   mpn <- findPlayer name
   case mpn of
      Just pl -> do
         traceM $ "Trying name:" ++ mPlayerName pl
         case pwd == mPassword pl of
            True -> do
               traceM "password OK"
               return $ LoginOK $ mPlayerNumber pl
            False -> do
               traceM "password false"
               return WrongPassword
      Nothing -> do
         traceM "New player"
         return NewLogin