module Web.Tweet.Utils where
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString as BS2
import Data.Char
import Data.List
import Web.Tweet.Types
import Control.Lens.Tuple
import Control.Lens hiding (noneOf)
import Data.Function
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