module Web.Tweet.Utils (
hits
, hits'
, getTweetsFast
, getTweets
, displayTimeline
, displayTimelineColor
, lineByKey
, bird
, getConfigData ) where
import Control.Composition
import Control.Lens hiding (noneOf)
import qualified Data.ByteString as BS2
import qualified Data.ByteString.Char8 as BS
import Data.List
import Data.List.Extra
import Data.Void
import Text.Megaparsec
import Web.Tweet.Parser
import Web.Tweet.Parser.FastParser hiding (text)
import Web.Tweet.Types
import Web.Tweet.Utils.Colors
hits :: Timeline -> Timeline
hits = sortTweets . filterRTs
hits' :: Timeline -> Timeline
hits' = hits . filterReplies
filterRTs :: Timeline -> Timeline
filterRTs = filter ((/="RT @") . take 4 . (view text))
filterReplies :: Timeline -> Timeline
filterReplies = filter ((/="@") . take 1 . (view text))
filterQuotes :: Timeline -> Timeline
filterQuotes = filter ((==Nothing) . (view quoted))
getTweets :: BS2.ByteString -> Either (ParseError Char Void) Timeline
getTweets = parse parseTweet "" . BS.unpack
getTweetsFast :: BS2.ByteString -> Either String Timeline
getTweetsFast = fmap (fmap fromFast) . fastParse
displayTimeline :: Timeline -> String
displayTimeline ((TweetEntity content user screenName idTweet _ Nothing rts fave):rest) = concat [user
, " ("
, screenName
, ")"
,":\n "
,fixNewline content
,"\n "
, "💜"
,show fave
, " \61561 "
,show rts
, " "
, show idTweet
,"\n\n"
,displayTimeline rest]
displayTimeline ((TweetEntity content user screenName idTweet _ (Just quoted) rts fave):rest) = concat [user
, " ("
, screenName
, ")"
, ":\n "
, fixNewline content
, "\n "
, "💜"
, show fave
, " \61561 "
, show rts
, " "
, show idTweet
, "\n "
, _name quoted
, " ("
, _screenName quoted
, ")"
, ": "
, _text quoted
, "\n\n"
, displayTimeline rest]
displayTimeline [] = []
bird :: String
bird = toPlainBlue $ "🐦\n"
displayTimelineColor :: Timeline -> String
displayTimelineColor ((TweetEntity content user screenName idTweet countries Nothing rts fave):rest) = concat [toYellow user
, " ("
, screenName
, ")"
, ":\n "
, fixNewline content
, "\n "
, toRed "💜"
, " "
, show fave
, toGreen " \61561 "
, show rts
, " "
, toBlue (show idTweet)
, "\n\n"
, displayTimelineColor rest]
displayTimelineColor ((TweetEntity content user screenName idTweet countries (Just quoted) rts fave):rest) = concat [toYellow user
, " ("
, screenName
, ")"
, ":\n "
, fixNewline content
, "\n "
, toRed "💜"
, " "
, show fave
, toGreen " \61561 "
, show rts
, " "
, toBlue (show idTweet)
, "\n "
, toYellow $ _name quoted
, " ("
, _screenName quoted
, ")"
, ": "
, _text quoted
, "\n\n"
, displayTimelineColor rest]
displayTimelineColor [] = []
fixNewline :: String -> String
fixNewline = replace "\n" "\n "
sortTweets :: Timeline -> Timeline
sortTweets = sortBy compareTweet
where compareTweet (TweetEntity _ _ _ _ _ _ r1 f1) (TweetEntity _ _ _ _ _ _ r2 f2) = compare (2*r2 + f2) (2*r1 + f1)
keyLinePie :: String -> String
keyLinePie = takeWhile (/=':')
lineByKey :: BS.ByteString -> [(BS.ByteString, BS.ByteString)] -> BS.ByteString
lineByKey = snd .* head .* (filter . (fst -.* (==)))
filterLine :: String -> String
filterLine = reverse . (takeWhile (not . (`elem` (" :" :: String)))) . reverse
getConfigData :: FilePath -> IO [(BS.ByteString, BS.ByteString)]
getConfigData filepath = zip <$> keys <*> content
where content = (map (BS.pack . filterLine)) . lines <$> file
keys = (map (BS.pack . keyLinePie)) . lines <$> file
file = readFile filepath