module Web.Tweet.Utils (
hits
, getTweets
, displayTimeline
, displayTimelineColor
, lineByKey
, getConfigData ) where
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString as BS2
import Data.List
import Web.Tweet.Types
import Control.Lens hiding (noneOf)
import Web.Tweet.Utils.Colors
import Data.List.Extra
import Web.Tweet.Parser
import Text.Megaparsec
hits :: Timeline -> Timeline
hits = sortTweets . filterRTs
filterRTs :: Timeline -> Timeline
filterRTs = filter ((/="RT @") . take 4 . (view text))
filterQuotes :: Timeline -> Timeline
filterQuotes = filter ((==Nothing) . (view quoted))
getTweets :: BS2.ByteString -> Either (ParseError Char Dec) Timeline
getTweets = parse parseTweet ""
displayTimeline :: Timeline -> String
displayTimeline ((TweetEntity content user screenName idTweet Nothing rts fave):rest) = concat [user
, " ("
, screenName
, ")"
,":\n "
,fixNewline content
,"\n "
,"♥ "
,show fave
," ♺ "
,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
, " ♺ "
, show rts
, " "
, show idTweet
, "\n "
, _name quoted
, " ("
, _screenName quoted
, ")"
, ": "
, _text quoted
, "\n\n"
, displayTimeline rest]
displayTimeline [] = []
displayTimelineColor :: Timeline -> String
displayTimelineColor ((TweetEntity content user screenName idTweet Nothing rts fave):rest) = concat [toYellow user
, " ("
, screenName
, ")"
, ":\n "
, fixNewline content
, "\n "
, toRed "♥"
, " "
, show fave
, toGreen " ♺ "
, show rts
, " "
, toBlue (show idTweet)
, "\n\n"
, displayTimelineColor rest]
displayTimelineColor ((TweetEntity content user screenName idTweet (Just quoted) rts fave):rest) = concat [toYellow user
, " ("
, screenName
, ")"
, ":\n "
, fixNewline content
, "\n "
, toRed "♥"
, " "
, show fave
, toGreen " ♺ "
, 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 key = snd . head . (filter (\i -> fst i == key))
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