{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Data.Char (toLower)
import System.IO (stderr, stdout)
import System.IO.Error (catchIOError)
import Data.LanguageCodes (ISO639_1(EN), fromChars)
import qualified Data.Text as T
import Data.Text.Encoding (encodeUtf8)
import Data.Text.IO (hPutStrLn)
import Network.DNS.Resolver (defaultResolvConf, makeResolvSeed, withResolver)
import Network.DNS.Lookup (lookupA)
import Network.Wai.Handler.Warp (run)
import System.Locale.SetLocale (Category(LC_CTYPE), setLocale)
import NicovideoTranslator.Proxy (ProxyConfiguration(ProxyConfiguration), app)
language :: IO ISO639_1
language = do
currentLocale <- setLocale LC_CTYPE Nothing
case currentLocale of
Just (x:y:ys) -> case fromChars (toLower x) (toLower y) of
Just lang -> return lang
_ -> ioError $ userError $ (x:y:ys) ++ " is wrong LC_CTYPE value"
_ -> ioError $ userError "locale is not set"
defaultUpstreamHost :: T.Text
defaultUpstreamHost = "msg.nicovideo.jp"
main :: IO ()
main = do
putStrLn "Running on http://0.0.0.0:80/ (Press ^C to quit)"
lang <- catchIOError language (\_ -> return EN)
rs <- makeResolvSeed defaultResolvConf
resolution <- withResolver rs $
\resolver -> lookupA resolver (encodeUtf8 defaultUpstreamHost)
case resolution of
Right (resolvedHost:_) ->
let upstreamHost = T.pack $ show resolvedHost
in do
hPutStrLn stdout $ T.concat ["Upstream: "
, defaultUpstreamHost
, " (", upstreamHost, ")"
]
run 80 $ app (ProxyConfiguration lang upstreamHost)
_ -> hPutStrLn stderr $ T.concat [ "error: failed to resolve "
, defaultUpstreamHost
]